| @@ -5,7 +5,7 @@ import expression.*; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| public class Evaluator extends ExpressionVisitor<Integer> { | |||||
| public class Evaluator extends Visitor<Integer> { | |||||
| final Expression expression; | final Expression expression; | ||||
| final Map<String, Integer> valuation = new HashMap<>(); | final Map<String, Integer> valuation = new HashMap<>(); | ||||
| @@ -19,22 +19,18 @@ public class Evaluator extends ExpressionVisitor<Integer> { | |||||
| return visit(expression); | return visit(expression); | ||||
| } | } | ||||
| @Override | |||||
| public Integer visitAddition(Addition addition) { | public Integer visitAddition(Addition addition) { | ||||
| return visit(addition.leftHandSide) + visit(addition.rightHandSide); | return visit(addition.leftHandSide) + visit(addition.rightHandSide); | ||||
| } | } | ||||
| @Override | |||||
| public Integer visitSubtraction(Subtraction subtraction) { | public Integer visitSubtraction(Subtraction subtraction) { | ||||
| return visit(subtraction.leftHandSide) - visit(subtraction.rightHandSide); | return visit(subtraction.leftHandSide) - visit(subtraction.rightHandSide); | ||||
| } | } | ||||
| @Override | |||||
| public Integer visitInt(Int integer) { | public Integer visitInt(Int integer) { | ||||
| return integer.value; | return integer.value; | ||||
| } | } | ||||
| @Override | |||||
| public Integer visitIdentifier(Identifier identifier) { | public Integer visitIdentifier(Identifier identifier) { | ||||
| if (valuation.containsKey(identifier.name)) { | if (valuation.containsKey(identifier.name)) { | ||||
| return valuation.get(identifier.name); | return valuation.get(identifier.name); | ||||
| @@ -1,28 +0,0 @@ | |||||
| package interpreter; | |||||
| import expression.*; | |||||
| import java.lang.reflect.Method; | |||||
| public abstract class ExpressionVisitor<T> { | |||||
| public T visit(Expression expression) { | |||||
| String methodName = "visit" + expression.getClass().getSimpleName(); | |||||
| Method method; | |||||
| try { | |||||
| method = this.getClass().getMethod(methodName, expression.getClass()); | |||||
| } catch (NoSuchMethodException e) { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| Object result; | |||||
| try { | |||||
| result = method.invoke(this, expression); | |||||
| } catch (Exception e) { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| return (T) result; | |||||
| } | |||||
| public abstract T visitAddition(Addition addition); | |||||
| public abstract T visitSubtraction(Subtraction subtraction); | |||||
| public abstract T visitInt(Int integer); | |||||
| public abstract T visitIdentifier(Identifier identifier); | |||||
| } | |||||
| @@ -5,7 +5,7 @@ import program.*; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| public class Interpreter extends ProgramVisitor { | |||||
| public class Interpreter extends Visitor { | |||||
| final Program program; | final Program program; | ||||
| final Map<String, Integer> valuation = new HashMap<>(); | final Map<String, Integer> valuation = new HashMap<>(); | ||||
| @@ -20,19 +20,16 @@ public class Interpreter extends ProgramVisitor { | |||||
| visit(program); | visit(program); | ||||
| } | } | ||||
| @Override | |||||
| public void visitAssignment(Assignment assignment) { | public void visitAssignment(Assignment assignment) { | ||||
| Evaluator evaluator = new Evaluator(assignment.expression, valuation); | Evaluator evaluator = new Evaluator(assignment.expression, valuation); | ||||
| valuation.put(assignment.identifier.name, evaluator.eval()); | valuation.put(assignment.identifier.name, evaluator.eval()); | ||||
| } | } | ||||
| @Override | |||||
| public void visitComposition(Composition composition) { | public void visitComposition(Composition composition) { | ||||
| visit(composition.first); | visit(composition.first); | ||||
| visit(composition.second); | visit(composition.second); | ||||
| } | } | ||||
| @Override | |||||
| public void visitConditional(Conditional conditional) { | public void visitConditional(Conditional conditional) { | ||||
| Evaluator evaluator = new Evaluator(conditional.condition, valuation); | Evaluator evaluator = new Evaluator(conditional.condition, valuation); | ||||
| if (evaluator.eval() != 0) { | if (evaluator.eval() != 0) { | ||||
| @@ -42,7 +39,6 @@ public class Interpreter extends ProgramVisitor { | |||||
| } | } | ||||
| } | } | ||||
| @Override | |||||
| public void visitLoop(Loop loop) { | public void visitLoop(Loop loop) { | ||||
| Evaluator evaluator = new Evaluator(loop.condition, valuation); | Evaluator evaluator = new Evaluator(loop.condition, valuation); | ||||
| if (evaluator.eval() != 0) { | if (evaluator.eval() != 0) { | ||||
| @@ -1,18 +0,0 @@ | |||||
| package interpreter; | |||||
| import program.*; | |||||
| public abstract class ProgramVisitor { | |||||
| public void visit(Program program) { | |||||
| try { | |||||
| this.getClass().getMethod("visit" + program.getClass().getSimpleName(), program.getClass()).invoke(this, program); | |||||
| } catch(Exception ex) { | |||||
| throw new RuntimeException(ex); | |||||
| } | |||||
| } | |||||
| public abstract void visitAssignment(Assignment assignment); | |||||
| public abstract void visitComposition(Composition composition); | |||||
| public abstract void visitConditional(Conditional conditional); | |||||
| public abstract void visitLoop(Loop loop); | |||||
| } | |||||
| @@ -0,0 +1,12 @@ | |||||
| package interpreter; | |||||
| public abstract class Visitor<T> { | |||||
| @SuppressWarnings("unchecked") | |||||
| public T visit(Object object) { | |||||
| try { | |||||
| return (T) this.getClass().getMethod("visit" + object.getClass().getSimpleName(), object.getClass()).invoke(this, object); | |||||
| } catch (Exception e) { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| } | |||||