aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-30 02:24:36 +0200
committerhachem <im@hachem.wtf>2026-08-30 02:24:36 +0200
commit7cdd9a92feb598ba0486f68fe505c40252734e49 (patch)
treecdedd2285da7abf5a9df2ba39983a97f8074fdb2
parent8fd64902c7752a9607974b093cd1946bc5ff79d6 (diff)
add: lex mutli-char operators
-rw-r--r--src/lexer/lexer.c33
-rw-r--r--src/lexer/lexer.h12
2 files changed, 40 insertions, 5 deletions
diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c
index 7c5ca8f..88efff3 100644
--- a/src/lexer/lexer.c
+++ b/src/lexer/lexer.c
@@ -26,6 +26,14 @@ static char advance(struct Lexer* lexer)
return c;
}
+static bool match(struct Lexer* lexer, char expected)
+{
+ if (*lexer->current != expected)
+ return false;
+ lexer->current += 1;
+ return true;
+}
+
static void skip_whitespace(struct Lexer* lexer)
{
for (;;)
@@ -87,11 +95,15 @@ struct Token scan_token(struct Lexer* lexer)
switch (character)
{
- case '=': return make_token(lexer, TOKEN_EQUAL, start);
- case '+': return make_token(lexer, TOKEN_PLUS, start);
- case '-': return make_token(lexer, TOKEN_MINUS, start);
- case '*': return make_token(lexer, TOKEN_STAR, start);
- case '/': return make_token(lexer, TOKEN_SLASH, start);
+ case '=': return make_token(lexer, match(lexer, '=') ? TOKEN_EQUAL_EQUAL : TOKEN_EQUAL, start);
+ case '!': return make_token(lexer, match(lexer, '=') ? TOKEN_BANG_EQUAL : TOKEN_BANG, start);
+ case '<': return make_token(lexer, match(lexer, '=') ? TOKEN_LESS_EQUAL : TOKEN_LESS, start);
+ case '>': return make_token(lexer, match(lexer, '=') ? TOKEN_GREATER_EQUAL : TOKEN_GREATER, start);
+ case '+': return make_token(lexer, match(lexer, '=') ? TOKEN_PLUS_EQUAL : TOKEN_PLUS, start);
+ case '-': return make_token(lexer, match(lexer, '=') ? TOKEN_MINUS_EQUAL : TOKEN_MINUS, start);
+ case '*': return make_token(lexer, match(lexer, '=') ? TOKEN_STAR_EQUAL : TOKEN_STAR, start);
+ case '/': return make_token(lexer, match(lexer, '=') ? TOKEN_SLASH_EQUAL : TOKEN_SLASH, start);
+
case '^': return make_token(lexer, TOKEN_CARET, start);
case '.': return make_token(lexer, TOKEN_DOT, start);
case ',': return make_token(lexer, TOKEN_COMMA, start);
@@ -120,6 +132,9 @@ const char* token_type_name(enum TokenType type)
case TOKEN_STAR: return "star";
case TOKEN_SLASH: return "slash";
case TOKEN_CARET: return "caret";
+ case TOKEN_BANG: return "bang";
+ case TOKEN_LESS: return "less";
+ case TOKEN_GREATER: return "greater";
case TOKEN_DOT: return "dot";
case TOKEN_COMMA: return "comma";
case TOKEN_COLON: return "colon";
@@ -129,6 +144,14 @@ const char* token_type_name(enum TokenType type)
case TOKEN_RIGHT_BRACKET: return "right_bracket";
case TOKEN_LEFT_BRACE: return "left_brace";
case TOKEN_RIGHT_BRACE: return "right_brace";
+ case TOKEN_EQUAL_EQUAL: return "equal_equal";
+ case TOKEN_BANG_EQUAL: return "bang_equal";
+ case TOKEN_PLUS_EQUAL: return "plus_equal";
+ case TOKEN_MINUS_EQUAL: return "minus_equal";
+ case TOKEN_STAR_EQUAL: return "star_equal";
+ case TOKEN_SLASH_EQUAL: return "slash_equal";
+ case TOKEN_LESS_EQUAL: return "less_equal";
+ case TOKEN_GREATER_EQUAL: return "greater_equal";
case TOKEN_UNKNOWN: return "unknown";
}
diff --git a/src/lexer/lexer.h b/src/lexer/lexer.h
index 4c40354..c8ad735 100644
--- a/src/lexer/lexer.h
+++ b/src/lexer/lexer.h
@@ -15,6 +15,9 @@ enum TokenType
TOKEN_STAR,
TOKEN_SLASH,
TOKEN_CARET,
+ TOKEN_BANG,
+ TOKEN_LESS,
+ TOKEN_GREATER,
TOKEN_DOT,
TOKEN_COMMA,
TOKEN_COLON,
@@ -25,6 +28,15 @@ enum TokenType
TOKEN_LEFT_BRACE,
TOKEN_RIGHT_BRACE,
+ TOKEN_EQUAL_EQUAL,
+ TOKEN_BANG_EQUAL,
+ TOKEN_PLUS_EQUAL,
+ TOKEN_MINUS_EQUAL,
+ TOKEN_STAR_EQUAL,
+ TOKEN_SLASH_EQUAL,
+ TOKEN_LESS_EQUAL,
+ TOKEN_GREATER_EQUAL,
+
TOKEN_UNKNOWN,
};