make file added

This commit is contained in:
SpookyDervish
2025-12-26 18:56:51 +11:00
parent b69a6c6eec
commit bd07952569
17 changed files with 217 additions and 474 deletions

View File

@@ -1,7 +1,9 @@
#include "lexer.h"
#include "exception.h"
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio,h>
#include <stdio.h>
Lexer initLexer(char *source) {
Lexer newLexer = {
@@ -11,6 +13,7 @@ Lexer initLexer(char *source) {
.lineNumber = 1,
.currentChar = '\0'
};
readChar(&newLexer);
return newLexer;
}
@@ -25,63 +28,134 @@ void readChar(Lexer *lexer) {
}
void skipWhitespace(Lexer *lexer) {
switch (lexer->currentChar)
{
case ' ':
case '\t':
case '\n':
case '\r':
if (lexer->currentChar == '\n')
lexer->lineNumber++;
bool whitespace = true;
readChar(lexer);
break;
default:
break;
while (whitespace)
{
switch (lexer->currentChar)
{
case ' ':
case '\t':
case '\n':
case '\r':
if (lexer->currentChar == '\n')
lexer->lineNumber++;
readChar(lexer);
break;
default:
whitespace = false;
break;
}
}
}
Token readNumber(Lexer *lexer) {
int startPos = lexer->position;
int dotCount = 0;
int strLength = 0;
size_t outputCap = 8;
char *output = malloc(outputCap);
if (!output) {
exceptionMessage(EXCEPTION_MEMORY_ALLOCATION_FAILURE, "Lexer failed to allocate memory.", lexer->lineNumber, lexer->position);
exit(1);
}
while (isdigit(lexer->currentChar) || lexer->currentChar == '.')
{
if (lexer->currentChar == '.') {
dotCount++;
if (dotCount > 1) {
exceptionMessage(EXCEPTION_MALFORMED_NUMBER, "Too many dots in decimal.", lexer->lineNumber, lexer->position);
char buffer[strLength+1];
strncpy(buffer, lexer->source + startPos, strLength+1);
buffer[strLength+1] = 0;
return NEW_TOKEN(lexer, TOKEN_ILLEGAL, buffer);
}
}
// allocate more memory if we reach the end of our buffer
if (strLength + 1 >= outputCap) {
char *temp = realloc(output, outputCap*=2);
if (!temp) {
exceptionMessage(EXCEPTION_MEMORY_ALLOCATION_FAILURE, "Lexer failed to allocate memory.", lexer->lineNumber, lexer->position);
exit(1);
}
output = temp;
}
output[strLength] = lexer->source[lexer->position];
strLength++;
readChar(lexer);
if (lexer->currentChar == '\0')
break;
}
output[strLength] = 0;
if (dotCount == 0)
return NEW_TOKEN(lexer, TOKEN_INT, output);
else
return NEW_TOKEN(lexer, TOKEN_FLOAT, output);
}
Token nextToken(Lexer *lexer) {
//Token tok;
Token tok;
skipWhitespace(lexer);
switch (lexer->currentChar)
{
case '+':
return NEW_TOKEN(lexer, PLUS, "+");
tok = NEW_TOKEN(lexer, TOKEN_PLUS, "+");
break;
case '-':
return NEW_TOKEN(lexer, MINUS, "-");
tok = NEW_TOKEN(lexer, TOKEN_MINUS, "-");
break;
case '*':
return NEW_TOKEN(lexer, ASTERISK, "*");
tok = NEW_TOKEN(lexer, TOKEN_ASTERISK, "*");
break;
case '/':
return NEW_TOKEN(lexer, SLASH, "/");
tok = NEW_TOKEN(lexer, TOKEN_SLASH, "/");
break;
case '%':
return NEW_TOKEN(lexer, MODULUS, "%");
tok = NEW_TOKEN(lexer, TOKEN_MODULUS, "%");
break;
case '^':
return NEW_TOKEN(lexer, POW, "^");
tok = NEW_TOKEN(lexer, TOKEN_POW, "^");
break;
case '(':
return NEW_TOKEN(lexer, LPAREN, "(");
tok = NEW_TOKEN(lexer, TOKEN_LPAREN, "(");
break;
case ')':
return NEW_TOKEN(lexer, RPAREN, ")");
tok = NEW_TOKEN(lexer, TOKEN_RPAREN, ")");
break;
case '\0':
return NEW_TOKEN(lexer, EOF, "");
case '\0': // EOF
tok = NEW_TOKEN(lexer, TOKEN_EOF, "EOF");
break;
default:
if (isdigit())
if (isdigit(lexer->currentChar)) {
tok = readNumber(lexer);
} else {
tok = NEW_TOKEN(lexer, TOKEN_ILLEGAL, &lexer->currentChar);
}
break;
}
//return tok;
readChar(lexer);
return tok;
}

View File

@@ -17,6 +17,6 @@ Lexer initLexer(char *source);
void readChar(Lexer *lexer);
void skipWhitespace(Lexer *lexer);
Token nextToken(Lexer *lexer);
char *tokenToCStr(Token token);
Token readNumber(Lexer *lexer);
#endif // !LEXER_H

View File

@@ -1,10 +1,16 @@
#include "lexer.h"
#include <stdio.h>
#include "../file_utils.h"
#include "../utils/file_utils.h"
#include "../utils/ansii.h"
int main() {
Lexer lexer = initLexer("const x, y = 1, 3\n");
printf(nextToken(&lexer).literal);
Lexer lexer = initLexer("123 456.789 + - * / % ^ ()");
while (lexer.currentChar != 0)
{
Token next = nextToken(&lexer);
printf("%s: %s\n", tokenTypeToCString(next.type), next.literal);
}
return 0;
}

View File

@@ -3,24 +3,24 @@
typedef enum {
// Special Tokens
EOF,
ILLEGAL,
TOKEN_EOF,
TOKEN_ILLEGAL,
// Data Types
INT,
FLOAT,
TOKEN_INT,
TOKEN_FLOAT,
// Arithmetic Symbols
PLUS,
MINUS,
ASTERISK,
SLASH,
POW,
MODULUS,
TOKEN_PLUS,
TOKEN_MINUS,
TOKEN_ASTERISK,
TOKEN_SLASH,
TOKEN_POW,
TOKEN_MODULUS,
// Symbols
LPAREN,
RPAREN
TOKEN_LPAREN,
TOKEN_RPAREN
} TokenType;
typedef struct
@@ -33,4 +33,6 @@ typedef struct
#define NEW_TOKEN(lexer, tokType, tokLiteral) (Token){ .type = (tokType), .literal = (tokLiteral), .lineNumber = (lexer->lineNumber), .position = (lexer->position) }
char *tokenTypeToCString(TokenType type);
#endif // !TOKEN_H