diff options
| author | hachem <im@hachem.wtf> | 2026-08-31 17:55:16 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-08-31 17:55:16 +0200 |
| commit | cbdb9073480c3e4d8a088b306c23406cf42e25c0 (patch) | |
| tree | 39f3093654cc8f27ea701ed1338cac84d93f42eb /src/lexer | |
| parent | 53aed3fadf1f7ad66dea9a8a0b46bf42eda921be (diff) | |
feat: hex/binary integer literals and constant-folding const expressions
Diffstat (limited to 'src/lexer')
| -rw-r--r-- | src/lexer/lexer.c | 24 |
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); } |
