diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | 21 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Executor.java | 12 |
2 files changed, 18 insertions, 15 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index 3bcf3ac..e715caa 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -18,6 +18,10 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> { public static InterpreterValue eval(Environment environment, ExpressionNode expression) { return new Evaluator(environment).eval(expression); } + + public static boolean evalCondition(Environment environment, ExpressionNode expression) { + return new Evaluator(environment).evalCondition(expression); + } private final Environment environment; @@ -67,14 +71,19 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> { @Override public InterpreterValue visit(TernaryConditionalNode ternaryConditional) { - InterpreterValue condition = eval(ternaryConditional.getCondition()); - if (!(condition instanceof BooleanInterpreterValue)) { - throw new ConditionMustBeBoolean(condition); - } - final org.zwobble.couscous.ast.ExpressionNode branch = ((BooleanInterpreterValue)condition).getValue() ? ternaryConditional.getIfTrue() : ternaryConditional.getIfFalse(); + boolean condition = evalCondition(ternaryConditional.getCondition()); + ExpressionNode branch = condition ? ternaryConditional.getIfTrue() : ternaryConditional.getIfFalse(); return eval(branch); } - + + private boolean evalCondition(ExpressionNode condition) { + InterpreterValue value = eval(condition); + if (!(value instanceof BooleanInterpreterValue)) { + throw new ConditionMustBeBoolean(value); + } + return ((BooleanInterpreterValue)value).getValue(); + } + @Override public InterpreterValue visit(MethodCallNode methodCall) { List<InterpreterValue> arguments = evalArguments(methodCall.getArguments()); diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java index 556e7d1..6de4828 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java @@ -1,10 +1,8 @@ package org.zwobble.couscous.interpreter; import org.zwobble.couscous.ast.*; -import org.zwobble.couscous.ast.structure.NodeStructure; import org.zwobble.couscous.ast.visitors.NodeMapperWithDefault; import org.zwobble.couscous.ast.visitors.StatementNodeMapper; -import org.zwobble.couscous.interpreter.values.BooleanInterpreterValue; import org.zwobble.couscous.interpreter.values.InterpreterValue; import org.zwobble.couscous.interpreter.values.UnitInterpreterValue; @@ -14,6 +12,7 @@ import java.util.stream.Stream; import static org.zwobble.couscous.ast.structure.NodeStructure.descendantNodesAndSelf; import static org.zwobble.couscous.interpreter.Evaluator.eval; +import static org.zwobble.couscous.interpreter.Evaluator.evalCondition; public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> { public static InterpreterValue callMethod(Environment environment, CallableNode method, Optional<InterpreterValue> thisValue, PositionalArguments arguments) { @@ -76,7 +75,7 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> @Override public Optional<InterpreterValue> visit(IfStatementNode ifStatement) { - List<StatementNode> body = evalCondition(ifStatement.getCondition()) + List<StatementNode> body = evalCondition(environment, ifStatement.getCondition()) ? ifStatement.getTrueBranch() : ifStatement.getFalseBranch(); return exec(body); @@ -84,7 +83,7 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> @Override public Optional<InterpreterValue> visit(WhileNode whileLoop) { - while (evalCondition(whileLoop.getCondition())) { + while (evalCondition(environment, whileLoop.getCondition())) { Optional<InterpreterValue> result = exec(whileLoop.getBody()); if (result.isPresent()) { return result; @@ -93,11 +92,6 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> return Optional.empty(); } - private boolean evalCondition(ExpressionNode conditionExpression) { - BooleanInterpreterValue condition = (BooleanInterpreterValue) eval(environment, conditionExpression); - return condition.getValue(); - } - private Optional<InterpreterValue> exec(List<StatementNode> statements) { for (StatementNode statement : statements) { Optional<InterpreterValue> result = exec(environment, statement); |
