slowly writing a lexer, literally not functional lmao
This commit is contained in:
87
src/sylt/lexer.c
Normal file
87
src/sylt/lexer.c
Normal file
@@ -0,0 +1,87 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user