aboutsummaryrefslogtreecommitdiff
path: root/src/lexer/lexer.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-31 17:55:16 +0200
committerhachem <im@hachem.wtf>2026-08-31 17:55:16 +0200
commitcbdb9073480c3e4d8a088b306c23406cf42e25c0 (patch)
tree39f3093654cc8f27ea701ed1338cac84d93f42eb /src/lexer/lexer.c
parent53aed3fadf1f7ad66dea9a8a0b46bf42eda921be (diff)
feat: hex/binary integer literals and constant-folding const expressions
Diffstat (limited to 'src/lexer/lexer.c')
-rw-r--r--src/lexer/lexer.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c
index fb3fce7..23d0a82 100644
--- a/src/lexer/lexer.c
+++ b/src/lexer/lexer.c
@@ -15,6 +15,13 @@ static bool is_digit(char character)
return character >= '0' && character <= '9';
}
+static bool is_hex_digit(char character)
+{
+ return is_digit(character)
+ || (character >= 'a' && character <= 'f')
+ || (character >= 'A' && character <= 'F');
+}
+
static enum TokenType identifier_type(const char* start, size_t length)
{
static const struct Keyword
@@ -177,8 +184,23 @@ struct Token scan_token(struct Lexer* lexer)
if (is_digit(character))
{
- while (is_digit(peek(lexer)))
+ if (character == '0' && (peek(lexer) == 'x' || peek(lexer) == 'X'))
+ {
+ advance(lexer);
+ while (is_hex_digit(peek(lexer)))
+ advance(lexer);
+ }
+ else if (character == '0' && (peek(lexer) == 'b' || peek(lexer) == 'B'))
+ {
advance(lexer);
+ while (peek(lexer) == '0' || peek(lexer) == '1')
+ advance(lexer);
+ }
+ else
+ {
+ while (is_digit(peek(lexer)))
+ advance(lexer);
+ }
return make_token(lexer, TOKEN_INTEGER, start);
}