diff options
19 files changed, 159 insertions, 98 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 fa16515..f079835 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.nodes.IDiceASTNode; import bjc.dicelang.old.ast.DiceASTExpression; import bjc.dicelang.old.ast.DiceASTInliner; import bjc.dicelang.old.ast.DiceASTParser; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; import bjc.utils.funcdata.FunctionalMap; import bjc.utils.parserutils.AST; 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 3c84657..23718ff 100644 --- a/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageTest.java +++ b/dice-lang/src/examples/java/bjc/dicelang/examples/DiceASTLanguageTest.java @@ -6,13 +6,13 @@ import java.util.Scanner; import java.util.function.BiConsumer; import bjc.dicelang.IDiceExpression; -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 bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.optimization.DiceASTOptimizer; import static bjc.dicelang.examples.DiceASTLanguagePragmaHandlers.*; diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTParser.java b/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTParser.java new file mode 100644 index 0000000..db2ba98 --- /dev/null +++ b/dice-lang/src/main/java/bjc/dicelang/ast/DiceASTParser.java @@ -0,0 +1,70 @@ +package bjc.dicelang.ast; + +import java.util.InputMismatchException; + +import bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.LiteralDiceNode; +import bjc.dicelang.old.ast.nodes.OperatorDiceNode; +import bjc.dicelang.old.ast.nodes.VariableDiceNode; +import bjc.utils.funcdata.IFunctionalList; +import bjc.utils.parserutils.AST; +import bjc.utils.parserutils.TreeConstructor; + +/** + * Parse a string expression into AST form. Doesn't do anything else + * + * @author ben + * + */ +public class DiceASTParser { + /** + * Create an AST from a list of tokens + * + * @param tokens + * The list of tokens to convert + * @return An AST built from the tokens + */ + public static AST<IDiceASTNode> createFromString( + IFunctionalList<String> tokens) { + AST<String> rawTokens = + TreeConstructor.constructTree(tokens, (token) -> { + return isOperatorNode(token); + }, (operator) -> false, null); + // The last argument is valid because there are no special + // operators yet, so it'll never get called + + return rawTokens.rebuildTree(DiceASTParser::convertLeafNode, + DiceASTParser::convertOperatorNode); + } + + private static boolean isOperatorNode(String token) { + try { + OperatorDiceNode.fromString(token); + return true; + } catch (@SuppressWarnings("unused") IllegalArgumentException iaex) { + // We don't care about details + return false; + } + } + + private static IDiceASTNode convertLeafNode(String leafNode) { + if (LiteralDiceNode.isLiteral(leafNode)) { + return new LiteralDiceNode(leafNode); + } + + return new VariableDiceNode(leafNode); + } + + private static IDiceASTNode convertOperatorNode(String operatorNode) { + try { + return OperatorDiceNode.fromString(operatorNode); + } catch (IllegalArgumentException iaex) { + InputMismatchException imex = new InputMismatchException( + "Attempted to parse invalid operator " + operatorNode); + + imex.initCause(iaex); + + throw imex; + } + } +} diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/package-info.java b/dice-lang/src/main/java/bjc/dicelang/ast/package-info.java new file mode 100644 index 0000000..105af50 --- /dev/null +++ b/dice-lang/src/main/java/bjc/dicelang/ast/package-info.java @@ -0,0 +1,6 @@ +/** + * New implementation of AST for dice-lang + * @author ben + * + */ +package bjc.dicelang.ast;
\ No newline at end of file diff --git a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTDefinedChecker.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTDefinedChecker.java index 4a20a82..e279d8e 100644 --- a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTDefinedChecker.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTDefinedChecker.java @@ -3,9 +3,9 @@ package bjc.dicelang.old.ast; import java.util.Map; import java.util.function.Consumer; -import bjc.dicelang.ast.nodes.DiceASTType; -import bjc.dicelang.ast.nodes.IDiceASTNode; -import bjc.dicelang.ast.nodes.VariableDiceNode; +import bjc.dicelang.old.ast.nodes.DiceASTType; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.VariableDiceNode; import bjc.utils.data.IHolder; /** @@ -54,8 +54,8 @@ public final class DiceASTDefinedChecker VariableDiceNode node = (VariableDiceNode) astNode; return !enviroment.containsKey(node.getVariable()); - } else { - return false; } + + return false; } }
\ No newline at end of file diff --git a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTExpression.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTExpression.java index 7651093..e6dca9e 100644 --- a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTExpression.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTExpression.java @@ -7,11 +7,11 @@ import java.util.function.Function; import bjc.dicelang.ComplexDice; import bjc.dicelang.IDiceExpression; -import bjc.dicelang.ast.nodes.DiceASTType; -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.dicelang.old.ast.nodes.DiceASTType; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.LiteralDiceNode; +import bjc.dicelang.old.ast.nodes.OperatorDiceNode; +import bjc.dicelang.old.ast.nodes.VariableDiceNode; import bjc.utils.data.GenHolder; import bjc.utils.data.Pair; import bjc.utils.funcdata.bst.ITreePart.TreeLinearizationMethod; @@ -79,8 +79,8 @@ 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) { + private static Map<IDiceASTNode, IOperatorCollapser> buildOperations( + Map<String, DiceASTExpression> enviroment) { Map<IDiceASTNode, IOperatorCollapser> operatorCollapsers = new HashMap<>(); @@ -111,14 +111,13 @@ public class DiceASTExpression implements IDiceExpression { DiceASTExpression::parseGroup); operatorCollapsers.put(OperatorDiceNode.LET, (left, right) -> { - return doLet(enviroment, left, right); + return doLet(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) -> { @@ -127,21 +126,10 @@ public class DiceASTExpression implements IDiceExpression { .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(); + return null; + }); }); } @@ -268,8 +256,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; @@ -284,17 +272,17 @@ 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)) { return new Pair<>(env.get(varName).roll(), new AST<>(leafNode)); - } else { - // Handle special case for defining variables - return new Pair<>(0, new AST<>(leafNode)); } + + // Handle special case for defining variables + return new Pair<>(0, new AST<>(leafNode)); } /** diff --git a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTFlattener.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTFlattener.java index a7500a8..39c0797 100644 --- a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTFlattener.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTFlattener.java @@ -15,11 +15,11 @@ import bjc.dicelang.DiceExpressionType; import bjc.dicelang.IDiceExpression; import bjc.dicelang.ReferenceDiceExpression; import bjc.dicelang.ScalarDie; -import bjc.dicelang.ast.nodes.DiceASTType; -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.dicelang.old.ast.nodes.DiceASTType; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.LiteralDiceNode; +import bjc.dicelang.old.ast.nodes.OperatorDiceNode; +import bjc.dicelang.old.ast.nodes.VariableDiceNode; import bjc.utils.parserutils.AST; /** diff --git a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTInliner.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTInliner.java index 3a8e796..802741f 100644 --- a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTInliner.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTInliner.java @@ -2,9 +2,9 @@ package bjc.dicelang.old.ast; import java.util.function.Function; -import bjc.dicelang.ast.nodes.DiceASTType; -import bjc.dicelang.ast.nodes.IDiceASTNode; -import bjc.dicelang.ast.nodes.VariableDiceNode; +import bjc.dicelang.old.ast.nodes.DiceASTType; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.VariableDiceNode; import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.FunctionalMap; import bjc.utils.funcdata.IFunctionalList; diff --git a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTParser.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTParser.java index d8e13f7..c9b48c8 100644 --- a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTParser.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTParser.java @@ -4,12 +4,10 @@ import java.util.Deque; import java.util.LinkedList; import java.util.function.Function; -import org.apache.commons.lang3.StringUtils; - -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.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.LiteralDiceNode; +import bjc.dicelang.old.ast.nodes.OperatorDiceNode; +import bjc.dicelang.old.ast.nodes.VariableDiceNode; import bjc.utils.data.IPair; import bjc.utils.data.Pair; import bjc.utils.funcdata.FunctionalStringTokenizer; @@ -32,37 +30,12 @@ public class DiceASTParser { public IDiceASTNode apply(String tok) { if (isOperator(tok)) { return OperatorDiceNode.fromString(tok); - } else if (NodeBaker.isLiteral(tok)) { + } else if (LiteralDiceNode.isLiteral(tok)) { return new LiteralDiceNode(tok); } else { return new VariableDiceNode(tok); } } - - /** - * Check if a token represents a literal - * - * @param tok - * The token to check - * @return Whether or not the token represents a literal - */ - private static boolean isLiteral(String tok) { - if (StringUtils.countMatches(tok, 'c') == 1 - && !tok.equalsIgnoreCase("c")) { - return true; - } else if (StringUtils.countMatches(tok, 'd') == 1 - && !tok.equalsIgnoreCase("d")) { - return true; - } else { - try { - Integer.parseInt(tok); - return true; - } catch (@SuppressWarnings("unused") NumberFormatException nfex) { - // We don't care about details - return false; - } - } - } } /** diff --git a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTReferenceChecker.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTReferenceChecker.java index e526ee9..3e0ceec 100644 --- a/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTReferenceChecker.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/DiceASTReferenceChecker.java @@ -2,9 +2,9 @@ package bjc.dicelang.old.ast; import java.util.function.Consumer; -import bjc.dicelang.ast.nodes.DiceASTType; -import bjc.dicelang.ast.nodes.IDiceASTNode; -import bjc.dicelang.ast.nodes.VariableDiceNode; +import bjc.dicelang.old.ast.nodes.DiceASTType; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.VariableDiceNode; import bjc.utils.data.IHolder; /** @@ -53,8 +53,8 @@ public final class DiceASTReferenceChecker VariableDiceNode node = (VariableDiceNode) astNode; return node.getVariable().equals(varName); - } else { - return false; } + + return false; } }
\ No newline at end of file diff --git a/dice-lang/src/main/java/bjc/dicelang/old/ast/IOperatorCollapser.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/IOperatorCollapser.java index 65cb264..36243a6 100644 --- a/dice-lang/src/main/java/bjc/dicelang/old/ast/IOperatorCollapser.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/IOperatorCollapser.java @@ -2,7 +2,7 @@ package bjc.dicelang.old.ast; import java.util.function.BinaryOperator; -import bjc.dicelang.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; import bjc.utils.data.Pair; import bjc.utils.parserutils.AST; diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/DiceASTType.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/DiceASTType.java index 9feb461..633d1d9 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/DiceASTType.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/DiceASTType.java @@ -1,4 +1,4 @@ -package bjc.dicelang.ast.nodes; +package bjc.dicelang.old.ast.nodes; /** * An enum to represent the type of node an AST node is diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/IDiceASTNode.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/IDiceASTNode.java index afa0bcd..579c595 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/IDiceASTNode.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/IDiceASTNode.java @@ -1,4 +1,4 @@ -package bjc.dicelang.ast.nodes; +package bjc.dicelang.old.ast.nodes; /** * The interface for a node in a dice AST diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/LiteralDiceNode.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/LiteralDiceNode.java index 1a6d2bf..46c84d0 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/LiteralDiceNode.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/LiteralDiceNode.java @@ -1,4 +1,4 @@ -package bjc.dicelang.ast.nodes; +package bjc.dicelang.old.ast.nodes; import org.apache.commons.lang3.StringUtils; @@ -189,4 +189,29 @@ public class LiteralDiceNode implements IDiceASTNode { public int toConstant() { return Integer.parseInt(value); } + + /** + * Check if a token represents a literal + * + * @param tok + * The token to check + * @return Whether or not the token represents a literal + */ + public static boolean isLiteral(String tok) { + if (StringUtils.countMatches(tok, 'c') == 1 + && !tok.equalsIgnoreCase("c")) { + return true; + } else if (StringUtils.countMatches(tok, 'd') == 1 + && !tok.equalsIgnoreCase("d")) { + return true; + } else { + try { + Integer.parseInt(tok); + return true; + } catch (@SuppressWarnings("unused") NumberFormatException nfex) { + // We don't care about details + return false; + } + } + } }
\ No newline at end of file diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/OperatorDiceNode.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/OperatorDiceNode.java index 2820cfb..3c06553 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/OperatorDiceNode.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/OperatorDiceNode.java @@ -1,4 +1,4 @@ -package bjc.dicelang.ast.nodes; +package bjc.dicelang.old.ast.nodes; // The following classes need to be changed upon addition of a new operator // 1. DiceASTExpression diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/VariableDiceNode.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/VariableDiceNode.java index 29fd483..262f99b 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/VariableDiceNode.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/VariableDiceNode.java @@ -1,4 +1,4 @@ -package bjc.dicelang.ast.nodes; +package bjc.dicelang.old.ast.nodes; /** * A node that represents a variable reference diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/package-info.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/package-info.java index 97f1990..f99776f 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/nodes/package-info.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/nodes/package-info.java @@ -3,4 +3,4 @@ * @author ben * */ -package bjc.dicelang.ast.nodes;
\ No newline at end of file +package bjc.dicelang.old.ast.nodes;
\ No newline at end of file diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/optimization/DiceASTOptimizer.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/optimization/DiceASTOptimizer.java index f6be7ab..dead812 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/optimization/DiceASTOptimizer.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/optimization/DiceASTOptimizer.java @@ -1,4 +1,6 @@ -package bjc.dicelang.ast.optimization; +package bjc.dicelang.old.ast.optimization; + +import static bjc.dicelang.old.ast.nodes.DiceASTType.*; import java.util.HashMap; import java.util.Map; @@ -6,13 +8,10 @@ import java.util.function.BiFunction; import java.util.function.BinaryOperator; import bjc.dicelang.IDiceExpression; -import bjc.dicelang.ast.nodes.DiceASTType; -import bjc.dicelang.ast.nodes.IDiceASTNode; -import bjc.dicelang.ast.nodes.LiteralDiceNode; -import bjc.dicelang.ast.nodes.OperatorDiceNode; - -import static bjc.dicelang.ast.nodes.DiceASTType.*; - +import bjc.dicelang.old.ast.nodes.DiceASTType; +import bjc.dicelang.old.ast.nodes.IDiceASTNode; +import bjc.dicelang.old.ast.nodes.LiteralDiceNode; +import bjc.dicelang.old.ast.nodes.OperatorDiceNode; import bjc.utils.parserutils.AST; /** diff --git a/dice-lang/src/main/java/bjc/dicelang/ast/optimization/package-info.java b/dice-lang/src/main/java/bjc/dicelang/old/ast/optimization/package-info.java index 132563d..ef39522 100644 --- a/dice-lang/src/main/java/bjc/dicelang/ast/optimization/package-info.java +++ b/dice-lang/src/main/java/bjc/dicelang/old/ast/optimization/package-info.java @@ -3,4 +3,4 @@ * @author ben * */ -package bjc.dicelang.ast.optimization;
\ No newline at end of file +package bjc.dicelang.old.ast.optimization;
\ No newline at end of file |
