/** * Track backtracking decisions. You'll see a fixed or cyclic decision and then a backtrack. * * <p>enter rule ... enter decision LA and possibly consumes (for cyclic DFAs) begin backtrack * level mark m rewind m end backtrack level, success exit decision ... exit rule */ public void beginBacktrack(int level) { if (dump) System.out.println("enter backtrack " + level); backtrackDepth++; DecisionEvent e = currentDecision(); if (e.decision.couldBacktrack) { stats.numBacktrackOccurrences++; e.decision.numBacktrackOccurrences++; e.backtracks = true; } }
public void semanticPredicate(boolean result, String predicate) { stats.numSemanticPredicates++; if (inDecision()) { DecisionEvent d = currentDecision(); d.evalSemPred = true; d.decision.numSemPredEvals++; if (dump) System.out.println( "eval " + predicate + " in " + d.decision.ruleName + "-" + d.decision.decision); } }
public void exitDecision(int decisionNumber) { DecisionEvent d = decisionStack.pop(); d.stopTime = System.currentTimeMillis(); int lastTokenIndex = lastRealTokenTouchedInDecision.getTokenIndex(); int numHidden = getNumberOfHiddenTokens(d.startIndex, lastTokenIndex); int depth = lastTokenIndex - d.startIndex - numHidden + 1; // +1 counts consuming start token as 1 d.k = depth; d.decision.maxk = Math.max(d.decision.maxk, depth); if (dump) System.out.println( "exitDecision " + decisionNumber + " in " + d.decision.ruleName + " lookahead " + d.k + " max token " + lastRealTokenTouchedInDecision); decisionEvents.add(d); // done with decision; track all }
public void enterDecision(int decisionNumber, boolean couldBacktrack) { lastRealTokenTouchedInDecision = null; stats.numDecisionEvents++; int startingLookaheadIndex = parser.getTokenStream().index(); TokenStream input = parser.getTokenStream(); if (dump) System.out.println( "enterDecision canBacktrack=" + couldBacktrack + " " + decisionNumber + " backtrack depth " + backtrackDepth + " @ " + input.get(input.index()) + " rule " + locationDescription()); String g = (String) currentGrammarFileName.peek(); DecisionDescriptor descriptor = decisions.get(g, decisionNumber); if (descriptor == null) { descriptor = new DecisionDescriptor(); decisions.put(g, decisionNumber, descriptor); descriptor.decision = decisionNumber; descriptor.fileName = (String) currentGrammarFileName.peek(); descriptor.ruleName = (String) currentRuleName.peek(); descriptor.line = (Integer) currentLine.peek(); descriptor.pos = (Integer) currentPos.peek(); descriptor.couldBacktrack = couldBacktrack; } descriptor.n++; DecisionEvent d = new DecisionEvent(); decisionStack.push(d); d.decision = descriptor; d.startTime = System.currentTimeMillis(); d.startIndex = startingLookaheadIndex; }