authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-30 14:04:32-07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-30 14:04:32-07:00
log9c386d3021621b90269a0bea8725d1049a6c3d9c
tree60462c76962bfd9b2cb2652213ea71f53a48105e
parent2dd4cf012080bea60a94d0b694c2b7c77b67602e
signature Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

astgen: better errors for eatSymbol and eatWord


1 files changed, 14 insertions(+), 5 deletions(-)

src/astgen.zig+14-5
......@@ -100,6 +100,15 @@ const Parser = struct {
100100 return ret;
101101 }
102102
103 fn raise(comptime line: usize, comptime pos: usize, comptime expected: []const u8, comptime found: []const u8) void {
104 @compileError(std.fmt.comptimePrint("pek: file:{d}:{d}: expected {s}, found {s}", .{ line, pos, expected, found }));
105 }
106
107 fn expect(comptime expected: []const u8, comptime found: []const u8, comptime line: usize, comptime pos: usize) void {
108 if (std.mem.eql(u8, found, expected)) return;
109 raise(line, pos, expected, found);
110 }
111
103112 fn tryEatSymbol(comptime self: *Parser, comptime needle: string) bool {
104113 if (self.index >= self.tokens.len) return false;
105114 switch (self.tokens[self.index].data) {
......@@ -134,11 +143,13 @@ const Parser = struct {
134143 }
135144
136145 pub fn eatSymbol(comptime self: *Parser, comptime needle: string) void {
137 std.debug.assert(std.mem.eql(u8, self.eat(.symbol), needle));
146 const tok = self.tokens[self.index];
147 expect(needle, self.eat(.symbol), tok.line, tok.pos);
138148 }
139149
140150 pub fn eatWord(comptime self: *Parser, comptime needle: string) void {
141 std.debug.assert(std.mem.eql(u8, needle, self.eat(.word)));
151 const tok = self.tokens[self.index];
152 expect(needle, self.eat(.word), tok.line, tok.pos);
142153 }
143154
144155 pub fn doChildren(comptime self: *Parser) []const Value {
......@@ -257,9 +268,7 @@ const Parser = struct {
257268 defer self.index += 1;
258269 const tok = self.tokens[self.index];
259270 const tag = std.meta.activeTag(tok.data);
260 if (tag != typ) {
261 @compileError(std.fmt.comptimePrint("pek: file:{d}:{d}: expected {s}, found {s}", .{ tok.line, tok.pos, @tagName(typ), @tagName(tag) }));
262 }
271 if (tag != typ) raise(tok.line, tok.pos, @tagName(typ), @tagName(tag));
263272 return @field(tok.data, @tagName(typ));
264273 }
265274