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