diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-11-07 15:54:07 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-11-07 15:54:07 +0000 |
| commit | f7a7bfd4764f2787e022fc0a9dd8eb57c151e90d (patch) | |
| tree | 8a164d4c1a4803c367c0ef4244a7689162474390 /src/main/java/org/zwobble/couscous/interpreter/Executor.java | |
| parent | 5579d7b84fbfbaecb953d0a7a720eafe521f8bc7 (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.java | 31 |
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 |
