Beispiel #1
0
 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
        }