private IRegexFSMTransition <T> GenerateNFATransitionFromRegexPreviousMatch(
            RegexPreviousMatch <T> previousMatch,
            IRegexNFA <T> nfa,
            IRegexNFAState <T> state
            )
        {
            var predicateTransition = new RegexFSMPredicateTransition <T>((sender, args) =>
            {
                if (args.FirstOrDefault() is IRegexFSM <T> fsm)
                {
                    var lastMatch = fsm.Matches?.LastOrDefault();
                    if (lastMatch == null)
                    {
                        // 没有上一个匹配。
                        return(true);
                    }
                    else
                    {
                        // 状态机当前索引与上一个匹配的结尾索引相邻。
                        return(fsm.Index == lastMatch.Index + lastMatch.Length);
                    }
                }
                else
                {
                    return(false);
                }
            });

            nfa.AttachTransition(state, predicateTransition);

            return(predicateTransition);
        }
        private IRegexFSMTransition <T> GenerateNFATransitionFromRegexZeroLengthObject(
            RegexZeroLengthObject <T> zeroLength,
            IRegexNFA <T> nfa,
            IRegexNFAState <T> state
            )
        {
            const string PROGRESS_SERVICE_KEY = "PROGRESS_SERVICE";
            const string PROGRESS_KEY         = "TIMEPOINT";

            IRegexNFAState <T> nextState = state;

            RegexFSMPredicateTransition <T> predicateTransition;

            predicateTransition = new RegexFSMPredicateTransition <T>((sender, args) =>
            {
                if (args.FirstOrDefault() is IRegexFSM <T> fsm)
                {
                    var progressService = fsm.GetService <RegexFSM <T> .ProgressService>();
                    var progress        = progressService.GetProgress();
                    fsm.UserData[PROGRESS_SERVICE_KEY] = progressService;
                    fsm.UserData[PROGRESS_KEY]         = progress;

                    return(true);
                }
                return(false);
            });
            nfa.AttachTransition(nextState, predicateTransition);
            nextState = this.contextInfo.ActivateRegexNFAState();
            nfa.SetTarget(predicateTransition, nextState);

            var transition = this.GenerateNFATransitionFromRegexObject(zeroLength.InnerRegex, nfa, nextState);

            nextState = this.contextInfo.ActivateRegexNFAState();
            nfa.SetTarget(transition, nextState);

            predicateTransition = new RegexFSMPredicateTransition <T>((sender, args) =>
            {
                if (args.FirstOrDefault() is IRegexFSM <T> fsm)
                {
                    var progressService = (RegexFSM <T> .ProgressService)fsm.UserData[PROGRESS_SERVICE_KEY];
                    var progress        = (RegexFSM <T> .ProgressService.Progress)fsm.UserData[PROGRESS_KEY];
                    progressService.SetProgress(progress);

                    return(true);
                }
                return(false);
            });

            return(predicateTransition);
        }
        private IRegexFSMTransition <T> GenerateNFATransitionFromRegexEndBorder(
            RegexEndBorder <T> endBorder,
            IRegexNFA <T> nfa,
            IRegexNFAState <T> state
            )
        {
            var predicateTransition = new RegexFSMPredicateTransition <T>((sender, args) =>
                                                                          (args.FirstOrDefault() is IRegexFSM <T> fsm) &&
                                                                          fsm.Index == fsm.Inputs.Count()
                                                                          );

            nfa.AttachTransition(state, predicateTransition);

            return(predicateTransition);
        }
 /// <summary>
 /// 使用规范参数列表初始化 <see cref="_DebugInfo"/> 类的新实例。
 /// </summary>
 /// <param name="functionalTransition">正则表达式构造的有限状态机的功能转换。</param>
 /// <param name="args">获取调试信息的参数列表。</param>
 public _DebugInfo(RegexFSMPredicateTransition <T> functionalTransition, params object[] args) : base(functionalTransition, args)
 {
 }