diff options
author | Mathias Magnusson <mathias@magnusson.space> | 2025-07-03 23:00:50 +0200 |
---|---|---|
committer | Mathias Magnusson <mathias@magnusson.space> | 2025-07-03 23:00:50 +0200 |
commit | 7f86e0dc92670dd5da34cd22c36aba18fa58ec6d (patch) | |
tree | 692521deb068563d650a0028874d11dea8cdda31 /src/parse.zig | |
parent | 3959256af626292d50d5c05c63073ef28d760546 (diff) | |
download | huginn-7f86e0dc92670dd5da34cd22c36aba18fa58ec6d.tar.gz |
implement comparisons
Diffstat (limited to 'src/parse.zig')
-rw-r--r-- | src/parse.zig | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/parse.zig b/src/parse.zig index e675fbe..efb5c8e 100644 --- a/src/parse.zig +++ b/src/parse.zig @@ -96,11 +96,19 @@ pub const Expr = struct { const Op = enum { plus, minus, + left_angle, + right_angle, + left_angle_equal, + right_angle_equal, pub fn format(self: Op, comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void { - try writer.writeByte(switch (self) { - .plus => '+', - .minus => '-', + try writer.writeAll(switch (self) { + .plus => "+", + .minus => "-", + .left_angle => "<", + .right_angle => ">", + .left_angle_equal => "<=", + .right_angle_equal => ">=", }); } }; @@ -210,7 +218,26 @@ pub fn statement(allocator: Allocator, lexer: *Lexer) ParseError!Stmt { } pub fn expression(allocator: Allocator, lexer: *Lexer) ParseError!*Expr { - return parseTerms(allocator, lexer); + return parseComparisons(allocator, lexer); +} + +pub fn parseComparisons(allocator: Allocator, lexer: *Lexer) ParseError!*Expr { + const lhs = try parseTerms(allocator, lexer); + + const op: Expr.Type.BinOp.Op = switch (lexer.peek().type) { + .left_angle => .left_angle, + .right_angle => .right_angle, + .left_angle_equal => .left_angle_equal, + .right_angle_equal => .right_angle_equal, + else => return lhs, + }; + _ = lexer.next(); + + const rhs = try parseTerms(allocator, lexer); + return try allocate(Expr, allocator, .{ + .loc = lhs.loc.combine(rhs.loc), + .type = .{ .bin_op = .{ .lhs = lhs, .op = op, .rhs = rhs } }, + }); } pub fn parseTerms(allocator: Allocator, lexer: *Lexer) !*Expr { |