summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src
diff options
context:
space:
mode:
authorbjculkin <bjculkin@mix.wvu.edu>2017-03-31 08:53:33 -0400
committerbjculkin <bjculkin@mix.wvu.edu>2017-03-31 08:53:33 -0400
commitb4e4e7f1d6749de92b0f2c5ca09eb4170704100f (patch)
tree110443ec91e8ff4f8e85028e27409e9bd2bb9bd4 /BJC-Utils2/src
parent21db48520acfd6e6ac175aa5df12e50c6be2c767 (diff)
Move Pratt Parser to new project
Diffstat (limited to 'BJC-Utils2/src')
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java35
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java299
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java37
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/SwitchCommand.java21
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TestContext.java42
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java129
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/VarCommand.java36
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/test.tree13
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/InitialCommand.java38
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NonInitialCommand.java63
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParseBlock.java37
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParserContext.java47
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java190
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/Token.java30
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/TokenStream.java93
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/ParseBlocks.java84
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/RepeatingParseBlock.java96
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/SimpleParseBlock.java101
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/TriggeredParseBlock.java61
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/AbstractInitialCommand.java32
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryCommand.java43
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryPostCommand.java40
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ChainCommand.java73
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ConstantCommand.java40
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultInitialCommand.java28
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultNonInitialCommand.java32
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DenestingCommand.java45
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/GroupingCommand.java51
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/InitialCommands.java168
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeafCommand.java29
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeftBinaryCommand.java32
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonBinaryCommand.java37
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonInitialCommands.java140
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostCircumfixCommand.java60
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostfixCommand.java39
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PreTernaryCommand.java75
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/RightBinaryCommand.java30
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TernaryCommand.java77
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TransformingInitialCommand.java52
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/UnaryCommand.java47
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringToken.java84
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringTokenStream.java56
42 files changed, 0 insertions, 2762 deletions
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java
deleted file mode 100644
index d743c21..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package bjc.utils.examples.parsing;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-import bjc.utils.parserutils.pratt.commands.NonBinaryCommand;
-import bjc.utils.parserutils.pratt.tokens.StringToken;
-
-class AssignCommand extends NonBinaryCommand<String, String, TestContext> {
- public AssignCommand() {
- super(10);
- }
-
- @Override
- public ITree<Token<String, String>> denote(ITree<Token<String, String>> operand, Token<String, String> operator,
- ParserContext<String, String, TestContext> ctx) throws ParserException {
- Token<String, String> name = operand.getHead();
-
- switch(name.getKey()) {
- case "(literal)":
- case "(vref)":
- break;
- default:
- throw new ParserException("Variable name must be simple");
- }
-
- ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
-
- ctx.state.scopes.top().putKey(name.getValue(), body);
-
- return new Tree<>(new StringToken("assign", "assign"), operand, body);
- }
-}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java
deleted file mode 100644
index 522bf6f..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java
+++ /dev/null
@@ -1,299 +0,0 @@
-package bjc.utils.examples.parsing;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.TransformIterator;
-import bjc.utils.esodata.Directory;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.NonInitialCommand;
-import bjc.utils.parserutils.pratt.PrattParser;
-import bjc.utils.parserutils.pratt.Token;
-import bjc.utils.parserutils.pratt.tokens.StringToken;
-import bjc.utils.parserutils.pratt.tokens.StringTokenStream;
-import bjc.utils.parserutils.splitter.TokenSplitter;
-import bjc.utils.parserutils.splitter.TwoLevelSplitter;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Scanner;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.function.UnaryOperator;
-
-import static bjc.utils.parserutils.pratt.commands.NonInitialCommands.*;
-import static bjc.utils.parserutils.pratt.commands.InitialCommands.*;
-
-import static bjc.utils.parserutils.pratt.tokens.StringToken.litToken;
-
-import static bjc.utils.functypes.ID.id;
-
-/**
- * Simple test for Pratt parser.
- *
- * @author EVE
- *
- */
-public class PrattParserTest {
- private static final class Tokenizer implements Function<String, Token<String, String>> {
- private Set<String> ops;
- private Set<String> reserved;
- private TestContext ctx;
-
- public Tokenizer(Set<String> operators, Set<String> reservedWords, TestContext context) {
- ops = operators;
- reserved = reservedWords;
- ctx = context;
- }
-
- @Override
- public Token<String, String> apply(String strang) {
- if (ops.contains(strang) || reserved.contains(strang)) {
- return litToken(strang);
- } else if (ctx.scopes.top().containsKey(strang)) {
- return new StringToken("(vref)", strang);
- } else {
- return new StringToken("(literal)", strang);
- }
- }
- }
-
- private static final class BlockExit implements UnaryOperator<TestContext> {
- @Override
- public TestContext apply(TestContext state) {
- state.scopes.pop();
-
- state.blockCount.pop();
-
- return state;
- }
- }
-
- private static final class BlockEnter implements UnaryOperator<TestContext> {
- @Override
- public TestContext apply(TestContext state) {
- Directory<String, ITree<Token<String, String>>> enclosing = state.scopes.top();
- int currBlockNumber = state.blockCount.pop();
-
- state.scopes.push(enclosing.newSubdirectory("block" + currBlockNumber));
-
- state.blockCount.push(currBlockNumber + 1);
- state.blockCount.push(0);
-
- return state;
- }
- }
-
- /**
- * Main method.
- *
- * @param args
- * Unused CLI arguments.
- */
- public static void main(String[] args) {
- /*
- * Use a linked hash set to preserve insertion order.
- */
- Set<String> ops = new LinkedHashSet<>();
-
- ops.add(":=");
- ops.addAll(Arrays.asList("||", "&&"));
- ops.addAll(Arrays.asList("<=", ">="));
-
- ops.addAll(Arrays.asList(".", ",", ";", ":"));
- ops.addAll(Arrays.asList("=", "<", ">"));
- ops.addAll(Arrays.asList("+", "-", "*", "/"));
- ops.addAll(Arrays.asList("^", "!"));
- ops.addAll(Arrays.asList("(", ")"));
- ops.addAll(Arrays.asList("[", "]"));
- ops.addAll(Arrays.asList("{", "}"));
-
- /*
- * Reserved words that represent themselves, not literals.
- */
- Set<String> reserved = new LinkedHashSet<>();
- reserved.addAll(Arrays.asList("if", "then", "else"));
- reserved.addAll(Arrays.asList("and", "or"));
- reserved.addAll(Arrays.asList("begin", "end"));
- reserved.addAll(Arrays.asList("switch", "case"));
- reserved.add("var");
-
- TwoLevelSplitter split = new TwoLevelSplitter();
-
- split.addCompoundDelim(":=");
- split.addCompoundDelim("||", "&&");
- split.addCompoundDelim("<=", ">=");
-
- split.addSimpleDelim(".", ",", ";", ":");
- split.addSimpleDelim("=", "<", ">");
- split.addSimpleDelim("+", "-", "*", "/");
- split.addSimpleDelim("^", "!");
-
- split.addSimpleMulti("\\(", "\\)");
- split.addSimpleMulti("\\[", "\\]");
- split.addSimpleMulti("\\{", "\\}");
-
- split.exclude(reserved.toArray(new String[0]));
-
- split.compile();
-
- PrattParser<String, String, TestContext> parser = createParser();
-
- TestContext ctx = new TestContext();
-
- Scanner scn = new Scanner(System.in);
-
- System.out.print("Enter a command (blank line to exit): ");
- String ln = scn.nextLine();
-
- while (!ln.trim().equals("")) {
- Iterator<Token<String, String>> tokens = preprocessInput(ops, split, ln, reserved, ctx);
-
- try {
- StringTokenStream tokenStream = new StringTokenStream(tokens);
-
- /*
- * Prime stream.
- */
- tokenStream.next();
-
- ITree<Token<String, String>> tree = parser.parseExpression(0, tokenStream, ctx, true);
-
- if (!tokenStream.headIs("(end)")) {
- System.out.println("Multiple expressions on line");
- }
-
- System.out.println("Parsed expression:\n" + tree);
- } catch (ParserException pex) {
- pex.printStackTrace();
- }
-
- System.out.print("Enter a command (blank line to exit): ");
- ln = scn.nextLine();
- }
-
- System.out.println();
- System.out.println("Context is: " + ctx);
-
- scn.close();
- }
-
- private static Iterator<Token<String, String>> preprocessInput(Set<String> ops, TokenSplitter split, String ln,
- Set<String> reserved, TestContext ctx) {
- String[] rawTokens = ln.split("\\s+");
-
- List<String> splitTokens = new LinkedList<>();
-
- for (String raw : rawTokens) {
- boolean doSplit = false;
-
- for (String op : ops) {
- if (raw.contains(op)) {
- doSplit = true;
- break;
- }
- }
-
- if (doSplit) {
- String[] strangs = split.split(raw);
-
- splitTokens.addAll(Arrays.asList(strangs));
- } else {
- splitTokens.add(raw);
- }
- }
-
- System.out.println("Split string: " + splitTokens);
-
- Iterator<String> source = splitTokens.iterator();
-
- Iterator<Token<String, String>> tokens = new TransformIterator<>(source,
- new Tokenizer(ops, reserved, ctx));
- return tokens;
- }
-
- private static PrattParser<String, String, TestContext> createParser() {
- /*
- * Set of which relational operators chain with each other.
- */
- HashSet<String> relChain = new HashSet<>();
- relChain.addAll(Arrays.asList("=", "<", ">", "<=", ">="));
-
- /*
- * Token for marking chains.
- */
- StringToken chainToken = litToken("and");
-
- /*
- * ID function.
- */
- UnaryOperator<TestContext> idfun = id();
-
- PrattParser<String, String, TestContext> parser = new PrattParser<>();
-
- parser.addNonInitialCommand(":", infixNon(3));
-
- parser.addNonInitialCommand("if", ternary(5, 0, "else", litToken("cond"), false));
-
- parser.addNonInitialCommand(":=", new AssignCommand());
-
- NonInitialCommand<String, String, TestContext> nonSSRelJoin = infixLeft(13);
- parser.addNonInitialCommand("and", nonSSRelJoin);
- parser.addNonInitialCommand("or", nonSSRelJoin);
-
- NonInitialCommand<String, String, TestContext> chainRelOp = chain(15, relChain, chainToken);
- parser.addNonInitialCommand("=", chainRelOp);
- parser.addNonInitialCommand("<", chainRelOp);
- parser.addNonInitialCommand(">", chainRelOp);
- parser.addNonInitialCommand("<=", chainRelOp);
- parser.addNonInitialCommand(">=", chainRelOp);
-
- NonInitialCommand<String, String, TestContext> ssRelJoin = infixRight(17);
- parser.addNonInitialCommand("&&", ssRelJoin);
- parser.addNonInitialCommand("||", ssRelJoin);
-
- NonInitialCommand<String, String, TestContext> addSub = infixLeft(20);
- parser.addNonInitialCommand("+", addSub);
- parser.addNonInitialCommand("-", addSub);
-
- NonInitialCommand<String, String, TestContext> mulDiv = infixLeft(30);
- parser.addNonInitialCommand("*", mulDiv);
- parser.addNonInitialCommand("/", mulDiv);
-
- parser.addNonInitialCommand("!", postfix(40));
-
- parser.addNonInitialCommand("^", infixRight(50));
-
- parser.addNonInitialCommand(".", infixLeft(60));
-
- parser.addNonInitialCommand("[", postCircumfix(60, 0, "]", litToken("idx")));
-
- parser.addInitialCommand("if", preTernary(0, 0, 0, "then", "else", litToken("ifelse")));
-
- parser.addInitialCommand("(", grouping(0, ")", litToken("parens")));
-
- parser.addInitialCommand("begin", delimited(0, ";", "end", litToken("block"), new BlockEnter(), idfun,
- new BlockExit(), true));
-
- parser.addInitialCommand("[", delimited(0, ",", "]", litToken("array"), idfun, idfun, idfun, false));
-
- parser.addInitialCommand("{", delimited(0, ",", "}", litToken("json"), idfun, idfun, idfun, false));
-
- parser.addInitialCommand("case", unary(5));
-
- parser.addInitialCommand("-", unary(30));
-
- InitialCommand<String, String, TestContext> leaf = leaf();
- parser.addInitialCommand("(literal)", leaf);
- parser.addInitialCommand("(vref)", leaf);
-
- parser.addInitialCommand("var", new VarCommand());
-
- parser.addInitialCommand("switch", new SwitchCommand());
-
- return parser;
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java
deleted file mode 100644
index 5f84d6b..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package bjc.utils.examples.parsing;
-
-import bjc.utils.funcdata.FunctionalStringTokenizer;
-import bjc.utils.funcdata.IList;
-import bjc.utils.parserutils.ShuntingYard;
-
-import java.util.Scanner;
-
-/**
- * Test of shunting yard
- *
- * @author ben
- *
- */
-public class ShuntTest {
- /**
- * Main method
- *
- * @param args
- * Unused CLI args
- */
- public static void main(String[] args) {
- Scanner inputSource = new Scanner(System.in);
-
- System.out.print("Enter a expression to shunt: ");
- String line = inputSource.nextLine();
-
- ShuntingYard<String> yard = new ShuntingYard<>(true);
-
- IList<String> preTokens = new FunctionalStringTokenizer(line).toList(strang -> strang);
- IList<String> shuntedTokens = yard.postfix(preTokens, strang -> strang);
-
- System.out.println(shuntedTokens.toString());
-
- inputSource.close();
- }
-}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/SwitchCommand.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/SwitchCommand.java
deleted file mode 100644
index 78d8093..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/SwitchCommand.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package bjc.utils.examples.parsing;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-import bjc.utils.parserutils.pratt.tokens.StringToken;
-
-class SwitchCommand implements InitialCommand<String, String, TestContext> {
- @Override
- public ITree<Token<String, String>> denote(Token<String, String> operator,
- ParserContext<String, String, TestContext> ctx) throws ParserException {
- ITree<Token<String, String>> object = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
-
- ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
-
- return new Tree<>(new StringToken("switch", "switch"), object, body);
- }
-}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TestContext.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TestContext.java
deleted file mode 100644
index 7f9986e..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TestContext.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package bjc.utils.examples.parsing;
-
-import bjc.utils.data.ITree;
-import bjc.utils.esodata.Directory;
-import bjc.utils.esodata.SimpleDirectory;
-import bjc.utils.esodata.SimpleStack;
-import bjc.utils.esodata.Stack;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * Simple context for the parser.
- *
- * @author EVE
- *
- */
-public class TestContext {
- /**
- * The variable scoping information.
- */
- public Stack<Directory<String, ITree<Token<String, String>>>> scopes;
-
- /**
- * The current number of scopes inside this scope.
- */
- public Stack<Integer> blockCount;
-
- /**
- * Create a new test context.
- */
- public TestContext() {
- scopes = new SimpleStack<>();
- blockCount = new SimpleStack<>();
-
- scopes.push(new SimpleDirectory<>());
- blockCount.push(0);
- }
-
- @Override
- public String toString() {
- return String.format("TestContext [scopes=%s\n, blockCount=%s]", scopes, blockCount);
- }
-}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java
deleted file mode 100644
index a78a3d5..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package bjc.utils.examples.parsing;
-
-import bjc.utils.data.IPair;
-import bjc.utils.data.ITree;
-import bjc.utils.data.Pair;
-import bjc.utils.data.Tree;
-import bjc.utils.funcdata.FunctionalMap;
-import bjc.utils.funcdata.FunctionalStringTokenizer;
-import bjc.utils.funcdata.IList;
-import bjc.utils.funcdata.IMap;
-import bjc.utils.funcutils.ListUtils;
-import bjc.utils.funcutils.StringUtils;
-import bjc.utils.parserutils.ShuntingYard;
-import bjc.utils.parserutils.TreeConstructor;
-
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.Scanner;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * Test of tree constructor
- *
- * @author ben
- *
- */
-public class TreeConstructTest {
- private static final class OperatorPicker implements Predicate<String> {
- @Override
- public boolean test(String token) {
- if(StringUtils.containsOnly(token, "\\[")) return true;
- else if(StringUtils.containsOnly(token, "\\]")) return true;
-
- switch(token) {
- case "+":
- case "-":
- case "*":
- case "/":
- return true;
- default:
- return false;
- }
- }
- }
-
- /**
- * Main method
- *
- * @param args
- * Unused CLI args
- */
- @SuppressWarnings({ "resource", "deprecation" })
- public static void main(String[] args) {
- Scanner inputSource = new Scanner(System.in);
-
- System.out.print("Enter a expression to parse: ");
- String line = inputSource.nextLine();
-
- IList<String> tokens = new FunctionalStringTokenizer(line).toList();
-
- ShuntingYard<String> yard = new ShuntingYard<>(true);
-
- Deque<IPair<String, String>> ops = new LinkedList<>();
-
- ops.add(new Pair<>("+", "\\+"));
- ops.add(new Pair<>("-", "-"));
- ops.add(new Pair<>("*", "\\*"));
- ops.add(new Pair<>("/", "/"));
- ops.add(new Pair<>(":=", ":="));
- ops.add(new Pair<>("=>", "=>"));
-
- IList<String> semiExpandedTokens = ListUtils.splitTokens(tokens, ops);
-
- ops = new LinkedList<>();
- ops.add(new Pair<>("(", "\\("));
- ops.add(new Pair<>(")", "\\)"));
- ops.add(new Pair<>("[", "\\["));
- ops.add(new Pair<>("]", "\\]"));
-
- IList<String> fullyExpandedTokens = ListUtils.deAffixTokens(semiExpandedTokens, ops);
- fullyExpandedTokens.removeIf((strang) -> strang.equals(""));
-
- IList<String> shuntedTokens = yard.postfix(fullyExpandedTokens, (token) -> token);
-
- System.out.println("Shunted: " + shuntedTokens.toString());
-
- Predicate<String> specialPicker = (operator) -> {
- if(StringUtils.containsOnly(operator, "\\[")) return true;
- else if(StringUtils.containsOnly(operator, "\\]")) return true;
-
- return false;
- };
-
- IMap<String, Function<Deque<ITree<String>>, ITree<String>>> operators
- = new FunctionalMap<>();
-
- operators.put("[", (queuedTrees) -> {
- return null;
- });
-
- operators.put("[", (queuedTrees) -> {
- Tree<String> openTree = new Tree<>("[");
-
- queuedTrees.push(openTree);
-
- return openTree;
- });
-
- operators.put("]", (queuedTrees) -> {
- ITree<String> arrayTree = new Tree<>("[]");
-
- while(!queuedTrees.peek().getHead().equals("[")) {
- arrayTree.addChild(queuedTrees.pop());
- }
-
- queuedTrees.push(arrayTree);
-
- return arrayTree;
- });
-
- ITree<String> constructedTree = TreeConstructor.constructTree(shuntedTokens,
- new OperatorPicker(), specialPicker, operators::get);
-
- System.out.println("AST: " + constructedTree.toString());
-
- inputSource.close();
- }
-}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/VarCommand.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/VarCommand.java
deleted file mode 100644
index 5cf4b25..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/VarCommand.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package bjc.utils.examples.parsing;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-import bjc.utils.parserutils.pratt.commands.AbstractInitialCommand;
-import bjc.utils.parserutils.pratt.tokens.StringToken;
-
-class VarCommand extends AbstractInitialCommand<String, String, TestContext> {
-
- @Override
- protected ITree<Token<String, String>> intNullDenotation(Token<String, String> operator,
- ParserContext<String, String, TestContext> ctx) throws ParserException {
- Token<String, String> name = ctx.tokens.current();
-
- switch(name.getKey()) {
- case "(literal)":
- case "(vref)":
- ctx.tokens.next();
- break;
- default:
- throw new ParserException("Variable name must be simple");
- }
-
- ctx.tokens.expect("=");
-
- ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
-
- ctx.state.scopes.top().putKey(name.getValue(), body);
-
- return new Tree<>(new StringToken("var-bind", "var-bind"), new Tree<>(name), body);
- }
-
-}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/test.tree b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/test.tree
deleted file mode 100644
index 795cc88..0000000
--- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/test.tree
+++ /dev/null
@@ -1,13 +0,0 @@
-test 1
- 1
- 1
- 2
- 2
- 1
-
-simp 1
- 2
- 3
- 4
- 3
- 2 \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/InitialCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/InitialCommand.java
deleted file mode 100644
index 716b99e..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/InitialCommand.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package bjc.utils.parserutils.pratt;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-
-/**
- * Represents an initial command in parsing.
- *
- * @author EVE
- *
- * @param <K>
- * The key type for the tokens.
- *
- * @param <V>
- * The value type for the tokens.
- *
- * @param <C>
- * The state type of the parser.
- *
- *
- */
-@FunctionalInterface
-public interface InitialCommand<K, V, C> {
- /**
- * Construct the null denotation of this command.
- *
- * @param operator
- * The operator for this command.
- * @param ctx
- * The context for the command.
- *
- * @return The tree for this command.
- *
- * @throws ParserException
- * If something goes wrong during parsing.
- */
- ITree<Token<K, V>> denote(Token<K, V> operator, ParserContext<K, V, C> ctx) throws ParserException;
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NonInitialCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NonInitialCommand.java
deleted file mode 100644
index b6797d3..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NonInitialCommand.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package bjc.utils.parserutils.pratt;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-
-/**
- * Represents a non-initial command in parsing.
- *
- * @author EVE
- *
- * @param <K>
- * The key type for the tokens.
- *
- * @param <V>
- * The value type for the tokens.
- *
- * @param <C>
- * The state type of the parser.
- *
- */
-public abstract class NonInitialCommand<K, V, C> {
- /**
- * Construct the left denotation of this command.
- *
- * @param operand
- * The left-hand operand of this command.
- * @param operator
- * The operator for this command.
- *
- * @param ctx
- * The state needed for commands.
- *
- * @return The tree this command forms.
- *
- * @throws ParserException
- * If something went wrong during parsing.
- */
- public abstract ITree<Token<K, V>> denote(ITree<Token<K, V>> operand, Token<K, V> operator,
- ParserContext<K, V, C> ctx) throws ParserException;
-
- /**
- * Get the left-binding power of this command.
- *
- * This represents the general precedence of this command.
- *
- * @return The left-binding power of this command.
- */
- public abstract int leftBinding();
-
- /**
- * Get the next-binding power of this command.
- *
- * This represents the highest precedence of command this command can be
- * the left operand of.
- *
- * This is the same as the left-binding power by default.
- *
- * @return The next-binding power of this command.
- */
- public int nextBinding() {
- return leftBinding();
- }
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParseBlock.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParseBlock.java
deleted file mode 100644
index 4542107..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParseBlock.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package bjc.utils.parserutils.pratt;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-
-/**
- * Represents a embedded block in an expression.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the token.
- *
- * @param <V>
- * The value type of the token.
- *
- * @param <C>
- * The state type of the parser.
- */
-@FunctionalInterface
-public interface ParseBlock<K, V, C> {
-
- /**
- * Parse the block this represents.
- *
- * @param ctx
- * The context for parsing.
- *
- * @return A AST for this block.
- *
- * @throws ParserException
- * If something goes wrong during parsing, or the block
- * fails validation.
- */
- ITree<Token<K, V>> parse(ParserContext<K, V, C> ctx) throws ParserException;
-
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParserContext.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParserContext.java
deleted file mode 100644
index 55b5e98..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/ParserContext.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package bjc.utils.parserutils.pratt;
-
-/**
- * Represents the contextual state passed to a command.
- *
- * @author EVE
- *
- * @param <K>
- * The key type of the tokens.
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class ParserContext<K, V, C> {
- /**
- * The source of tokens.
- */
- public TokenStream<K, V> tokens;
- /**
- * The parser for sub-expressions.
- */
- public PrattParser<K, V, C> parse;
- /**
- * The state of the parser.
- */
- public C state;
-
- /**
- * Create a new parser context.
- *
- * @param tokens
- * The source of tokens.
- *
- * @param parse
- * The parser to call for sub expressions.
- *
- * @param state
- * Any state needing to be kept during parsing.
- */
- public ParserContext(TokenStream<K, V> tokens, PrattParser<K, V, C> parse, C state) {
- this.tokens = tokens;
- this.parse = parse;
- this.state = state;
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java
deleted file mode 100644
index c53b4e1..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java
+++ /dev/null
@@ -1,190 +0,0 @@
-package bjc.utils.parserutils.pratt;
-
-import bjc.utils.data.ITree;
-import bjc.utils.funcutils.NumberUtils;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.commands.DefaultNonInitialCommand;
-import bjc.utils.parserutils.pratt.commands.DefaultInitialCommand;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A configurable Pratt parser for expressions.
- *
- * @author EVE
- *
- * @param <K>
- * The key type for the tokens.
- *
- * @param <V>
- * The value type for the tokens.
- *
- * @param <C>
- * The state type of the parser.
- *
- *
- */
-public class PrattParser<K, V, C> {
- /*
- * Default commands that error when used.
- */
- private final NonInitialCommand<K, V, C> DEFAULT_LEFT_COMMAND = new DefaultNonInitialCommand<>();
- private final InitialCommand<K, V, C> DEFAULT_NULL_COMMAND = new DefaultInitialCommand<>();
-
- /*
- * Left-commands that depend on what the null command was.
- */
- private Map<K, Map<K, NonInitialCommand<K, V, C>>> dependantLeftCommands;
-
- /*
- * The left commands.
- */
- private Map<K, NonInitialCommand<K, V, C>> leftCommands;
- /*
- * The initial commands.
- */
- private Map<K, InitialCommand<K, V, C>> nullCommands;
- /*
- * Initial commands only checked for statements.
- */
- private Map<K, InitialCommand<K, V, C>> statementCommands;
-
- /**
- * Create a new Pratt parser.
- *
- */
- public PrattParser() {
- dependantLeftCommands = new HashMap<>();
-
- leftCommands = new HashMap<>();
- nullCommands = new HashMap<>();
- statementCommands = new HashMap<>();
- }
-
- /**
- * Parse an expression.
- *
- * @param precedence
- * The initial precedence for the expression.
- *
- * @param tokens
- * The tokens for the expression.
- *
- * @param state
- * The state of the parser.
- *
- * @param isStatement
- * Whether or not to parse statements.
- *
- * @return The expression as an AST.
- *
- * @throws ParserException
- * If something goes wrong during parsing.
- */
- public ITree<Token<K, V>> parseExpression(int precedence, TokenStream<K, V> tokens, C state,
- boolean isStatement) throws ParserException {
- if (precedence < 0) {
- throw new IllegalArgumentException("Precedence must be greater than zero");
- }
-
- Token<K, V> initToken = tokens.current();
- tokens.next();
-
- K initKey = initToken.getKey();
-
- ITree<Token<K, V>> ast;
-
- if (isStatement && statementCommands.containsKey(initKey)) {
- ast = statementCommands.getOrDefault(initKey, DEFAULT_NULL_COMMAND).denote(initToken,
- new ParserContext<>(tokens, this, state));
- } else {
- ast = nullCommands.getOrDefault(initKey, DEFAULT_NULL_COMMAND).denote(initToken,
- new ParserContext<>(tokens, this, state));
- }
-
- int rightPrec = Integer.MAX_VALUE;
-
- while (true) {
- Token<K, V> tok = tokens.current();
-
- K key = tok.getKey();
-
- NonInitialCommand<K, V, C> command = leftCommands.getOrDefault(key, DEFAULT_LEFT_COMMAND);
-
- if (dependantLeftCommands.containsKey(initKey)) {
- command = dependantLeftCommands.get(initKey).getOrDefault(key, command);
- }
-
- int leftBind = command.leftBinding();
-
- if (NumberUtils.between(precedence, rightPrec, leftBind)) {
- tokens.next();
-
- ast = command.denote(ast, tok, new ParserContext<>(tokens, this, state));
- rightPrec = command.nextBinding();
- } else {
- break;
- }
- }
-
- return ast;
- }
-
- /**
- * Add a non-initial command to this parser.
- *
- * @param marker
- * The key that marks the command.
- *
- * @param comm
- * The command.
- */
- public void addNonInitialCommand(K marker, NonInitialCommand<K, V, C> comm) {
- leftCommands.put(marker, comm);
- }
-
- /**
- * Add a initial command to this parser.
- *
- * @param marker
- * The key that marks the command.
- *
- * @param comm
- * The command.
- */
- public void addInitialCommand(K marker, InitialCommand<K, V, C> comm) {
- nullCommands.put(marker, comm);
- }
-
- /**
- * Add a statement command to this parser.
- *
- * The difference between statements and initial commands is that
- * statements can only appear at the start of the expression.
- *
- * @param marker
- * The key that marks the command.
- *
- * @param comm
- * The command.
- */
- public void addStatementCommand(K marker, InitialCommand<K, V, C> comm) {
- statementCommands.put(marker, comm);
- }
-
- /**
- * Add a dependant non-initial command to this parser.
- */
- public void addDependantCommand(K dependant, K marker, NonInitialCommand<K, V, C> comm) {
- if (dependantLeftCommands.containsKey(dependant)) {
- dependantLeftCommands.get(dependant).put(marker, comm);
- } else {
- Map<K, NonInitialCommand<K, V, C>> comms = new HashMap<>();
-
- comms.put(marker, comm);
-
- dependantLeftCommands.put(dependant, comms);
- }
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/Token.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/Token.java
deleted file mode 100644
index 6db8b63..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/Token.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package bjc.utils.parserutils.pratt;
-
-/**
- * Represents a simple parsing token.
- *
- * @author EVE
- *
- * @param <K>
- * The key type of this token. Represents the type of the token.
- *
- * @param <V>
- * The value type of this token. Represents any additional data
- * for the token.
- *
- */
-public interface Token<K, V> {
- /**
- * Get the key for this token.
- *
- * @return The key for this token
- */
- K getKey();
-
- /**
- * Get the value for this token.
- *
- * @return The value for this token.
- */
- V getValue();
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/TokenStream.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/TokenStream.java
deleted file mode 100644
index db7d1e0..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/TokenStream.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package bjc.utils.parserutils.pratt;
-
-import bjc.utils.funcutils.StringUtils;
-import bjc.utils.parserutils.ParserException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * A stream of tokens.
- *
- * @author EVE
- *
- * @param <K>
- * The key type of the token.
- *
- * @param <V>
- * The value type of the token.
- */
-public abstract class TokenStream<K, V> implements Iterator<Token<K, V>> {
- /**
- * The exception thrown when an expectation fails.
- *
- * @author EVE
- *
- */
- public static class ExpectationException extends ParserException {
- /**
- * Create a new exception with the specified message.
- *
- * @param msg
- * The message of the exception.
- */
- public ExpectationException(String msg) {
- super(msg);
- }
- }
-
- /**
- * Get the current token.
- *
- * @return The current token.
- */
- public abstract Token<K, V> current();
-
- @Override
- public abstract Token<K, V> next();
-
- @Override
- public abstract boolean hasNext();
-
- /**
- * Utility method for checking that the next token is one of a specific
- * set of types, and then consuming it.
- *
- * @param expectedKeys
- * The expected values
- *
- * @throws ExpectationException
- * If the token is not one of the expected types.
- */
- public void expect(Set<K> expectedKeys) throws ExpectationException {
- K curKey = current().getKey();
-
- if (!expectedKeys.contains(curKey)) {
- String expectedList = StringUtils.toEnglishList(expectedKeys.toArray(), false);
-
- throw new ExpectationException("One of '" + expectedList + "' was expected, not " + curKey);
- } else {
- next();
- }
- }
-
- /**
- * Utility method for checking that the next token is one of a specific
- * set of types, and then consuming it.
- *
- * @param expectedKeys
- * The expected values
- *
- * @throws ExpectationException
- * If the token is not one of the expected types.
- */
- @SafeVarargs
- public final void expect(K... expectedKeys) throws ExpectationException {
- expect(new HashSet<>(Arrays.asList(expectedKeys)));
- }
-
- public boolean headIs(K val) {
- return current().getKey().equals(val);
- }
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/ParseBlocks.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/ParseBlocks.java
deleted file mode 100644
index 9df8355..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/ParseBlocks.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package bjc.utils.parserutils.pratt.blocks;
-
-import java.util.function.Predicate;
-import java.util.function.UnaryOperator;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * Utility class for creating common implementations of {@link ParseBlock}
- *
- * @author bjculkin
- *
- */
-public class ParseBlocks {
- /**
- * Create a new repeating parse block.
- *
- * @param inner
- * The parse block to repeat.
- *
- * @param delim
- * The token type that seperates repetitions.
- *
- * @param term
- * The token type that terminates repititions.
- *
- * @param mark
- * The token to use as the node in the AST.
- *
- * @param action
- * The action to perform on the state after every
- * repitition.
- *
- * @return A configured repeating parse block.
- */
- public static <K, V, C> ParseBlock<K, V, C> repeating(ParseBlock<K, V, C> inner, K delim, K term,
- Token<K, V> mark, UnaryOperator<C> action) {
- return new RepeatingParseBlock<>(inner, delim, term, mark, action);
- }
-
- /**
- * Create a new triggered parse block.
- *
- * @param source
- * The block to trigger around.
- *
- * @param onEnter
- * The action to perform upon the state before entering
- * the block.
- *
- * @param onExit
- * The action to perform upon the state after exiting the
- * block.
- *
- * @return A configured trigger parse block.
- */
- public static <K, V, C> ParseBlock<K, V, C> trigger(ParseBlock<K, V, C> source, UnaryOperator<C> onEnter,
- UnaryOperator<C> onExit) {
- return new TriggeredParseBlock<>(onEnter, onExit, source);
- }
-
- /**
- * Create a new simple parse block.
- *
- * @param precedence
- * The precedence of the expression inside the block.
- *
- * @param terminator
- * The key type of the token expected after this block,
- * or null if none is expected.
- *
- * @param validator
- * The predicate to use to validate parsed expressions,
- * or null if none is used.
- *
- * @return A configured simple parse block.
- */
- public static <K, V, C> ParseBlock<K, V, C> simple(int precedence, K terminator,
- Predicate<ITree<Token<K, V>>> validator) {
- return new SimpleParseBlock<>(precedence, terminator, validator);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/RepeatingParseBlock.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/RepeatingParseBlock.java
deleted file mode 100644
index 08a4bae..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/RepeatingParseBlock.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package bjc.utils.parserutils.pratt.blocks;
-
-import java.util.function.UnaryOperator;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A parse block that can parse a sequnce of zero or more occurances of another
- * block.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class RepeatingParseBlock<K, V, C> implements ParseBlock<K, V, C> {
- private ParseBlock<K, V, C> innerBlock;
-
- private K delim;
- private K term;
-
- private UnaryOperator<C> onDelim;
-
- private Token<K, V> mark;
-
- /**
- * Create a new repeating block.
- *
- * @param inner
- * The inner block for elements.
- *
- * @param delimiter
- * The token that delimits elements in the sequence.
- *
- * @param terminator
- * The token that terminates the sequence.
- *
- * @param marker
- * The token to use as the node in the AST.
- *
- * @param action
- * The action to apply to the state after every
- * delimiter.
- */
- public RepeatingParseBlock(ParseBlock<K, V, C> inner, K delimiter, K terminator, Token<K, V> marker,
- UnaryOperator<C> action) {
- super();
-
- if (inner == null)
- throw new NullPointerException("Inner block must not be null");
- else if (delimiter == null)
- throw new NullPointerException("Delimiter must not be null");
- else if (terminator == null) throw new NullPointerException("Terminator must not be null");
-
- innerBlock = inner;
-
- delim = delimiter;
- term = terminator;
-
- mark = marker;
-
- onDelim = action;
- }
-
- @Override
- public ITree<Token<K, V>> parse(ParserContext<K, V, C> ctx) throws ParserException {
- ITree<Token<K, V>> ret = new Tree<>(mark);
-
- Token<K, V> tok = ctx.tokens.current();
-
- while (!tok.getKey().equals(term)) {
- ITree<Token<K, V>> kid = innerBlock.parse(ctx);
- ret.addChild(kid);
-
- tok = ctx.tokens.current();
-
- ctx.tokens.expect(delim, term);
-
- if (onDelim != null) ctx.state = onDelim.apply(ctx.state);
- }
-
- return ret;
- }
-
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/SimpleParseBlock.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/SimpleParseBlock.java
deleted file mode 100644
index c2e9e54..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/SimpleParseBlock.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package bjc.utils.parserutils.pratt.blocks;
-
-import java.util.function.Predicate;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * Simple implementation of {@link ParseBlock}
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class SimpleParseBlock<K, V, C> implements ParseBlock<K, V, C> {
- private int pow;
-
- private K term;
-
- private Predicate<ITree<Token<K, V>>> validatr;
-
- /**
- * Create a new block.
- *
- * @param precedence
- * The precedence of this block.
- *
- * @param terminator
- * The token type that terminates the block. If this is
- * null, don't check for a terminator.
- *
- * @param validator
- * The predicate to apply to blocks.
- */
- public SimpleParseBlock(int precedence, K terminator, Predicate<ITree<Token<K, V>>> validator) {
- if (precedence < 0) throw new IllegalArgumentException("Precedence must be non-negative");
-
- pow = precedence;
- term = terminator;
- validatr = validator;
- }
-
- @Override
- public ITree<Token<K, V>> parse(ParserContext<K, V, C> ctx) throws ParserException {
- ITree<Token<K, V>> res = ctx.parse.parseExpression(pow, ctx.tokens, ctx.state, false);
-
- if (term != null) {
- ctx.tokens.expect(term);
- }
-
- if (validatr == null || validatr.test(res)) {
- return res;
- }
-
- throw new ParserException("Block failed validation");
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
-
- int result = 1;
-
- result = prime * result + pow;
- result = prime * result + ((term == null) ? 0 : term.hashCode());
-
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (!(obj instanceof SimpleParseBlock)) return false;
-
- SimpleParseBlock<?, ?, ?> other = (SimpleParseBlock<?, ?, ?>) obj;
-
- if (pow != other.pow) return false;
-
- if (term == null) {
- if (other.term != null) return false;
- } else if (!term.equals(other.term)) return false;
-
- return true;
- }
-
- @Override
- public String toString() {
- return String.format("ParseBlock [pow=%s, term='%s']", pow, term);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/TriggeredParseBlock.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/TriggeredParseBlock.java
deleted file mode 100644
index fbfc61b..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/blocks/TriggeredParseBlock.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package bjc.utils.parserutils.pratt.blocks;
-
-import java.util.function.UnaryOperator;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A parse block that can adjust the state before handling its context.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- * @param <V>
- * The value type of the tokens.
- * @param <C>
- * The state type of the parser.
- */
-public class TriggeredParseBlock<K, V, C> implements ParseBlock<K, V, C> {
- private UnaryOperator<C> onEnter;
- private UnaryOperator<C> onExit;
-
- private ParseBlock<K, V, C> source;
-
- /**
- * Create a new triggered parse block.
- *
- * @param onEnter
- * The action to fire before parsing the block.
- *
- * @param onExit
- * The action to fire after parsing the block.
- *
- * @param source
- * The block to use for parsing.
- */
- public TriggeredParseBlock(UnaryOperator<C> onEnter, UnaryOperator<C> onExit, ParseBlock<K, V, C> source) {
- super();
- this.onEnter = onEnter;
- this.onExit = onExit;
- this.source = source;
- }
-
- @Override
- public ITree<Token<K, V>> parse(ParserContext<K, V, C> ctx) throws ParserException {
- C newState = onEnter.apply(ctx.state);
-
- ParserContext<K, V, C> newCtx = new ParserContext<>(ctx.tokens, ctx.parse, newState);
-
- ITree<Token<K, V>> res = source.parse(newCtx);
-
- ctx.state = onExit.apply(newState);
-
- return res;
- }
-
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/AbstractInitialCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/AbstractInitialCommand.java
deleted file mode 100644
index 3c3a89b..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/AbstractInitialCommand.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * Abstract base for initial commands.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public abstract class AbstractInitialCommand<K, V, C> implements InitialCommand<K, V, C> {
- @Override
- public ITree<Token<K, V>> denote(Token<K, V> operator, ParserContext<K, V, C> ctx) throws ParserException {
- return intNullDenotation(operator, ctx);
- }
-
- protected abstract ITree<Token<K, V>> intNullDenotation(Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException;
-
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryCommand.java
deleted file mode 100644
index 781309c..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryCommand.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A binary operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public abstract class BinaryCommand<K, V, C> extends BinaryPostCommand<K, V, C> {
- /**
- * Create a new binary operator with the specified precedence.
- *
- * @param precedence
- * The precedence of the operator.
- */
- public BinaryCommand(int precedence) {
- super(precedence);
- }
-
- protected abstract int rightBinding();
-
- @Override
- public ITree<Token<K, V>> denote(ITree<Token<K, V>> operand, Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- ITree<Token<K, V>> opr = ctx.parse.parseExpression(rightBinding(), ctx.tokens, ctx.state, false);
-
- return new Tree<>(operator, operand, opr);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryPostCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryPostCommand.java
deleted file mode 100644
index 806f2f3..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/BinaryPostCommand.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.parserutils.pratt.NonInitialCommand;
-
-/**
- * A operator with fixed precedence.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public abstract class BinaryPostCommand<K, V, C> extends NonInitialCommand<K, V, C> {
- private final int leftPower;
-
- /**
- * Create a new operator with fixed precedence.
- *
- * @param precedence
- * The precedence of the operator.
- */
- public BinaryPostCommand(int precedence) {
- if (precedence < 0) {
- throw new IllegalArgumentException("Precedence must be non-negative");
- }
-
- leftPower = precedence;
- }
-
- @Override
- public int leftBinding() {
- return leftPower;
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ChainCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ChainCommand.java
deleted file mode 100644
index 1324586..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ChainCommand.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-import java.util.Set;
-
-/**
- * Create a new chained operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class ChainCommand<K, V, C> extends BinaryPostCommand<K, V, C> {
- private Set<K> chainWith;
-
- private Token<K, V> chain;
-
- /**
- * Create a new chained operator.
- *
- * @param precedence
- * The precedence of this operator.
- *
- * @param chainSet
- * The operators to chain with.
- *
- * @param chainMarker
- * The token to use as the node in the AST.
- */
- public ChainCommand(int precedence, Set<K> chainSet, Token<K, V> chainMarker) {
- super(precedence);
-
- chainWith = chainSet;
- chain = chainMarker;
- }
-
- @Override
- public ITree<Token<K, V>> denote(ITree<Token<K, V>> operand, Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- ITree<Token<K, V>> tree = ctx.parse.parseExpression(1 + leftBinding(), ctx.tokens, ctx.state, false);
-
- ITree<Token<K, V>> res = new Tree<>(operator, operand, tree);
-
- if (chainWith.contains(ctx.tokens.current().getKey())) {
- Token<K, V> tok = ctx.tokens.current();
- ctx.tokens.next();
-
- ITree<Token<K, V>> other = denote(tree, tok,
- new ParserContext<>(ctx.tokens, ctx.parse, ctx.state));
-
- return new Tree<>(chain, res, other);
- } else {
- return res;
- }
- }
-
- @Override
- public int nextBinding() {
- return leftBinding() - 1;
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ConstantCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ConstantCommand.java
deleted file mode 100644
index 10ff184..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/ConstantCommand.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A command that represents a specific tree.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class ConstantCommand<K, V, C> implements InitialCommand<K, V, C> {
- private ITree<Token<K, V>> val;
-
- /**
- * Create a new constant.
- *
- * @param con
- * The tree this constant represents.
- */
- public ConstantCommand(ITree<Token<K, V>> con) {
- val = con;
- }
-
- @Override
- public ITree<Token<K, V>> denote(Token<K, V> operator, ParserContext<K, V, C> ctx) throws ParserException {
- return val;
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultInitialCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultInitialCommand.java
deleted file mode 100644
index 7409755..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultInitialCommand.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * Default implementation of an initial command.
- *
- * @author EVE
- *
- * @param <K>
- * The key type of the token.
- *
- * @param <V>
- * The value type of the token.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class DefaultInitialCommand<K, V, C> implements InitialCommand<K, V, C> {
- @Override
- public ITree<Token<K, V>> denote(Token<K, V> operator, ParserContext<K, V, C> ctx) throws ParserException {
- throw new ParserException("Unexpected token " + operator);
- }
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultNonInitialCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultNonInitialCommand.java
deleted file mode 100644
index 887dd25..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DefaultNonInitialCommand.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.pratt.NonInitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * Default implementation of a non-initial command.
- *
- * @author EVE
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class DefaultNonInitialCommand<K, V, C> extends NonInitialCommand<K, V, C> {
- @Override
- public ITree<Token<K, V>> denote(ITree<Token<K, V>> operand, Token<K, V> operator, ParserContext<K, V, C> ctx) {
- throw new UnsupportedOperationException("Default command has no left denotation");
- }
-
- @Override
- public int leftBinding() {
- return -1;
- }
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DenestingCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DenestingCommand.java
deleted file mode 100644
index 01f92bb..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DenestingCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A command that denests a input tree.
- *
- * Useful for processing the result of passing a complex parse group to a
- * command.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- *
- */
-public class DenestingCommand<K, V, C> extends AbstractInitialCommand<K, V, C> {
- private InitialCommand<K, V, C> wrapped;
-
- /**
- * Create a new transforming initial command.
- *
- * @param internal
- * The initial command to delegate to.
- */
- public DenestingCommand(InitialCommand<K, V, C> internal) {
- wrapped = internal;
- }
-
- @Override
- protected ITree<Token<K, V>> intNullDenotation(Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- return wrapped.denote(operator, ctx).getChild(0);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/GroupingCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/GroupingCommand.java
deleted file mode 100644
index 37cc6ee..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/GroupingCommand.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A grouping operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class GroupingCommand<K, V, C> extends AbstractInitialCommand<K, V, C> {
- private ParseBlock<K, V, C> innerBlock;
-
- private Token<K, V> mark;
-
- /**
- * Create a new grouping command.
- *
- * @param inner
- * The inner block.
- *
- * @param marker
- * The token to use as the node in the AST.
- */
- public GroupingCommand(ParseBlock<K, V, C> inner, Token<K, V> marker) {
- innerBlock = inner;
-
- mark = marker;
- }
-
- @Override
- protected ITree<Token<K, V>> intNullDenotation(Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- ITree<Token<K, V>> opr = innerBlock.parse(ctx);
-
- return new Tree<>(mark, opr);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/InitialCommands.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/InitialCommands.java
deleted file mode 100644
index eac357a..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/InitialCommands.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.Token;
-
-import java.util.function.UnaryOperator;
-
-import static bjc.utils.parserutils.pratt.blocks.ParseBlocks.*;
-
-/**
- * * Contains factory methods for producing common implementations of
- * {@link InitialCommand}
- *
- * @author EVE
- *
- */
-public class InitialCommands {
- /**
- * Create a new unary operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @return A command implementing that operator.
- */
- public static <K, V, C> InitialCommand<K, V, C> unary(int precedence) {
- return new UnaryCommand<>(precedence);
- }
-
- /**
- * Create a new grouping operator.
- *
- * @param precedence
- * The precedence of the expression in the operator.
- *
- * @param term
- * The type that closes the group.
- *
- * @param mark
- * The token for the AST node of the group.
- *
- * @return A command implementing the operator.
- */
- public static <K, V, C> InitialCommand<K, V, C> grouping(int precedence, K term, Token<K, V> mark) {
- ParseBlock<K, V, C> innerBlock = simple(precedence, term, null);
-
- return new GroupingCommand<>(innerBlock, mark);
- }
-
- /**
- * Create a new leaf operator.
- *
- * @return A command implementing the operator.
- */
- public static <K, V, C> InitialCommand<K, V, C> leaf() {
- return new LeafCommand<>();
- }
-
- /**
- * Create a new pre-ternary operator, like an if-then-else statement.
- *
- * @param cond1
- * The priority of the first block.
- *
- * @param block1
- * The priority of the second block.
- *
- * @param block2
- * The priority of the third block.
- *
- * @param mark1
- * The marker that ends the first block.
- *
- * @param mark2
- * The marker that ends the second block.
- *
- * @param term
- * The token for the AST node of the group.
- *
- * @return A command implementing the operator.
- */
- public static <K, V, C> InitialCommand<K, V, C> preTernary(int cond1, int block1, int block2, K mark1, K mark2,
- Token<K, V> term) {
- ParseBlock<K, V, C> condBlock = simple(cond1, mark1, null);
- ParseBlock<K, V, C> opblock1 = simple(block1, mark2, null);
- ParseBlock<K, V, C> opblock2 = simple(block2, null, null);
-
- return new PreTernaryCommand<>(condBlock, opblock1, opblock2, term);
- }
-
- /**
- * Create a new named constant.
- *
- * @param val
- * The value of the constant.
- *
- * @return A command implementing the constant.
- */
- public static <K, V, C> InitialCommand<K, V, C> constant(ITree<Token<K, V>> val) {
- return new ConstantCommand<>(val);
- }
-
- /**
- * Create a new delimited command. This is for block-like constructs.
- *
- * @param inner
- * The precedence of the inner blocks.
- *
- * @param delim
- * The marker between sub-blocks.
- *
- * @param mark
- * The block terminator.
- *
- * @param term
- * The token for the AST node of the group.
- *
- * @param onEnter
- * The function to apply to the state on entering the
- * block.
- *
- * @param onDelim
- * The function to apply to the state on finishing a
- * sub-block.
- *
- * @param onExit
- * The function to apply to the state on exiting the
- * block.
- *
- * @param statement
- * Whether or not the sub-blocks are statements or
- * expressions.
- *
- * @return A command implementing the operator.
- */
- public static <K, V, C> InitialCommand<K, V, C> delimited(int inner, K delim, K mark, Token<K, V> term,
- UnaryOperator<C> onEnter, UnaryOperator<C> onDelim, UnaryOperator<C> onExit,
- boolean statement) {
- ParseBlock<K, V, C> innerBlock = simple(inner, null, null);
- ParseBlock<K, V, C> delimsBlock = repeating(innerBlock, delim, mark, term, onDelim);
- ParseBlock<K, V, C> scopedBlock = trigger(delimsBlock, onEnter, onExit);
-
- GroupingCommand<K, V, C> command = new GroupingCommand<>(scopedBlock, term);
-
- /*
- * Remove the wrapper layer from grouping-command on top of
- * RepeatingParseBlock.
- */
- return denest(command);
- }
-
- /**
- * Create a new denesting command.
- *
- * This removes one tree-level, and is useful when combining complex
- * parse blocks with commands.
- *
- * @param comm
- * The command to denest.
- *
- * @return A command that denests the result of the provided command.
- */
- public static <K, V, C> InitialCommand<K, V, C> denest(InitialCommand<K, V, C> comm) {
- return new DenestingCommand<>(comm);
- }
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeafCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeafCommand.java
deleted file mode 100644
index 3937f5f..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeafCommand.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A operator that stands for itself.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class LeafCommand<K, V, C> implements InitialCommand<K, V, C> {
- @Override
- public ITree<Token<K, V>> denote(Token<K, V> operator, ParserContext<K, V, C> ctx) throws ParserException {
- return new Tree<>(operator);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeftBinaryCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeftBinaryCommand.java
deleted file mode 100644
index 58d7261..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/LeftBinaryCommand.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-/**
- * A left-associative operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class LeftBinaryCommand<K, V, C> extends BinaryCommand<K, V, C> {
- /**
- * Create a new left-associative operator.
- *
- * @param precedence
- * The precedence of the operator.
- */
- public LeftBinaryCommand(int precedence) {
- super(precedence);
- }
-
- @Override
- protected int rightBinding() {
- return 1 + leftBinding();
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonBinaryCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonBinaryCommand.java
deleted file mode 100644
index d32a1a7..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonBinaryCommand.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-/**
- * A non-associative operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class NonBinaryCommand<K, V, C> extends BinaryCommand<K, V, C> {
- /**
- * Create a new non-associative operator.
- *
- * @param precedence
- * The precedence of the operator.
- */
- public NonBinaryCommand(int precedence) {
- super(precedence);
- }
-
- @Override
- protected int rightBinding() {
- return 1 + leftBinding();
- }
-
- @Override
- public int nextBinding() {
- return leftBinding() - 1;
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonInitialCommands.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonInitialCommands.java
deleted file mode 100644
index 45bdc51..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/NonInitialCommands.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.parserutils.pratt.NonInitialCommand;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.Token;
-import bjc.utils.parserutils.pratt.blocks.SimpleParseBlock;
-
-import java.util.Set;
-
-/**
- * Contains factory methods for producing common implementations of
- * {@link NonInitialCommand}
- *
- * @author EVE
- *
- */
-public class NonInitialCommands {
- /**
- * Create a left-associative infix operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @return A command implementing that operator.
- */
- public static <K, V, C> NonInitialCommand<K, V, C> infixLeft(int precedence) {
- return new LeftBinaryCommand<>(precedence);
- }
-
- /**
- * Create a right-associative infix operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @return A command implementing that operator.
- */
- public static <K, V, C> NonInitialCommand<K, V, C> infixRight(int precedence) {
- return new RightBinaryCommand<>(precedence);
- }
-
- /**
- * Create a non-associative infix operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @return A command implementing that operator.
- */
- public static <K, V, C> NonInitialCommand<K, V, C> infixNon(int precedence) {
- return new NonBinaryCommand<>(precedence);
- }
-
- /**
- * Create a chained operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @param chainSet
- * The operators it forms a chain with.
- *
- * @param marker
- * The token to use as the AST node for the chained
- * operators.
- *
- * @return A command implementing that operator.
- */
- public static <K, V, C> NonInitialCommand<K, V, C> chain(int precedence, Set<K> chainSet, Token<K, V> marker) {
- return new ChainCommand<>(precedence, chainSet, marker);
- }
-
- /**
- * Create a postfix operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @return A command implementing that operator.
- */
- public static <K, V, C> NonInitialCommand<K, V, C> postfix(int precedence) {
- return new PostfixCommand<>(precedence);
- }
-
- /**
- * Create a post-circumfix operator.
- *
- * This is an operator in form similar to array indexing.
- *
- * @param precedence
- * The precedence of this operator
- *
- * @param insidePrecedence
- * The precedence of the expression inside the operator
- *
- * @param closer
- * The token that closes the circumfix.
- *
- * @param marker
- * The token to use as the AST node for the operator.
- *
- * @return A command implementing that operator.
- */
- public static <K, V, C> NonInitialCommand<K, V, C> postCircumfix(int precedence, int insidePrecedence, K closer,
- Token<K, V> marker) {
- ParseBlock<K, V, C> innerBlock = new SimpleParseBlock<>(insidePrecedence, closer, null);
-
- return new PostCircumfixCommand<>(precedence, innerBlock, marker);
- }
-
- /**
- * Create a ternary operator.
- *
- * This is like C's ?: operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @param insidePrecedence
- * The precedence of the inner section of the operator.
- *
- * @param closer
- * The token that marks the end of the inner section.
- *
- * @param marker
- * The token to use as the AST node for the operator.
- *
- * @param nonassoc
- * True if the command is non-associative, false
- * otherwise.
- *
- * @return A command implementing this operator.
- */
- public static <K, V, C> NonInitialCommand<K, V, C> ternary(int precedence, int insidePrecedence, K closer,
- Token<K, V> marker, boolean nonassoc) {
- ParseBlock<K, V, C> innerBlock = new SimpleParseBlock<>(insidePrecedence, closer, null);
-
- return new TernaryCommand<>(precedence, innerBlock, marker, nonassoc);
- }
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostCircumfixCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostCircumfixCommand.java
deleted file mode 100644
index 90fca00..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostCircumfixCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A post-circumfix operator, like array indexing.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class PostCircumfixCommand<K, V, C> extends BinaryPostCommand<K, V, C> {
- private ParseBlock<K, V, C> innerBlock;
-
- private Token<K, V> mark;
-
- /**
- * Create a new post-circumfix operator.
- *
- * @param precedence
- * The precedence of the operator.
- *
- * @param inner
- * The block inside the expression.
- *
- * @param marker
- * The token to use as the node for the AST.
- */
- public PostCircumfixCommand(int precedence, ParseBlock<K, V, C> inner, Token<K, V> marker) {
- super(precedence);
-
- if (inner == null) {
- throw new NullPointerException("Inner block must not be null");
- }
-
- innerBlock = inner;
-
- mark = marker;
- }
-
- @Override
- public ITree<Token<K, V>> denote(ITree<Token<K, V>> operand, Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- ITree<Token<K, V>> inside = innerBlock.parse(ctx);
-
- return new Tree<>(mark, operand, inside);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostfixCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostfixCommand.java
deleted file mode 100644
index bab3de4..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PostfixCommand.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A postfix operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class PostfixCommand<K, V, C> extends BinaryPostCommand<K, V, C> {
- /**
- * Create a new postfix operator.
- *
- * @param precedence
- * The precedence of the operator.
- */
- public PostfixCommand(int precedence) {
- super(precedence);
- }
-
- @Override
- public ITree<Token<K, V>> denote(ITree<Token<K, V>> operand, Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- return new Tree<>(operator, operand);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PreTernaryCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PreTernaryCommand.java
deleted file mode 100644
index 42d1a6e..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/PreTernaryCommand.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A prefix ternary operator, like an if/then/else group.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class PreTernaryCommand<K, V, C> extends AbstractInitialCommand<K, V, C> {
- private Token<K, V> term;
-
- private ParseBlock<K, V, C> condBlock;
-
- private ParseBlock<K, V, C> opblock1;
- private ParseBlock<K, V, C> opblock2;
-
- /**
- * Create a new ternary statement.
- *
- * @param cond
- * The block for handling the condition.
- *
- * @param op1
- * The block for handling the first operator.
- *
- * @param op2
- * The block for handling the second operator.
- *
- * @param term
- * The token to use as the node for the AST.
- */
- public PreTernaryCommand(ParseBlock<K, V, C> cond, ParseBlock<K, V, C> op1, ParseBlock<K, V, C> op2,
- Token<K, V> term) {
- super();
-
- if (cond == null)
- throw new NullPointerException("Cond block must not be null");
- else if (op1 == null)
- throw new NullPointerException("Op block #1 must not be null");
- else if (op2 == null) throw new NullPointerException("Op block #2 must not be null");
-
- this.condBlock = cond;
- this.opblock1 = op1;
- this.opblock2 = op2;
-
- this.term = term;
- }
-
- @Override
- protected ITree<Token<K, V>> intNullDenotation(Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- ITree<Token<K, V>> cond = condBlock.parse(ctx);
-
- ITree<Token<K, V>> op1 = opblock1.parse(ctx);
-
- ITree<Token<K, V>> op2 = opblock2.parse(ctx);
-
- return new Tree<>(term, cond, op1, op2);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/RightBinaryCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/RightBinaryCommand.java
deleted file mode 100644
index 5f3d9f2..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/RightBinaryCommand.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-/**
- * A right-associative binary operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- * @param <V>
- * The value type of the tokens.
- * @param <C>
- * The state type of the parser.
- */
-public class RightBinaryCommand<K, V, C> extends BinaryCommand<K, V, C> {
- /**
- * Create a new right-associative operator.
- *
- * @param precedence
- * The precedence of the operator.
- */
- public RightBinaryCommand(int precedence) {
- super(precedence);
- }
-
- @Override
- protected int rightBinding() {
- return leftBinding();
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TernaryCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TernaryCommand.java
deleted file mode 100644
index 8f04368..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TernaryCommand.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParseBlock;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A ternary command, like C's ?:
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class TernaryCommand<K, V, C> extends BinaryPostCommand<K, V, C> {
- private ParseBlock<K, V, C> innerBlck;
-
- private Token<K, V> mark;
-
- private boolean nonassoc;
-
- /**
- * Create a new ternary command.
- *
- * @param precedence
- * The precedence of this operator.
- *
- * @param innerBlock
- * The representation of the inner block of the
- * expression.
- *
- * @param marker
- * The token to use as the root of the AST node.
- *
- * @param isNonassoc
- * Whether or not the conditional is associative.
- */
- public TernaryCommand(int precedence, ParseBlock<K, V, C> innerBlock, Token<K, V> marker, boolean isNonassoc) {
- super(precedence);
-
- if (innerBlock == null)
- throw new NullPointerException("Inner block must not be null");
- else if (marker == null) throw new NullPointerException("Marker must not be null");
-
- innerBlck = innerBlock;
- mark = marker;
- nonassoc = isNonassoc;
- }
-
- @Override
- public ITree<Token<K, V>> denote(ITree<Token<K, V>> operand, Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- ITree<Token<K, V>> inner = innerBlck.parse(ctx);
-
- ITree<Token<K, V>> outer = ctx.parse.parseExpression(1 + leftBinding(), ctx.tokens, ctx.state, false);
-
- return new Tree<>(mark, inner, operand, outer);
- }
-
- @Override
- public int nextBinding() {
- if (nonassoc) {
- return leftBinding() - 1;
- } else {
- return leftBinding();
- }
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TransformingInitialCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TransformingInitialCommand.java
deleted file mode 100644
index 88803df..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/TransformingInitialCommand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import java.util.function.UnaryOperator;
-
-import bjc.utils.data.ITree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.InitialCommand;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * An initial command that transforms the result of another command.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class TransformingInitialCommand<K, V, C> extends AbstractInitialCommand<K, V, C> {
- private InitialCommand<K, V, C> internal;
-
- private UnaryOperator<ITree<Token<K, V>>> transform;
-
- /**
- * Create a new transforming initial command.
- *
- * @param internal
- * The initial command to delegate to.
- *
- * @param transform
- * The transform to apply to the returned tree.
- */
- public TransformingInitialCommand(InitialCommand<K, V, C> internal,
- UnaryOperator<ITree<Token<K, V>>> transform) {
- super();
- this.internal = internal;
- this.transform = transform;
- }
-
- @Override
- protected ITree<Token<K, V>> intNullDenotation(Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- return transform.apply(internal.denote(operator, ctx));
- }
-
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/UnaryCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/UnaryCommand.java
deleted file mode 100644
index c608362..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/UnaryCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package bjc.utils.parserutils.pratt.commands;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-import bjc.utils.parserutils.pratt.ParserContext;
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * A unary operator.
- *
- * @author bjculkin
- *
- * @param <K>
- * The key type of the tokens.
- *
- * @param <V>
- * The value type of the tokens.
- *
- * @param <C>
- * The state type of the parser.
- */
-public class UnaryCommand<K, V, C> extends AbstractInitialCommand<K, V, C> {
- private final int nullPwer;
-
- /**
- * Create a new unary command.
- *
- * @param precedence
- * The precedence of this operator.
- */
- public UnaryCommand(int precedence) {
- if(precedence < 0) {
- throw new IllegalArgumentException("Precedence must be non-negative");
- }
-
- nullPwer = precedence;
- }
-
- @Override
- protected ITree<Token<K, V>> intNullDenotation(Token<K, V> operator, ParserContext<K, V, C> ctx)
- throws ParserException {
- ITree<Token<K, V>> opr = ctx.parse.parseExpression(nullPwer, ctx.tokens, ctx.state, false);
-
- return new Tree<>(operator, opr);
- }
-} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringToken.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringToken.java
deleted file mode 100644
index f156f02..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringToken.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package bjc.utils.parserutils.pratt.tokens;
-
-import bjc.utils.parserutils.pratt.Token;
-
-/**
- * Simple token implementation for strings.
- *
- * @author EVE
- *
- */
-public class StringToken implements Token<String, String> {
- private String key;
- private String val;
-
- /**
- * Create a new string token.
- *
- * @param ky
- * The key for the token.
- *
- * @param vl
- * The value for the token.
- */
- public StringToken(String ky, String vl) {
- key = ky;
- val = vl;
- }
-
- @Override
- public String getKey() {
- return key;
- }
-
- @Override
- public String getValue() {
- return val;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
-
- int result = 1;
- result = prime * result + ((key == null) ? 0 : key.hashCode());
- result = prime * result + ((val == null) ? 0 : val.hashCode());
-
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (!(obj instanceof StringToken))
- return false;
-
- StringToken other = (StringToken) obj;
-
- if (key == null) {
- if (other.key != null)
- return false;
- } else if (!key.equals(other.key))
- return false;
-
- if (val == null) {
- if (other.val != null)
- return false;
- } else if (!val.equals(other.val))
- return false;
-
- return true;
- }
-
- @Override
- public String toString() {
- return String.format("StringToken [key='%s', val='%s']", key, val);
- }
-
- public static StringToken litToken(String val) {
- return new StringToken(val, val);
- }
-}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringTokenStream.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringTokenStream.java
deleted file mode 100644
index 75e86c4..0000000
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/tokens/StringTokenStream.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package bjc.utils.parserutils.pratt.tokens;
-
-import java.util.Iterator;
-
-import bjc.utils.parserutils.pratt.Token;
-import bjc.utils.parserutils.pratt.TokenStream;
-
-import static bjc.utils.parserutils.pratt.tokens.StringToken.litToken;
-
-/**
- * Simple implementation of token stream for strings.
- *
- * The terminal token here is represented by a token with type and value
- * '(end)'.
- *
- * @author EVE
- *
- */
-public class StringTokenStream extends TokenStream<String, String> {
- private Iterator<Token<String, String>> iter;
-
- private Token<String, String> curr;
-
- /**
- * Create a new token stream from a iterator.
- *
- * @param itr
- * The iterator to use.
- *
- */
- public StringTokenStream(Iterator<Token<String, String>> itr) {
- iter = itr;
-
- }
-
- @Override
- public Token<String, String> current() {
- return curr;
- }
-
- @Override
- public Token<String, String> next() {
- if (iter.hasNext()) {
- curr = iter.next();
- } else {
- curr = litToken("(end)");
- }
-
- return curr;
- }
-
- @Override
- public boolean hasNext() {
- return iter.hasNext();
- }
-}