aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Executor.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-11-07 15:54:07 +0000
committerMichael Williamson <mike@zwobble.org>2015-11-07 15:54:07 +0000
commitf7a7bfd4764f2787e022fc0a9dd8eb57c151e90d (patch)
tree8a164d4c1a4803c367c0ef4244a7689162474390 /src/main/java/org/zwobble/couscous/interpreter/Executor.java
parent5579d7b84fbfbaecb953d0a7a720eafe521f8bc7 (diff)
Add if-statement node
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Executor.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index e47106d..6f33b4d 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -3,19 +3,22 @@ package org.zwobble.couscous.interpreter;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
+
import org.zwobble.couscous.ast.CallableNode;
import org.zwobble.couscous.ast.ExpressionStatementNode;
+import org.zwobble.couscous.ast.IfStatementNode;
import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
import org.zwobble.couscous.ast.ReturnNode;
import org.zwobble.couscous.ast.StatementNode;
import org.zwobble.couscous.ast.VariableNode;
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;
+
import static org.zwobble.couscous.interpreter.Evaluator.eval;
public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> {
-
public static InterpreterValue callMethod(Environment environment, CallableNode method, Optional<InterpreterValue> thisValue, PositionalArguments arguments) {
final org.zwobble.couscous.interpreter.Environment innerEnvironment = buildEnvironment(environment, method, thisValue, arguments);
for (final org.zwobble.couscous.ast.StatementNode statement : method.getBody()) {
@@ -38,7 +41,6 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
private static Stream<VariableNode> findDeclarations(List<StatementNode> body) {
return body.stream().flatMap(statement -> statement.accept(new StatementNodeMapper<Stream<VariableNode>>(){
-
@Override
public Stream<VariableNode> visit(ReturnNode returnNode) {
return Stream.empty();
@@ -53,6 +55,12 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
public Stream<VariableNode> visit(LocalVariableDeclarationNode localVariableDeclaration) {
return Stream.of(localVariableDeclaration);
}
+
+ @Override
+ public Stream<VariableNode> visit(IfStatementNode ifStatement) {
+ // TODO: Handle declarations in branches
+ return Stream.empty();
+ }
}));
}
@@ -82,4 +90,23 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
environment.put(localVariableDeclaration, value);
return Optional.empty();
}
+
+ @Override
+ public Optional<InterpreterValue> visit(IfStatementNode ifStatement) {
+ BooleanInterpreterValue condition = (BooleanInterpreterValue) eval(environment, ifStatement.getCondition());
+ if (condition.getValue()) {
+ return exec(ifStatement.getTrueBranch());
+ }
+ return Optional.empty();
+ }
+
+ private Optional<InterpreterValue> exec(List<StatementNode> statements) {
+ for (StatementNode statement : statements) {
+ Optional<InterpreterValue> result = exec(environment, statement);
+ if (result.isPresent()) {
+ return result;
+ }
+ }
+ return Optional.empty();
+ }
} \ No newline at end of file