diff options
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 { |