diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lexer.zig | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/lexer.zig b/src/lexer.zig index 608b755..3621a1c 100644 --- a/src/lexer.zig +++ b/src/lexer.zig @@ -4,7 +4,7 @@ pub const Token = struct { loc: Location, type: Type, - pub const Type = union(enum) { + pub const Type = enum { left_paren, right_paren, integer_literal, @@ -20,7 +20,7 @@ pub const Location = struct { end: usize, pub fn combine(a: Location, b: Location) Location { - if (a.end > b.start) unreachable; + std.debug.assert(a.end <= b.start); return .{ .start = @min(a.start, b.start), .end = @max(a.end, b.end) }; } @@ -36,10 +36,11 @@ pub const Location = struct { }; source: []const u8, -last_end: usize = 0, +start: usize = 0, pos: usize = 0, pub fn next(self: *Self) ?Token { + self.start = self.pos; return s: switch (self.eat() orelse return self.create(.eof)) { '(' => self.create(.left_paren), ')' => self.create(.right_paren), @@ -47,7 +48,7 @@ pub fn next(self: *Self) ?Token { '+' => self.create(.plus), '-' => self.create(.minus), ' ' => { - self.last_end = self.pos; + self.start = self.pos; continue :s (self.eat() orelse return self.create(.eof)); }, else => self.create(.invalid), @@ -55,7 +56,7 @@ pub fn next(self: *Self) ?Token { } fn integerLiteral(self: *Self) Token { - var value: ?u64 = 0; + var value: ?u64 = self.source[self.start] - '0'; while (digitValue(self.peek())) |v| { var nxt: ?u64 = null; if (value) |val| @@ -68,14 +69,13 @@ fn integerLiteral(self: *Self) Token { _ = self.eat(); } return if (value != null) - self.create(.{ .integer_literal = {} }) + self.create(.integer_literal) else - self.create(.{ .invalid = {} }); + self.create(.invalid); } fn create(self: *Self, tajp: Token.Type) Token { - const start = self.last_end; - self.last_end = self.pos; + const start = self.start; return .{ .loc = .{ .start = start, .end = self.pos }, .type = tajp }; } |