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

91
main.c
View File

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