aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-02-18 00:25:51 -0500
committerBobby <[email protected]>2024-02-18 00:25:51 -0500
commit6022da9a279b9a95bb839de765cf5e27a4c9138b (patch)
tree1f625b4b5770968c95d992b3e125e0f72d939f62
parent8415754488747d96d40ffc5ff77631ef3cfec44a (diff)
downloadmana-6022da9a279b9a95bb839de765cf5e27a4c9138b.tar.xz
mana-6022da9a279b9a95bb839de765cf5e27a4c9138b.zip
Eval Infix Integer Operator
-rw-r--r--evaluator/evaluator.go32
-rw-r--r--evaluator/evaluator_test.go11
2 files changed, 43 insertions, 0 deletions
diff --git a/evaluator/evaluator.go b/evaluator/evaluator.go
index b8940a9..5d69e2b 100644
--- a/evaluator/evaluator.go
+++ b/evaluator/evaluator.go
@@ -31,6 +31,11 @@ func Eval(node ast.Node) object.Object {
case *ast.PrefixExpression:
right := Eval(node.Right)
return evalPrefixExpression(node.Operator, right)
+
+ case *ast.InfixExpression:
+ left := Eval(node.Left)
+ right := Eval(node.Right)
+ return evalInfixExpression(node.Operator, left, right)
}
return nil
@@ -64,6 +69,15 @@ func evalPrefixExpression(operator string, right object.Object) object.Object {
}
}
+func evalInfixExpression(operator string, left, right object.Object) object.Object {
+ switch {
+ case left.Type() == object.INTEGER_OBJ && right.Type() == object.INTEGER_OBJ:
+ return evalIntegerInfixExpression(operator, left, right)
+ default:
+ return NULL
+ }
+}
+
func evalBangOperatorExpression(right object.Object) object.Object {
switch right {
case TRUE:
@@ -85,3 +99,21 @@ func evalMinusPrefixOperatorExpression(right object.Object) object.Object {
value := right.(*object.Integer).Value
return &object.Integer{Value: -value}
}
+
+func evalIntegerInfixExpression(operator string, left, right object.Object) object.Object {
+ leftValue := left.(*object.Integer).Value
+ rightValue := right.(*object.Integer).Value
+
+ switch operator {
+ case "+":
+ return &object.Integer{Value: leftValue + rightValue}
+ case "-":
+ return &object.Integer{Value: leftValue - rightValue}
+ case "*":
+ return &object.Integer{Value: leftValue * rightValue}
+ case "/":
+ return &object.Integer{Value: leftValue / rightValue}
+ default:
+ return NULL
+ }
+}
diff --git a/evaluator/evaluator_test.go b/evaluator/evaluator_test.go
index 1221de6..f0a5180 100644
--- a/evaluator/evaluator_test.go
+++ b/evaluator/evaluator_test.go
@@ -17,6 +17,17 @@ func TestEvalIntegerExpression(t *testing.T) {
{"10", 10},
{"-5", -5},
{"-10", -10},
+ {"5 + 5 + 5 + 5 - 10", 10},
+ {"2 * 2 * 2 * 2 * 2", 32},
+ {"-50 + 100 + -50", 0},
+ {"5 * 2 + 10", 20},
+ {"5 + 2 * 10", 25},
+ {"20 + 2 * -10", 0},
+ {"50 / 2 * 2 + 10", 60},
+ {"2 * (5 + 10)", 30},
+ {"3 * 3 * 3 + 10", 37},
+ {"3 * (3 * 3) + 10", 37},
+ {"(5 + 10 * 2 + 15 / 3) * 2 + -10", 50},
}
for _, tt := range tests {