protected virtual void OptimizeExitBranches(DFAState d)
{
int sI = d.stateNumber;
if (_visited.Contains(sI))
{
return; // already visited
}
_visited.Add(sI);
int nAlts = d.dfa.NumberOfAlts;
for (int i = 0; i < d.NumberOfTransitions; i++)
{
Transition edge = (Transition)d.Transition(i);
DFAState edgeTarget = ((DFAState)edge.target);
/*
* [email protected](d.stateNumber+"-"+
* edge.label.toString(d.dfa.nfa.grammar)+"->"+
* edgeTarget.stateNumber);
*/
// if target is an accept state and that alt is the exit alt
if (edgeTarget.IsAcceptState &&
edgeTarget.GetUniquelyPredictedAlt() == nAlts)
{
/*
* [email protected]("ignoring transition "+i+" to max alt "+
* d.dfa.getNumberOfAlts());
*/
d.RemoveTransition(i);
i--; // back up one so that i++ of loop iteration stays within bounds
}
OptimizeExitBranches(edgeTarget);
}
}