private static SDK.Parsers.ICombiParser?Parse(FileRef sourceFile, FileRef debugFile, bool toCs, SDK.Parsers.ICombiParser parser, Func <INode, Grammar> aster) { if (debugFile == null) { throw new ArgumentNullException(nameof(debugFile)); } var source = Source.FromFile(sourceFile); Name.Clear(); var parseTree = parser.Parse(source.Start()); if (parseTree.IsSuccess) { Dumper.Nodes(debugFile.Add(".nodes"), parseTree.Nodes); var grammar = aster(parseTree.Nodes[0]); Checker.Check(grammar); if (!grammar.Results.HasAny) { Dumper.Pretty(debugFile.Add(".lpg"), grammar); parser = Builder.BuildParser(grammar); if (toCs) { Builder.BuildSource(grammar, debugFile.Add(".g.cs")); } Dumper.Parsers(debugFile.Add(".parser"), grammar); return(parser); } grammar.Results.Report(Console.Out); } else { Console.WriteLine($"farthest:{Result.FarthestFail}"); } return(null); }
public void Dump(FileRef dests) { var grammarDump = dests.Add(".Grammar"); var terminals = dests.Add(".Terminals"); var nonterminals = dests.Add(".Nonterminals"); var sets = dests.Add(".Sets"); var table = dests.Add(".Table"); var cores = dests.Add(".Cores"); using (var writer = new StreamWriter(grammarDump)) { new GrammarDumper(Grammar).Dump(new TextIWriter(writer)); } using (var writer = new StreamWriter(terminals)) { new TerminalDumper(Grammar).Dump(new TextIWriter(writer)); } using (var writer = new StreamWriter(nonterminals)) { new NonterminalDumper(Grammar).Dump(new TextIWriter(writer)); } using (var writer = new StreamWriter(sets)) { new SetDumper(Grammar).Dump(new TextIWriter(writer)); } using (var writer = new StreamWriter(table)) { new TableDumper(Grammar).Dump(new TextIWriter(writer)); } using (var writer = new StreamWriter(cores)) { new CoresDumper(Grammar).Dump(new TextIWriter(writer)); } }