Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
            }
        }