remove reflection

This commit is contained in:
ChUrl
2021-02-01 18:57:32 +01:00
parent d69c10600b
commit a6ebcadaa4

View File

@ -6,15 +6,12 @@ import parser.ast.SyntaxTree;
import parser.ast.SyntaxTreeNode; import parser.ast.SyntaxTreeNode;
import typechecker.TypeChecker; import typechecker.TypeChecker;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Collections; import java.util.Collections;
import java.util.Deque; import java.util.Deque;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static java.util.Map.entry;
import static util.Logger.log; import static util.Logger.log;
/** /**
@ -22,35 +19,6 @@ import static util.Logger.log;
*/ */
public final class FlowGraphGenerator { public final class FlowGraphGenerator {
/**
* Mappt die {@link SyntaxTreeNode}-Namen auf entsprechende Methoden für die Codeerzeugung.
*/
private static final Map<String, Method> methodMap;
static {
// Init the method mappings: ASTNode.getName() -> FlowGraphGenerator.method
Map<String, Method> map;
try {
final Class<?> gen = FlowGraphGenerator.class;
map = Map.ofEntries(
entry("cond", gen.getDeclaredMethod("condNode", SyntaxTreeNode.class)),
entry("loop", gen.getDeclaredMethod("loopNode", SyntaxTreeNode.class)),
entry("assignment", gen.getDeclaredMethod("assignNode", SyntaxTreeNode.class)),
entry("expr", gen.getDeclaredMethod("exprNode", SyntaxTreeNode.class)),
// Leafs
entry("INTEGER_LIT", gen.getDeclaredMethod("intStringLiteralNode", SyntaxTreeNode.class)),
entry("BOOLEAN_LIT", gen.getDeclaredMethod("boolLiteralNode", SyntaxTreeNode.class)),
entry("STRING_LIT", gen.getDeclaredMethod("intStringLiteralNode", SyntaxTreeNode.class)),
entry("IDENTIFIER", gen.getDeclaredMethod("identifierNode", SyntaxTreeNode.class)),
entry("print", gen.getDeclaredMethod("printlnNode", SyntaxTreeNode.class))
);
} catch (NoSuchMethodException e) {
map = null;
e.printStackTrace();
}
methodMap = map;
}
private final SyntaxTree tree; private final SyntaxTree tree;
/** /**
@ -146,18 +114,20 @@ public final class FlowGraphGenerator {
/** /**
* Erzeugt den FlussGraphen für die angegebene Wurzel. * Erzeugt den FlussGraphen für die angegebene Wurzel.
* Der Wurzelname wird über die methodMap einer Methode zugewiesen. * Der Wurzelname wird einer Methode zugewiesen.
* Diese wird aufgerufen und erzeugt den entsprechenden Teilbaum. * Diese wird aufgerufen und erzeugt den entsprechenden Teilbaum.
*/ */
private void generateNode(SyntaxTreeNode root) { private void generateNode(SyntaxTreeNode root) {
if (methodMap.containsKey(root.getName())) { switch (root.getName()) {
try { case "cond" -> this.condNode(root);
methodMap.get(root.getName()).invoke(this, root); case "loop" -> this.loopNode(root);
} catch (IllegalAccessException | InvocationTargetException e) { case "assignment" -> this.assignNode(root);
e.printStackTrace(); case "expr" -> this.exprNode(root);
} case "INTEGER_LIT", "STRING_LIT" -> this.intStringLiteralNode(root);
} else { case "BOOLEAN_LIT" -> this.boolLiteralNode(root);
root.getChildren().forEach(this::generateNode); case "IDENTIFIER" -> this.identifierNode(root);
case "print" -> this.printlnNode(root);
default -> root.getChildren().forEach(this::generateNode);
} }
} }