/** To process a grammar, we load all of its imported grammars into subordinate grammar objects. Then we merge the imported rules into the root grammar. If a root grammar is a combined grammar, we have to extract the implicit lexer. Once all this is done, we process the lexer first, if present, and then the parser grammar */ public virtual void Process(Grammar g, bool gencode) { g.LoadImportedGrammars(); GrammarTransformPipeline transform = new GrammarTransformPipeline(g, this); transform.Process(); LexerGrammar lexerg; GrammarRootAST lexerAST; if (g.ast != null && g.ast.grammarType == ANTLRParser.COMBINED && !g.ast.hasErrors) { lexerAST = transform.ExtractImplicitLexer(g); // alters g.ast if (lexerAST != null) { if (grammarOptions != null) { lexerAST.cmdLineOptions = grammarOptions; } lexerg = new LexerGrammar(this, lexerAST); lexerg.fileName = g.fileName; lexerg.originalGrammar = g; g.implicitLexer = lexerg; lexerg.implicitLexerOwner = g; int prevErrors = errMgr.GetNumErrors(); ProcessNonCombinedGrammar(lexerg, gencode); if (errMgr.GetNumErrors() > prevErrors) { return; } // System.out.println("lexer tokens="+lexerg.tokenNameToTypeMap); // System.out.println("lexer strings="+lexerg.stringLiteralToTypeMap); } } if (g.implicitLexer != null) g.ImportVocab(g.implicitLexer); // System.out.println("tokens="+g.tokenNameToTypeMap); // System.out.println("strings="+g.stringLiteralToTypeMap); ProcessNonCombinedGrammar(g, gencode); }