package interpreter; import program.*; import java.util.HashMap; import java.util.Map; public class Interpreter extends ProgramVisitor { final Program program; final Map valuation = new HashMap<>(); public Map getValuation() { Map result = new HashMap<>(); result.putAll(valuation); return result; } public Interpreter(Program program) { this.program = program; visit(program); } public Interpreter(Program program, Map valuation) { this.program = program; this.valuation.putAll(valuation); visit(program); } @Override public void visitAssignment(Assignment assignment) { Evaluator evaluator = new Evaluator(assignment.expression, valuation); valuation.put(assignment.identifier.name, evaluator.eval()); } @Override public void visitComposition(Composition composition) { visit(composition.first); visit(composition.second); } @Override public void visitConditional(Conditional conditional) { Evaluator evaluator = new Evaluator(conditional.condition, valuation); if (evaluator.eval() != 0) { visit(conditional.thenCase); } else { visit(conditional.elseCase); } } @Override public void visitLoop(Loop loop) { Evaluator evaluator = new Evaluator(loop.condition, valuation); if (evaluator.eval() != 0) { visit(new Composition(loop.program, loop)); } } }