protected virtual bool ReachesState( DFAState startState,
DFAState targetState,
HashSet<object> states )
{
if ( startState == targetState )
{
states.Add( targetState );
//[email protected]("found target DFA state "+targetState.getStateNumber());
_stateReachable[startState.StateNumber] = Reachable.Yes;
return true;
}
DFAState s = startState;
// avoid infinite loops
_stateReachable[s.StateNumber] = Reachable.Busy;
// look for a path to targetState among transitions for this state
// stop when you find the first one; I'm pretty sure there is
// at most one path to any DFA state with conflicting predictions
for ( int i = 0; i < s.NumberOfTransitions; i++ )
{
Transition t = s.GetTransition( i );
DFAState edgeTarget = (DFAState)t.Target;
Reachable targetStatus; //= stateReachable.get( edgeTarget.stateNumber );
if ( _stateReachable.TryGetValue( edgeTarget.StateNumber, out targetStatus ) )
{
if ( targetStatus == Reachable.Busy )
{ // avoid cycles; they say nothing
continue;
}
if ( targetStatus == Reachable.Yes )
{ // return success!
_stateReachable[s.StateNumber] = Reachable.Yes;
return true;
}
if ( targetStatus == Reachable.No )
{ // try another transition
continue;
}
}
// if null, target must be REACHABLE_UNKNOWN (i.e., unvisited)
if ( ReachesState( edgeTarget, targetState, states ) )
{
states.Add( s );
_stateReachable[s.StateNumber] = Reachable.Yes;
return true;
}
}
_stateReachable[s.StateNumber] = Reachable.No;
return false; // no path to targetState found.
}