From ba9cf27de7e9f31dfa97a7266979f300101d67f9 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Thu, 10 Nov 2016 19:44:22 -0500 Subject: Doc updates --- .../java/bjc/utils/parserutils/TokenTransformer.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/TokenTransformer.java') 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 implements Consumer { + // Handle operators private final class OperatorHandler implements UnaryOperator< IPair>, ITree>> { private TokenType element; @@ -24,6 +25,7 @@ final class TokenTransformer implements Consumer { @Override public IPair>, ITree> apply( IPair>, ITree> 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 implements Consumer { private IPair>, ITree> handleOperator( Deque> queuedASTs) { + // The AST we're going to hand back ITree 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 implements Consumer { + queuedASTs.peek()); } + // Grab the two operands ITree rightAST = queuedASTs.pop(); ITree 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 implements Consumer { private Function>, ITree>> handleSpecialOperator; + // Create a new transformer public TokenTransformer( IHolder>, ITree>> initialState, @@ -84,12 +94,16 @@ final class TokenTransformer implements Consumer { @Override public void accept(TokenType element) { + // Handle operators if (operatorPredicate.test(element)) { initialState.transform(new OperatorHandler(element)); } else { ITree 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 implements Consumer { }); } } -} \ No newline at end of file +} -- cgit v1.2.3