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; }
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; }