diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-09-29 20:19:28 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-09-29 20:19:28 +0100 |
| commit | a6447679032d997d861f4f397ae3e21806726739 (patch) | |
| tree | 5dd39e577f7f630ba4871302a21121dc3461135c /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | |
| parent | ccac9247fe4663874be8026ab9cc968ecec7157b (diff) | |
Move Evaluator to its own class
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java new file mode 100644 index 0000000..033bfb8 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -0,0 +1,41 @@ +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; +import org.zwobble.couscous.ast.VariableReferenceNode; +import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; +import org.zwobble.couscous.values.InterpreterValue; + +import lombok.val; + +public class Evaluator implements ExpressionNodeVisitor<InterpreterValue> { + private final Map<Integer, InterpreterValue> stackFrame; + + public Evaluator(Map<Integer, InterpreterValue> stackFrame) { + this.stackFrame = stackFrame; + } + + public InterpreterValue eval(ExpressionNode expression) { + return expression.accept(this); + } + + @Override + public InterpreterValue visit(LiteralNode literal) { + return literal.getValue(); + } + + @Override + public InterpreterValue visit(VariableReferenceNode variableReference) { + return stackFrame.get(variableReference.getReferentId()); + } + + @Override + public InterpreterValue visit(Assignment assignment) { + val value = eval(assignment.getValue()); + stackFrame.put(assignment.getTarget().getReferentId(), value); + return value; + } +} |
