diff options
| author | hachem <im@hachem.wtf> | 2026-08-30 02:42:24 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-08-30 02:42:24 +0200 |
| commit | 018c80eb47afe605a269b2d8f1687b249c99f6b4 (patch) | |
| tree | 1461ac87467488c89968c164cbcb6185460e1e23 /src/lexer/lexer.c | |
| parent | 7cdd9a92feb598ba0486f68fe505c40252734e49 (diff) | |
add: lex string literals
Diffstat (limited to 'src/lexer/lexer.c')
| -rw-r--r-- | src/lexer/lexer.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index 88efff3..1c49337 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -70,6 +70,40 @@ struct Lexer create_lexer(const char* source) return lexer; } +static struct Token scan_string(struct Lexer* lexer, const char* start) +{ + while (peek(lexer) != '"') + { + char character = peek(lexer); + if (character == '\0') + return make_token(lexer, TOKEN_UNKNOWN, start); + if (character == '\n') + lexer->line += 1; + if (character == '\\' && lexer->current[1] != '\0') + advance(lexer); + advance(lexer); + } + + advance(lexer); + return make_token(lexer, TOKEN_STRING, start); +} + +static struct Token scan_char(struct Lexer* lexer, const char* start) +{ + while (peek(lexer) != '\'') + { + char character = peek(lexer); + if (character == '\0' || character == '\n') + return make_token(lexer, TOKEN_UNKNOWN, start); + if (character == '\\' && lexer->current[1] != '\0') + advance(lexer); + advance(lexer); + } + + advance(lexer); + return make_token(lexer, TOKEN_CHAR, start); +} + struct Token scan_token(struct Lexer* lexer) { skip_whitespace(lexer); @@ -93,6 +127,11 @@ struct Token scan_token(struct Lexer* lexer) return make_token(lexer, TOKEN_INTEGER, start); } + if (character == '"') + return scan_string(lexer, start); + if (character == '\'') + return scan_char(lexer, start); + switch (character) { case '=': return make_token(lexer, match(lexer, '=') ? TOKEN_EQUAL_EQUAL : TOKEN_EQUAL, start); @@ -126,6 +165,8 @@ const char* token_type_name(enum TokenType type) case TOKEN_EOF: return "eof"; case TOKEN_IDENTIFIER: return "identifier"; case TOKEN_INTEGER: return "integer"; + case TOKEN_STRING: return "string"; + case TOKEN_CHAR: return "char"; case TOKEN_EQUAL: return "equal"; case TOKEN_PLUS: return "plus"; case TOKEN_MINUS: return "minus"; |
