예제 #1
0
        public void MkRegexFromAutomatonOf_3_Divisibility()
        {
            var solver = new CharSetSolver(BitWidth.BV7);
            var _0     = solver.MkCharConstraint('a');
            var _3     = solver.MkCharConstraint('d');
            var _03    = solver.MkOr(_0, _3);
            var _1     = solver.MkCharConstraint('b');
            var _2     = solver.MkCharConstraint('c');
            var moves  = new Move <BDD>[] {
                Move <BDD> .Create(0, 0, _03),
                Move <BDD> .Create(0, 1, _2),
                Move <BDD> .Create(0, 2, _1),
                Move <BDD> .Create(1, 1, _03),
                Move <BDD> .Create(1, 0, _1),
                Move <BDD> .Create(1, 2, _2),
                Move <BDD> .Create(2, 2, _03),
                Move <BDD> .Create(2, 0, _2),
                Move <BDD> .Create(2, 1, _1)
            };
            var aut = Automaton <BDD> .Create(solver, 0, new int[] { 0 }, moves);

            //solver.ShowGraph(aut, "div3a");
            string regex = solver.ConvertToRegex(aut).Replace("[ad]", "(a|d)").Replace("[b]", "b").Replace("[c]", "c");
            var    aut2  = solver.Convert(regex).Determinize().MinimizeHopcroft();
            // solver.ShowGraph(aut2, "div3b");
            bool equiv = aut.IsEquivalentWith(aut2);

            Assert.IsTrue(equiv);
            //binary version of the regex
            string regex01 = regex.Replace("a", "00").Replace("b", "01").Replace("c", "10").Replace("d", "11");
            var    bits30  = solver.Convert("^[01]{10,30}\\z");
            var    aut01_  = solver.Convert(regex01).Determinize();
            //solver.ShowGraph(aut01_, "aut01_");
            var aut01 = aut01_.MinimizeHopcroft();
            //solver.ShowGraph(aut01, "aut01");
            string regex01small = solver.ConvertToRegex(aut01);

            aut01 = aut01.Intersect(bits30);
            //genarate some random paths in this automaton and check that the binary representation is a numer that is divisible by 3.
            for (int i = 0; i < 1000; i++)
            {
                string sample = solver.ChooseString(aut01.ChoosePathToSomeFinalState(solver.Chooser));
                int    m      = 0;
                for (int j = sample.Length - 1; j >= 0; j--)
                {
                    if (sample[j] == '0')
                    {
                        m = m << 1;
                    }
                    else
                    {
                        m = (m << 1) | 1;
                    }
                }
                bool div3 = ((m % 3) == 0);
                Assert.IsTrue(div3);
            }
        }
        public static XElement getTwoWordsInstructorFeedback(XElement regex, XElement xAlphabet, XElement first, XElement second)
        {
            string         firstString  = (XElement.Parse(DFAUtilities.RemoveAllNamespaces(first.ToString()))).Value.Trim();
            string         secondString = (XElement.Parse(DFAUtilities.RemoveAllNamespaces(second.ToString()))).Value.Trim();
            HashSet <char> alphabet     = parseAlphabet(xAlphabet);

            CharSetSolver solver  = new CharSetSolver(BitWidth.BV64);
            var           dfaPair = DFAUtilities.parseRegexFromXML(regex, xAlphabet, solver);
            var           dfa     = dfaPair.Second.Determinize(solver).Minimize(solver);

            firstString  = firstString.decodeEpsilon();
            secondString = secondString.decodeEpsilon();
            int  firstState    = DFAUtilities.GetStateAfterString(dfa.InitialState, firstString, dfa, solver);
            int  secondState   = DFAUtilities.GetStateAfterString(dfa.InitialState, secondString, dfa, solver);
            bool areEquivalent = (firstState == secondState);

            if (areEquivalent)
            {
                var suffixDfa = Automaton <BDD> .Create(firstState, dfa.GetFinalStates(), dfa.GetMoves());

                var suffixRegex = solver.ConvertToRegex(suffixDfa);
                suffixRegex = regexToTraditional(suffixRegex);
                return(XElement.Parse(String.Format("<div><feedback> The words '{0}' and '{1}' are equivalent. The language of suffixes is '{2}'</feedback></div>", firstString, secondString, suffixRegex)));
            }
            else
            {
                var shortestDiff = DFAUtilities.GetDifferentiatingWord(firstState, secondState, dfa, alphabet, solver).Second;
                return(XElement.Parse(String.Format("<div><feedback> The words '{0}' and '{1}' are NOT equivalent. The shortest differentiating word is '{2}'</feedback></div>", firstString, secondString, shortestDiff)));
            }
        }
예제 #3
0
        public void MkRegexFromAutomatonTest1()
        {
            var    solver = new CharSetSolver(BitWidth.BV7);
            string regexA = "^abc(d|[a-ce-g])*$";
            var    A      = solver.Convert(regexA).Determinize().MinimizeHopcroft();
            string a      = solver.ConvertToRegex(A);

            Assert.AreEqual <string>("^(abc([a-g])*)$", a);
        }
예제 #4
0
        public void MkLengthAutomatonTest()
        {
            var    solver      = new CharSetSolver(BitWidth.BV7);
            string regexA      = "^(((((00|11)|10((00|11))*01)|(01|10((00|11))*10)(((00|11)|01((00|11))*10))*(10|01((00|11))*01)))*)$";
            BDD    _1          = solver.MkCharConstraint('1');
            var    A           = solver.Convert(regexA).RelpaceAllGuards(x => (x == null ? null : _1));
            var    B           = A.Determinize().MinimizeHopcroft();
            var    lengthregex = solver.ConvertToRegex(B);

            Assert.AreEqual <string>("^((11)*)$", lengthregex);
        }
예제 #5
0
        public void TestRegexComplement()
        {
            CharSetSolver css = new CharSetSolver();
            Regex         L1  = new Regex("^(([^>]|><)*(>|>[^<].*))$", RegexOptions.Singleline);
            var           A1  = css.Convert(L1.ToString(), L1.Options);
            Regex         L1n = new Regex("^([^>]([^>]|><)*(>|>[^<].*))$", RegexOptions.Singleline);
            var           A1n = css.Convert(L1n.ToString(), L1n.Options);
            var           A3  = A1.Minus(A1n).Minimize();
            var           L3  = css.ConvertToRegex(A3);

            Console.WriteLine(L3);
        }
예제 #6
0
        public void MkRegexFromAutomatonTest2()
        {
            string regex1 = @"^([\w-[\d]]|3)$";
            var    solver = new CharSetSolver(BitWidth.BV16);
            var    aut1   = solver.Convert(regex1);
            //this will be a pretty large regex where the classes have been expanded
            var  regex2 = solver.ConvertToRegex(aut1);
            var  aut2   = solver.Convert(regex2);
            bool equiv  = aut1.IsEquivalentWith(aut2);

            Assert.IsTrue(equiv);
        }
예제 #7
0
        static void TestRegex(Regex regex)
        {
            var    solver  = new CharSetSolver();
            string myregex = regex.ToString();

            //Regex.CompileToAssembly(new RegexCompilationInfo[] { new RegexCompilationInfo(myregex, RegexOptions.None, "EvilRegex", "RegexTransfomer", true) },
            //    new System.Reflection.AssemblyName("EvilRegex"));

            var sfa    = solver.Convert(myregex, regex.Options).RemoveEpsilons();
            var sfaDet = sfa.Determinize();
            var sfaMin = sfaDet.Minimize();

            //solver.ShowGraph(sfa, "sfa");
            //solver.ShowGraph(sfaDet, "sfaDet");
            //solver.ShowGraph(sfaMin, "sfaMin");

            var cs = solver.ToCS(sfaMin, true, "MyRegex", "RegexTransfomer");

            var regexMin = solver.ConvertToRegex(sfaMin);

            Console.WriteLine("------- given regex --------");
            Console.WriteLine(myregex);
            Console.WriteLine("----------------------------");

            Console.WriteLine("-------- regexMin ----------");
            Console.WriteLine(regexMin);
            Console.WriteLine("----------------------------");

            Console.WriteLine("-------- cs ----------------");
            // Console.WriteLine(cs.SourceCode);
            Console.WriteLine("----------------------------");

            string sIn  = solver.GenerateMember(sfaMin);
            string sOut = solver.GenerateMember(sfaMin.Complement());
            string s    = sIn;
            int    t1;
            //int t2;
            int t3;

            for (int i = 0; i < 2; i++)
            {
                //original regex
                t1 = System.Environment.TickCount;
                bool res1 = false;
                for (int j = 0; j < 100000; j++)
                {
                    res1 = Regex.IsMatch(s, regex.ToString(), regex.Options);
                }
                //res1 = evilregex.IsMatch(s);
                t1 = System.Environment.TickCount - t1;

                ////minimized regex
                //t2 = System.Environment.TickCount;
                //bool res2 = false;
                //for (int j = 0; j < 100000; j++)
                //    res2 = Regex.IsMatch(s, regexMin, regex.Options);
                //t2 = System.Environment.TickCount - t2;

                //code from minimized regex
                t3 = System.Environment.TickCount;
                bool res3 = false;
                for (int j = 0; j < 100000; j++)
                {
                    res3 = cs.IsMatch(s);
                }
                t3 = System.Environment.TickCount - t3;
                Console.WriteLine(String.Format("{0}ms({1}), {2}ms({3})", t1, res1, t3, res3));
                s = sOut;
            }
            Console.WriteLine("done...(press any key)");
            Console.ReadKey();
        }
예제 #8
0
        static void TestRegex(Regex regex)
        {
            var solver = new CharSetSolver();
            string myregex = regex.ToString();

            //Regex.CompileToAssembly(new RegexCompilationInfo[] { new RegexCompilationInfo(myregex, RegexOptions.None, "EvilRegex", "RegexTransfomer", true) },
            //    new System.Reflection.AssemblyName("EvilRegex"));

            var sfa = solver.Convert(myregex, regex.Options).RemoveEpsilons();
            var sfaDet = sfa.Determinize();
            var sfaMin = sfaDet.Minimize();

            //solver.ShowGraph(sfa, "sfa");
            //solver.ShowGraph(sfaDet, "sfaDet");
            //solver.ShowGraph(sfaMin, "sfaMin");

            var cs = solver.ToCS(sfaMin, true, "MyRegex", "RegexTransfomer");

            var regexMin = solver.ConvertToRegex(sfaMin);

            Console.WriteLine("------- given regex --------");
            Console.WriteLine(myregex);
            Console.WriteLine("----------------------------");

            Console.WriteLine("-------- regexMin ----------");
            Console.WriteLine(regexMin);
            Console.WriteLine("----------------------------");

            Console.WriteLine("-------- cs ----------------");
            Console.WriteLine(cs.SourceCode);
            Console.WriteLine("----------------------------");

            string sIn = solver.GenerateMember(sfaMin);
            string sOut = solver.GenerateMember(sfaMin.Complement());
            string s = sIn;
            int t1;
            int t2;
            int t3;
            for (int i = 0; i < 2; i++)
            {
                //original regex
                t1 = System.Environment.TickCount;
                bool res1 = false;
                for (int j = 0; j < 100000; j++)
                    res1 = Regex.IsMatch(s, regex.ToString(), regex.Options);
                //res1 = evilregex.IsMatch(s);
                t1 = System.Environment.TickCount - t1;

                ////minimized regex
                //t2 = System.Environment.TickCount;
                //bool res2 = false;
                //for (int j = 0; j < 100000; j++)
                //    res2 = Regex.IsMatch(s, regexMin, regex.Options);
                //t2 = System.Environment.TickCount - t2;

                //code from minimized regex
                t3 = System.Environment.TickCount;
                bool res3 = false;
                for (int j = 0; j < 100000; j++)
                    res3 = cs.IsMatch(s);
                t3 = System.Environment.TickCount - t3;
                Console.WriteLine(String.Format("{0}ms({1}), {2}ms({3})", t1, res1, t3, res3));
                s = sOut;
            }
            Console.WriteLine("done...(press any key)");
            Console.ReadKey();
        }