Beispiel #1
0
        static void _RunStress2()
        {
            CharFA <string> fa  = null;
            var             min = 255;
            var             max = 511;

            Console.Write("Building NFA matching integer values {0}-{1} ", min, max);
            for (var i = min; i <= max; ++i)
            {
                // for perf reasons we reduce every 12 times
                if (null == fa)
                {
                    fa = CharFA <string> .Literal(i.ToString());
                }
                else
                {
                    fa = CharFA <string> .Or(new CharFA <string>[] { fa, CharFA <string> .Literal(i.ToString()) });
                }
                if (0 == (i % 12))
                {
                    Console.Write('.');
                }
                // replace the above "Console.Write('.');" line with below is MUCH faster
                //	fa=fa.Reduce(new _ConsoleProgress());
            }
            Console.WriteLine();
            Console.WriteLine("C# integer NFA has {0} states.", fa.FillClosure().Count);
            fa = fa.Reduce(new _ConsoleProgress());
            Console.WriteLine();
            Console.WriteLine("C# integer DFA has {0} states.", fa.FillClosure().Count);
            Console.WriteLine("Rendering stress2.jpg");
            fa.RenderToFile(@"..\..\..\stress2.jpg");
        }
Beispiel #2
0
        /// <summary>
        /// Makes a simple lexer where each terminal is its own literal value.
        /// </summary>
        /// <returns>A lexer suitable for lexing the grammar</returns>
        public CharFA ToSimpleLexer()
        {
            var result = new CharFA();

            foreach (var t in _EnumTerminals())
            {
                if ("#ERROR" != t && "#EOS" != t)
                {
                    result.EpsilonTransitions.Add(CharFA.Literal(t, t));
                }
            }
            result = result.ToDfa();
            return(result);
        }
Beispiel #3
0
        static void _RunStress2()
        {
            CharFA <string> fa  = null;
            var             min = 599;
            var             max = 639;

            Console.Write("Building NFA matching integer values {0}-{1} ", min, max);
            for (var i = min; i <= max; ++i)
            {
                if (null == fa)
                {
                    fa = CharFA <string> .Literal(i.ToString());
                }
                else
                {
                    fa = CharFA <string> .Or(new CharFA <string>[] { fa, CharFA <string> .Literal(i.ToString()) });
                }
                // for perf reasons we can reduce every 12 times
                if (0 == (i % 12))
                {
                    Console.Write('.');
                }
                // replace the above "Console.Write('.');" line with below is MUCH faster
                //	fa=fa.Reduce(new _ConsoleProgress());
            }
            Console.WriteLine();
            fa.TrimNeutrals();
            //fa.TrimDuplicates();
            Console.WriteLine("C# integer NFA has {0} states.", fa.FillClosure().Count);
            fa.RenderToFile(@"..\..\..\stress2_nfa.jpg");
            fa = fa.Reduce(new _ConsoleProgress());
            Console.WriteLine();
            Console.WriteLine("C# integer DFA has {0} states.", fa.FillClosure().Count);
            //var expr = RegexExpression.FromFA(fa);
            //Console.WriteLine("Final Expression: {0}", expr);
            Console.WriteLine("Rendering stress2.jpg");
            fa.RenderToFile(@"..\..\..\stress2.jpg");
        }
Beispiel #4
0
 public override CharFA ToFA(EbnfDocument parent, Cfg cfg)
 {
     return(CharFA.Literal(Value, (null == parent) ? "" : parent.GetIdForExpression(this)));
 }
Beispiel #5
0
        static void _BuildArticleImages()
        {
            // this generates the figures used in the code project article
            // at https://www.codeproject.com/Articles/5251476/How-to-Build-a-Regex-Engine-in-Csharp
            var litA = CharFA <string> .Literal("ABC", "Accept");

            litA.RenderToFile(@"..\..\..\literal.jpg");
            var litAa = CharFA <string> .CaseInsensitive(litA, "Accept");

            litAa.RenderToFile(@"..\..\..\literal_ci.jpg");
            var opt = CharFA <string> .Optional(litA, "Accept");

            opt.RenderToFile(@"..\..\..\optional.jpg");
            var litB = CharFA <string> .Literal("DEF");

            var or = CharFA <string> .Or(new CharFA <string>[] { litA, litB }, "Accept");

            or.RenderToFile(@"..\..\..\or.jpg");
            var set = CharFA <string> .Set("ABC", "Accept");

            set.RenderToFile(@"..\..\..\set.jpg");
            var loop = CharFA <string> .Repeat(litA, 1, -1, "Accept");

            loop.RenderToFile(@"..\..\..\repeat.jpg");
            var concat = CharFA <string> .Concat(new CharFA <string>[] { litA, litB }, "Accept");

            concat.RenderToFile(@"..\..\..\concat.jpg");
            var foobar = CharFA <string> .Or(new CharFA <string>[] { CharFA <string> .Literal("foo"), CharFA <string> .Literal("bar") }, "Accept");

            foobar.RenderToFile(@"..\..\..\foobar_nfa.jpg");
            var rfoobar = foobar.Reduce();

            rfoobar.RenderToFile(@"..\..\..\foobar.jpg");
            var lfoobar = CharFA <string> .Repeat(foobar, 1, -1, "Accept");

            lfoobar.RenderToFile(@"..\..\..\foobar_loop_nfa.jpg");
            var rlfoobar = lfoobar.Reduce();

            rlfoobar.RenderToFile(@"..\..\..\foobar_loop.jpg");

            var digits = CharFA <string> .Repeat(
                CharFA <string> .Set("0123456789"),
                1, -1
                , "Digits");

            var word = CharFA <string> .Repeat(
                CharFA <string> .Set(new CharRange[] { new CharRange('A', 'Z'), new CharRange('a', 'z') }),
                1, -1
                , "Word");

            var whitespace = CharFA <string> .Repeat(
                CharFA <string> .Set(" \t\r\n\v\f"),
                1, -1
                , "Whitespace");

            var lexer = CharFA <string> .ToLexer(digits, word, whitespace);

            lexer.RenderToFile(@"..\..\..\lexer.jpg");
            var dopt = new CharFA <string> .DotGraphOptions();

            dopt.DebugSourceNfa = lexer;
            var dlexer = lexer.ToDfa();

            dlexer.RenderToFile(@"..\..\..\dlexer.jpg", dopt
                                );
            dlexer.RenderToFile(@"..\..\..\dlexer2.jpg");
            var dom = RegexExpression.Parse("(ABC|DEF)+");
            var fa  = dom.ToFA("Accept");

            fa.RenderToFile(@"..\..\..\ABCorDEFloop.jpg");
        }