From 6d1d1355379feb3273c3634adfc50a1876c40314 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Wed, 22 Jan 2025 00:25:22 +0100 Subject: Feature: Add support for division and multiplication --- src/parser.zig | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'src/parser.zig') diff --git a/src/parser.zig b/src/parser.zig index 13509ea..966cad3 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -15,6 +15,7 @@ const NodeType = enum { WHILE_STATEMENT, EQUALITY_EXPRESSION, ADDITIVE_EXPRESSION, + MULTIPLICATIVE_EXPRESSION, UNARY_EXPRESSION, PRIMARY_EXPRESSION, FUNCTION_DEFINITION, @@ -54,6 +55,11 @@ pub const Node = union(NodeType) { lhs: *Node, rhs: *Node, }, + MULTIPLICATIVE_EXPRESSION: struct { + multiplication: bool, + lhs: *Node, + rhs: *Node, + }, UNARY_EXPRESSION: struct { negation: bool, expression: *Node, @@ -268,11 +274,11 @@ pub const Parser = struct { } }); } - // AdditiveExpression ::= UnaryExpression (("+" | "-") UnaryExpression)* + // AdditiveExpression ::= MultiplicativeExpression (("+" | "-") MultiplicativeExpression)* fn parse_additive_expression(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing additive expression\n", .{}); - var lhs = try self.parse_unary_expression(); + var lhs = try self.parse_multiplicative_expression(); while (true) { const plus = self.accept_token(tokenizer.TokenType.PLUS); @@ -280,7 +286,7 @@ pub const Parser = struct { if (plus == null and minus == null) break; - const rhs = try self.parse_unary_expression(); + const rhs = try self.parse_multiplicative_expression(); lhs = try self.create_node(.{ .ADDITIVE_EXPRESSION = .{ .addition = plus != null, @@ -292,6 +298,30 @@ pub const Parser = struct { return lhs; } + // MultiplicativeExpression ::= UnaryExpression (("*" | "/") UnaryExpression)* + fn parse_multiplicative_expression(self: *Parser) ParserError!*Node { + errdefer if (!self.try_context) std.debug.print("Error parsing additive expression\n", .{}); + + var lhs = try self.parse_unary_expression(); + + while (true) { + const mul = self.accept_token(tokenizer.TokenType.MUL); + const div = self.accept_token(tokenizer.TokenType.DIV); + + if (mul == null and div == null) break; + + const rhs = try self.parse_unary_expression(); + + lhs = try self.create_node(.{ .MULTIPLICATIVE_EXPRESSION = .{ + .multiplication = mul != null, + .lhs = lhs, + .rhs = rhs, + } }); + } + + return lhs; + } + // UnaryExpression ::= "!" UnaryExpression | PrimaryExpression fn parse_unary_expression(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing unary expression\n", .{}); -- cgit 1.4.1