From 7f86e0dc92670dd5da34cd22c36aba18fa58ec6d Mon Sep 17 00:00:00 2001 From: Mathias Magnusson Date: Thu, 3 Jul 2025 23:00:50 +0200 Subject: implement comparisons --- src/parse.zig | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'src/parse.zig') 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 { -- cgit v1.2.3