aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMathias Magnusson <mathias@magnusson.space>2025-06-01 00:59:45 +0200
committerMathias Magnusson <mathias@magnusson.space>2025-06-01 01:07:13 +0200
commitf26bc6965372783cd5942a99e1e5b6f0026f8333 (patch)
tree507d4fe176f9d78cba6fd0171fd828a50a065908 /src
parent69b66367be54dc2029adc32544a5f709fc1ef1a2 (diff)
downloadhuginn-f26bc6965372783cd5942a99e1e5b6f0026f8333.tar.gz
refactor slightly and fix bug in lexer
Diffstat (limited to 'src')
-rw-r--r--src/lexer.zig18
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 };
}