Forráskód Böngészése

infix expression object evaluator

simon 3 éve
szülő
commit
7542d43226
2 módosított fájl, 48 hozzáadás és 0 törlés
  1. 39 0
      evaluator/evaluator.go
  2. 9 0
      evaluator/evaluator_test.go

+ 39 - 0
evaluator/evaluator.go

@@ -28,6 +28,10 @@ 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
@@ -60,6 +64,41 @@ func evalPrefixExpression(operator string, right object.Object) object.Object {
 		return NULL
 	}
 }
+func evalInfixExpression(operator string, left object.Object, right object.Object) object.Object {
+	switch {
+	case left.Type() == object.IntegerObj && right.Type() == object.IntegerObj:
+		return evalIntegerInfixExpression(operator, left, right)
+	default:
+		return NULL
+	}
+}
+
+func evalIntegerInfixExpression(operator string,
+	left object.Object, right object.Object) object.Object {
+	leftVal := left.(*object.Integer).Value
+	rightVal := right.(*object.Integer).Value
+
+	switch operator {
+	case "+":
+		return &object.Integer{Value: leftVal + rightVal}
+	case "-":
+		return &object.Integer{Value: leftVal - rightVal}
+	case "*":
+		return &object.Integer{Value: leftVal * rightVal}
+	case "/":
+		return &object.Integer{Value: leftVal / rightVal}
+	case "<":
+		return nativeBooleanObject(leftVal < rightVal)
+	case ">":
+		return nativeBooleanObject(leftVal > rightVal)
+	case "==":
+		return nativeBooleanObject(leftVal == rightVal)
+	case "!=":
+		return nativeBooleanObject(leftVal != rightVal)
+	default:
+		return NULL
+	}
+}
 
 func evalMinusPreOperatorExpression(right object.Object) object.Object {
 	if right.Type() != object.IntegerObj {

+ 9 - 0
evaluator/evaluator_test.go

@@ -16,6 +16,9 @@ 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},
 	}
 
 	for _, tt := range tests {
@@ -31,6 +34,12 @@ func TestEvalBooleanExpression(t *testing.T) {
 	}{
 		{"true", true},
 		{"false", false},
+		{"1 < 2", true},
+		{"1 > 2", false},
+		{"1 == 1", true},
+		{"1 != 1", false},
+		{"1 == 2", false},
+		{"1 != 2", true},
 	}
 
 	for _, tt := range tests {