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="startState">指定的起始状态。</param>
        /// <returns>指定起始状态开始无须接受输入就能达到的所有状态的集合。</returns>
        /// <exception cref="ArgumentNullException"><paramref name="startState"/> 的值为 null 。</exception>
        public static IEnumerable <IRegexFSMState <T> > RecurGetReachableStates <T>(this IRegexFSMState <T> startState)
        {
            if (startState == null)
            {
                throw new ArgumentNullException(nameof(startState));
            }

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

            RegexFSMUtility.RecurGetReachableStatesInternal(startState, states);

            return(states);
        }
        /// <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);
        }