Antlr3.Analysis.DecisionProbe.ReachesState C# (CSharp) Method

ReachesState() protected method

protected ReachesState ( DFAState startState, DFAState targetState, HashSet states ) : bool
startState DFAState
targetState DFAState
states HashSet
return bool
        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.
        }