diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-06-08 15:17:13 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-06-08 15:17:13 +0200 |
commit | d21121e59b21c73afa3622abe256771f1e73ff69 (patch) | |
tree | d91acbc4fac4062cd5acda237d759e2a51047648 /src/main.c | |
parent | 46e676254e5121f38c5d3668855c34a4496f88ec (diff) |
Switch to an SOA for lexemes
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 89 |
1 files changed, 62 insertions, 27 deletions
@@ -24,40 +24,75 @@ main(int argc, char **argv) } file; file.p = readfile(argv[1], &file.len); - struct { - struct lexeme *p; - size_t len; - } toks; - toks.p = lexstring(file.p, file.len, &toks.len); + struct lexemes_soa toks = lexstring(file.p, file.len); for (size_t i = 0; i < toks.len; i++) { - struct lexeme l = toks.p[i]; - switch (l.kind) { - case LEXIDENT: - printf("Identifier: ā%.*sā\n", (int)l.len, l.p); - break; - case LEXCOLON: puts("Colon"); break; - case LEXLBRACE: puts("Left brace"); break; - case LEXLPAR: puts("Left parenthesis"); break; - case LEXRBRACE: puts("Right brace"); break; - case LEXRPAR: puts("Right parenthesis"); break; - case LEXSEMI: puts("Semicolon"); break; - case LEXAMP: puts("Ampersand"); break; - case LEXEQ: puts("Equals"); break; - case LEXLANGL: puts("Left angle bracket"); break; - case LEXMINUS: puts("Minus"); break; - case LEXPIPE: puts("Pipe"); break; - case LEXPLUS: puts("Plus"); break; - case LEXRANGL: puts("Right angle bracket"); break; - case LEXSLASH: puts("Slash"); break; - case LEXSTAR: puts("Asterisk"); break; - case LEXTILDE: puts("Tilde"); break; + switch (toks.kinds[i]) { + case LEXIDENT: { + struct strview sv = toks.strs[i]; + printf("Identifier: ā%.*sā\n", (int)sv.len, sv.p); + break; + } + case LEXAMP: + puts("Ampersand"); + break; + case LEXCOLON: + puts("Colon"); + break; + case LEXEQ: + puts("Equals"); + break; + case LEXLANGL: + puts("Left angle bracket"); + break; + case LEXLBRACE: + puts("Left brace"); + break; + case LEXLBRKT: + puts("Right bracket"); + break; + case LEXLPAR: + puts("Left parenthesis"); + break; + case LEXMINUS: + puts("Minus"); + break; + case LEXPIPE: + puts("Pipe"); + break; + case LEXPLUS: + puts("Plus"); + break; + case LEXRANGL: + puts("Right angle bracket"); + break; + case LEXRBRACE: + puts("Right brace"); + break; + case LEXRBRKT: + puts("Right bracket"); + break; + case LEXRPAR: + puts("Right parenthesis"); + break; + case LEXSEMI: + puts("Semicolon"); + break; + case LEXSLASH: + puts("Slash"); + break; + case LEXSTAR: + puts("Asterisk"); + break; + case LEXTILDE: + puts("Tilde"); + break; } } #if DEBUG free(file.p); - free(toks.p); + lexemes_free(toks); #endif return EXIT_SUCCESS; } |