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); }