diff options
| author | Bobby <[email protected]> | 2024-02-18 00:25:51 -0500 |
|---|---|---|
| committer | Bobby <[email protected]> | 2024-02-18 00:25:51 -0500 |
| commit | 6022da9a279b9a95bb839de765cf5e27a4c9138b (patch) | |
| tree | 1f625b4b5770968c95d992b3e125e0f72d939f62 | |
| parent | 8415754488747d96d40ffc5ff77631ef3cfec44a (diff) | |
| download | mana-6022da9a279b9a95bb839de765cf5e27a4c9138b.tar.xz mana-6022da9a279b9a95bb839de765cf5e27a4c9138b.zip | |
Eval Infix Integer Operator
| -rw-r--r-- | evaluator/evaluator.go | 32 | ||||
| -rw-r--r-- | evaluator/evaluator_test.go | 11 |
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 { |
