diff --git a/src/interpreter/Evaluator.java b/src/interpreter/Evaluator.java index fcf4f1e..526f16b 100644 --- a/src/interpreter/Evaluator.java +++ b/src/interpreter/Evaluator.java @@ -5,7 +5,7 @@ import expression.*; import java.util.HashMap; import java.util.Map; -public class Evaluator extends ExpressionVisitor { +public class Evaluator extends Visitor { final Expression expression; final Map valuation = new HashMap<>(); @@ -19,22 +19,18 @@ public class Evaluator extends ExpressionVisitor { return visit(expression); } - @Override public Integer visitAddition(Addition addition) { return visit(addition.leftHandSide) + visit(addition.rightHandSide); } - @Override public Integer visitSubtraction(Subtraction subtraction) { return visit(subtraction.leftHandSide) - visit(subtraction.rightHandSide); } - @Override public Integer visitInt(Int integer) { return integer.value; } - @Override public Integer visitIdentifier(Identifier identifier) { if (valuation.containsKey(identifier.name)) { return valuation.get(identifier.name); diff --git a/src/interpreter/ExpressionVisitor.java b/src/interpreter/ExpressionVisitor.java deleted file mode 100644 index 54df3ae..0000000 --- a/src/interpreter/ExpressionVisitor.java +++ /dev/null @@ -1,28 +0,0 @@ -package interpreter; - -import expression.*; -import java.lang.reflect.Method; - -public abstract class ExpressionVisitor { - 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); -} \ No newline at end of file diff --git a/src/interpreter/Interpreter.java b/src/interpreter/Interpreter.java index c7208f2..541adf8 100644 --- a/src/interpreter/Interpreter.java +++ b/src/interpreter/Interpreter.java @@ -5,7 +5,7 @@ import program.*; import java.util.HashMap; import java.util.Map; -public class Interpreter extends ProgramVisitor { +public class Interpreter extends Visitor { final Program program; final Map valuation = new HashMap<>(); @@ -20,19 +20,16 @@ public class Interpreter extends ProgramVisitor { 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) { @@ -42,7 +39,6 @@ public class Interpreter extends ProgramVisitor { } } - @Override public void visitLoop(Loop loop) { Evaluator evaluator = new Evaluator(loop.condition, valuation); if (evaluator.eval() != 0) { diff --git a/src/interpreter/ProgramVisitor.java b/src/interpreter/ProgramVisitor.java deleted file mode 100644 index b21079f..0000000 --- a/src/interpreter/ProgramVisitor.java +++ /dev/null @@ -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); -} \ No newline at end of file diff --git a/src/interpreter/Visitor.java b/src/interpreter/Visitor.java new file mode 100644 index 0000000..5fa2145 --- /dev/null +++ b/src/interpreter/Visitor.java @@ -0,0 +1,12 @@ +package interpreter; + +public abstract class Visitor { + @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); + } + } +} \ No newline at end of file