diff options
Diffstat (limited to 'src/main/java/org')
3 files changed, 31 insertions, 12 deletions
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<Integer, InterpreterValue> stackFrame; + + public Environment(Map<Integer, InterpreterValue> 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<InterpreterValue> { - private final Map<Integer, InterpreterValue> stackFrame; + private final Environment environment; - public Evaluator(Map<Integer, InterpreterValue> 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<InterpreterValue> { @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<Integer, InterpreterValue> buildStackFrame( + private Environment buildEnvironment( final MethodNode method, List<InterpreterValue> 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<Optional<InterpreterValue>> { |
