summaryrefslogtreecommitdiff
path: root/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFreezer.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2016-03-28 08:47:23 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2016-03-28 08:47:23 -0400
commit62e94ef994a59e87543445bb3c0ce0a37017a70a (patch)
treedfa1a488d3929e3f93e2a91669cdaf97c6d707f3 /dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFreezer.java
parent78d9c539e25f16fd15f06c2b2c48c0ad37a21540 (diff)
Renamed packages to suit updated project
Diffstat (limited to 'dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFreezer.java')
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFreezer.java92
1 files changed, 92 insertions, 0 deletions
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFreezer.java b/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFreezer.java
new file mode 100644
index 0000000..0e2134b
--- /dev/null
+++ b/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFreezer.java
@@ -0,0 +1,92 @@
+package bjc.dicelang.ast;
+
+import java.util.Map;
+
+import bjc.utils.parserutils.AST;
+
+/**
+ * Freeze references in a dice AST, replacing variable references with what
+ * the variables refer to
+ *
+ * @author ben
+ *
+ */
+public class DiceASTFreezer {
+ /**
+ * Expand a reference
+ *
+ * @param vnode
+ * The node containing the reference to expand
+ * @param env
+ * The enviroment to expand against
+ * @return The expanded reference
+ */
+ private static AST<IDiceASTNode> expandNode(VariableDiceNode vnode,
+ Map<String, AST<IDiceASTNode>> env) {
+ return env.get(vnode.getVariable());
+ }
+
+ /**
+ * Expand a reference
+ *
+ * @param vnode
+ * The node containing the reference to expand
+ * @param env
+ * The enviroment to expand against
+ * @return The expanded reference
+ */
+ private static AST<IDiceASTNode> expandNode2(VariableDiceNode vnode,
+ Map<String, DiceASTExpression> env) {
+ return env.get(vnode.getVariable()).getAst();
+ }
+
+ /**
+ * Freeze the references in an AST
+ *
+ * @param tree
+ * The tree to freeze references in
+ * @param env
+ * The enviroment to get reference values from
+ * @return The tree with references frozen
+ */
+ @SuppressWarnings("unused")
+ public static AST<IDiceASTNode> freezeAST(AST<IDiceASTNode> tree,
+ Map<String, AST<IDiceASTNode>> env) {
+ return tree.collapse((nod) -> {
+ if (nod instanceof VariableDiceNode) {
+ return expandNode((VariableDiceNode) nod, env);
+ } else {
+ // Type is specified here so compiler can know the type
+ // we're using
+ return new AST<IDiceASTNode>(nod);
+ }
+ } , (op) -> (left, right) -> {
+ return new AST<IDiceASTNode>(op, left, right);
+ } , (r) -> r);
+ }
+
+ /**
+ * Freeze the references in an expression backed by an AST
+ *
+ * @param tree
+ * The tree-backed expression to freeze references in
+ * @param env
+ * The enviroment to get reference values from
+ * @return The tree with references frozen
+ */
+ @SuppressWarnings("unused")
+ public static AST<IDiceASTNode> freezeAST(DiceASTExpression tree,
+ Map<String, DiceASTExpression> env) {
+ return tree.getAst().collapse((nod) -> {
+ if (nod instanceof VariableDiceNode) {
+ return expandNode2((VariableDiceNode) nod, env);
+ } else {
+ // Type is specified here so compiler can know the type
+ // we're using
+ return new AST<IDiceASTNode>(nod);
+ }
+ } , (op) -> (left, right) -> {
+ return new AST<IDiceASTNode>(op, left, right);
+ } , (r) -> r);
+ }
+}