protected virtual IAcceptInputTransition <T> ActivateRegexNFATransitionFromRegexConstAdaptor <TTarget>(RegexConstAdaptor <TTarget, T> regex) { return(new ConstAdaptorRegexFATransition <TTarget, T, BasicRegexNFAState <T> >(t => this.AccreditedSet.Any(_t => regex.Condition(_t)))); }
static void Main(string[] args) { Program.TestFunctionalTransitions( Regex.Range('0', '9').NoneOrMany().NonGreedy() + Regex.Range('0', '9').Many().NonGreedy().Group("sec", true).GroupReference(out RegexGroupReference <char> sec_GroupReference) + sec_GroupReference ); #if false RangeSet <char> set = new RangeSet <char>(new CharRangeInfo()); set.Add('a'); set.Add('c'); ; Dictionary <int, int> d = new Dictionary <int, int>(); var chars = Regex.Range('\0', 'z', true, false); var tchars = Regex.Range(new TT <char>('a'), new TT <char>('z'), false, true); var phone = Regex.Range(0, 9).RepeatMany(10); Func <int, RegexObject <char> > func = (count) => { var junkPrefix = Regex.Const('0').NoneOrMany(); Func <int, char> convertor = Convert.ToChar; return(junkPrefix + Enumerable.Range(0, count).Select(num => num.ToString().Select(c => Regex.Const(c)).ConcatMany()).UnionMany()); }; var section = func(255); var dot = Regex.Const('.'); var colon = Regex.Const(':'); var port = func(9999); var ipAddress = new RegexObject <char>[] { section, dot, section, dot, section, dot, section, new RegexObject <char>[] { colon, port }.ConcatMany().Optional() }.ConcatMany(); IRegexFAProvider <char> char_Provider = new RegexFAProvider <char>(new MyCharRegexRunContextInfo()); var char_nfa = char_Provider.GenerateRegexFSMFromRegexObject(ipAddress, RegexOptions.None); //var debuginfo = char_nfa.GetDebugInfo(); var char_dfa = char_Provider.GenerateRegexDFAFromRegexFSM(char_nfa); ; Action <RegexObject <char> > action = regexObj => { var ___nfa = char_Provider.GenerateRegexFSMFromRegexObject(regexObj, RegexOptions.None); var ___dfa = char_Provider.GenerateRegexDFAFromRegexFSM(___nfa); IEnumerable <char> inputs = Enumerable.Repeat <Func <int, int> >(new Random().Next, 25).Select(nextFunc => (char)('a' - 1 + nextFunc(4))); char[] ___charArray = inputs.ToArray(); IRegexFSM <char> ___fsm; #if false ___fsm = new RegexFSM <char>() { StartState = ___dfa.StartState }; #else ___fsm = ___dfa; #endif ___fsm.TransitMany(___charArray); var ___matches = ___fsm.Matches; }; action?.Invoke(Regex.Const('a').Optional().Concat(Regex.Const('b').Concat(Regex.Const('c').Optional()))); #endif Func <int, int, RegexRange <string> > func_adpator = (min, max) => new RegexRangeAdaptor <int, string>( min, max, (source => source.ToString()), (target => int.Parse(target)) ); var section_adpator = func_adpator(0, 255); var dot_adaptor = new RegexConstAdaptor <char, string>('.', (source => source.ToString()), (target => target[0])); var colon_adaptor = new RegexConstAdaptor <char, string>(':', (source => source.ToString()), (target => target[0])); var port_adaptor = func_adpator(0, 9999); var ipAddress_adaptor = new RegexObject <string>[] { section_adpator, dot_adaptor, section_adpator, dot_adaptor, section_adpator, dot_adaptor, section_adpator, new RegexObject <string>[] { colon_adaptor, port_adaptor }.ConcatMany().Optional() }.ConcatMany(); IRegexFAProvider <string> string_Provider = new RegexFAProvider <string>(new MyStringRegexRunContextInfo()); var string_nfa = string_Provider.GenerateRegexFSMFromRegexObject(ipAddress_adaptor, RegexOptions.None); var string_dfa = string_Provider.GenerateRegexDFAFromRegexFSM(string_nfa); ; Random random = new Random(); int 样本树 = 100; var ipAddressStrFragments = Enumerable.Repeat( new Tuple <Func <int>, Func <double> >( (() => random.Next(4, 6)), (() => random.NextDouble() * 1.15) ), 样本树 ) .Select(tuple => { int groupCount = tuple.Item1(); int sectionMax = 255; int portMax = 9999; return (Enumerable.Repeat <IEnumerable <string> >( new string[] { ((int)(sectionMax * tuple.Item2())).ToString(), "." }, 3) .Aggregate((ss1, ss2) => ss1.Concat(ss2)) .Concat(groupCount > 3 ? new string[] { ((int)(sectionMax * tuple.Item2())).ToString() } .Concat(groupCount > 4 ? new string[] { ":", ((int)(portMax * tuple.Item2())).ToString() } : Enumerable.Empty <string>() ) : Enumerable.Empty <string>() )); }); #if false IRegexFSM <char> char_fsm = char_dfa; var matchesArray = ipAddressStrFragments .Select(ipAddressStrFragment => string.Join(string.Empty, ipAddressStrFragment)) .Select(ipAddressStr => { char_fsm.TransitMany(ipAddressStr); return(char_fsm.Matches); }) .ToArray(); ; #else IRegexFSM <string> string_fsm = string_dfa; var matchesArray = ipAddressStrFragments .Select(ipAddressStr => { string_fsm.TransitMany(ipAddressStr); return(string_fsm.Matches); }) .ToArray(); ; #endif }