public virtual RuleAST ParseArtificialRule(Grammar g, string ruleText)
        {
            ANTLRLexer        lexer   = new ANTLRLexer(new ANTLRStringStream(ruleText));
            GrammarASTAdaptor adaptor = new GrammarASTAdaptor(lexer.CharStream);
            CommonTokenStream tokens  = new CommonTokenStream(lexer);

            lexer.tokens = tokens;
            ToolANTLRParser p = new ToolANTLRParser(tokens, tool);

            p.TreeAdaptor = adaptor;
            IToken ruleStart = null;

            try
            {
                Antlr.Runtime.AstParserRuleReturnScope <GrammarAST, IToken> r = p.rule();
                RuleAST tree = (RuleAST)r.Tree;
                ruleStart = r.Start;
                GrammarTransformPipeline.SetGrammarPtr(g, tree);
                GrammarTransformPipeline.AugmentTokensWithOriginalPosition(g, tree);
                return(tree);
            }
            catch (Exception e)
            {
                tool.errMgr.ToolError(ErrorType.INTERNAL_ERROR,
                                      e,
                                      ruleStart,
                                      "error parsing rule created during left-recursion detection: " + ruleText);
            }
            return(null);
        }
Пример #2
0
        /** Given the raw AST of a grammar, create a grammar object
            associated with the AST. Once we have the grammar object, ensure
            that all nodes in tree referred to this grammar. Later, we will
            use it for error handling and generally knowing from where a rule
            comes from.
         */
        public virtual Grammar CreateGrammar(GrammarRootAST ast)
        {
            Grammar g;
            if (ast.grammarType == ANTLRParser.LEXER)
                g = new LexerGrammar(this, ast);
            else
                g = new Grammar(this, ast);

            // ensure each node has pointer to surrounding grammar
            GrammarTransformPipeline.SetGrammarPtr(g, ast);
            return g;
        }