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); }
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); }