summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2016-04-08 13:29:48 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2016-04-08 13:29:48 -0400
commit90d1cc6c9f47f1b6f74fb57e07865795a46c23b8 (patch)
treeb74cd5b9989c9f5a1bbde1e1b8c751faf9cb7086
parentb1df3ff8c890bf6d4cc16fb4f28ddb7833512d71 (diff)
Change to data interfaces, as well as prepare to rewrite parser
-rw-r--r--dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguagePragmaHandlers.java6
-rw-r--r--dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageState.java4
-rw-r--r--dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageTest.java49
-rw-r--r--dice-lang/src/examples/java/bjc/dicelang/examples/DiceExpressionParserTest.java3
-rw-r--r--dice-lang/src/examples/java/bjc/dicelang/examples/DiceLanguageTest.java2
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/DiceExpressionParser.java12
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/PolyhedralDice.java63
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/ast/nodes/LiteralDiceNode.java13
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/ast/nodes/OperatorDiceNode.java8
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/ast/optimization/DiceASTOptimizer.java59
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTDefinedChecker.java (renamed from dice-lang/src/main/java/bjc/dicelang/ast/DiceASTDefinedChecker.java)2
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTExpression.java (renamed from dice-lang/src/main/java/bjc/dicelang/ast/DiceASTExpression.java)153
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTFlattener.java (renamed from dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFlattener.java)2
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTInliner.java (renamed from dice-lang/src/main/java/bjc/dicelang/ast/DiceASTInliner.java)40
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTParser.java (renamed from dice-lang/src/main/java/bjc/dicelang/ast/DiceASTParser.java)28
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTReferenceChecker.java (renamed from dice-lang/src/main/java/bjc/dicelang/ast/DiceASTReferenceChecker.java)2
-rw-r--r--dice-lang/src/main/java/bjc/dicelang/old/ast/IOperatorCollapser.java (renamed from dice-lang/src/main/java/bjc/dicelang/ast/IOperatorCollapser.java)4
17 files changed, 282 insertions, 168 deletions
diff --git a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguagePragmaHandlers.java b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguagePragmaHandlers.java
index 420391e..fa16515 100644
--- a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguagePragmaHandlers.java
+++ b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguagePragmaHandlers.java
@@ -3,10 +3,10 @@ package bjc.dicelang.examples;
import java.util.Map;
import java.util.function.BiConsumer;
-import bjc.dicelang.ast.DiceASTExpression;
-import bjc.dicelang.ast.DiceASTInliner;
-import bjc.dicelang.ast.DiceASTParser;
import bjc.dicelang.ast.nodes.IDiceASTNode;
+import bjc.dicelang.old.ast.DiceASTExpression;
+import bjc.dicelang.old.ast.DiceASTInliner;
+import bjc.dicelang.old.ast.DiceASTParser;
import bjc.utils.funcdata.FunctionalMap;
import bjc.utils.parserutils.AST;
diff --git a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageState.java b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageState.java
index 92e75e3..7db6ab3 100644
--- a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageState.java
+++ b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageState.java
@@ -2,8 +2,8 @@ package bjc.dicelang.examples;
import java.util.Map;
-import bjc.dicelang.ast.DiceASTExpression;
-import bjc.dicelang.ast.DiceASTParser;
+import bjc.dicelang.old.ast.DiceASTExpression;
+import bjc.dicelang.old.ast.DiceASTParser;
import bjc.utils.data.Pair;
/**
diff --git a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageTest.java b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageTest.java
index 54f54ac..3c84657 100644
--- a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageTest.java
+++ b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageTest.java
@@ -6,19 +6,20 @@ import java.util.Scanner;
import java.util.function.BiConsumer;
import bjc.dicelang.IDiceExpression;
-import bjc.dicelang.ast.DiceASTDefinedChecker;
-import bjc.dicelang.ast.DiceASTExpression;
-import bjc.dicelang.ast.DiceASTInliner;
-import bjc.dicelang.ast.DiceASTParser;
-import bjc.dicelang.ast.DiceASTReferenceChecker;
import bjc.dicelang.ast.nodes.IDiceASTNode;
import bjc.dicelang.ast.optimization.DiceASTOptimizer;
+import bjc.dicelang.old.ast.DiceASTDefinedChecker;
+import bjc.dicelang.old.ast.DiceASTExpression;
+import bjc.dicelang.old.ast.DiceASTInliner;
+import bjc.dicelang.old.ast.DiceASTParser;
+import bjc.dicelang.old.ast.DiceASTReferenceChecker;
import static bjc.dicelang.examples.DiceASTLanguagePragmaHandlers.*;
import bjc.utils.data.GenHolder;
import bjc.utils.data.IHolder;
import bjc.utils.funcdata.FunctionalMap;
+import bjc.utils.funcdata.IFunctionalMap;
import bjc.utils.funcdata.bst.ITreePart.TreeLinearizationMethod;
import bjc.utils.parserutils.AST;
@@ -149,20 +150,21 @@ public class DiceASTLanguageTest {
try {
numberOfRolls = Integer.parseInt(args[2]);
- } catch (NumberFormatException nfex) {
+ } catch (@SuppressWarnings("unused") NumberFormatException nfex) {
+ // Don't care about details
System.err.println(
"ERROR: The second argument must be a valid number, and "
+ args[2] + " is not one.");
return;
}
- IDiceExpression expressionToRoll =
- languageState.merge((astParser, enviroment) -> {
+ IDiceExpression expressionToRoll = languageState
+ .merge((astParser, enviroment) -> {
if (!enviroment.containsKey(expressionName)) {
return null;
- } else {
- return enviroment.get(expressionName);
}
+
+ return enviroment.get(expressionName);
});
if (expressionToRoll == null) {
@@ -198,8 +200,8 @@ public class DiceASTLanguageTest {
// The parser to turn strings into AST's
DiceASTParser astParser = new DiceASTParser();
- DiceASTLanguageState languageState =
- new DiceASTLanguageState(astParser, enviroment);
+ DiceASTLanguageState languageState = new DiceASTLanguageState(
+ astParser, enviroment);
while (!currentLine.equalsIgnoreCase("quit")) {
String prospectiveCommandName = currentLine.split(" ")[0];
@@ -214,20 +216,20 @@ public class DiceASTLanguageTest {
AST<IDiceASTNode> builtAST;
try {
- builtAST = astParser.buildAST(currentLine);
+ builtAST = DiceASTParser.buildAST(currentLine);
} catch (IllegalStateException isex) {
System.out.println(
"ERROR: " + isex.getLocalizedMessage());
- currentLine =
- getNextCommand(inputSource, commandNumber);
+ currentLine = getNextCommand(inputSource,
+ commandNumber);
continue;
}
// Build a rollable expression from the AST
- DiceASTExpression expression =
- new DiceASTExpression(builtAST, enviroment);
+ DiceASTExpression expression = new DiceASTExpression(
+ builtAST, enviroment);
int sampleRoll;
@@ -237,8 +239,8 @@ public class DiceASTLanguageTest {
System.out.println(
"ERROR: " + usex.getLocalizedMessage());
- currentLine =
- getNextCommand(inputSource, commandNumber);
+ currentLine = getNextCommand(inputSource,
+ commandNumber);
continue;
}
@@ -249,8 +251,8 @@ public class DiceASTLanguageTest {
+ " Problematic expression: \n\t"
+ expression);
- currentLine =
- getNextCommand(inputSource, commandNumber);
+ currentLine = getNextCommand(inputSource,
+ commandNumber);
continue;
}
@@ -320,9 +322,8 @@ public class DiceASTLanguageTest {
private static DiceASTExpression freezeOutLast(
Map<String, DiceASTExpression> enviroment,
AST<IDiceASTNode> builtAST) {
- FunctionalMap<String, AST<IDiceASTNode>> transformedEnviroment =
- new FunctionalMap<>(enviroment)
- .mapValues((expr) -> expr.getAst());
+ IFunctionalMap<String, AST<IDiceASTNode>> transformedEnviroment = new FunctionalMap<>(
+ enviroment).mapValues((expr) -> expr.getAst());
AST<IDiceASTNode> expressionSansLast = DiceASTInliner
.selectiveInline(builtAST, transformedEnviroment, "last");
diff --git a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceExpressionParserTest.java b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceExpressionParserTest.java
index d2f947a..ceb90ef 100644
--- a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceExpressionParserTest.java
+++ b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceExpressionParserTest.java
@@ -44,7 +44,8 @@ public class DiceExpressionParserTest {
*/
DiceExpressionParser dep = new DiceExpressionParser();
- IDiceExpression dexp = dep.parse(exp, new HashMap<>());
+ IDiceExpression dexp = DiceExpressionParser.parse(exp,
+ new HashMap<>());
/*
* Roll the dice a specified amount of times
diff --git a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceLanguageTest.java b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceLanguageTest.java
index c832d6b..8dfaceb 100644
--- a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceLanguageTest.java
+++ b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceLanguageTest.java
@@ -76,7 +76,7 @@ public class DiceLanguageTest {
if (acts.containsKey(header)) {
acts.get(header).accept(ln, state);
} else {
- IDiceExpression exp = dep.parse(ln, env);
+ IDiceExpression exp = DiceExpressionParser.parse(ln, env);
System.out.println("\tParsed: " + exp.toString());
System.out.println("\tSample Roll: " + exp.roll());
diff --git a/dice-lang/src/main/java/bjc/dicelang/DiceExpressionParser.java b/dice-lang/src/main/java/bjc/dicelang/DiceExpressionParser.java
index 05e8942..8a8ded3 100644
--- a/dice-lang/src/main/java/bjc/dicelang/DiceExpressionParser.java
+++ b/dice-lang/src/main/java/bjc/dicelang/DiceExpressionParser.java
@@ -5,8 +5,8 @@ import java.util.Stack;
import org.apache.commons.lang3.StringUtils;
-import bjc.utils.funcdata.FunctionalList;
import bjc.utils.funcdata.FunctionalStringTokenizer;
+import bjc.utils.funcdata.IFunctionalList;
import bjc.utils.parserutils.ShuntingYard;
/**
@@ -25,7 +25,7 @@ public class DiceExpressionParser {
* The enviroment to use when parsing expressions
* @return The parsed dice expression
*/
- public IDiceExpression parse(String exp,
+ public static IDiceExpression parse(String exp,
Map<String, IDiceExpression> env) {
/*
* Create a tokenizer over the strings
@@ -50,8 +50,8 @@ public class DiceExpressionParser {
/*
* Shunt the expression to postfix form
*/
- FunctionalList<String> ls =
- yard.postfix(fst.toList(s -> s), s -> s);
+ IFunctionalList<String> ls = yard.postfix(fst.toList(s -> s),
+ s -> s);
/*
* Create a stack for building an expression from parts
@@ -82,8 +82,8 @@ public class DiceExpressionParser {
* Handle scalar numbers
*/
dexps.push(new ScalarDie(Integer.parseInt(tok)));
- } catch (NumberFormatException nfex) {
-
+ } catch (@SuppressWarnings("unused") NumberFormatException nfex) {
+ // We don't care about details, just that it failed
if (dexps.size() >= 2) {
/*
* Apply an operation to two dice
diff --git a/dice-lang/src/main/java/bjc/dicelang/PolyhedralDice.java b/dice-lang/src/main/java/bjc/dicelang/PolyhedralDice.java
index e0bef64..9f609b4 100644
--- a/dice-lang/src/main/java/bjc/dicelang/PolyhedralDice.java
+++ b/dice-lang/src/main/java/bjc/dicelang/PolyhedralDice.java
@@ -19,6 +19,15 @@ public class PolyhedralDice {
}
/**
+ * Produce a single d10
+ *
+ * @return A single d10
+ */
+ public static IDiceExpression d10() {
+ return d10(1);
+ }
+
+ /**
* Produce the specified number of 100-sided dice
*
* @param nDice
@@ -30,6 +39,15 @@ public class PolyhedralDice {
}
/**
+ * Produce a single d100
+ *
+ * @return A single d100
+ */
+ public static IDiceExpression d100() {
+ return d100(1);
+ }
+
+ /**
* Produce the specified number of 12-sided dice
*
* @param nDice
@@ -41,6 +59,15 @@ public class PolyhedralDice {
}
/**
+ * Produce a single d12
+ *
+ * @return A single d12
+ */
+ public static IDiceExpression d12() {
+ return d12(1);
+ }
+
+ /**
* Produce the specified number of 20-sided dice
*
* @param nDice
@@ -52,6 +79,15 @@ public class PolyhedralDice {
}
/**
+ * Produce a single d20
+ *
+ * @return A single d20
+ */
+ public static IDiceExpression d20() {
+ return d20(1);
+ }
+
+ /**
* Produce the specified number of 4-sided dice
*
* @param nDice
@@ -63,6 +99,15 @@ public class PolyhedralDice {
}
/**
+ * Produce a single d4
+ *
+ * @return A single d4
+ */
+ public static IDiceExpression d4() {
+ return d4(1);
+ }
+
+ /**
* Produce the specified number of 6-sided dice
*
* @param nDice
@@ -74,6 +119,15 @@ public class PolyhedralDice {
}
/**
+ * Produce a single d6
+ *
+ * @return A single d6
+ */
+ public static IDiceExpression d6() {
+ return d6(1);
+ }
+
+ /**
* Produce the specified number of 8-sided dice
*
* @param nDice
@@ -83,4 +137,13 @@ public class PolyhedralDice {
public static IDiceExpression d8(int nDice) {
return new ComplexDice(nDice, 8);
}
+
+ /**
+ * Produce a single d8
+ *
+ * @return A single d8
+ */
+ public static IDiceExpression d8() {
+ return d8(1);
+ }
}
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/LiteralDiceNode.java b/dice-lang/src/main/java/bjc/dicelang/ast/nodes/LiteralDiceNode.java
index e689c7f..1a6d2bf 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/LiteralDiceNode.java
+++ b/dice-lang/src/main/java/bjc/dicelang/ast/nodes/LiteralDiceNode.java
@@ -38,7 +38,9 @@ public class LiteralDiceNode implements IDiceASTNode {
/**
* Create a new node with the given value
- * @param val The value for this node
+ *
+ * @param val
+ * The value for this node
*/
public LiteralDiceNode(int val) {
this(Integer.toString(val));
@@ -126,8 +128,12 @@ public class LiteralDiceNode implements IDiceASTNode {
try {
return new ScalarDie(Integer.parseInt(literalData));
} catch (NumberFormatException nfex) {
- throw new UnsupportedOperationException(
+ UnsupportedOperationException usex = new UnsupportedOperationException(
"Found malformed leaf token " + this);
+
+ usex.initCause(nfex);
+
+ throw usex;
}
}
}
@@ -165,7 +171,8 @@ public class LiteralDiceNode implements IDiceASTNode {
try {
Integer.parseInt(value);
return true;
- } catch (NumberFormatException nfex) {
+ } catch (@SuppressWarnings("unused") NumberFormatException nfex) {
+ // We don't care about details
return false;
}
}
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/OperatorDiceNode.java b/dice-lang/src/main/java/bjc/dicelang/ast/nodes/OperatorDiceNode.java
index e1eb316..2820cfb 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/OperatorDiceNode.java
+++ b/dice-lang/src/main/java/bjc/dicelang/ast/nodes/OperatorDiceNode.java
@@ -38,7 +38,11 @@ public enum OperatorDiceNode implements IDiceASTNode {
/**
* Represents subtracting two nodes
*/
- SUBTRACT;
+ SUBTRACT,
+ /**
+ * Represents executing one statement in the context of the other
+ */
+ LET;
/**
* Create a operator node from a string
@@ -63,6 +67,8 @@ public enum OperatorDiceNode implements IDiceASTNode {
return GROUP;
case "c":
return COMPOUND;
+ case "->":
+ return LET;
default:
throw new IllegalArgumentException(
s + " is not a valid operator node");
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/optimization/DiceASTOptimizer.java b/dice-lang/src/main/java/bjc/dicelang/ast/optimization/DiceASTOptimizer.java
index e6c62ee..f6be7ab 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/optimization/DiceASTOptimizer.java
+++ b/dice-lang/src/main/java/bjc/dicelang/ast/optimization/DiceASTOptimizer.java
@@ -36,26 +36,26 @@ public class DiceASTOptimizer {
@Override
public AST<IDiceASTNode> apply(AST<IDiceASTNode> leftAST,
AST<IDiceASTNode> rightAST) {
- AST<IDiceASTNode> rightBranchOfLeftAST =
- leftAST.applyToRight((rightSideAST) -> rightSideAST);
- AST<IDiceASTNode> leftBranchOfLeftAST =
- leftAST.applyToRight((rightSideAST) -> rightSideAST);
+ AST<IDiceASTNode> rightBranchOfLeftAST = leftAST
+ .applyToRight((rightSideAST) -> rightSideAST);
+ AST<IDiceASTNode> leftBranchOfLeftAST = leftAST
+ .applyToRight((rightSideAST) -> rightSideAST);
boolean leftContainsNestedConstant = DiceASTOptimizer
.checkNodeType(rightBranchOfLeftAST, LITERAL)
&& DiceASTOptimizer.isNodeConstant(leftAST);
- boolean isRightConstant =
- DiceASTOptimizer.checkNodeType(rightAST, LITERAL)
- && DiceASTOptimizer.isNodeConstant(leftAST);
+ boolean isRightConstant = DiceASTOptimizer
+ .checkNodeType(rightAST, LITERAL)
+ && DiceASTOptimizer.isNodeConstant(leftAST);
if (leftContainsNestedConstant && isRightConstant) {
int combinedValue = valueCollapser.apply(
getNodeValue(rightBranchOfLeftAST),
getNodeValue(rightAST));
- AST<IDiceASTNode> newRightBranch =
- new AST<>(new LiteralDiceNode(combinedValue));
+ AST<IDiceASTNode> newRightBranch = new AST<>(
+ new LiteralDiceNode(combinedValue));
return new AST<>(type, leftBranchOfLeftAST,
newRightBranch);
@@ -82,13 +82,13 @@ public class DiceASTOptimizer {
@Override
public AST<IDiceASTNode> apply(AST<IDiceASTNode> leftAST,
AST<IDiceASTNode> rightAST) {
- boolean isLeftConstant =
- DiceASTOptimizer.checkNodeType(leftAST, LITERAL)
- && DiceASTOptimizer.isNodeConstant(leftAST);
+ boolean isLeftConstant = DiceASTOptimizer
+ .checkNodeType(leftAST, LITERAL)
+ && DiceASTOptimizer.isNodeConstant(leftAST);
- boolean isRightConstant =
- DiceASTOptimizer.checkNodeType(rightAST, LITERAL)
- && DiceASTOptimizer.isNodeConstant(leftAST);
+ boolean isRightConstant = DiceASTOptimizer
+ .checkNodeType(rightAST, LITERAL)
+ && DiceASTOptimizer.isNodeConstant(leftAST);
if (isLeftConstant) {
if (isRightConstant) {
@@ -107,10 +107,8 @@ public class DiceASTOptimizer {
}
}
- private static Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>>
- buildConstantCollapsers() {
- Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>> operatorCollapsers =
- new HashMap<>();
+ private static Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>> buildConstantCollapsers() {
+ Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>> operatorCollapsers = new HashMap<>();
operatorCollapsers.put(OperatorDiceNode.ADD,
new ArithmeticOperationCollapser(OperatorDiceNode.ADD,
@@ -131,10 +129,8 @@ public class DiceASTOptimizer {
return operatorCollapsers;
}
- private static Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>>
- buildNestedConstantCollapsers() {
- Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>> operatorCollapsers =
- new HashMap<>();
+ private static Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>> buildNestedConstantCollapsers() {
+ Map<IDiceASTNode, BinaryOperator<AST<IDiceASTNode>>> operatorCollapsers = new HashMap<>();
operatorCollapsers.put(OperatorDiceNode.ADD,
new NestedArithmeticOperationCollapser(
@@ -167,9 +163,9 @@ public class DiceASTOptimizer {
IDiceExpression leaf) {
if (leaf.canOptimize()) {
return new LiteralDiceNode(Integer.toString(leaf.optimize()));
- } else {
- return node;
}
+
+ return node;
}
private static AST<IDiceASTNode> finishTree(AST<IDiceASTNode> tree) {
@@ -184,14 +180,13 @@ public class DiceASTOptimizer {
* @return The optimized tree
*/
public static AST<IDiceASTNode> optimizeTree(AST<IDiceASTNode> tree) {
- AST<IDiceASTNode> astWithConstantsFolded =
- tree.collapse(DiceASTOptimizer::collapseLeaf,
- buildConstantCollapsers()::get,
- DiceASTOptimizer::finishTree);
+ AST<IDiceASTNode> astWithConstantsFolded = tree.collapse(
+ DiceASTOptimizer::collapseLeaf,
+ buildConstantCollapsers()::get,
+ DiceASTOptimizer::finishTree);
- AST<IDiceASTNode> astWithNestedConstantsFolded =
- astWithConstantsFolded.collapse(
- DiceASTOptimizer::collapseLeaf,
+ AST<IDiceASTNode> astWithNestedConstantsFolded = astWithConstantsFolded
+ .collapse(DiceASTOptimizer::collapseLeaf,
buildNestedConstantCollapsers()::get,
DiceASTOptimizer::finishTree);
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTDefinedChecker.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTDefinedChecker.java
index c26098c..4a20a82 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTDefinedChecker.java
+++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTDefinedChecker.java
@@ -1,4 +1,4 @@
-package bjc.dicelang.ast;
+package bjc.dicelang.old.ast;
import java.util.Map;
import java.util.function.Consumer;
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTExpression.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTExpression.java
index 3552926..7651093 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTExpression.java
+++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTExpression.java
@@ -1,7 +1,8 @@
-package bjc.dicelang.ast;
+package bjc.dicelang.old.ast;
import java.util.HashMap;
import java.util.Map;
+import java.util.function.BinaryOperator;
import java.util.function.Function;
import bjc.dicelang.ComplexDice;
@@ -24,6 +25,37 @@ import bjc.utils.parserutils.AST;
*
*/
public class DiceASTExpression implements IDiceExpression {
+ private static final class ArithmeticCollapser
+ implements IOperatorCollapser {
+ private OperatorDiceNode type;
+
+ private BinaryOperator<Integer> valueOp;
+
+ public ArithmeticCollapser(OperatorDiceNode type,
+ BinaryOperator<Integer> valueOp) {
+ this.type = type;
+ this.valueOp = valueOp;
+ }
+
+ @Override
+ public Pair<Integer, AST<IDiceASTNode>> apply(
+ Pair<Integer, AST<IDiceASTNode>> leftNode,
+ Pair<Integer, AST<IDiceASTNode>> rightNode) {
+ return leftNode.merge((leftValue, leftAST) -> {
+ return rightNode.merge((rightValue, rightAST) -> {
+ if (type == OperatorDiceNode.DIVIDE
+ && rightValue == 0) {
+ throw new ArithmeticException(
+ "Attempted to divide by zero. The AST of the problem expression is "
+ + rightAST);
+ }
+
+ return new Pair<>(valueOp.apply(leftValue, rightValue),
+ new AST<>(type, leftAST, rightAST));
+ });
+ });
+ }
+ }
private static final class VariableRetriever
implements Function<IDiceASTNode, String> {
@@ -47,59 +79,26 @@ public class DiceASTExpression implements IDiceExpression {
* The enviroment to evaluate bindings and such against
* @return The operations to use when collapsing the AST
*/
- private static Map<IDiceASTNode, IOperatorCollapser> buildOperations(
- Map<String, DiceASTExpression> enviroment) {
- Map<IDiceASTNode, IOperatorCollapser> operatorCollapsers = new HashMap<>();
+ private static Map<IDiceASTNode, IOperatorCollapser>
+ buildOperations(Map<String, DiceASTExpression> enviroment) {
+ Map<IDiceASTNode, IOperatorCollapser> operatorCollapsers =
+ new HashMap<>();
operatorCollapsers.put(OperatorDiceNode.ADD,
- (leftNode, rightNode) -> {
- return leftNode.merge((leftValue, leftAST) -> {
- return rightNode.merge((rightValue, rightAST) -> {
- return new Pair<>(leftValue + rightValue,
- new AST<>(OperatorDiceNode.ADD,
- leftAST, rightAST));
- });
- });
+ new ArithmeticCollapser(OperatorDiceNode.ADD,
+ (left, right) -> left + right));
- });
operatorCollapsers.put(OperatorDiceNode.SUBTRACT,
- (leftNode, rightNode) -> {
- return leftNode.merge((leftValue, leftAST) -> {
- return rightNode.merge((rightValue, rightAST) -> {
- return new Pair<>(leftValue - rightValue,
- new AST<>(OperatorDiceNode.SUBTRACT,
- leftAST, rightAST));
- });
- });
- });
+ new ArithmeticCollapser(OperatorDiceNode.SUBTRACT,
+ (left, right) -> left - right));
operatorCollapsers.put(OperatorDiceNode.MULTIPLY,
- (leftNode, rightNode) -> {
- return leftNode.merge((leftValue, leftAST) -> {
- return rightNode.merge((rightValue, rightAST) -> {
- return new Pair<>(leftValue * rightValue,
- new AST<>(OperatorDiceNode.MULTIPLY,
- leftAST, rightAST));
- });
- });
+ new ArithmeticCollapser(OperatorDiceNode.MULTIPLY,
+ (left, right) -> left * right));
- });
operatorCollapsers.put(OperatorDiceNode.DIVIDE,
- (leftNode, rightNode) -> {
- return leftNode.merge((leftValue, leftAST) -> {
- return rightNode.merge((rightValue, rightAST) -> {
- if (rightValue == 0) {
- throw new ArithmeticException(
- "Attempted to divide by zero. The AST of the problem expression is "
- + rightAST);
- }
-
- return new Pair<>(leftValue / rightValue,
- new AST<>(OperatorDiceNode.DIVIDE,
- leftAST, rightAST));
- });
- });
- });
+ new ArithmeticCollapser(OperatorDiceNode.DIVIDE,
+ (left, right) -> left / right));
operatorCollapsers.put(OperatorDiceNode.ASSIGN, (left, right) -> {
return parseBinding(enviroment, left, right);
@@ -111,9 +110,46 @@ public class DiceASTExpression implements IDiceExpression {
operatorCollapsers.put(OperatorDiceNode.GROUP,
DiceASTExpression::parseGroup);
+ operatorCollapsers.put(OperatorDiceNode.LET, (left, right) -> {
+ return doLet(enviroment, left, right);
+ });
+
return operatorCollapsers;
}
+ private static Pair<Integer, AST<IDiceASTNode>> doLet(
+ Map<String, DiceASTExpression> enviroment,
+ Pair<Integer, AST<IDiceASTNode>> left,
+ Pair<Integer, AST<IDiceASTNode>> right) {
+ return left.merge((leftValue, leftAST) -> {
+ return right.merge((rightValue, rightAST) -> {
+ if (!leftAST
+ .applyToHead(DiceASTExpression::isAssignNode)) {
+ // Just ignore the left block then
+ return new Pair<>(rightValue, rightAST);
+ } else {
+ // Left block has an assignment to handle
+ String varName = leftAST.applyToLeft((leftBranch) -> {
+ return getAssignmentVar(leftBranch);
+ });
+
+ return null;
+ }
+ });
+ });
+ }
+
+ private static String getAssignmentVar(AST<IDiceASTNode> leftBranch) {
+ return leftBranch.applyToHead((node) -> {
+ return ((VariableDiceNode) node).getVariable();
+ });
+ }
+
+ private static Boolean isAssignNode(IDiceASTNode node) {
+ return node.getType() == DiceASTType.OPERATOR
+ && node == OperatorDiceNode.ASSIGN;
+ }
+
private static Pair<Integer, AST<IDiceASTNode>> parseBinding(
Map<String, DiceASTExpression> enviroment,
Pair<Integer, AST<IDiceASTNode>> left,
@@ -129,8 +165,9 @@ public class DiceASTExpression implements IDiceExpression {
GenHolder<Boolean> selfReference = new GenHolder<>(false);
- DiceASTReferenceChecker refChecker = new DiceASTReferenceChecker(
- selfReference, variableName);
+ DiceASTReferenceChecker refChecker =
+ new DiceASTReferenceChecker(selfReference,
+ variableName);
rightAST.traverse(TreeLinearizationMethod.PREORDER,
refChecker);
@@ -163,8 +200,8 @@ public class DiceASTExpression implements IDiceExpression {
Pair<Integer, AST<IDiceASTNode>> rightNode) {
return leftNode.merge((leftValue, leftAST) -> {
return rightNode.merge((rightValue, rightAST) -> {
- int compoundValue = Integer
- .parseInt(Integer.toString(leftValue)
+ int compoundValue =
+ Integer.parseInt(Integer.toString(leftValue)
+ Integer.toString(rightValue));
return new Pair<>(compoundValue, new AST<>(
@@ -190,8 +227,8 @@ public class DiceASTExpression implements IDiceExpression {
+ rightAST);
}
- int rolledValue = new ComplexDice(leftValue, rightValue)
- .roll();
+ int rolledValue =
+ new ComplexDice(leftValue, rightValue).roll();
return new Pair<>(rolledValue, new AST<>(
OperatorDiceNode.GROUP, leftAST, rightAST));
@@ -231,8 +268,8 @@ public class DiceASTExpression implements IDiceExpression {
* @return A pair consisting of the token's value and the AST it
* represents
*/
- private Pair<Integer, AST<IDiceASTNode>> evaluateLeaf(
- IDiceASTNode leafNode) {
+ private Pair<Integer, AST<IDiceASTNode>>
+ evaluateLeaf(IDiceASTNode leafNode) {
if (leafNode.getType() == DiceASTType.VARIABLE) {
VariableDiceNode node = (VariableDiceNode) leafNode;
@@ -247,8 +284,8 @@ public class DiceASTExpression implements IDiceExpression {
}
}
- private Pair<Integer, AST<IDiceASTNode>> parseVariable(
- VariableDiceNode leafNode) {
+ private Pair<Integer, AST<IDiceASTNode>>
+ parseVariable(VariableDiceNode leafNode) {
String varName = leafNode.getVariable();
if (env.containsKey(varName)) {
@@ -276,8 +313,8 @@ public class DiceASTExpression implements IDiceExpression {
*/
@Override
public int roll() {
- Map<IDiceASTNode, IOperatorCollapser> operations = buildOperations(
- env);
+ Map<IDiceASTNode, IOperatorCollapser> operations =
+ buildOperations(env);
return ast.collapse(this::evaluateLeaf, operations::get,
(returnedValue) -> returnedValue
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFlattener.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTFlattener.java
index a54a088..a7500a8 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTFlattener.java
+++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTFlattener.java
@@ -1,4 +1,4 @@
-package bjc.dicelang.ast;
+package bjc.dicelang.old.ast;
import java.util.HashMap;
import java.util.Map;
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTInliner.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTInliner.java
index ef4a904..3a8e796 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTInliner.java
+++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTInliner.java
@@ -1,4 +1,4 @@
-package bjc.dicelang.ast;
+package bjc.dicelang.old.ast;
import java.util.function.Function;
@@ -7,6 +7,8 @@ import bjc.dicelang.ast.nodes.IDiceASTNode;
import bjc.dicelang.ast.nodes.VariableDiceNode;
import bjc.utils.funcdata.FunctionalList;
import bjc.utils.funcdata.FunctionalMap;
+import bjc.utils.funcdata.IFunctionalList;
+import bjc.utils.funcdata.IFunctionalMap;
import bjc.utils.parserutils.AST;
/**
@@ -19,9 +21,9 @@ import bjc.utils.parserutils.AST;
public class DiceASTInliner {
private static class NodeInliner
implements Function<IDiceASTNode, AST<IDiceASTNode>> {
- private FunctionalMap<String, AST<IDiceASTNode>> enviroment;
+ private IFunctionalMap<String, AST<IDiceASTNode>> enviroment;
- public NodeInliner(FunctionalMap<String, AST<IDiceASTNode>> env) {
+ public NodeInliner(IFunctionalMap<String, AST<IDiceASTNode>> env) {
enviroment = env;
}
@@ -29,13 +31,13 @@ public class DiceASTInliner {
public AST<IDiceASTNode> apply(IDiceASTNode nod) {
if (nod.getType() == DiceASTType.VARIABLE) {
return expandNode((VariableDiceNode) nod);
- } else {
- return new AST<>(nod);
}
+
+ return new AST<>(nod);
}
- protected AST<IDiceASTNode>
- expandNode(VariableDiceNode variableNode) {
+ protected AST<IDiceASTNode> expandNode(
+ VariableDiceNode variableNode) {
String varName = variableNode.getVariable();
if (!enviroment.containsKey(varName)) {
@@ -50,24 +52,24 @@ public class DiceASTInliner {
private static final class SelectiveInliner extends NodeInliner {
- private FunctionalList<String> variableNames;
+ private IFunctionalList<String> variableNames;
public SelectiveInliner(
- FunctionalMap<String, AST<IDiceASTNode>> env,
- FunctionalList<String> varNames) {
+ IFunctionalMap<String, AST<IDiceASTNode>> env,
+ IFunctionalList<String> varNames) {
super(env);
variableNames = varNames;
}
@Override
- protected AST<IDiceASTNode>
- expandNode(VariableDiceNode variableNode) {
+ protected AST<IDiceASTNode> expandNode(
+ VariableDiceNode variableNode) {
if (variableNames.contains(variableNode.getVariable())) {
return super.expandNode(variableNode);
- } else {
- return new AST<>(variableNode);
}
+
+ return new AST<>(variableNode);
}
}
@@ -81,7 +83,7 @@ public class DiceASTInliner {
* @return The tree with references inlined
*/
public static AST<IDiceASTNode> inlineAST(AST<IDiceASTNode> tree,
- FunctionalMap<String, AST<IDiceASTNode>> env) {
+ IFunctionalMap<String, AST<IDiceASTNode>> env) {
return selectiveInline(tree, env);
}
@@ -112,7 +114,7 @@ public class DiceASTInliner {
* @return An AST with the specified variables inlined
*/
public static AST<IDiceASTNode> selectiveInline(AST<IDiceASTNode> tree,
- FunctionalMap<String, AST<IDiceASTNode>> env,
+ IFunctionalMap<String, AST<IDiceASTNode>> env,
String... varNames) {
return selectiveInline(tree, env, new FunctionalList<>(varNames));
}
@@ -129,8 +131,8 @@ public class DiceASTInliner {
* @return An AST with the specified variables inline
*/
public static AST<IDiceASTNode> selectiveInline(AST<IDiceASTNode> tree,
- FunctionalMap<String, AST<IDiceASTNode>> env,
- FunctionalList<String> varNames) {
- return tree.expand(new SelectiveInliner(env, varNames));
+ IFunctionalMap<String, AST<IDiceASTNode>> env,
+ IFunctionalList<String> varNames) {
+ return tree.flatMapTree(new SelectiveInliner(env, varNames));
}
} \ No newline at end of file
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTParser.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTParser.java
index fb77ad5..d8e13f7 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTParser.java
+++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTParser.java
@@ -1,4 +1,4 @@
-package bjc.dicelang.ast;
+package bjc.dicelang.old.ast;
import java.util.Deque;
import java.util.LinkedList;
@@ -10,9 +10,10 @@ import bjc.dicelang.ast.nodes.IDiceASTNode;
import bjc.dicelang.ast.nodes.LiteralDiceNode;
import bjc.dicelang.ast.nodes.OperatorDiceNode;
import bjc.dicelang.ast.nodes.VariableDiceNode;
+import bjc.utils.data.IPair;
import bjc.utils.data.Pair;
-import bjc.utils.funcdata.FunctionalList;
import bjc.utils.funcdata.FunctionalStringTokenizer;
+import bjc.utils.funcdata.IFunctionalList;
import bjc.utils.funcutils.ListUtils;
import bjc.utils.parserutils.AST;
import bjc.utils.parserutils.ShuntingYard;
@@ -56,7 +57,8 @@ public class DiceASTParser {
try {
Integer.parseInt(tok);
return true;
- } catch (NumberFormatException nfx) {
+ } catch (@SuppressWarnings("unused") NumberFormatException nfex) {
+ // We don't care about details
return false;
}
}
@@ -86,11 +88,11 @@ public class DiceASTParser {
* The string to build from
* @return An AST built from the passed in string
*/
- public AST<IDiceASTNode> buildAST(String exp) {
- FunctionalList<String> tokens =
- FunctionalStringTokenizer.fromString(exp).toList();
+ public static AST<IDiceASTNode> buildAST(String exp) {
+ IFunctionalList<String> tokens = FunctionalStringTokenizer
+ .fromString(exp).toList();
- Deque<Pair<String, String>> ops = new LinkedList<>();
+ Deque<IPair<String, String>> ops = new LinkedList<>();
ops.add(new Pair<>("+", "\\+"));
ops.add(new Pair<>("-", "-"));
@@ -98,19 +100,19 @@ public class DiceASTParser {
ops.add(new Pair<>("/", "/"));
ops.add(new Pair<>(":=", ":="));
- FunctionalList<String> semiExpandedTokens =
- ListUtils.splitTokens(tokens, ops);
+ IFunctionalList<String> semiExpandedTokens = ListUtils
+ .splitTokens(tokens, ops);
ops = new LinkedList<>();
ops.add(new Pair<>("(", "\\("));
ops.add(new Pair<>(")", "\\)"));
- FunctionalList<String> fullyExpandedTokens =
- ListUtils.deAffixTokens(semiExpandedTokens, ops);
+ IFunctionalList<String> fullyExpandedTokens = ListUtils
+ .deAffixTokens(semiExpandedTokens, ops);
- FunctionalList<String> shunted =
- yard.postfix(fullyExpandedTokens, (s) -> s);
+ IFunctionalList<String> shunted = yard.postfix(fullyExpandedTokens,
+ (s) -> s);
AST<String> rawAST = TreeConstructor.constructTree(shunted,
DiceASTParser::isOperator);
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTReferenceChecker.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTReferenceChecker.java
index 8fa4d55..e526ee9 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTReferenceChecker.java
+++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTReferenceChecker.java
@@ -1,4 +1,4 @@
-package bjc.dicelang.ast;
+package bjc.dicelang.old.ast;
import java.util.function.Consumer;
diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/IOperatorCollapser.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/IOperatorCollapser.java
index c872583..65cb264 100644
--- a/dice-lang/src/main/java/bjc/dicelang/ast/IOperatorCollapser.java
+++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/IOperatorCollapser.java
@@ -1,4 +1,4 @@
-package bjc.dicelang.ast;
+package bjc.dicelang.old.ast;
import java.util.function.BinaryOperator;
@@ -14,5 +14,5 @@ import bjc.utils.parserutils.AST;
*/
public interface IOperatorCollapser
extends BinaryOperator<Pair<Integer, AST<IDiceASTNode>>> {
-
+ // Just an alias
}