/** * Pushes a new operator onto the opp stack, resolving existing opps as needed. * * @param node The operator node */ private void pushOpp(OppNode node) { // If node is null then it's just a group marker if (node == null) { oppStack.add(0, node); return; } while (true) { if (oppStack.size() == 0) break; OppNode top = oppStack.get(0); // If the top is a spacer then don't pop // anything if (top == null) break; // If the top node has a lower precedence then // let it stay if (top.getPrecedence() < node.getPrecedence()) break; // Remove the top node oppStack.remove(0); // Let it fill its branches top.popValues(nodeStack); // Stick it on the resolved node stack nodeStack.add(0, top); } // Add the new node to the opp stack oppStack.add(0, node); }
/** Resolves all pending opp nodes on the stack until the next group marker is reached. */ private void resolveGroup() { OppNode top = null; while ((top = oppStack.remove(0)) != null) { // Let it fill its branches top.popValues(nodeStack); // Stick it on the resolved node stack nodeStack.add(0, top); } }