diff options
author | Himbeer <himbeer@disroot.org> | 2024-09-12 12:32:39 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-09-12 12:34:27 +0200 |
commit | 3642954f1715e43fa33f404315d18a8061c29050 (patch) | |
tree | 1ecc8f26a7c5e04a04b34c9ed390ef602b92b271 /src | |
parent | 122f416c3f5d6f8081c548659d81e0938a055de1 (diff) |
Include strings in lexical analysis
Diffstat (limited to 'src')
-rw-r--r-- | src/lex.c | 18 | ||||
-rw-r--r-- | src/main.c | 3 |
2 files changed, 20 insertions, 1 deletions
@@ -208,6 +208,21 @@ lex_number(struct lexer *lexer, struct token *out) return out->token; } +static enum lexical_token +lex_string(struct lexer *lexer, struct token *out, uint32_t delim) +{ + uint32_t c; + while ((c = next(lexer)) != C_EOF && c != delim) { + push(lexer, c); + } + + out->info.str = strdup(lexer->buf); + + clear(lexer); + out->token = T_STRING; + return out->token; +} + enum lexical_token lex(struct lexer *lexer, struct token *out) { @@ -349,6 +364,9 @@ lex(struct lexer *lexer, struct token *out) case '_': out->token = T_UNDERSCORE; break; + case '"': + case '`': + return lex_string(lexer, out, c); } } @@ -43,7 +43,8 @@ main(int argc, char *argv[]) struct token token; while (lex(&lexer, &token) != T_EOF) { printf("%d", token.token); - if (token.token == T_IDENT || token.token == T_NAME) { + if (token.token == T_IDENT || token.token == T_NAME + || token.token == T_STRING) { printf(" %s", token.info.str); } else if (token.token == T_NUMBER && token.info.num.isfloat) { |