diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-02-19 22:43:36 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-02-19 22:44:07 +0100 |
commit | 2520b79fdf6c344c358e21518b1a5fbcccb21095 (patch) | |
tree | 54c0cee6c12412d438e9fd0cf06a4e2a19e8e996 /src/c8asm/lexer.c | |
parent | 1207728a0c8824029a10d091e2258d242b77bd26 (diff) |
Make error messages great again
Diffstat (limited to 'src/c8asm/lexer.c')
-rw-r--r-- | src/c8asm/lexer.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/c8asm/lexer.c b/src/c8asm/lexer.c index 3d2a3bf..87835a9 100644 --- a/src/c8asm/lexer.c +++ b/src/c8asm/lexer.c @@ -10,9 +10,6 @@ #define ISDIGIT(n) ((n) >= '0' && (n) <= '9') #define U8MOV(sv, n) ((sv)->p += (n), (sv)->len -= (n)) -#define die_at_pos_with_code(HL, OFF, ...) \ - die_at_pos_with_code(filename, filebuf, (HL), (OFF), __VA_ARGS__) - #define E_BASE "integer with invalid base specifier" #define E_EXTRA "unknown extraneous character" #define E_IDENTCCHAR "illegal character in identifier" @@ -68,12 +65,12 @@ lexfile(void) return toks; } +#define DIE_AT_POS_WITH_CODE2(HL, ...) \ + DIE_AT_POS_WITH_CODE((HL), sv->p - w, __VA_ARGS__) + void lexline(struct tokens *toks, struct u8view *sv) { -#define _die_at_pos_with_code(HL, ...) \ - die_at_pos_with_code((HL), sv->p - baseptr - w, __VA_ARGS__) - struct token tok; for (;;) { @@ -117,7 +114,7 @@ lexline(struct tokens *toks, struct u8view *sv) break; default: if (!ISDIGIT(ch)) - _die_at_pos_with_code(tok.sv, E_BASE); + DIE_AT_POS_WITH_CODE2(tok.sv, E_BASE); } } @@ -130,10 +127,10 @@ out: if (ch == '.') { tok.sv.len += w = u8next(&ch, &sv->p, &sv->len); if (!w || rprop_is_pat_ws(ch)) - _die_at_pos_with_code(tok.sv, E_IDENTLOST); + DIE_AT_POS_WITH_CODE2(tok.sv, E_IDENTLOST); if (ch != '_' && !rprop_is_xids(ch)) { U8MOV(&tok.sv, 1); - _die_at_pos_with_code(tok.sv, E_IDENTSCHAR); + DIE_AT_POS_WITH_CODE2(tok.sv, E_IDENTSCHAR); } } @@ -147,7 +144,7 @@ out: .p = sv->p - w, .len = w, }; - _die_at_pos_with_code(hl, E_IDENTCCHAR); + DIE_AT_POS_WITH_CODE2(hl, E_IDENTCCHAR); } tok.sv.len += w; @@ -159,7 +156,7 @@ out: if (ch == '"') goto found; } - _die_at_pos_with_code(tok.sv, E_UNTERMINATED); + DIE_AT_POS_WITH_CODE2(tok.sv, E_UNTERMINATED); found: } else if (ch == ':') { tok.kind = T_COLON; @@ -167,7 +164,7 @@ found: goto end; } else { struct u8view hl = {.p = sv->p - w, .len = w}; - _die_at_pos_with_code(hl, E_EXTRA); + DIE_AT_POS_WITH_CODE2(hl, E_EXTRA); } /* The colon is the only token that isn’t whitespace separated */ @@ -175,7 +172,7 @@ found: w = u8next(&ch, &sv->p, &sv->len); if (!w || !rprop_is_pat_ws(ch)) { struct u8view hl = {.p = sv->p - w, .len = w}; - _die_at_pos_with_code(hl, E_EXTRA); + DIE_AT_POS_WITH_CODE2(hl, E_EXTRA); } } @@ -189,10 +186,10 @@ end:; .sv.len = 0, }; dapush(toks, tok); - -#undef _die_at_pos_with_code } +#undef DIE_AT_POS_WITH_CODE2 + bool skipws(struct u8view *sv) { |