|
|
@@ -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 {
|