From 5e246adccf986af9dd032d6e8645ddd5d2a577d4 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Fri, 24 Feb 2017 04:15:20 -0500 Subject: Work on unary operators Specifically, the coercive operator for allowing mixing floats and ints --- dice-lang/src/bjc/dicelang/v2/Evaluator.java | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'dice-lang/src/bjc/dicelang/v2/Evaluator.java') diff --git a/dice-lang/src/bjc/dicelang/v2/Evaluator.java b/dice-lang/src/bjc/dicelang/v2/Evaluator.java index 72d7779..969b2d5 100644 --- a/dice-lang/src/bjc/dicelang/v2/Evaluator.java +++ b/dice-lang/src/bjc/dicelang/v2/Evaluator.java @@ -158,6 +158,13 @@ public class Evaluator { private TopDownTransformResult pickEvaluationType(Node nd) { switch(nd.type) { + case UNARYOP: + switch(nd.operatorType) { + case COERCE: + return TopDownTransformResult.PULLUP; + default: + return TopDownTransformResult.PUSHDOWN; + } default: return TopDownTransformResult.PUSHDOWN; } @@ -166,8 +173,7 @@ public class Evaluator { private ITree evaluateNode(ITree ast, Context ctx) { switch(ast.getHead().type) { case UNARYOP: - System.out.println("\tEVALUATOR ERROR: Unary operator evaluation isn't supported yet"); - return new Tree<>(FAIL(ast)); + return evaluateUnaryOp(ast, ctx); case BINOP: return evaluateBinaryOp(ast, ctx); case TOKREF: @@ -180,6 +186,20 @@ public class Evaluator { } } + private ITree evaluateUnaryOp(ITree ast, Context ctx) { + switch(ast.getHead().operatorType) { + case COERCE: + if(ast.getChildrenCount() != 1) { + Errors.inst.printError(EK_EVAL_NOTUNARY, ast.getChildrenCount()); + return new Tree<>(FAIL(AST)); + } + break; + default: + Errors.inst.printError(EK_EVAL_INVUNARY, ast.getHead().operatorType.toString()); + return new Tree<>(FAIL(ast)); + } + } + private ITree evaluateBinaryOp(ITree ast, Context ctx) { Token.Type binOp = ast.getHead().operatorType; -- cgit v1.2.3