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 {...@@ -100,6 +100,15 @@ const Parser = struct {
100 return ret;100 return ret;
101 }101 }
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
103 fn tryEatSymbol(comptime self: *Parser, comptime needle: string) bool {112 fn tryEatSymbol(comptime self: *Parser, comptime needle: string) bool {
104 if (self.index >= self.tokens.len) return false;113 if (self.index >= self.tokens.len) return false;
105 switch (self.tokens[self.index].data) {114 switch (self.tokens[self.index].data) {
...@@ -134,11 +143,13 @@ const Parser = struct {...@@ -134,11 +143,13 @@ const Parser = struct {
134 }143 }
135144
136 pub fn eatSymbol(comptime self: *Parser, comptime needle: string) void {145 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);
138 }148 }
139149
140 pub fn eatWord(comptime self: *Parser, comptime needle: string) void {150 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);
142 }153 }
143154
144 pub fn doChildren(comptime self: *Parser) []const Value {155 pub fn doChildren(comptime self: *Parser) []const Value {
...@@ -257,9 +268,7 @@ const Parser = struct {...@@ -257,9 +268,7 @@ const Parser = struct {
257 defer self.index += 1;268 defer self.index += 1;
258 const tok = self.tokens[self.index];269 const tok = self.tokens[self.index];
259 const tag = std.meta.activeTag(tok.data);270 const tag = std.meta.activeTag(tok.data);
260 if (tag != typ) {271 if (tag != typ) raise(tok.line, tok.pos, @tagName(typ), @tagName(tag));
261 @compileError(std.fmt.comptimePrint("pek: file:{d}:{d}: expected {s}, found {s}", .{ tok.line, tok.pos, @tagName(typ), @tagName(tag) }));
262 }
263 return @field(tok.data, @tagName(typ));272 return @field(tok.data, @tagName(typ));
264 }273 }
265274