示例#1
0
        private static void ParserGenerator()
        {
            var g      = Ebnf.GrammarLayout();
            var earley = new EarleyParser2(g);

            var sentence1 = Sentence.FromLetters(Grammars.Properties.Resources.Arithmetic_ebnf);
            // var sentence1 = Sentence.FromLetters(Grammars.Properties.Resources.Bnf);
            // var sentence2 = Sentence.FromLetters("<S> ::= <S> '+' <S>\r\n<S> ::= '1'\r\n");
            // if (!sentence1.Equals(sentence2)) {          }
            // int index = sentence1.Zip(sentence2, (c1, c2) => c1 == c2).TakeWhile(b => b).Count() + 1;

            var sppf = earley.ParseGetForest(sentence1);

            if (sppf == null)
            {
                throw new Exception();
            }

            DotRunner.Run(DotBuilder.GetRawDot(sppf), "arithmetic_ebnf");

            //var traversal = new Traversal(sppf, sentence1, g);
            //var result = traversal.Traverse();
            //if (result.Count() != 1) {
            //	throw new Exception();
            //}
            //var generatedGrammar = new Grammar((IEnumerable<Production>)result.First().Payload, Nonterminal.Of("S"));
            //Console.WriteLine(generatedGrammar);
        }
示例#2
0
        private static void TraversePlay()
        {
            var g = new Grammar(new List <Production> {
                CFGParser.Production("<A> → <B>"),
                CFGParser.Production("<B> → <A>"),
                CFGParser.Production("<B> → 'x'"),
            }, Nonterminal.Of("A"));

            g = IdentityActions.Annotate(g);

            var earley2  = new EarleyParser2(g);
            var sentence = Sentence.FromWords("x");
            var sppf2    = earley2.ParseGetForest(sentence);

            DotRunner.Run(DotBuilder.GetRawDot(sppf2), "infinite");

            var t2 = new Traversal(sppf2, g);
            var r2 = t2.Traverse();
            //foreach (var option in r2) {
            //	var s2 = (Sentence)option.Payload;
            //	if (!sentence.SequenceEqual(s2)) {
            //		throw new Exception();
            //	}
            //}
        }
示例#3
0
        private static void DevelopAnnotations()
        {
            var sw    = Stopwatch.StartNew();
            var input = Sentence.FromLetters(Grammars.Properties.Resources.Arithmetic_annotated);
            var inputWithoutLayout = Ebnf.RemoveLayout(input, out _);
            var grammar            = Ebnf.GrammarSyntax();
            var parser             = new EarleyParser2(grammar);
            var sppf = parser.ParseGetForest(inputWithoutLayout);

            if (sppf == null)
            {
                throw new Exception();
            }
            var ms1 = sw.Elapsed.TotalMilliseconds;

            Console.WriteLine("Parse: {0:0.#}ms", ms1);
            DotRunner.Run(DotBuilder.GetRawDot(sppf), "annotations");

            var traversal     = new Traversal(sppf, grammar);
            var resCollection = traversal.Traverse();

            if (resCollection.Count() > 1)
            {
                throw new Exception("ambiguous");
            }
            var res = resCollection.Single();

            Console.WriteLine(res);
        }
示例#4
0
        // from http://dx.doi.org/10.1016/j.entcs.2008.03.044
        private static void PaperExamples()
        {
            var ex3 = new Grammar(new List <Production> {
                CFGParser.Production("<S> → <A> <T>"),
                CFGParser.Production("<S> → 'a' <T>"),
                CFGParser.Production("<A> → 'a'"),
                CFGParser.Production("<A> → <B> <A>"),
                CFGParser.Production("<B> → ε"),
                CFGParser.Production("<T> → 'b' 'b' 'b'"),
            }, Nonterminal.Of("S"));

            var input = Sentence.FromLetters("abbb");
            var sppf1 = new EarleyParser(ex3).ParseGetForest(input);
            var sppf2 = new EarleyParser2(ex3).ParseGetForest(input);

            DotRunner.Run(DotBuilder.GetRawDot(sppf1), "example3_old");
            DotRunner.Run(DotBuilder.GetRawDot(sppf2), "example3_new");
        }
示例#5
0
        private static void BnfPlay()
        {
            var bnf    = Bnf.Grammar();
            var earley = new EarleyParser2(bnf);

            var sentence1 = Sentence.FromLetters(Grammars.Properties.Resources.Arithmetic);
            // var sentence1 = Sentence.FromLetters(Grammars.Properties.Resources.Bnf);
            // var sentence2 = Sentence.FromLetters("<S> ::= <S> '+' <S>\r\n<S> ::= '1'\r\n");
            // if (!sentence1.Equals(sentence2)) {          }
            // int index = sentence1.Zip(sentence2, (c1, c2) => c1 == c2).TakeWhile(b => b).Count() + 1;
            var sppf = earley.ParseGetForest(sentence1);

            if (sppf == null)
            {
                throw new Exception();
            }
            DotRunner.Run(DotBuilder.GetRawDot(sppf), "bnfPlay");
        }
示例#6
0
        private static void VisitorPlay()
        {
            var gp = AdditionGrammar(argList => string.Format("({0} + {1})", argList[0].Payload, argList[2].Payload));

            //var actions2 = new Dictionary<Production, IParserAction> {
            //	[p1] = new ParserAction<long>((argList) => (long)(argList[0].Payload) + (long)(argList[2].Payload)),
            //};
            //var termAction2 = new ParserAction<long>(x => Convert.ToInt64(x[0].Payload));
            //foreach (var num in nums) {
            //	actions2[num] = termAction2;
            //}

            var ep = new EarleyParser2(gp);

            var inputString = AdditionInput(5);
            var input       = Sentence.FromWords(inputString);
            var sppf        = ep.ParseGetForest(input);

            var rawdot = DotBuilder.GetRawDot(sppf);

            DotRunner.Run(rawdot, "newSppf");

            Console.WriteLine(sppf.ToString());
            Console.WriteLine();

            Console.WriteLine("Starting Traversal...");
            var trav       = new Traversal(sppf, gp);
            var resultList = trav.Traverse();

            Console.WriteLine("-----------------");
            foreach (var result in resultList)
            {
                Console.WriteLine(result.Payload);
            }

            //Console.WriteLine("-----------------");
            //foreach (var result in new Traversal(sppf, input, gp).Traverse()) {
            //	Console.WriteLine(result.Payload);
            //}
        }
示例#7
0
        private static void DebugGrammar()
        {
            BaseGrammar g = new Grammar(new List <Production> {
                CFGParser.Production("<S> → ε"),
            }, Nonterminal.Of("S"));
            var sentence = Sentence.FromWords("1 + 1 + 1");
            var grammar  = AdditionGrammar(argList => string.Format("({0} + {1})", argList[0].Payload, argList[2].Payload));

            g = grammar;
            var earley  = new EarleyParser(g);
            var earley2 = new EarleyParser2(g);

            //DotRunner.Run(earley.ParseGetForest(sentence).GetRawDot(), "testEarleyOld");
            //DotRunner.Run(earley2.ParseGetForest(sentence).GetRawDot(), "testEarleyNew");
            DotRunner.Run(DotBuilder.GetRawDot(earley.ParseGetForest(sentence)), "testEarleyOld");
            DotRunner.Run(DotBuilder.GetRawDot(earley2.ParseGetForest(sentence)), "testEarleyNew");
            // DotRunner.Run(DotBuilder.GetFlattenedDot(earley2.ParseGetForest(sentence)), "testEarleyFlat");


            // var prob0 = earley.ParseGetProbability(sentence);
            var prob = earley2.ParseGetProbability(sentence);
        }