summary refs log tree commit diff
path: root/src/parser.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.zig')
-rw-r--r--src/parser.zig36
1 files changed, 33 insertions, 3 deletions
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", .{});