summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/ast/DiceASTOptimizer.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2016-10-27 21:56:18 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2016-10-27 22:12:47 -0400
commite7413128ff4e376997de6e94e4bea5eca14811ef (patch)
tree0749e270fdb754d04dc223abd95d47436508047f /dice-lang/src/bjc/dicelang/ast/DiceASTOptimizer.java
parente13a6981bd278c2cfc3b5ecb2517367b117f7a52 (diff)
Moved examples
Diffstat (limited to 'dice-lang/src/bjc/dicelang/ast/DiceASTOptimizer.java')
-rw-r--r--dice-lang/src/bjc/dicelang/ast/DiceASTOptimizer.java60
1 files changed, 60 insertions, 0 deletions
diff --git a/dice-lang/src/bjc/dicelang/ast/DiceASTOptimizer.java b/dice-lang/src/bjc/dicelang/ast/DiceASTOptimizer.java
new file mode 100644
index 0000000..d7fc23c
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/ast/DiceASTOptimizer.java
@@ -0,0 +1,60 @@
+package bjc.dicelang.ast;
+
+import bjc.utils.funcdata.FunctionalList;
+import bjc.utils.funcdata.IList;
+import bjc.utils.funcdata.IMap;
+import bjc.utils.funcdata.ITree;
+
+import bjc.dicelang.ast.nodes.IDiceASTNode;
+import bjc.dicelang.ast.optimization.IOptimizationPass;
+
+/**
+ * Contains optimizations appliable to a dice AST
+ *
+ * @author ben
+ *
+ */
+public class DiceASTOptimizer {
+ private IList<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,
+ IMap<String, ITree<IDiceASTNode>> enviroment) {
+ ITree<IDiceASTNode> optimizedTree = passes.reduceAux(ast,
+ (currentPass, currentTree) -> {
+ return currentTree.collapse(currentPass::optimizeLeaf,
+ (operator) -> {
+ return (nodes) -> {
+ return currentPass.optimizeOperator(
+ operator, nodes);
+ };
+ }, (tree) -> tree);
+ }, (tree) -> tree);
+ return optimizedTree;
+ }
+}