public LexerATNFactory(LexerGrammar g) { super(g); // use codegen to get correct language templates for lexer commands String language = g.getOptionString("language"); CodeGenerator gen = new CodeGenerator(g.tool, null, language); codegenTemplates = gen.getTemplates(); }
public ST generateBaseListener() { return generateBaseListener(false); } public ST generateBaseListener(boolean header) { return walk(createController().buildBaseListenerOutputModel(header), header); }
public ST generateBaseVisitor() { return generateBaseVisitor(false); } public ST generateBaseVisitor(boolean header) { return walk(createController().buildBaseVisitorOutputModel(header), header); }
public void writeVocabFile() { // write out the vocab interchange file; used by antlr, // does not change per target ST tokenVocabSerialization = getTokenVocabOutput(); String fileName = getVocabFileName(); if ( fileName!=null ) { getTarget().genFile(g, tokenVocabSerialization, fileName); } }
public void writeRecognizer(ST outputFileST, boolean header) { getTarget().genFile(g, outputFileST, getRecognizerFileName(header)); }
public void process() { if ( !CodeGenerator.targetExists(g.getOptionString("language")) ) return; CodeGenerator gen = new CodeGenerator(g); IntervalSet idTypes = new IntervalSet(); idTypes.add(ANTLRParser.ID); List<GrammarAST> idNodes = g.ast.getNodesWithType(idTypes); for (GrammarAST idNode : idNodes) { if ( gen.getTarget().grammarSymbolCausesIssueInGeneratedCode(idNode) ) { g.tool.errMgr.grammarError(ErrorType.USE_OF_BAD_WORD, g.fileName, idNode.getToken(), ST lexer = gen.generateLexer(); if (g.tool.errMgr.getNumErrors() == errorCount) { writeRecognizer(lexer, gen); ST parser = gen.generateParser(); if (g.tool.errMgr.getNumErrors() == errorCount) { writeRecognizer(parser, gen); ST listener = gen.generateListener(); if (g.tool.errMgr.getNumErrors() == errorCount) { gen.writeListener(listener); if (gen.getTarget().wantsBaseListener()) { ST baseListener = gen.generateBaseListener(); if (g.tool.errMgr.getNumErrors() == errorCount) { gen.writeBaseListener(baseListener);
if (generator.getTarget().needsHeader()) { files.add(getOutputFile(generator.getRecognizerFileName(true))); files.add(getOutputFile(generator.getRecognizerFileName(false))); files.add(getOutputFile(generator.getVocabFileName())); ST extST = generator.getTemplates().getInstanceOf("codeFileExtension"); if (generator.getTemplates().isDefined("headerFile")) { headerExtST = generator.getTemplates().getInstanceOf("headerFileExtension"); String suffix = Grammar.getGrammarTypeToFileNameSuffix(g.getType()); String fileName = g.name + suffix + headerExtST.render(); if (generator.getTarget().needsHeader()) { files.add(getOutputFile(generator.getListenerFileName(true))); files.add(getOutputFile(generator.getListenerFileName(false))); if (generator.getTarget().needsHeader()) { files.add(getOutputFile(generator.getBaseListenerFileName(true))); files.add(getOutputFile(generator.getBaseListenerFileName(false))); if (generator.getTarget().needsHeader()) { files.add(getOutputFile(generator.getVisitorFileName(true))); files.add(getOutputFile(generator.getVisitorFileName(false))); if (generator.getTarget().needsHeader()) {
CodeGenerator cgen = new CodeGenerator(g); IntervalSet idTypes = new IntervalSet(); idTypes.add(ANTLRParser.ID); .filter(idNode -> cgen.getTarget() .grammarSymbolCausesIssueInGeneratedCode(idNode)) .forEach(idNode -> g.tool.errMgr.grammarError(ErrorType.USE_OF_BAD_WORD, lexer = cgen.generateLexer(); } else { parser = cgen.generateParser(); listener = cgen.generateListener(); if (cgen.getTarget().wantsBaseListener()) { baseListener = cgen.generateBaseListener(); visitor = cgen.generateVisitor(); if (cgen.getTarget().wantsBaseVisitor()) { baseVisitor = cgen.generateBaseVisitor(); CodeGenerator lgcg = new CodeGenerator(lg); lexer = lgcg.generateLexer();
public String getRecognizerFileName(boolean header) { Target target = getTarget(); if (target == null) { throw new UnsupportedOperationException("Cannot generate code without a target."); } return target.getRecognizerFileName(header); }
public String getRecognizerFileName() { return getRecognizerFileName(false); } public String getListenerFileName() { return getListenerFileName(false); }
public BuildDependencyGenerator(Tool tool, Grammar g) { this.tool = tool; this.g = g; String language = g.getOptionString("language"); generator = new CodeGenerator(tool, g, language); }
public LexerATNFactory(LexerGrammar g) { super(g); // use codegen to get correct language templates for lexer commands String language = g.getOptionString("language"); CodeGenerator gen = new CodeGenerator(g.tool, null, language); Target target = gen.getTarget(); codegenTemplates = target != null ? target.getTemplates() : null; }
public void writeHeaderFile() { String fileName = getHeaderFileName(); if ( fileName==null ) return; if ( getTemplates().isDefined("headerFile") ) { ST extST = getTemplates().getInstanceOf("headerFileExtension"); ST headerFileST = null; // TODO: don't hide this header file generation here! getTarget().genRecognizerHeaderFile(g, headerFileST, extST.render(lineWidth)); } }
public void writeBaseListener(ST outputFileST, boolean header) { Target target = getTarget(); if (target == null) { throw new UnsupportedOperationException("Cannot generate code without a target."); } target.genFile(g, outputFileST, getBaseListenerFileName(header)); }
public boolean isGrammarStale() { String qualFileName = grammarFile.getPath(); String sourcePath = ConfigANTLRPerGrammar.getParentDir(grammarFile); sourcePath = ConfigANTLRPerGrammar.getProp(project, qualFileName, ConfigANTLRPerGrammar.PROP_LIB_DIR, sourcePath); String fullyQualifiedInputFileName = sourcePath+File.separator+grammarFile.getName(); ANTLRv4PluginController controller = ANTLRv4PluginController.getInstance(project); final PreviewState previewState = controller.getPreviewState(grammarFile); Grammar g = previewState.getMainGrammar(); // Grammar should be updated in the preview state before calling this function if ( g==null ) { return false; } String language = g.getOptionString(ConfigANTLRPerGrammar.PROP_LANGUAGE); CodeGenerator generator = new CodeGenerator(null, g, language); String recognizerFileName = generator.getRecognizerFileName(); VirtualFile contentRoot = ConfigANTLRPerGrammar.getContentRoot(project, grammarFile); String package_ = ConfigANTLRPerGrammar.getProp(project, qualFileName, ConfigANTLRPerGrammar.PROP_PACKAGE, MISSING); String outputDirName = ConfigANTLRPerGrammar.getOutputDirName(project, qualFileName, contentRoot, package_); String fullyQualifiedOutputFileName = outputDirName+File.separator+recognizerFileName; File inF = new File(fullyQualifiedInputFileName); File outF = new File(fullyQualifiedOutputFileName); boolean stale = inF.lastModified()>outF.lastModified(); LOG.info((!stale ? "not" : "") + "stale: " + fullyQualifiedInputFileName + " -> " + fullyQualifiedOutputFileName); return stale; }
@Override public void run(@NotNull ProgressIndicator indicator) { indicator.setIndeterminate(true); String qualFileName = grammarFile.getPath(); boolean autogen = ConfigANTLRPerGrammar.getBooleanProp(project, qualFileName, ConfigANTLRPerGrammar.PROP_AUTO_GEN, false); // System.out.println("autogen is "+autogen+", force="+forceGeneration); if ( forceGeneration || (autogen && isGrammarStale()) ) { antlr(grammarFile); } else { ANTLRv4PluginController controller = ANTLRv4PluginController.getInstance(project); final PreviewState previewState = controller.getPreviewState(grammarFile); // is lexer file? gen .tokens file no matter what as tokens might have changed; // a parser that feeds off of that file will need to see the changes. if ( previewState.g==null && previewState.lg!=null) { Grammar g = previewState.lg; String language = g.getOptionString(ConfigANTLRPerGrammar.PROP_LANGUAGE); Tool tool = ParsingUtils.createANTLRToolForLoadingGrammars(); CodeGenerator gen = new CodeGenerator(tool, g, language); gen.writeVocabFile(); } } }
public ST generateParser() { return generateParser(false); } public ST generateParser(boolean header) { return walk(createController().buildParserOutputModel(header), header); }
public ST generateListener() { return generateListener(false); } public ST generateListener(boolean header) { return walk(createController().buildListenerOutputModel(header), header); }
public ST generateLexer() { return generateLexer(false); } public ST generateLexer(boolean header) { return walk(createController().buildLexerOutputModel(header), header); }
public ST generateVisitor() { return generateVisitor(false); } public ST generateVisitor(boolean header) { return walk(createController().buildVisitorOutputModel(header), header); }