From e04db0ac0c83dcc66e5b17f8c822cb9c8f60ce62 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sun, 10 May 2026 14:38:03 +0200 Subject: [PATCH] Expand lexer support for expression tokens --- main.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 81 insertions(+), 14 deletions(-) diff --git a/main.c b/main.c index e34a729..fa852a0 100644 --- a/main.c +++ b/main.c @@ -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