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