From f7a7bfd4764f2787e022fc0a9dd8eb57c151e90d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 7 Nov 2015 15:54:07 +0000 Subject: Add if-statement node --- .../org/zwobble/couscous/interpreter/Executor.java | 31 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/interpreter/Executor.java') 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> { - public static InterpreterValue callMethod(Environment environment, CallableNode method, Optional 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> private static Stream findDeclarations(List body) { return body.stream().flatMap(statement -> statement.accept(new StatementNodeMapper>(){ - @Override public Stream visit(ReturnNode returnNode) { return Stream.empty(); @@ -53,6 +55,12 @@ public class Executor implements StatementNodeMapper> public Stream visit(LocalVariableDeclarationNode localVariableDeclaration) { return Stream.of(localVariableDeclaration); } + + @Override + public Stream visit(IfStatementNode ifStatement) { + // TODO: Handle declarations in branches + return Stream.empty(); + } })); } @@ -82,4 +90,23 @@ public class Executor implements StatementNodeMapper> environment.put(localVariableDeclaration, value); return Optional.empty(); } + + @Override + public Optional visit(IfStatementNode ifStatement) { + BooleanInterpreterValue condition = (BooleanInterpreterValue) eval(environment, ifStatement.getCondition()); + if (condition.getValue()) { + return exec(ifStatement.getTrueBranch()); + } + return Optional.empty(); + } + + private Optional exec(List statements) { + for (StatementNode statement : statements) { + Optional result = exec(environment, statement); + if (result.isPresent()) { + return result; + } + } + return Optional.empty(); + } } \ No newline at end of file -- cgit v1.2.3