From 6022da9a279b9a95bb839de765cf5e27a4c9138b Mon Sep 17 00:00:00 2001 From: Bobby Date: Sun, 18 Feb 2024 00:25:51 -0500 Subject: Eval Infix Integer Operator --- evaluator/evaluator.go | 32 ++++++++++++++++++++++++++++++++ evaluator/evaluator_test.go | 11 +++++++++++ 2 files changed, 43 insertions(+) (limited to 'evaluator') 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 { -- cgit v1.2.3