Files
VMBL/src/sylt/lexer.c
2025-12-26 12:28:45 +11:00

87 lines
1.4 KiB
C

#include "lexer.h"
#include <string.h>
#include <stdlib.h>
#include <stdio,h>
Lexer initLexer(char *source) {
Lexer newLexer = {
.source = source,
.position = -1,
.readPosition = 0,
.lineNumber = 1,
.currentChar = '\0'
};
return newLexer;
}
void readChar(Lexer *lexer) {
if (lexer->readPosition >= strlen(lexer->source))
lexer->currentChar = '\0';
else
lexer->currentChar = lexer->source[lexer->readPosition];
lexer->position = lexer->readPosition;
lexer->readPosition++;
}
void skipWhitespace(Lexer *lexer) {
switch (lexer->currentChar)
{
case ' ':
case '\t':
case '\n':
case '\r':
if (lexer->currentChar == '\n')
lexer->lineNumber++;
readChar(lexer);
break;
default:
break;
}
}
Token nextToken(Lexer *lexer) {
//Token tok;
skipWhitespace(lexer);
switch (lexer->currentChar)
{
case '+':
return NEW_TOKEN(lexer, PLUS, "+");
break;
case '-':
return NEW_TOKEN(lexer, MINUS, "-");
break;
case '*':
return NEW_TOKEN(lexer, ASTERISK, "*");
break;
case '/':
return NEW_TOKEN(lexer, SLASH, "/");
break;
case '%':
return NEW_TOKEN(lexer, MODULUS, "%");
break;
case '^':
return NEW_TOKEN(lexer, POW, "^");
break;
case '(':
return NEW_TOKEN(lexer, LPAREN, "(");
break;
case ')':
return NEW_TOKEN(lexer, RPAREN, ")");
break;
case '\0':
return NEW_TOKEN(lexer, EOF, "");
break;
default:
if (isdigit())
break;
}
//return tok;
}