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 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> > 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); }
/// <summary> /// 递归获取指定起始状态开始能经到的所有转换的集合。 /// </summary> /// <param name="startState">指定的起始状态</param> /// <returns>指定起始状态开始能经到的所有转换的集合。</returns> /// <exception cref="ArgumentNullException"><paramref name="startState"/> 的值为 null 。</exception> public static IEnumerable <IRegexFSMTransition <T> > RecurGetTransitions <T>(this IRegexFSMState <T> startState) { if (startState == null) { throw new ArgumentNullException(nameof(startState)); } HashSet <IRegexFSMTransition <T> > transitions = new HashSet <IRegexFSMTransition <T> >(); foreach (var transition in startState.Transitions) { transitions.UnionWith(transition.RecurGetTransitions()); } return(transitions); }
/// <summary> /// 从 <see cref="RegexDFA{T}"/> 的一个指定状态移除指定转换。 /// </summary> /// <param name="state">指定的状态。</param> /// <param name="transition">要添加的转换。</param> /// <returns>一个值,指示操作是否成功。</returns> public override bool RemoveTransition(IRegexFSMState <T> state, IRegexFSMTransition <T> transition) => this.RemoveTransition(state, transition);
/// <summary> /// 为 <see cref="RegexDFA{T}"/> 的一个指定状态添加指定转换。 /// </summary> /// <param name="state">指定的状态。</param> /// <param name="transition">要添加的转换。</param> /// <returns>一个值,指示操作是否成功。</returns> public sealed override bool AttachTransition(IRegexFSMState <T> state, IRegexFSMTransition <T> transition) => this.AttachTransition((IRegexDFAState <T>)state, (IAcceptInputTransition <T>)transition);
bool IRegexFSMTransition <T> .SetTarget(IRegexFSMState <T> state) => base.SetTarget(state);
public RegexAcceptInputTransitionGroupTransition(IRegexFSMState <T> stateFrom, IAcceptInputTransition <T> acceptInputTransition) { this.StateFrom = stateFrom; this.AcceptInputTransition = acceptInputTransition; }
public RegexStateState(IRegexFSMState <T> state) => this.InnerState = state ?? throw new ArgumentNullException(nameof(state));
internal static (IEnumerable <IRegexFSMState <T> > states, IEnumerable <IRegexFSMTransition <T> > transitions) RecurGetPredicated <T>(this IRegexFSMState <T> startState, Predicate <IRegexFSMState <T> > statePredicate = null, Predicate <IRegexFSMTransition <T> > transitionPredicate = null) { if (startState == null)
/// <summary> /// 递归获取指定起始状态开始无须接受输入就能经到的所有转换的集合。 /// </summary> /// <param name="startState">指定的起始状态</param> /// <returns>指定起始状态开始无须接受输入就能经到的所有转换的集合。</returns> /// <exception cref="ArgumentNullException"><paramref name="startState"/> 的值为 null 。</exception> public static IEnumerable <IRegexFSMTransition <T> > RecurGetReachableTransitions <T>(this IRegexFSMState <T> startState) { if (startState == null) { throw new ArgumentNullException(nameof(startState)); } HashSet <IRegexFSMTransition <T> > transitions = new HashSet <IRegexFSMTransition <T> >(); foreach (var transition in startState.Transitions.Where(_transition => _transition != null)) { if (transitions.Add(transition) && transition is IEpsilonTransition) { transitions.UnionWith(transition.RecurGetReachableTransitions()); } } return(transitions); }
/// <summary> /// 从 <see cref="RegexNFA{T}"/> 的一个指定状态移除指定转换。 /// </summary> /// <param name="state">指定的状态。</param> /// <param name="transition">要添加的转换。</param> /// <returns>一个值,指示操作是否成功。</returns> public sealed override bool RemoveTransition(IRegexFSMState <T> state, IRegexFSMTransition <T> transition) => base.RemoveTransition(state, transition);
/// <summary> /// 为 <see cref="RegexNFA{T}"/> 的一个指定状态添加指定转换。 /// </summary> /// <param name="state">指定的状态。</param> /// <param name="transition">要添加的转换。</param> /// <returns>一个值,指示操作是否成功。</returns> public sealed override bool AttachTransition(IRegexFSMState <T> state, IRegexFSMTransition <T> transition) => base.AttachTransition(state, transition);
/// <summary> /// 将转换的目标设为指定状态。 /// </summary> /// <param name="state">要设为目标的状态。</param> /// <returns>一个值,指示操作是否成功。</returns> /// <exception cref="ArgumentNullException"><paramref name="state"/> 的值为 null 。</exception> public bool SetTarget(IRegexFSMState <T> state) => base.SetTarget(state);