From b359b0456ccba2fbb83de950f5210cc6df8b5432 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Fri, 10 Mar 2017 10:53:23 -0500 Subject: Basic string operators --- dice-lang/src/bjc/dicelang/Evaluator.java | 46 ++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) (limited to 'dice-lang/src/bjc/dicelang/Evaluator.java') diff --git a/dice-lang/src/bjc/dicelang/Evaluator.java b/dice-lang/src/bjc/dicelang/Evaluator.java index 87980d4..551325a 100644 --- a/dice-lang/src/bjc/dicelang/Evaluator.java +++ b/dice-lang/src/bjc/dicelang/Evaluator.java @@ -119,6 +119,9 @@ public class Evaluator { } switch(ast.getHead().operatorType) { + /* + * @TODO move coercing to its own class + */ case COERCE: ITree toCoerce = ast.getChild(0); ITree retVal = new Tree<>(toCoerce.getHead()); @@ -221,12 +224,53 @@ public class Evaluator { return evaluateDiceBinary(binOp, left.getHead().resultVal, right.getHead().resultVal, ctx); + case STRCAT: + case STRREP: + return evaluateStringBinary(binOp, + left.getHead().resultVal, right.getHead().resultVal, + ctx); default: Errors.inst.printError(EK_EVAL_UNBIN, binOp.toString()); return new Tree<>(FAIL(ast)); } } + private ITree evaluateStringBinary(Token.Type op, + EvaluatorResult left, EvaluatorResult right, Context ctx) { + if(left.type != STRING) { + Errors.inst.printError(EK_EVAL_INVSTRING, left.type.toString()); + return new Tree<>(FAIL(left)); + } + + String strang = left.stringVal; + + switch(op) { + case STRCAT: + if(right.type != STRING) { + Errors.inst.printError(EK_EVAL_UNSTRING, right.type.toString()); + return new Tree<>(FAIL(right)); + } else { + String strung = right.stringVal; + return new Tree<>(new Node(Node.Type.RESULT, new EvaluatorResult(STRING, strang + strung))); + } + case STRREP: + if(right.type != INT) { + Errors.inst.printError(EK_EVAL_INVSTRING, right.type.toString()); + return new Tree<>(FAIL(right)); + } else { + String res = strang; + long count = right.intVal; + for(long i = 1; i < count; i++) { + res += strang; + } + return new Tree<>(new Node(Node.Type.RESULT, new EvaluatorResult(STRING, res))); + } + default: + Errors.inst.printError(EK_EVAL_UNSTRING, op.toString()); + return new Tree<>(FAIL()); + } + } + private ITree evaluateDiceBinary(Token.Type op, EvaluatorResult left, EvaluatorResult right, Context ctx) { EvaluatorResult res = null; @@ -434,7 +478,7 @@ public class Evaluator { res = new EvaluatorResult(DICE, tk.diceValue); break; case STRING_LIT: - res = new EvaluatorResult(STRING, eng.stringLits.get((int)(tk.intValue))); + res = new EvaluatorResult(STRING, eng.stringLiterals.get((int)(tk.intValue))); break; default: Errors.inst.printError(EK_EVAL_UNTOK, tk.type.toString()); -- cgit v1.2.3