Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

60 rader
1.6 KiB

  1. package interpreter;
  2. import program.*;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. public class Interpreter extends ProgramVisitor {
  6. final Program program;
  7. final Map<String, Integer> valuation = new HashMap<>();
  8. public Map<String, Integer> getValuation() {
  9. Map<String, Integer> result = new HashMap<>();
  10. result.putAll(valuation);
  11. return result;
  12. }
  13. public Interpreter(Program program) {
  14. this.program = program;
  15. visit(program);
  16. }
  17. public Interpreter(Program program, Map<String, Integer> valuation) {
  18. this.program = program;
  19. this.valuation.putAll(valuation);
  20. visit(program);
  21. }
  22. @Override
  23. public void visitAssignment(Assignment assignment) {
  24. Evaluator evaluator = new Evaluator(assignment.expression, valuation);
  25. valuation.put(assignment.identifier.name, evaluator.eval());
  26. }
  27. @Override
  28. public void visitComposition(Composition composition) {
  29. visit(composition.first);
  30. visit(composition.second);
  31. }
  32. @Override
  33. public void visitConditional(Conditional conditional) {
  34. Evaluator evaluator = new Evaluator(conditional.condition, valuation);
  35. if (evaluator.eval() != 0) {
  36. visit(conditional.thenCase);
  37. } else {
  38. visit(conditional.elseCase);
  39. }
  40. }
  41. @Override
  42. public void visitLoop(Loop loop) {
  43. Evaluator evaluator = new Evaluator(loop.condition, valuation);
  44. if (evaluator.eval() != 0) {
  45. visit(new Composition(loop.program, loop));
  46. }
  47. }
  48. }