diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-08-13 22:40:51 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 10:06:21 +0900 |
| commit | 7685bff588632a486a9e677c63ae7123b112ba9e (patch) | |
| tree | 880d0be559c15e7bcdf857c3c17ee7f2629a4adb /tokenize.c | |
| parent | 56580d654dfc19d03900fa9df680980d3e60c4ee (diff) | |
| download | ducc-7685bff588632a486a9e677c63ae7123b112ba9e.tar.gz ducc-7685bff588632a486a9e677c63ae7123b112ba9e.tar.zst ducc-7685bff588632a486a9e677c63ae7123b112ba9e.zip | |
refactor: use TokenArray instead of raw pointer and length
Diffstat (limited to 'tokenize.c')
| -rw-r--r-- | tokenize.c | 29 |
1 files changed, 14 insertions, 15 deletions
@@ -1,25 +1,27 @@ struct Lexer { - Token* src; - int pos; - Token* tokens; - int n_tokens; + TokenArray* src; + TokenArray* tokens; }; typedef struct Lexer Lexer; -Lexer* lexer_new(Token* pp_tokens) { +Lexer* lexer_new(TokenArray* pp_tokens) { Lexer* l = calloc(1, sizeof(Lexer)); l->src = pp_tokens; - l->tokens = calloc(1024 * 1024, sizeof(Token)); + l->tokens = calloc(1, sizeof(TokenArray)); + // l->tokens need not store whitespace tokens. + tokens_init(l->tokens, pp_tokens->len / 2); return l; } void tokenize_all(Lexer* l) { - while (l->src[l->pos].kind != TokenKind_eof) { - Token* pp_tok = l->src + l->pos; - Token* tok = l->tokens + l->n_tokens; - tok->loc = pp_tok->loc; + for (int pos = 0; pos < l->src->len; ++pos) { + Token* pp_tok = &l->src->data[pos]; TokenKind k = pp_tok->kind; - ++l->pos; + if (k == TokenKind_whitespace) { + continue; + } + Token* tok = tokens_push_new(l->tokens); + tok->loc = pp_tok->loc; if (k == TokenKind_character_constant) { tok->kind = TokenKind_literal_int; int ch = pp_tok->raw.data[1]; @@ -53,17 +55,14 @@ void tokenize_all(Lexer* l) { tok->raw.len = pp_tok->raw.len - 2; } else if (k == TokenKind_other) { unreachable(); - } else if (k == TokenKind_whitespace) { - continue; } else { tok->kind = pp_tok->kind; tok->raw = pp_tok->raw; } - ++l->n_tokens; } } -Token* tokenize(Token* pp_tokens) { +TokenArray* tokenize(TokenArray* pp_tokens) { Lexer* l = lexer_new(pp_tokens); tokenize_all(l); return l->tokens; |
