summaryrefslogtreecommitdiff
path: root/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTOptimizer.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2016-04-18 08:34:32 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2016-04-18 08:34:32 -0400
commit9ce39956fa1702f157c347dc4b8807d9b5dd2185 (patch)
treed981c0010a92660a1f0501431c4a3bc02d94e56d /dice-lang/src/main/java/bjc/dicelang/ast/DiceASTOptimizer.java
parent7c222f25d4b2d9f3b149d880f0e1acf8d673e4f5 (diff)
Reimplemented basic optimization.
Diffstat (limited to 'dice-lang/src/main/java/bjc/dicelang/ast/DiceASTOptimizer.java')
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/ast/DiceASTOptimizer.java57
1 files changed, 57 insertions, 0 deletions
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTOptimizer.java b/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTOptimizer.java
new file mode 100644
index 0000000..00ac871
--- /dev/null
+++ b/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTOptimizer.java
@@ -0,0 +1,57 @@
+package bjc.dicelang.ast;
+
+import bjc.dicelang.ast.nodes.IDiceASTNode;
+import bjc.dicelang.ast.optimization.IOptimizationPass;
+import bjc.utils.funcdata.FunctionalList;
+import bjc.utils.funcdata.IFunctionalList;
+import bjc.utils.funcdata.IFunctionalMap;
+import bjc.utils.funcdata.ITree;
+
+/**
+ * Contains optimizations appliable to a dice AST
+ *
+ * @author ben
+ *
+ */
+public class DiceASTOptimizer {
+ private IFunctionalList<IOptimizationPass> passes;
+
+ /**
+ * Create a new optimizer
+ */
+ public DiceASTOptimizer() {
+ passes = new FunctionalList<>();
+ }
+
+ /**
+ * Add a pass to the list of optimization passes
+ *
+ * @param pass
+ * The pass to add
+ */
+ public void addPass(IOptimizationPass pass) {
+ passes.add(pass);
+ }
+
+ /**
+ * Optimize the passed in tree
+ *
+ * @param ast
+ * The tree to optimize
+ * @param enviroment
+ * The enviroment for variable references
+ * @return The optimized tree
+ */
+ public ITree<IDiceASTNode> optimizeTree(ITree<IDiceASTNode> ast,
+ IFunctionalMap<String, ITree<IDiceASTNode>> enviroment) {
+ return passes.reduceAux(ast, (currentPass, currentTree) -> {
+ return currentTree.collapse(currentPass::optimizeLeaf,
+ (operator) -> {
+ return (nodes) -> {
+ return currentPass.optimizeOperator(operator,
+ nodes);
+ };
+ }, (tree) -> tree);
+ }, (tree) -> tree);
+ }
+}