if ( state.getNumberOfTransitions()==0 ) { if ( debug ) System.out.println("dangling state: "+state); return; if ( state.isAcceptState() ) { NFAState invokingState = ruleInvocationStack.pop(); if ( debug ) System.out.println("pop invoking state "+invokingState); continue; if ( state.getNumberOfTransitions()==1 ) { int decisionNumber = state.getDecisionNumber(); if ( decisionNumber==0 ) { System.out.println("weird: no decision number but a choice node");
public NFAState newState() { NFAState n = new NFAState(nfa); int state = nfa.getNewNFAStateNumber(); n.stateNumber = state; nfa.addState(n); n.enclosingRule = currentRule; return n; }
private void transitionBetweenStates(NFAState a, NFAState b, int label) { Transition e = new Transition(label,b); a.addTransition(e); } }
public boolean hasOneOrMoreEpsilonTransitionOnly(NFAState state) { for(int t=0; t<state.getNumberOfTransitions(); t++) { Transition transition = state.transition(t); if(!transition.isEpsilon()) return false; } return state.getNumberOfTransitions()>0; }
/** This method returns true if the state can be skipped, using several criteria. * */ public boolean canBeSkipped(NFAState state) { if(!optimize) return false; // Cannot skip first state if(state.stateNumber == 0) return false; // Cannot skip accepted state if(state.isAcceptState()) return false; // Cannot skip alternative state if(state.getDecisionNumber() > 0) return false; // Cannot skip start of block state if(state.endOfBlockStateNumber != State.INVALID_STATE_NUMBER) return false; // Cannot skip state with more than one incoming transition (often an end-of-alternative state) if(analysis.numberOfIncomingTransition(state)>1) return false; return hasOneOrMoreEpsilonTransitionOnly(state); }
String ruleName = r.name; NFAState ruleBeginState = factory.newState(); ruleBeginState.setDescription("rule "+ruleName+" start"); ruleBeginState.enclosingRule = r; r.startState = ruleBeginState; NFAState ruleEndState = factory.newState(); ruleEndState.setDescription("rule "+ruleName+" end"); ruleEndState.setAcceptState(true); ruleEndState.enclosingRule = r; r.stopState = ruleEndState;
+decisionStartState.getDecisionNumber()+") for "+ decisionStartState.getDescription()); for (int alt = 1; alt <= numAlts; alt++) { int walkAlt = decisionStartState.translateDisplayAltToWalkAlt(alt); NFAState altLeftEdge = getNFAStateForAltOfDecision(decisionStartState, walkAlt); NFAState altStartState = (NFAState)altLeftEdge.transition[0].target;
if ( s.getDecisionNumber()>0 && s.nfa.grammar.getNumberOfAltsForDecisionNFA(s)>1 ) { DFA dfa = s.nfa.grammar.getLookaheadDFA(s.getDecisionNumber()); int predictedAlt = predict(dfa); if ( predictedAlt == NFA.INVALID_ALT_NUMBER ) { String description = dfa.getNFADecisionStartState().getDescription(); NoViableAltException nvae = new NoViableAltException(description, s.translateDisplayAltToWalkAlt(predictedAlt); if ( s.isAcceptState() ) { // end of rule node if ( actions!=null ) { actions.exitRule(s.nfa.grammar.getFileName(), s.enclosingRule.name);
if ( composite.watchNFAConversion ) { System.out.println("--------------------\nbuilding lookahead DFA (d=" +decisionStartState.getDecisionNumber()+") for "+ decisionStartState.getDescription()); startDFA = System.currentTimeMillis();
if ( (s instanceof NFAState) && ((NFAState)s).isDecisionState() ) { stateLabel = stateLabel+",d="+ ((NFAState)s).getDecisionNumber(); if ( ((NFAState)s).endOfBlockStateNumber!=State.INVALID_STATE_NUMBER ) { stateLabel += ",eob="+((NFAState)s).endOfBlockStateNumber;
currentPath.add(state); if(state.isAcceptState()) { for(int t=0; t<state.getNumberOfTransitions(); t++) { FAState parentState = js; Transition transition = state.transition(t); NFAState target = (NFAState)transition.target; if(targetStateIsInAnotherRule(transition)) {
public FAState(NFAState state) { this.stateNumber = state.stateNumber; this.acceptedState = state.isAcceptState(); this.enclosingRuleName = state.enclosingRule.name; }
private void computeRuleError(GrammarError error, GrammarNonDeterminismMessage message) { List nonDetAlts = message.probe.getNonDeterministicAltsForState(message.problemState); Set disabledAlts = message.probe.getDisabledAlternatives(message.problemState); int firstAlt = 0; for (Object nonDetAlt : nonDetAlts) { Integer displayAltI = (Integer) nonDetAlt; NFAState nfaStart = message.probe.dfa.getNFADecisionStartState(); int tracePathAlt = nfaStart.translateDisplayAltToWalkAlt(displayAltI); if (firstAlt == 0) firstAlt = tracePathAlt; List path = message.probe.getNFAPathStatesForAlt(firstAlt, tracePathAlt, error.getLabels()); error.addPath(path, disabledAlts.contains(displayAltI)); error.addStates(path); // Find all rules enclosing each state (because a path can extend over multiple rules) for (Object aPath : path) { NFAState state = (NFAState) aPath; error.addRule(state.enclosingRule.name); } } }
/** Return a string like "3:22: ( A {;} | B )" that describes this * decision. */ public String getDescription() { return dfa.getNFADecisionStartState().getDescription(); }
if(g != null) { Rule r = g.getRule(Grammar.ARTIFICIAL_TOKENS_RULENAME); NFAState s = (NFAState)r.startState.transition(0).target; if(s == null) { System.err.println("NFAState s is null for rule "+r.name); if(dfa.getDecisionNumber() == s.getDecisionNumber()) continue;
continue; if ( t.label.isEpsilon() && !t.label.isAction() && s.getNumberOfTransitions()==1 ) { epsilonTarget.transition[0] !=null ) s.setTransition0(epsilonTarget.transition[0]);
public int getDecisionNumber() { return decisionNFAStartState.getDecisionNumber(); }
public void run() { for (int decision=i; decision<=j; decision++) { NFAState decisionStartState = grammar.getDecisionNFAStartState(decision); if ( decisionStartState.getNumberOfTransitions()>1 ) { grammar.createLookaheadDFA(decision,true); } } // now wait for others to finish try { barrier.waitForRelease(); } catch(InterruptedException e) { ErrorManager.internalError("what the hell? DFA interruptus", e); } } }
if ( ((NFAState)s).isDecisionState() ) { GrammarAST n = ((NFAState)s).associatedASTNode; if ( n!=null && n.getType()!=ANTLRParser.EOB ) {
if ( anyState.isEOTTargetState() ) { Set allAlts = d.getAltSet();