summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/ast/DiceASTUtils.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/DiceASTUtils.java
parente13a6981bd278c2cfc3b5ecb2517367b117f7a52 (diff)
Moved examples
Diffstat (limited to 'dice-lang/src/bjc/dicelang/ast/DiceASTUtils.java')
-rw-r--r--dice-lang/src/bjc/dicelang/ast/DiceASTUtils.java86
1 files changed, 86 insertions, 0 deletions
diff --git a/dice-lang/src/bjc/dicelang/ast/DiceASTUtils.java b/dice-lang/src/bjc/dicelang/ast/DiceASTUtils.java
new file mode 100644
index 0000000..d98c8fe
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/ast/DiceASTUtils.java
@@ -0,0 +1,86 @@
+package bjc.dicelang.ast;
+
+import bjc.utils.funcdata.ITree;
+
+import bjc.dicelang.IDiceExpression;
+import bjc.dicelang.ScalarDie;
+import bjc.dicelang.ast.nodes.DiceASTType;
+import bjc.dicelang.ast.nodes.DiceLiteralNode;
+import bjc.dicelang.ast.nodes.IDiceASTNode;
+import bjc.dicelang.ast.nodes.ILiteralDiceNode;
+import bjc.dicelang.ast.nodes.IntegerLiteralNode;
+
+/**
+ * Functions that are useful when dealing with dice ASTs
+ *
+ * @author ben
+ *
+ */
+public class DiceASTUtils {
+ /**
+ * Check if a dice AST contains a simple variable reference
+ *
+ * @param nameTree
+ * The tree to check for a reference in
+ * @return Whether or not a dice AST contains a simple variable
+ * reference
+ */
+ public static boolean containsSimpleVariable(
+ ITree<IDiceASTNode> nameTree) {
+ return nameTree.transformHead((nameNode) -> {
+ if (nameNode.getType() != DiceASTType.VARIABLE) {
+ return false;
+ }
+
+ return true;
+ });
+ }
+
+ /**
+ * Convert an literal AST node to a dice expression, if possible.
+ *
+ * @param tree
+ * The node to convert in tree form
+ * @return The tree as a dice expression
+ *
+ * @throws ClassCastException
+ * if the head of the tree is not a literal (implements
+ * {@link ILiteralDiceNode})
+ * @throws UnsupportedOperationException
+ * if the head of the tree is not optimizable
+ */
+ public static IDiceExpression literalToExpression(
+ ITree<IDiceASTNode> tree) {
+ ILiteralDiceNode literalNode = (ILiteralDiceNode) tree.getHead();
+
+ switch (literalNode.getLiteralType()) {
+ case DICE:
+ return ((DiceLiteralNode) literalNode).getValue();
+ case INTEGER:
+ return new ScalarDie(
+ ((IntegerLiteralNode) literalNode).getValue());
+ default:
+ throw new UnsupportedOperationException(
+ "This type of literal isn't convertable to an expression");
+ }
+ }
+
+ /**
+ * Convert an literal AST node to an integer, if possible.
+ *
+ * @param tree
+ * The literal node to convert, as a tree
+ * @return The node as an integer
+ *
+ * @throws ClassCastException
+ * if the head of the tree is not a literal (implements
+ * {@link ILiteralDiceNode})
+ * @throws UnsupportedOperationException
+ * if the head of the tree is not optimizable
+ */
+ public static int literalToInteger(ITree<IDiceASTNode> tree) {
+ return tree.transformHead((node) -> {
+ return ((ILiteralDiceNode) node).optimize();
+ });
+ }
+}