Пример #1
0
 /// <summary>
 /// 从 <see cref="RegexNFA{T}"/> 的一个指定状态移除指定 ε 转换。
 /// </summary>
 /// <param name="state">指定的状态。</param>
 /// <param name="epsilonTransition">要添加的 ε 转换。</param>
 /// <returns>一个值,指示操作是否成功。</returns>
 public virtual bool RemoveTransition(IRegexNFAState <T> state, IRegexFSMEpsilonTransition <T> epsilonTransition) => base.RemoveTransition(state, epsilonTransition);
        protected virtual IRegexFSMTransition <T> GenerateNFATransitionFromRegexGroupReference(
            RegexGroupReference <T> groupReference,
            IRegexNFA <T> nfa,
            IRegexNFAState <T> state
            )
        {
            RegexGroup <T> group;

            if (groupReference.IsDetermined)
            {
                group = groupReference.Group;
            }
            else
            {
                IRegexFSMEpsilonTransition <T> epsilonTransition = this.contextInfo.ActivateRegexFSMEpsilonTransition();

                var groups = this.regexGroups.Where(_group => _group.ID == groupReference.GroupID).ToArray();
                switch (groups.Length)
                {
                case 0:
                    //throw new InvalidOperationException("未找到引用的正则组。");
                    epsilonTransition = this.contextInfo.ActivateRegexFSMEpsilonTransition();
                    nfa.AttachTransition(state, epsilonTransition);
                    return(epsilonTransition);

                case 1:
                    group = groups[0];
                    break;

                default:
                    group = new RegexGroup <T>(
                        groups.Select(_group => _group.InnerRegex).UnionMany()
                        );
                    break;
                    //throw new InvalidOperationException("找到多个重复 ID 的正则组。");
                    //epsilonTransition = this.contextInfo.ActivateRegexNFAEpsilonTransition();
                    //nfa.AttachTransition(state, epsilonTransition);
                    //return epsilonTransition;
                }
            }

            IRegexNFAState <T> nextState = state;

            var lastCaptureReferenceTransition = new RegexFSMLastCaptureReferenceTransition <T>(group, group.ID, (sender, readerSource, handler, args) =>
            {
                if (args.FirstOrDefault() is IRegexFSM <T> fsm)
                {
                    if (fsm.TryGetLastCapture(sender.IDToken, sender.ID, out int start, out int length))
                    {
                        var progressService = fsm.GetService <RegexFSM <T> .ProgressService>();
                        var progress        = progressService.GetProgress();

                        foreach (var t in fsm.Inputs.Skip(start).Take(length))
                        {
                            if (!(readerSource.HasNext() && EqualityComparer <T> .Default.Equals(readerSource.Read(), t)))
                            {
                                progressService.SetProgress(progress);
                                return(false);
                            }
                        }

                        return(true);
                    }
                }
Пример #3
0
 /// <summary>
 /// 为 <see cref="RegexNFA{T}"/> 的一个指定状态添加指定 ε 转换。
 /// </summary>
 /// <param name="state">指定的状态。</param>
 /// <param name="epsilonTransition">要添加的 ε 转换。</param>
 /// <returns>一个值,指示操作是否成功。</returns>
 public virtual bool AttachTransition(IRegexNFAState <T> state, IRegexFSMEpsilonTransition <T> epsilonTransition) => base.AttachTransition(state, epsilonTransition);