Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
 public Parser(Grammar g, ILexer lexer, BaseNodeGenerator nodeGen = null) : base(g, lexer, nodeGen)
 {
     Table = new TableLR1(g);
 }