summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java
diff options
context:
space:
mode:
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java44
1 files changed, 23 insertions, 21 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java
index 5f843a2..c441dff 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java
@@ -1,10 +1,11 @@
package bjc.utils.parserutils;
import bjc.utils.data.IHolder;
-import bjc.utils.data.IPair;
import bjc.utils.data.ITree;
import bjc.utils.data.Pair;
import bjc.utils.data.Tree;
+import bjc.utils.parserutils.TreeConstructor.ConstructorState;
+import bjc.utils.parserutils.TreeConstructor.QueueFlattener;
import java.util.Deque;
import java.util.function.Consumer;
@@ -14,7 +15,7 @@ import java.util.function.UnaryOperator;
final class TokenTransformer<TokenType> implements Consumer<TokenType> {
// Handle operators
- private final class OperatorHandler implements UnaryOperator<IPair<Deque<ITree<TokenType>>, ITree<TokenType>>> {
+ private final class OperatorHandler implements UnaryOperator<ConstructorState<TokenType>> {
private TokenType element;
public OperatorHandler(TokenType element) {
@@ -22,17 +23,15 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> {
}
@Override
- public IPair<Deque<ITree<TokenType>>, ITree<TokenType>> apply(
- IPair<Deque<ITree<TokenType>>, ITree<TokenType>> pair) {
+ public ConstructorState<TokenType> apply(ConstructorState<TokenType> pair) {
// Replace the current AST with the result of handling
// an operator
- return pair.bindLeft((queuedASTs) -> {
+ return new ConstructorState<>(pair.bindLeft(queuedASTs -> {
return handleOperator(queuedASTs);
- });
+ }));
}
- private IPair<Deque<ITree<TokenType>>, ITree<TokenType>> handleOperator(
- Deque<ITree<TokenType>> queuedASTs) {
+ private ConstructorState<TokenType> handleOperator(Deque<ITree<TokenType>> queuedASTs) {
// The AST we're going to hand back
ITree<TokenType> newAST;
@@ -42,10 +41,13 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> {
} else {
// Error if we don't have enough for a binary
// operator
- if(queuedASTs.size() < 2) throw new IllegalStateException(
- "Attempted to parse binary operator without enough operands.\n"
- + "Problem operator is " + element
- + "\nPossible operand is: \n\t" + queuedASTs.peek());
+ if(queuedASTs.size() < 2) {
+ String msg = String.format(
+ "Attempted to parse binary operator without enough operands\n\tProblem operator is: %s\n\tPossible operand is: %s",
+ element.toString(), queuedASTs.peek().toString());
+
+ throw new IllegalStateException(msg);
+ }
// Grab the two operands
ITree<TokenType> right = queuedASTs.pop();
@@ -59,21 +61,21 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> {
queuedASTs.push(newAST);
// Hand back the state
- return new Pair<>(queuedASTs, newAST);
+ return new ConstructorState<>(queuedASTs, newAST);
}
}
- private IHolder<IPair<Deque<ITree<TokenType>>, ITree<TokenType>>> initialState;
+ private IHolder<ConstructorState<TokenType>> initialState;
private Predicate<TokenType> operatorPredicate;
- private Predicate<TokenType> isSpecialOperator;
- private Function<TokenType, Function<Deque<ITree<TokenType>>, ITree<TokenType>>> handleSpecialOperator;
+ private Predicate<TokenType> isSpecialOperator;
+ private Function<TokenType, QueueFlattener<TokenType>> handleSpecialOperator;
// Create a new transformer
- public TokenTransformer(IHolder<IPair<Deque<ITree<TokenType>>, ITree<TokenType>>> initialState,
+ public TokenTransformer(IHolder<ConstructorState<TokenType>> initialState,
Predicate<TokenType> operatorPredicate, Predicate<TokenType> isSpecialOperator,
- Function<TokenType, Function<Deque<ITree<TokenType>>, ITree<TokenType>>> handleSpecialOperator) {
+ Function<TokenType, QueueFlattener<TokenType>> handleSpecialOperator) {
this.initialState = initialState;
this.operatorPredicate = operatorPredicate;
this.isSpecialOperator = isSpecialOperator;
@@ -89,15 +91,15 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> {
ITree<TokenType> newAST = new Tree<>(element);
// Insert the new tree into the AST
- initialState.transform((pair) -> {
+ initialState.transform(pair -> {
// Transform the pair, ignoring the current AST
// in favor of the
// one consisting of the current element
- return pair.bindLeft((queue) -> {
+ return new ConstructorState<>(pair.bindLeft(queue -> {
queue.push(newAST);
return new Pair<>(queue, newAST);
- });
+ }));
});
}
}