From 0ae6498192f838d091ef61c8e8518ec938cefd19 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Tue, 21 Jan 2025 00:10:04 +0100 Subject: Parser: Make additive expression left associative --- src/parser.zig | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/parser.zig b/src/parser.zig index 76f2127..eead436 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -251,17 +251,21 @@ pub const Parser = struct { } }); } - // AdditiveExpression ::= PrimaryExpression (("+" | "-") AdditiveExpression)? + // AdditiveExpression ::= PrimaryExpression (("+" | "-") PrimaryExpression)* fn parse_additive_expression(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing additive expression\n", .{}); - const lhs = try self.parse_primary_expression(); + var lhs = try self.parse_primary_expression(); - const plus = self.accept_token(tokenizer.TokenType.PLUS); - const minus = self.accept_token(tokenizer.TokenType.MINUS); - if (plus != null or minus != null) { - const rhs = try self.parse_additive_expression(); - return self.create_node(.{ .ADDITIVE_EXPRESSION = .{ + while (true) { + const plus = self.accept_token(tokenizer.TokenType.PLUS); + const minus = self.accept_token(tokenizer.TokenType.MINUS); + + if (plus == null and minus == null) break; + + const rhs = try self.parse_primary_expression(); + + lhs = try self.create_node(.{ .ADDITIVE_EXPRESSION = .{ .addition = plus != null, .lhs = lhs, .rhs = rhs, -- cgit 1.4.1