diff --git a/go/src/miller/dsl/interpreter.go b/go/src/miller/dsl/interpreter.go index ec7d09b47..b7e1cc41d 100644 --- a/go/src/miller/dsl/interpreter.go +++ b/go/src/miller/dsl/interpreter.go @@ -114,7 +114,8 @@ func (this *Interpreter) evaluateNode( break case NodeTypeOperator: this.checkArity(node, 2) // xxx temp -- binary-only for now - return "", errors.New("unhandled") + return this.evaluateBinaryOperatorNode(node, node.Children[0], node.Children[1], + inrec, context) break case NodeTypeContextVariable: return this.evaluateContextVariableNode(node, context) @@ -151,3 +152,44 @@ func (this *Interpreter) evaluateContextVariableNode( } return "", errors.New("internal coding error") // xxx libify } + +func (this *Interpreter) evaluateBinaryOperatorNode( + node *ASTNode, + leftChild *ASTNode, + rightChild *ASTNode, + inrec *containers.Lrec, + context *runtime.Context, +) (string, error) { + sval := string(node.Token.Lit) + + leftValue, leftErr := this.evaluateNode(leftChild, inrec, context) + if leftErr != nil { + return "", leftErr + } + rightValue, rightErr := this.evaluateNode(rightChild, inrec, context) + if rightErr != nil { + return "", rightErr + } + + switch sval { + case ".": + return leftValue + rightValue, nil + break + case "+": + return "", errors.New("unhandled") + break + case "-": + return "", errors.New("unhandled") + break + case "*": + return "", errors.New("unhandled") + break + case "/": + return "", errors.New("unhandled") + break + case "//": + return "", errors.New("unhandled") + break + } + return "", errors.New("internal coding error") // xxx libify +}