From fec7b703498ff1ed0b0d31ed602e0ba9459985f1 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 29 Sep 2015 20:23:15 +0100 Subject: Extract Environment class --- .../zwobble/couscous/interpreter/Environment.java | 21 +++++++++++++++++++++ .../org/zwobble/couscous/interpreter/Evaluator.java | 12 +++++------- .../zwobble/couscous/interpreter/Interpreter.java | 10 +++++----- 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/interpreter/Environment.java (limited to 'src') diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java new file mode 100644 index 0000000..ef91916 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java @@ -0,0 +1,21 @@ +package org.zwobble.couscous.interpreter; + +import java.util.Map; + +import org.zwobble.couscous.values.InterpreterValue; + +public class Environment { + private Map stackFrame; + + public Environment(Map stackFrame) { + this.stackFrame = stackFrame; + } + + public InterpreterValue get(int referentId) { + return stackFrame.get(referentId); + } + + public void put(int referentId, InterpreterValue value) { + stackFrame.put(referentId, value); + } +} diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index 033bfb8..02acbe3 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -1,7 +1,5 @@ package org.zwobble.couscous.interpreter; -import java.util.Map; - import org.zwobble.couscous.ast.Assignment; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.LiteralNode; @@ -12,10 +10,10 @@ import org.zwobble.couscous.values.InterpreterValue; import lombok.val; public class Evaluator implements ExpressionNodeVisitor { - private final Map stackFrame; + private final Environment environment; - public Evaluator(Map stackFrame) { - this.stackFrame = stackFrame; + public Evaluator(Environment environment) { + this.environment = environment; } public InterpreterValue eval(ExpressionNode expression) { @@ -29,13 +27,13 @@ public class Evaluator implements ExpressionNodeVisitor { @Override public InterpreterValue visit(VariableReferenceNode variableReference) { - return stackFrame.get(variableReference.getReferentId()); + return environment.get(variableReference.getReferentId()); } @Override public InterpreterValue visit(Assignment assignment) { val value = eval(assignment.getValue()); - stackFrame.put(assignment.getTarget().getReferentId(), value); + environment.put(assignment.getTarget().getReferentId(), value); return value; } } diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java index 8bf6479..d68f4df 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java @@ -1,7 +1,6 @@ package org.zwobble.couscous.interpreter; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.stream.IntStream; @@ -29,10 +28,10 @@ public class Interpreter { val clazz = project.findClass(className); val method = find(clazz.getMethods(), method -> method.getName().equals(methodName)); - val stackFrame = buildStackFrame(method, arguments); + val environment = buildEnvironment(method, arguments); for (val statement : method.getBody()) { - val result = statement.accept(new Executor(new Evaluator(stackFrame))); + val result = statement.accept(new Executor(new Evaluator(environment))); if (result.isPresent()) { return result.get(); } @@ -40,7 +39,7 @@ public class Interpreter { return UNIT; } - private Map buildStackFrame( + private Environment buildEnvironment( final MethodNode method, List arguments) { @@ -48,11 +47,12 @@ public class Interpreter { throw new WrongNumberOfArguments(method.getArguments().size(), arguments.size()); } - return IntStream.range(0, method.getArguments().size()) + val stackFrame = IntStream.range(0, method.getArguments().size()) .boxed() .collect(toMap( index -> method.getArguments().get(index).getId(), index -> arguments.get(index))); + return new Environment(stackFrame); } private class Executor implements StatementNodeVisitor> { -- cgit v1.2.3