diff --git a/src/astgen.zig b/src/astgen.zig index 08166d23fbf9a17bfa23cea35cb2769c6bc2ee17..a57b1760057d28c378ad8244c131def00376ab7a 100644 --- a/src/astgen.zig +++ b/src/astgen.zig @@ -84,7 +84,7 @@ const Parser = struct { } fn tryEatSymbol(comptime self: *Parser, comptime needle: string) bool { - switch (self.tokens[self.index]) { + switch (self.tokens[self.index].data) { .symbol => |sym| { if (std.mem.eql(u8, sym, needle)) { self.index += 1; @@ -126,7 +126,7 @@ const Parser = struct { } pub fn doValue(comptime self: *Parser) Value { - if (self.tokens[self.index] == .string) { + if (self.tokens[self.index].data == .string) { return Value{ .string = self.eat(.string) }; } if (self.tryEatSymbol("{")) { @@ -193,8 +193,13 @@ const Parser = struct { return ret; } - fn eat(comptime self: *Parser, comptime typ: std.meta.Tag(Token)) string { + fn eat(comptime self: *Parser, comptime typ: std.meta.Tag(Token.Data)) string { defer self.index += 1; - return @field(self.tokens[self.index], @tagName(typ)); + const tok = self.tokens[self.index]; + const tag = std.meta.activeTag(tok.data); + if (tag != typ) { + @compileError(std.fmt.comptimePrint("pek: file:{d}:{d}: expected {s}, found {s}", .{ tok.line, tok.pos, @tagName(tag), @tagName(typ) })); + } + return @field(tok.data, @tagName(typ)); } }; diff --git a/src/tokenize.zig b/src/tokenize.zig index 97211ad56e52ce647238707f4b708bd5ac9de96a..ce49a9ccc0590ee463efcb665674e5ec701505c8 100644 --- a/src/tokenize.zig +++ b/src/tokenize.zig @@ -4,12 +4,18 @@ const string = []const u8; // // -pub const Token = union(enum) { - word: string, - symbol: string, - string: string, +pub const Token = struct { + data: Data, + line: usize, + pos: usize, pub const skippedChars = &[_]u8{ ' ', '\n', '\t', '\r' }; + + pub const Data = union(enum) { + word: string, + symbol: string, + string: string, + }; }; // @@ -58,7 +64,11 @@ pub fn do(comptime input: string, comptime symbols: []const u8) []const Token { } if (mode == 2) { if (c == input[start]) { - ret = ret ++ &[_]Token{.{ .string = input[start .. i + 1] }}; + ret = ret ++ &[_]Token{.{ + .data = .{ .string = input[start .. i + 1] }, + .line = line, + .pos = pos, + }}; start = i + 1; end = i; mode = 0; @@ -84,7 +94,11 @@ pub fn do(comptime input: string, comptime symbols: []const u8) []const Token { if (shouldFlush) { if (mode == 0) { if (end - start > 0) { - ret = ret ++ &[_]Token{.{ .word = input[start..end] }}; + ret = ret ++ &[_]Token{.{ + .data = .{ .word = input[start..end] }, + .line = line, + .pos = pos, + }}; start = i; end = i; } @@ -93,7 +107,11 @@ pub fn do(comptime input: string, comptime symbols: []const u8) []const Token { end += 1; } if (std.mem.indexOfScalar(u8, symbols, c)) |_| { - ret = ret ++ &[_]Token{.{ .symbol = s }}; + ret = ret ++ &[_]Token{.{ + .data = .{ .symbol = s }, + .line = line, + .pos = pos, + }}; start += 1; end += 1; }