aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-10 20:54:22 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-10 20:54:22 +0000
commit2b17c6b76596464a4cace039ace428c01aa4128c (patch)
tree7be2784f8a3cd4c1f5c94998a20aed75b5329b0f /src/main/java/org
parentb3a14193f1cd90a0f94270fa05d3239af4d5d47a (diff)
Combine code for reading conditions in interpreter
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java21
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java12
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);