Beispiel #1
0
        private IForestNode CreateNullParseNode(ISymbol symbol, int location)
        {
            var symbolNode = _nodeSet.AddOrGetExistingSymbolNode(symbol, location, location);
            var token      = new Token(string.Empty, location, EmptyTokenType);
            var nullNode   = new TokenForestNode(token, location, location);

            symbolNode.AddUniqueFamily(nullNode);
            return(symbolNode);
        }
Beispiel #2
0
        public void ParseEngineGivenAmbiguousNullableRightRecursionShouldCreateMultipleParsePaths()
        {
            // example 1 section 3, Elizabeth Scott
            var tokens = Tokenize("aa");

            ProductionExpression
                S = "S",
                T = "T",
                B = "B";

            S.Rule = (S + T) | "a";
            B.Rule = null;
            T.Rule = ("a" + B) | "a";

            var grammar     = new GrammarExpression(S, new[] { S, T, B }).ToGrammar();
            var parseEngine = new ParseEngine(grammar, new ParseEngineOptions(false));

            ParseInput(parseEngine, tokens);

            var parseForestRoot = parseEngine.GetParseForestRootNode();
            var actual          = parseForestRoot;

            var a_1_2    = new TokenForestNode(MakeToken("a", 1));
            var expected =
                new SymbolForestNode(
                    S.ProductionModel.LeftHandSide.NonTerminal,
                    0,
                    2,
                    new AndForestNode(
                        new SymbolForestNode(
                            S.ProductionModel.LeftHandSide.NonTerminal,
                            0,
                            1,
                            new AndForestNode(new TokenForestNode(MakeToken("a", 0)))),
                        new SymbolForestNode(
                            T.ProductionModel.LeftHandSide.NonTerminal,
                            1,
                            2,
                            new AndForestNode(a_1_2),
                            new AndForestNode(
                                a_1_2,
                                new SymbolForestNode(
                                    B.ProductionModel.LeftHandSide.NonTerminal,
                                    2,
                                    2,
                                    new AndForestNode(new SymbolForestNode(B.ProductionModel.LeftHandSide.NonTerminal, 2, 2)))))));

            AssertForestsAreEqual(expected, actual);
        }