summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/v2/Evaluator.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2017-02-24 04:15:20 -0500
committerbculkin2442 <bjculkin@mix.wvu.edu>2017-02-24 04:15:20 -0500
commit5e246adccf986af9dd032d6e8645ddd5d2a577d4 (patch)
tree96cc49b43b32f1b38e4d848419d2b23a4c74b217 /dice-lang/src/bjc/dicelang/v2/Evaluator.java
parenta942114b89013732a2be3092cdb65cafc4566fe0 (diff)
Work on unary operators
Specifically, the coercive operator for allowing mixing floats and ints
Diffstat (limited to 'dice-lang/src/bjc/dicelang/v2/Evaluator.java')
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Evaluator.java24
1 files changed, 22 insertions, 2 deletions
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<Node> evaluateNode(ITree<Node> 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<Node> evaluateUnaryOp(ITree<Node> 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<Node> evaluateBinaryOp(ITree<Node> ast, Context ctx) {
Token.Type binOp = ast.getHead().operatorType;