Expand lexer support for expression tokens

This commit is contained in:
Krzosa Karol
2026-05-10 14:38:03 +02:00
parent 723ebb8f62
commit e04db0ac0c

95
main.c
View File

@@ -128,11 +128,55 @@ Token lex_token(Lexer *lex) {
case ';': t.kind = TOK_SEMICOLON; break;
case '?': t.kind = TOK_QUESTION; break;
case '#': t.kind = TOK_HASH; break;
case '+': t.kind = TOK_PLUS; break;
case '-': t.kind = TOK_MINUS; break;
case '*': t.kind = TOK_STAR; break;
case '/': t.kind = TOK_SLASH; break;
case '%': t.kind = TOK_PERCENT; break;
case '+': {
if (lex->at < lex->end && *lex->at == '+') {
lex_advance(lex);
t.kind = TOK_INC;
} else if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_PLUS_ASSIGN;
} else {
t.kind = TOK_PLUS;
}
} break;
case '-': {
if (lex->at < lex->end && *lex->at == '-') {
lex_advance(lex);
t.kind = TOK_DEC;
} else if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_MINUS_ASSIGN;
} else if (lex->at < lex->end && *lex->at == '>') {
lex_advance(lex);
t.kind = TOK_ARROW;
} else {
t.kind = TOK_MINUS;
}
} break;
case '*': {
if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_MUL_ASSIGN;
} else {
t.kind = TOK_STAR;
}
} break;
case '/': {
if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_DIV_ASSIGN;
} else {
t.kind = TOK_SLASH;
}
} break;
case '%': {
if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_MOD_ASSIGN;
} else {
t.kind = TOK_PERCENT;
}
} break;
case '=': {
if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
@@ -142,23 +186,33 @@ Token lex_token(Lexer *lex) {
}
} break;
case '<': {
if (lex->at < lex->end && *lex->at == '=') {
if (lex->at < lex->end && *lex->at == '<') {
lex_advance(lex);
if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_LSHIFT_ASSIGN;
} else {
t.kind = TOK_LSHIFT;
}
} else if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_LEQ;
} else if (lex->at < lex->end && *lex->at == '<') {
lex_advance(lex);
t.kind = TOK_LSHIFT;
} else {
t.kind = TOK_LT;
}
} break;
case '>': {
if (lex->at < lex->end && *lex->at == '=') {
if (lex->at < lex->end && *lex->at == '>') {
lex_advance(lex);
if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_RSHIFT_ASSIGN;
} else {
t.kind = TOK_RSHIFT;
}
} else if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_GEQ;
} else if (lex->at < lex->end && *lex->at == '>') {
lex_advance(lex);
t.kind = TOK_RSHIFT;
} else {
t.kind = TOK_GT;
}
@@ -176,6 +230,9 @@ Token lex_token(Lexer *lex) {
if (lex->at < lex->end && *lex->at == '&') {
lex_advance(lex);
t.kind = TOK_AND;
} else if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_AND_ASSIGN;
} else {
t.kind = TOK_BITAND;
}
@@ -184,11 +241,21 @@ Token lex_token(Lexer *lex) {
if (lex->at < lex->end && *lex->at == '|') {
lex_advance(lex);
t.kind = TOK_OR;
} else if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_OR_ASSIGN;
} else {
t.kind = TOK_BITOR;
}
} break;
case '^': t.kind = TOK_BITXOR; break;
case '^': {
if (lex->at < lex->end && *lex->at == '=') {
lex_advance(lex);
t.kind = TOK_XOR_ASSIGN;
} else {
t.kind = TOK_BITXOR;
}
} break;
default: {
// @todo: lexer perhaps should have a static buffer of size 1024, error message
// should be put there and piped to the upper program. The token should be filled