Ejemplo n.º 1
0
        static int Main(string[] args)
        {
            try
            {
                if (args.Length < 2 || args.Length > 4)
                {
                    Console.WriteLine("Usage:");
                    Console.WriteLine("  BnfToDfa.exe bnf_file.bnf mark_file.mrk root_rule_name [no_warning_file.nwr]");
                    Console.WriteLine("-or-");
                    Console.WriteLine("  BnfToDfa.exe bnf_file.bnf root_rule_name");
                    Console.WriteLine("-or-");
                    Console.WriteLine("  BnfToDfa.exe --all-marks bnf_file.bnf root_rule_name output_file_name");
                    return(-1);
                }

                if (args[0] == "--all-marks")
                {
                    var bnfFile    = args[1];
                    var rootRule   = args[2];
                    var outputFile = args[3];


                    var builder = LoadBnfFiles(bnfFile);


                    var rules = new HashSet <string>();
                    builder.CreateNfa(rootRule, (state, rulePath) =>
                    {
                        rules.Add(rulePath.Value);
                        return(state);
                    });


                    Console.WriteLine("Write all ({1}) marks: {0}", outputFile, rules.Count);

                    using (var output = File.CreateText(outputFile))
                    {
                        foreach (var rule in rules)
                        {
                            output.WriteLine(rule);
                        }
                    }
                }
                else
                {
                    var bnfFile  = args[0];
                    var mrkFile  = (args.Length >= 3) ? args[1] : null;
                    var rootRule = (args.Length >= 3) ? args[2] : args[1];
                    var nwrFile  = (args.Length >= 4) ? args[3] : null;
                    var dfaFile  = Path.GetFileNameWithoutExtension(bnfFile) + ".xml";


                    var builder = LoadBnfFiles(bnfFile);


                    var marker = new Marker();
                    if (mrkFile != null)
                    {
                        Console.WriteLine("Load marks file: {0}", mrkFile);
                        marker.LoadMarks(mrkFile);
                    }

                    if (nwrFile != null)
                    {
                        Console.WriteLine("Load 'No warning' file: {0}", nwrFile);
                        marker.LoadSuppressWarning(nwrFile);
                    }


                    Console.Write("Build NFA");
                    var nfa = builder.CreateNfa(rootRule, marker.MarkRuleHandler);
                    Console.WriteLine(", max NFA state id: {0}", Fsm.State.MaxId);


                    Console.ForegroundColor = ConsoleColor.Yellow;
                    foreach (var unused in marker.GetUnusedRules())
                    {
                        Console.WriteLine("UNUSED: {0}", unused);
                    }
                    Console.ResetColor();


                    PackNfa.Pack(nfa, true);


                    int count;
                    var dfa = nfa.ToDfa3(out count, true);
                    Console.WriteLine("DFA Complied States: {0}", count);


                    var minCount = dfa.Minimize(true);
                    Console.WriteLine("Minimized DFA States: {0}", minCount);


                    Console.WriteLine("Write DFA file: {0}", dfaFile);
                    Writer.Write(dfa, dfaFile);
                }
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine();
                Console.WriteLine("Error {0}", ex.Message);
                Console.ResetColor();
                return(-1);
            }

            return(0);
        }
Ejemplo n.º 2
0
        static int Main(string[] args)
        {
            try
            {
                //api.xbnf.txt api.mark.txt API

                var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\";

                bool mode2    = (((args.Length >= 4) ? args[3] : "") == "mode2");
                var  rootRule = args[2];

                Console.WriteLine("Load grammar");
                var grammar = new XbnfGrammar(mode2 ? XbnfGrammar.Mode.HttpCompatible : XbnfGrammar.Mode.Strict);

                Console.WriteLine("Create parser");
                var parser = new Parser(grammar);

                Console.WriteLine("Read XBNF from {0}", args[0]);
                var xbnf = File.ReadAllText(args[0]);

                Console.WriteLine("Optimize");
                var oprimized = Optimize(xbnf);

                Console.WriteLine("Parse");
                var tree = parser.Parse(oprimized, "<source>");
                if (tree == null)
                {
                    throw new Exception(@"Failed to parse");
                }

                Console.WriteLine("Build expressions");
                var builder = new Builder(tree);
                builder.BuildExpressions();

                Console.WriteLine("Load marks");
                var marker = new Marker();
                if (args.Length >= 2)
                {
                    marker.LoadMarks(path + args[1]);
                }
                //if (args.Length >= 3)
                //    marker.LoadSuppressWarngin(path + args[2]);

                Console.WriteLine("Build NFA");
                var nfa = builder.CreateNfa(rootRule, marker.MarkRuleHandler);
                nfa.MarkFinal();
                Console.WriteLine("Max NFA state id: {0}", Fsm.State.MaxId);

                Console.WriteLine("Check unused rules");
                foreach (var unused in marker.GetUnusedRules())
                {
                    Console.WriteLine("UNUSED: {0}", unused);
                }

                Console.WriteLine("Pack NFA");
                PackNfa.Pack(nfa, true);

                int count;
                var dfa = nfa.ToDfa3(out count, true);
                Console.WriteLine("DFA Complied States: {0}", count);

                var minCount = dfa.Minimize(true);
                Console.WriteLine("Minimized DFA States: {0}", minCount);

                Console.WriteLine("Write DFA");
                Writer.Write(dfa, "dfa.xml");

                //Console.WriteLine("Convert to C#");
                //var csharp = grammar.RunSample(tree);

                //Console.WriteLine("Write C# to {0}", args[1]);
                //File.WriteAllText(args[1], AddHeaderFooter(csharp));
            }
            catch (Exception ex)
            {
                Console.Write(ex.ToString());
                return(-1);
            }

            return(0);
        }