87 lines
1.4 KiB
C
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;
|
||
|
|
}
|