private static void RecurGetStatesInternal <T>(IRegexFSMState <T> startState, HashSet <IRegexFSMState <T> > states)
 {
     if (states.Add(startState))
     {
         foreach (var transition in startState.Transitions.Where(transition => transition.Target != null))
         {
             RegexFSMUtility.RecurGetStatesInternal(transition.Target, states);
         }
     }
 }
 private static void RecurGetReachableTransitionsInternal <T>(IRegexFSMTransition <T> transition, HashSet <IRegexFSMTransition <T> > transitions)
 {
     foreach (var t in transition.Target.Transitions)
     {
         if (transitions.Add(t) && t is IEpsilonTransition)
         {
             RegexFSMUtility.RecurGetReachableTransitionsInternal(transition, transitions);
         }
     }
 }
 private static void RecurGetReachableStatesInternal <T>(IRegexFSMState <T> startState, HashSet <IRegexFSMState <T> > states)
 {
     foreach (var transition in startState.Transitions.Where(_transition => _transition != null && _transition.Target != null))
     {
         if (transition is IEpsilonTransition && states.Add(transition.Target))
         {
             RegexFSMUtility.RecurGetReachableStatesInternal(transition.Target, states);
         }
     }
 }
        /// <summary>
        /// 递归获取指定转换开始能经到的所有转换的集合。
        /// </summary>
        /// <param name="transition">指定的转换。</param>
        /// <returns>指定转换开始能经到的所有转换的集合。</returns>
        /// <exception cref="ArgumentNullException"><paramref name="transition"/> 的值为 null 。</exception>
        public static IEnumerable <IRegexFSMTransition <T> > RecurGetTransitions <T>(this IRegexFSMTransition <T> transition)
        {
            if (transition == null)
            {
                throw new ArgumentNullException(nameof(transition));
            }

            HashSet <IRegexFSMTransition <T> > transitions = new HashSet <IRegexFSMTransition <T> >();

            RegexFSMUtility.RecurGetTransitionsInternal(transition, transitions);

            return(transitions);
        }
        /// <summary>
        /// 递归获取指定起始状态开始能达到的所有状态的集合。
        /// </summary>
        /// <param name="startState">指定的起始状态。</param>
        /// <returns>指定起始状态开始能达到的所有状态的集合。</returns>
        /// <exception cref="ArgumentNullException"><paramref name="startState"/> 的值为 null 。</exception>
        public static IEnumerable <IRegexFSMState <T> > RecurGetStates <T>(this IRegexFSMState <T> startState)
        {
            if (startState == null)
            {
                throw new ArgumentNullException(nameof(startState));
            }

            HashSet <IRegexFSMState <T> > states = new HashSet <IRegexFSMState <T> >();

            RegexFSMUtility.RecurGetStatesInternal(startState, states);

            return(states);
        }
 private static void RecurGetTransitionsInternal <T>(IRegexFSMTransition <T> transition, HashSet <IRegexFSMTransition <T> > transitions)
 {
     if (transitions.Add(transition))
     {
         if (transition.Target != null)
         {
             foreach (var _transition in transition.Target.Transitions.Where(t => t != null))
             {
                 RegexFSMUtility.RecurGetTransitionsInternal(_transition, transitions);
             }
         }
     }
 }
        /// <summary>
        /// 递归获取指定转换开始无须接受输入就能达到的所有状态的集合。
        /// </summary>
        /// <param name="transition">指定的转换。</param>
        /// <returns>指定转换开始无须接受输入就能达到的所有状态的集合。</returns>
        public static IEnumerable <IRegexFSMState <T> > RecurGetReachableStates <T>(this IRegexFSMTransition <T> transition)
        {
            if (transition == null)
            {
                throw new ArgumentNullException(nameof(transition));
            }

            HashSet <IRegexFSMState <T> > states = new HashSet <IRegexFSMState <T> > {
                transition.Target
            };

            RegexFSMUtility.RecurGetReachableStatesInternal(transition.Target, states);

            return(states);
        }