about summary refs log tree commit diff
path: root/src/evaluator.zig
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-03-12 00:47:31 +0100
committerBaitinq <[email protected]>2025-03-12 00:47:43 +0100
commitda0788140e7afbc9b0bcbb937a29e2b08de08ec7 (patch)
treeef6435c7c91f40926f01f5faa9b4dbc2946a5caf /src/evaluator.zig
parentCodegen: add bundled llvm (diff)
parentCodegen: Fix bug with functions without name (diff)
downloadinterpreter-da0788140e7afbc9b0bcbb937a29e2b08de08ec7.tar.gz
interpreter-da0788140e7afbc9b0bcbb937a29e2b08de08ec7.tar.bz2
interpreter-da0788140e7afbc9b0bcbb937a29e2b08de08ec7.zip
Merge branch 'master' into native-llvm
Diffstat (limited to 'src/evaluator.zig')
-rw-r--r--src/evaluator.zig13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/evaluator.zig b/src/evaluator.zig
index 43380a1..fef08a2 100644
--- a/src/evaluator.zig
+++ b/src/evaluator.zig
@@ -177,8 +177,11 @@ pub const Evaluator = struct {
                 const lhs = try self.get_expression_value(x.lhs) orelse return EvaluatorError.EvaluationError;
                 const rhs = try self.get_expression_value(x.rhs) orelse return EvaluatorError.EvaluationError;
                 std.debug.assert(lhs.* == .NUMBER and rhs.* == .NUMBER);
-                if (x.multiplication) return try self.create_variable(.{ .NUMBER = lhs.NUMBER * rhs.NUMBER });
-                return try self.create_variable(.{ .NUMBER = @divFloor(lhs.NUMBER, rhs.NUMBER) });
+                switch (x.typ) {
+                    .MUL => return try self.create_variable(.{ .NUMBER = lhs.NUMBER * rhs.NUMBER }),
+                    .DIV => return try self.create_variable(.{ .NUMBER = @divFloor(lhs.NUMBER, rhs.NUMBER) }),
+                    .MOD => return try self.create_variable(.{ .NUMBER = @rem(lhs.NUMBER, rhs.NUMBER) }),
+                }
             },
             .UNARY_EXPRESSION => |x| {
                 const val = try self.get_expression_value(x.expression) orelse return EvaluatorError.EvaluationError;
@@ -193,7 +196,11 @@ pub const Evaluator = struct {
                 const lhs = try self.get_expression_value(x.lhs) orelse return EvaluatorError.EvaluationError;
                 const rhs = try self.get_expression_value(x.rhs) orelse return EvaluatorError.EvaluationError;
                 std.debug.assert(lhs.* == .NUMBER and rhs.* == .NUMBER); //TODO: Generic
-                return try self.create_variable(.{ .BOOLEAN = (lhs.NUMBER == rhs.NUMBER) });
+                switch (x.typ) {
+                    .EQ => return try self.create_variable(.{ .BOOLEAN = (lhs.NUMBER == rhs.NUMBER) }),
+                    .GT => return try self.create_variable(.{ .BOOLEAN = (lhs.NUMBER > rhs.NUMBER) }),
+                    .LT => return try self.create_variable(.{ .BOOLEAN = (lhs.NUMBER < rhs.NUMBER) }),
+                }
             },
             .PRIMARY_EXPRESSION => |x| {
                 switch (x) {