public BaseParser(Grammar g, ILexer lexer, BaseNodeGenerator nodeGen = null, BaseNodeRetypingVisitor retypeVisitor = null) { GrammarObject = g; Lexer = lexer; NodeGenerator = nodeGen ?? new BaseNodeGenerator(g); NodeRetypingVisitor = retypeVisitor ?? new BaseNodeRetypingVisitor(g); }
public Parser(Grammar g, ILexer lexer, BaseNodeGenerator nodeGen = null) : base(g, lexer, nodeGen) { Table = new TableLL1(g); /// В ходе парсинга потребуется First, /// учитывающее возможную пустоту ANY GrammarObject.UseModifiedFirst = true; RecoveryCache = new Dictionary <string, Tuple <LocalOptions, Stack <string> > >(); /// Для каждого из возможных символов для восстановления кешируем дополнительную информацию foreach (var smb in GrammarObject.Options.GetSymbols(ParsingOption.RECOVERY)) { var stack = new Stack <string>(); stack.Push(smb); LocalOptions anyOptions = null; /// Накапливаем символы, которые придётся положить на стек при восстановлении на smb while (true) { var alternative = Table[stack.Peek(), Grammar.ANY_TOKEN_NAME][0]; stack.Pop(); for (var i = alternative.Count - 1; i >= 0; --i) { stack.Push(alternative[i]); } if (alternative[0].Symbol == Grammar.ANY_TOKEN_NAME) { anyOptions = alternative[0].Options; stack.Pop(); break; } } /// В кеш помещаем цепочку символов и опции Any RecoveryCache[smb] = new Tuple <LocalOptions, Stack <string> >(anyOptions, stack); } }
public Parser(Grammar g, ILexer lexer, BaseNodeGenerator nodeGen = null) : base(g, lexer, nodeGen) { Table = new TableLR1(g); }