summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/parserutils/TreeConstructor.java
diff options
context:
space:
mode:
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/TreeConstructor.java')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/TreeConstructor.java62
1 files changed, 30 insertions, 32 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/TreeConstructor.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/TreeConstructor.java
index 46e4da4..68ec70e 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/TreeConstructor.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/TreeConstructor.java
@@ -28,40 +28,38 @@ public class TreeConstructor {
}
@Override
- public IPair<Deque<AST<T>>, AST<T>>
- apply(IPair<Deque<AST<T>>, AST<T>> pair) {
- Deque<AST<T>> queuedASTs =
- pair.merge((queue, currentAST) -> queue);
-
- AST<T> mergedAST = pair.merge((queue, currentAST) -> {
- AST<T> newAST;
-
- if (isSpecialOperator.test(element)) {
- newAST = handleSpecialOperator.apply(queue);
- } else {
- if (queue.size() < 2) {
- throw new IllegalStateException(
- "Attempted to parse binary operator without enough operands.\n"
- + "Problem operator is "
- + element
- + "\nPossible operand is: \n\t"
- + queue.peek());
- }
-
- AST<T> rightAST = queue.pop();
- AST<T> leftAST = queue.pop();
-
- newAST = new AST<>(element, leftAST, rightAST);
+ public IPair<Deque<AST<T>>, AST<T>> apply(
+ IPair<Deque<AST<T>>, AST<T>> pair) {
+ return pair.bind((queuedASTs, currentAST) -> {
+ return handleOperator(queuedASTs);
+ });
+ }
+
+ private IPair<Deque<AST<T>>, AST<T>> handleOperator(
+ Deque<AST<T>> queuedASTs) {
+ AST<T> newAST;
+
+ if (isSpecialOperator.test(element)) {
+ newAST = handleSpecialOperator.apply(queuedASTs);
+ } else {
+ 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());
}
- queue.push(newAST);
- return newAST;
- });
+ AST<T> rightAST = queuedASTs.pop();
+ AST<T> leftAST = queuedASTs.pop();
+
+ newAST = new AST<>(element, leftAST, rightAST);
+ }
- Pair<Deque<AST<T>>, AST<T>> newPair =
- new Pair<>(queuedASTs, mergedAST);
+ queuedASTs.push(newAST);
- return newPair;
+ return new Pair<>(queuedASTs, newAST);
}
}
@@ -162,8 +160,8 @@ public class TreeConstructor {
"Special operator determiner must not be null");
}
- GenHolder<IPair<Deque<AST<T>>, AST<T>>> initialState =
- new GenHolder<>(new Pair<>(new LinkedList<>(), null));
+ GenHolder<IPair<Deque<AST<T>>, AST<T>>> initialState = new GenHolder<>(
+ new Pair<>(new LinkedList<>(), null));
tokens.forEach(
new TokenTransformer<>(initialState, operatorPredicate,