diff options
| author | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-11-10 19:44:22 -0500 |
|---|---|---|
| committer | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-11-10 19:44:22 -0500 |
| commit | ba9cf27de7e9f31dfa97a7266979f300101d67f9 (patch) | |
| tree | dbf938e02d647e1be519808f8a14c6e954cab732 /BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java | |
| parent | 5cf7bcf156970fe72f79e40b8a6e320ea160ac83 (diff) | |
Doc updates
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.java | 16 |
1 files changed, 15 insertions, 1 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 149cbbf..ff3a6b9 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java +++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java @@ -13,6 +13,7 @@ import bjc.utils.data.Pair; import bjc.utils.data.Tree; final class TokenTransformer<TokenType> implements Consumer<TokenType> { + // Handle operators private final class OperatorHandler implements UnaryOperator< IPair<Deque<ITree<TokenType>>, ITree<TokenType>>> { private TokenType element; @@ -24,6 +25,7 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> { @Override public IPair<Deque<ITree<TokenType>>, ITree<TokenType>> apply( IPair<Deque<ITree<TokenType>>, ITree<TokenType>> pair) { + // Replace the current AST with the result of handling an operator return pair.bindLeft((queuedASTs) -> { return handleOperator(queuedASTs); }); @@ -32,12 +34,15 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> { private IPair<Deque<ITree<TokenType>>, ITree<TokenType>> handleOperator( Deque<ITree<TokenType>> queuedASTs) { + // The AST we're going to hand back ITree<TokenType> newAST; + // Handle special operators if (isSpecialOperator.test(element)) { newAST = handleSpecialOperator.apply(element) .apply(queuedASTs); } 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" @@ -46,14 +51,18 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> { + queuedASTs.peek()); } + // Grab the two operands ITree<TokenType> rightAST = queuedASTs.pop(); ITree<TokenType> leftAST = queuedASTs.pop(); + // Create a new AST newAST = new Tree<>(element, leftAST, rightAST); } + // Stick it onto the stack queuedASTs.push(newAST); + // Hand back the state return new Pair<>(queuedASTs, newAST); } } @@ -69,6 +78,7 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> { private Function<TokenType, Function<Deque<ITree<TokenType>>, ITree<TokenType>>> handleSpecialOperator; + // Create a new transformer public TokenTransformer( IHolder<IPair<Deque<ITree<TokenType>>, ITree<TokenType>>> initialState, @@ -84,12 +94,16 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> { @Override public void accept(TokenType element) { + // Handle operators if (operatorPredicate.test(element)) { initialState.transform(new OperatorHandler(element)); } else { ITree<TokenType> newAST = new Tree<>(element); + // Insert the new tree into the AST initialState.transform((pair) -> { + // Transform the pair, ignoring the current AST in favor of the + // one consisting of the current element return pair.bindLeft((queue) -> { queue.push(newAST); @@ -98,4 +112,4 @@ final class TokenTransformer<TokenType> implements Consumer<TokenType> { }); } } -}
\ No newline at end of file +} |
