private IForestNode CreateNullParseNode(NonTerminal symbol, int location) { var symbolNode = NodeSet.AddOrGetExistingSymbolNode(symbol, location, location); var nullNode = new SymbolForestNode(symbol, location, location); //new EpsilonForestNode(location); symbolNode.AddUniqueFamily(nullNode); return(symbolNode); }
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); }