aboutsummaryrefslogtreecommitdiff
path: root/src/parse.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.zig')
-rw-r--r--src/parse.zig35
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 {