瀏覽代碼

Simplifies visitor

pull/1/head
Malte Schmitz 9 年之前
父節點
當前提交
5651a39cc8
共有 5 個文件被更改,包括 14 次插入56 次删除
  1. +1
    -5
      src/interpreter/Evaluator.java
  2. +0
    -28
      src/interpreter/ExpressionVisitor.java
  3. +1
    -5
      src/interpreter/Interpreter.java
  4. +0
    -18
      src/interpreter/ProgramVisitor.java
  5. +12
    -0
      src/interpreter/Visitor.java

+ 1
- 5
src/interpreter/Evaluator.java 查看文件

@@ -5,7 +5,7 @@ import expression.*;
import java.util.HashMap;
import java.util.Map;

public class Evaluator extends ExpressionVisitor<Integer> {
public class Evaluator extends Visitor<Integer> {

final Expression expression;
final Map<String, Integer> valuation = new HashMap<>();
@@ -19,22 +19,18 @@ public class Evaluator extends ExpressionVisitor<Integer> {
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);


+ 0
- 28
src/interpreter/ExpressionVisitor.java 查看文件

@@ -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);
}

+ 1
- 5
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<String, Integer> 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) {


+ 0
- 18
src/interpreter/ProgramVisitor.java 查看文件

@@ -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);
}

+ 12
- 0
src/interpreter/Visitor.java 查看文件

@@ -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);
}
}
}

Loading…
取消
儲存