From 5f132c8422cb88e3f0ca266f4de9cc0129d44775 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Sat, 8 Mar 2025 20:53:46 +0100 Subject: Feature: Add support for GT and LT operators --- src/parser.zig | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'src/parser.zig') diff --git a/src/parser.zig b/src/parser.zig index f7a6806..ad2b8d0 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -30,10 +30,7 @@ pub const Node = union(enum) { condition: *Node, statements: []*Node, }, - EQUALITY_EXPRESSION: struct { - lhs: *Node, - rhs: *Node, - }, + EQUALITY_EXPRESSION: struct { lhs: *Node, rhs: *Node, typ: EqualityExpressionType }, ADDITIVE_EXPRESSION: struct { addition: bool, lhs: *Node, @@ -79,6 +76,12 @@ pub const Node = union(enum) { }, }; +pub const EqualityExpressionType = enum { + EQ, + LT, + GT, +}; + pub const Parser = struct { tokens: []tokenizer.Token, offset: u32, @@ -266,20 +269,38 @@ pub const Parser = struct { return ParserError.ParsingError; } - // EqualityExpression ::= AdditiveExpression "==" AdditiveExpression + // EqualityExpression ::= AdditiveExpression ("==" | "<" | ">") AdditiveExpression fn parse_equality_expression(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing equality expression {any}\n", .{self.peek_token()}); const lhs = try self.parse_additive_expression(); - _ = try self.parse_token(tokenizer.TokenType.EQUALS); - _ = try self.parse_token(tokenizer.TokenType.EQUALS); + var typ: EqualityExpressionType = undefined; + + if (self.accept_parse(struct { + fn parse(iself: *Parser) ParserError!*Node { + _ = try iself.parse_token(tokenizer.TokenType.EQUALS); + _ = try iself.parse_token(tokenizer.TokenType.EQUALS); + return try iself.create_node(.{ .PROGRAM = .{ + .statements = &[_]*Node{}, + } }); + } + }.parse) != null) { + typ = .EQ; + } else if (self.accept_token(tokenizer.TokenType.LESS) != null) { + typ = .LT; + } else if (self.accept_token(tokenizer.TokenType.GREATER) != null) { + typ = .GT; + } else { + return ParserError.ParsingError; + } const rhs = try self.parse_additive_expression(); return self.create_node(.{ .EQUALITY_EXPRESSION = .{ .lhs = lhs, .rhs = rhs, + .typ = typ, } }); } -- cgit 1.4.1