1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2010 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr; 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.analysis.*; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.codegen.CodeGenerator; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.misc.Graph; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.misc.Stats; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.*; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.STGroup; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.*; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.*; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The main ANTLR entry point. Read a grammar and generate a parser. */ 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class Tool { 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public final Properties antlrSettings = new Properties(); 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String VERSION = "3.4"; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //public static final String VERSION = "${project.version}"; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final String UNINITIALIZED_DIR = "<unset-dir>"; 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private List<String> grammarFileNames = new ArrayList<String>(); 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean generate_NFA_dot = false; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean generate_DFA_dot = false; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private String outputDirectory = "."; 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean haveOutputDir = false; 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private String inputDirectory = null; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private String parentGrammarDirectory; 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private String grammarOutputDirectory; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean haveInputDir = false; 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private String libDirectory = "."; 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean debug = false; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean trace = false; 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean profile = false; 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean report = false; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean printGrammar = false; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean depend = false; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean forceAllFilesToOutputDir = false; 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean forceRelativeOutput = false; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected boolean deleteTempLexer = true; 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean verbose = false; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Don't process grammar file if generated files are newer than grammar */ 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean make = false; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private boolean showBanner = true; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static boolean exitNow = false; 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static boolean return_dont_exit = false; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String forcedLanguageOption; // -language L on command line 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The internal options are for my use on the command line during dev 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static boolean internalOption_PrintGrammarTree = false; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static boolean internalOption_PrintDFA = false; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static boolean internalOption_ShowNFAConfigsInDFA = false; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static boolean internalOption_watchNFAConversion = false; 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A list of dependency generators that are accumulated aaaas (and if) the 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * tool is required to sort the provided grammars into build dependency order. 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected Map<String, BuildDependencyGenerator> buildDependencyGenerators; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void main(String[] args) { 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool antlr = new Tool(args); 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!exitNow) { 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr.process(); 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( return_dont_exit ) return; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ErrorManager.getNumErrors() > 0) { 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.exit(1); 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.exit(0); 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Load the properties file org/antlr/antlr.properties and populate any 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * variables that must be initialized from it, such as the version of ANTLR. 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private void loadResources() { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver InputStream in = null; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver in = this.getClass().getResourceAsStream("antlr.properties"); 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If we found the resource, then load it, otherwise revert to the 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // defaults. 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (in != null) { 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Load the resources into the map 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlrSettings.load(in); 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Set any variables that we need to populate from the resources 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// VERSION = antlrSettings.getProperty("antlr.version"); 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } catch (Exception e) { 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Do nothing, just leave the defaults in place 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public Tool() { 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver loadResources(); 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public Tool(String[] args) { 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver loadResources(); 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Set all the options and pick up all the named grammar files 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver processArgs(args); 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void processArgs(String[] args) { 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isVerbose()) { 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.info("ANTLR Parser Generator Version " + VERSION); 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver showBanner = false; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (args == null || args.length == 0) { 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver help(); 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < args.length; i++) { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (args[i].equals("-o") || args[i].equals("-fo")) { 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing output directory with -fo/-o option; ignoring"); 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (args[i].equals("-fo")) { // force output into dir 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setForceAllFilesToOutputDir(true); 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDirectory = args[i]; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (outputDirectory.endsWith("/") || 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDirectory.endsWith("\\")) { 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDirectory = 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDirectory.substring(0, getOutputDirectory().length() - 1); 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File outDir = new File(outputDirectory); 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver haveOutputDir = true; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (outDir.exists() && !outDir.isDirectory()) { 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_OUTPUT_DIR_IS_FILE, outputDirectory); 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setLibDirectory("."); 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-lib")) { 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing library directory with -lib option; ignoring"); 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setLibDirectory(args[i]); 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (getLibraryDirectory().endsWith("/") || 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getLibraryDirectory().endsWith("\\")) { 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setLibDirectory(getLibraryDirectory().substring(0, getLibraryDirectory().length() - 1)); 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File outDir = new File(getLibraryDirectory()); 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!outDir.exists()) { 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_DIR_NOT_FOUND, getLibraryDirectory()); 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setLibDirectory("."); 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-language")) { 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing language name; ignoring"); 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver forcedLanguageOption = args[i]; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-nfa")) { 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setGenerate_NFA_dot(true); 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-dfa")) { 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setGenerate_DFA_dot(true); 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-debug")) { 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setDebug(true); 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-trace")) { 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setTrace(true); 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-report")) { 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setReport(true); 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-profile")) { 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setProfile(true); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-print")) { 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setPrintGrammar(true); 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-depend")) { 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setDepend(true); 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-verbose")) { 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setVerbose(true); 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-version")) { 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver version(); 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exitNow = true; 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-make")) { 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setMake(true); 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-message-format")) { 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing output format with -message-format option; using default"); 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.setFormat(args[i]); 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xgrtree")) { 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internalOption_PrintGrammarTree = true; // print grammar tree 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xdfa")) { 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internalOption_PrintDFA = true; 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xnoprune")) { 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFAOptimizer.PRUNE_EBNF_EXIT_BRANCHES = false; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xnocollapse")) { 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFAOptimizer.COLLAPSE_ALL_PARALLEL_EDGES = false; 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xdbgconversion")) { 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NFAToDFAConverter.debug = true; 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xmultithreaded")) { 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NFAToDFAConverter.SINGLE_THREADED_NFA_CONVERSION = false; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xnomergestopstates")) { 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFAOptimizer.MERGE_STOP_STATES = false; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xdfaverbose")) { 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internalOption_ShowNFAConfigsInDFA = true; 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xwatchconversion")) { 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internalOption_watchNFAConversion = true; 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-XdbgST")) { 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.LAUNCH_ST_INSPECTOR = true; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver STGroup.trackCreationEvents = true; 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return_dont_exit = true; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xmaxinlinedfastates")) { 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing max inline dfa states -Xmaxinlinedfastates option; ignoring"); 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE = Integer.parseInt(args[i]); 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xmaxswitchcaselabels")) { 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing max switch case labels -Xmaxswitchcaselabels option; ignoring"); 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MAX_SWITCH_CASE_LABELS = Integer.parseInt(args[i]); 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xminswitchalts")) { 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing min switch alternatives -Xminswitchalts option; ignoring"); 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MIN_SWITCH_ALTS = Integer.parseInt(args[i]); 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xm")) { 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing max recursion with -Xm option; ignoring"); 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NFAContext.MAX_SAME_RULE_INVOCATIONS_PER_NFA_CONFIG_STACK = Integer.parseInt(args[i]); 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xmaxdfaedges")) { 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing max number of edges with -Xmaxdfaedges option; ignoring"); 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFA.MAX_STATE_TRANSITIONS_FOR_TABLE = Integer.parseInt(args[i]); 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xconversiontimeout")) { 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i + 1 >= args.length) { 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("missing max time in ms -Xconversiontimeout option; ignoring"); 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFA.MAX_TIME_PER_DFA_CREATION = Integer.parseInt(args[i]); 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xnfastates")) { 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DecisionProbe.verbose = true; 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-Xsavelexer")) { 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver deleteTempLexer = false; 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args[i].equals("-X")) { 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Xhelp(); 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (args[i].charAt(0) != '-') { 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Must be the grammar file 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver addGrammarFile(args[i]); 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void checkForInvalidArguments(String[] args, BitSet cmdLineArgValid) { 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // check for invalid command line args 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int a = 0; a < args.length; a++) { 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!cmdLineArgValid.member(a)) { 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("invalid command-line argument: " + args[a] + "; ignored"); 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Checks to see if the list of outputFiles all exist, and have 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * last-modified timestamps which are later than the last-modified 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * timestamp of all the grammar files involved in build the output 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (imports must be checked). If these conditions hold, the method 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * returns false, otherwise, it returns true. 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param grammarFileName The grammar file we are checking 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean buildRequired(String grammarFileName) 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throws IOException 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BuildDependencyGenerator bd = 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new BuildDependencyGenerator(this, grammarFileName); 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List<File> outputFiles = bd.getGeneratedFileList(); 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List<File> inputFiles = bd.getDependenciesFileList(); 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Note that input directory must be set to use buildRequired 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File grammarFile; 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (haveInputDir) { 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarFile = new File(inputDirectory, grammarFileName); 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarFile = new File(grammarFileName); 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver long grammarLastModified = grammarFile.lastModified(); 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (File outputFile : outputFiles) { 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!outputFile.exists() || grammarLastModified > outputFile.lastModified()) { 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // One of the output files does not exist or is out of date, so we must build it 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Check all of the imported grammars and see if any of these are younger 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // than any of the output files. 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (inputFiles != null) { 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (File inputFile : inputFiles) { 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (inputFile.lastModified() > outputFile.lastModified()) { 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // One of the imported grammar files has been updated so we must build 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isVerbose()) { 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("Grammar " + grammarFile + " is up to date - build skipped"); 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return false; 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void process() { 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean exceptionWhenWritingLexerFile = false; 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String lexerGrammarFileName = null; // necessary at this scope to have access in the catch below 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Have to be tricky here when Maven or build tools call in and must new Tool() 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // before setting options. The banner won't display that way! 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isVerbose() && showBanner) { 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.info("ANTLR Parser Generator Version " + VERSION); 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver showBanner = false; 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sortGrammarFiles(); // update grammarFileNames 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (Exception e) { 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR,e); 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (Error e) { 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, e); 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (String grammarFileName : grammarFileNames) { 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If we are in make mode (to support build tools like Maven) and the 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // file is already up to date, then we do not build it (and in verbose mode 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we will say so). 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (make) { 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !buildRequired(grammarFileName) ) continue; 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (Exception e) { 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR,e); 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isVerbose() && !isDepend()) { 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(grammarFileName); 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isDepend()) { 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BuildDependencyGenerator dep = 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new BuildDependencyGenerator(this, grammarFileName); 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List outputFiles = dep.getGeneratedFileList(); 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List dependents = dep.getDependenciesFileList(); 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("output: "+outputFiles); 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("dependents: "+dependents); 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(dep.getDependencies().render()); 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar rootGrammar = getRootGrammar(grammarFileName); 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we now have all grammars read in as ASTs 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // (i.e., root and all delegates) 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rootGrammar.composite.assignTokenTypes(); 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //rootGrammar.composite.translateLeftRecursiveRules(); 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rootGrammar.addRulesForSyntacticPredicates(); 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rootGrammar.composite.defineGrammarSymbols(); 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rootGrammar.composite.createNFAs(); 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generateRecognizer(rootGrammar); 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isPrintGrammar()) { 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rootGrammar.printGrammar(System.out); 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isReport()) { 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver GrammarReport2 greport = new GrammarReport2(rootGrammar); 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.print(greport.toString()); 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// GrammarReport greport = new GrammarReport(rootGrammar); 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// System.out.println(greport.toString()); 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// // print out a backtracking report too (that is not encoded into log) 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// System.out.println(greport.getBacktrackingReport()); 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isProfile()) { 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver GrammarReport greport = new GrammarReport(rootGrammar); 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Stats.writeReport(GrammarReport.GRAMMAR_STATS_FILENAME, 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver greport.toNotifyString()); 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // now handle the lexer if one was created for a merged spec 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String lexerGrammarStr = rootGrammar.getLexerGrammar(); 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("lexer rootGrammar:\n"+lexerGrammarStr); 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (rootGrammar.type == Grammar.COMBINED && lexerGrammarStr != null) { 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammarFileName = rootGrammar.getImplicitlyGeneratedLexerFileName(); 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Writer w = getOutputFile(rootGrammar, lexerGrammarFileName); 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver w.write(lexerGrammarStr); 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver w.close(); 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (IOException e) { 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // emit different error message when creating the implicit lexer fails 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // due to write permission error 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exceptionWhenWritingLexerFile = true; 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw e; 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringReader sr = new StringReader(lexerGrammarStr); 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar lexerGrammar = new Grammar(this); 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.composite.watchNFAConversion = internalOption_watchNFAConversion; 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.implicitLexer = true; 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //lexerGrammar.setTool(this); 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File lexerGrammarFullFile = 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new File(getFileDirectory(lexerGrammarFileName), lexerGrammarFileName); 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.setFileName(lexerGrammarFullFile.toString()); 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.importTokenVocabulary(rootGrammar); 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.parseAndBuildAST(sr); 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sr.close(); 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.composite.assignTokenTypes(); 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.addRulesForSyntacticPredicates(); 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.composite.defineGrammarSymbols(); 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerGrammar.composite.createNFAs(); 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generateRecognizer(lexerGrammar); 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally { 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // make sure we clean up 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (deleteTempLexer) { 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File outputDir = getOutputDirectory(lexerGrammarFileName); 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File outputFile = new File(outputDir, lexerGrammarFileName); 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputFile.delete(); 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (IOException e) { 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (exceptionWhenWritingLexerFile) { 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_CANNOT_WRITE_FILE, e); 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_CANNOT_OPEN_FILE, 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarFileName); 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (Exception e) { 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, grammarFileName, e); 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally { 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("creates="+ Interval.creates); 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("hits="+ Interval.hits); 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("misses="+ Interval.misses); 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("outOfRange="+ Interval.outOfRange); 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void sortGrammarFiles() throws IOException { 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("Grammar names "+getGrammarFileNames()); 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Graph g = new Graph(); 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List<String> missingFiles = new ArrayList<String>(); 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (String gfile : grammarFileNames) { 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver GrammarSpelunker grammar = new GrammarSpelunker(inputDirectory, gfile); 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar.parse(); 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String vocabName = grammar.getTokenVocab(); 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammarName = grammar.getGrammarName(); 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Make all grammars depend on any tokenVocab options 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( vocabName!=null ) g.addEdge(gfile, vocabName+CodeGenerator.VOCAB_FILE_EXTENSION); 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Make all generated tokens files depend on their grammars 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver g.addEdge(grammarName+CodeGenerator.VOCAB_FILE_EXTENSION, gfile); 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (FileNotFoundException fnfe) { 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_CANNOT_OPEN_FILE, gfile); 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver missingFiles.add(gfile); 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List<Object> sorted = g.sort(); 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("sorted="+sorted); 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarFileNames.clear(); // wipe so we can give new ordered list 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < sorted.size(); i++) { 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String f = (String)sorted.get(i); 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( missingFiles.contains(f) ) continue; 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !(f.endsWith(".g") || f.endsWith(".g3")) ) continue; 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarFileNames.add(f); 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("new grammars="+grammarFileNames); 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Get a grammar mentioned on the command-line and any delegates */ 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public Grammar getRootGrammar(String grammarFileName) 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throws IOException 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //ST.setLintMode(true); 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // grammars mentioned on command line are either roots or single grammars. 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // create the necessary composite in case it's got delegates; even 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // single grammar needs it to get token types. 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CompositeGrammar composite = new CompositeGrammar(); 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar grammar = new Grammar(this, grammarFileName, composite); 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver composite.setDelegationRoot(grammar); 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FileReader fr = null; 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File f = null; 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (haveInputDir) { 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver f = new File(inputDirectory, grammarFileName); 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver f = new File(grammarFileName); 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Store the location of this grammar as if we import files, we can then 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // search for imports in the same location as the original grammar as well as in 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the lib directory. 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parentGrammarDirectory = f.getParent(); 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (grammarFileName.lastIndexOf(File.separatorChar) == -1) { 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarOutputDirectory = "."; 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarOutputDirectory = grammarFileName.substring(0, grammarFileName.lastIndexOf(File.separatorChar)); 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fr = new FileReader(f); 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BufferedReader br = new BufferedReader(fr); 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar.parseAndBuildAST(br); 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver composite.watchNFAConversion = internalOption_watchNFAConversion; 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver br.close(); 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fr.close(); 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return grammar; 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Create NFA, DFA and generate code for grammar. 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Create NFA for any delegates first. Once all NFA are created, 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * it's ok to create DFA, which must check for left-recursion. That check 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is done by walking the full NFA, which therefore must be complete. 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * After all NFA, comes DFA conversion for root grammar then code gen for 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * root grammar. DFA and code gen for delegates comes next. 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void generateRecognizer(Grammar grammar) { 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String language = (String) grammar.getOption("language"); 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (language != null) { 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator = new CodeGenerator(this, grammar, language); 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar.setCodeGenerator(generator); 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.setDebug(isDebug()); 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.setProfile(isProfile()); 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.setTrace(isTrace()); 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // generate NFA early in case of crash later (for debugging) 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isGenerate_NFA_dot()) { 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generateNFAs(grammar); 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // GENERATE CODE 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.genRecognizer(); 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isGenerate_DFA_dot()) { 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generateDFAs(grammar); 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List<Grammar> delegates = grammar.getDirectDelegates(); 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; delegates != null && i < delegates.size(); i++) { 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar delegate = (Grammar) delegates.get(i); 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delegate != grammar) { // already processing this one 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generateRecognizer(delegate); 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void generateDFAs(Grammar g) { 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int d = 1; d <= g.getNumberOfDecisions(); d++) { 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFA dfa = g.getLookaheadDFA(d); 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (dfa == null) { 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; // not there for some reason, ignore 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DOTGenerator dotGenerator = new DOTGenerator(g); 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String dot = dotGenerator.getDOT(dfa.startState); 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String dotFileName = g.name + "." + "dec-" + d; 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (g.implicitLexer) { 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotFileName = g.name + Grammar.grammarTypeToFileNameSuffix[g.type] + "." + "dec-" + d; 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver writeDOTFile(g, dotFileName, dot); 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } catch (IOException ioe) { 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_CANNOT_GEN_DOT_FILE, 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotFileName, 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ioe); 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void generateNFAs(Grammar g) { 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DOTGenerator dotGenerator = new DOTGenerator(g); 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Collection rules = g.getAllImportedRules(); 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rules.addAll(g.getRules()); 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (Iterator itr = rules.iterator(); itr.hasNext();) { 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Rule r = (Rule) itr.next(); 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String dot = dotGenerator.getDOT(r.startState); 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (dot != null) { 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver writeDOTFile(g, r, dot); 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } catch (IOException ioe) { 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_CANNOT_WRITE_FILE, ioe); 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void writeDOTFile(Grammar g, Rule r, String dot) throws IOException { 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver writeDOTFile(g, r.grammar.name + "." + r.name, dot); 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void writeDOTFile(Grammar g, String name, String dot) throws IOException { 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Writer fw = getOutputFile(g, name + ".dot"); 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fw.write(dot); 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fw.close(); 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static void version() { 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.info("ANTLR Parser Generator Version " + new Tool().VERSION); 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static void help() { 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.info("ANTLR Parser Generator Version " + new Tool().VERSION); 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("usage: java org.antlr.Tool [args] file.g [file2.g file3.g ...]"); 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -o outputDir specify output directory where all output is generated"); 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -fo outputDir same as -o but force even files with relative paths to dir"); 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -lib dir specify location of token files"); 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -depend generate file dependencies"); 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -report print out a report about the grammar(s) processed"); 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -print print out the grammar without actions"); 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -debug generate a parser that emits debugging events"); 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -profile generate a parser that computes profiling information"); 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -trace generate a recognizer that traces rule entry/exit"); 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -nfa generate an NFA for each rule"); 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -dfa generate a DFA for each decision point"); 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -message-format name specify output style for messages"); 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -verbose generate ANTLR version and other information"); 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -make only build if generated files older than grammar"); 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -version print the version of ANTLR and exit."); 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -language L override language grammar option; generate L"); 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -X display extended argument list"); 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static void Xhelp() { 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.info("ANTLR Parser Generator Version " + new Tool().VERSION); 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xgrtree print the grammar AST"); 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xdfa print DFA as text "); 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xnoprune test lookahead against EBNF block exit branches"); 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xnocollapse collapse incident edges into DFA states"); 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xdbgconversion dump lots of info during NFA conversion"); 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xconversiontimeout use to restrict NFA conversion exponentiality"); 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xmultithreaded run the analysis in 2 threads"); 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xnomergestopstates do not merge stop states"); 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xdfaverbose generate DFA states in DOT with NFA configs"); 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xwatchconversion print a message for each NFA before converting"); 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -XdbgST put tags at start/stop of all templates in output"); 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xnfastates for nondeterminisms, list NFA states for each path"); 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xm m max number of rule invocations during conversion [" + NFAContext.MAX_SAME_RULE_INVOCATIONS_PER_NFA_CONFIG_STACK + "]"); 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xmaxdfaedges m max \"comfortable\" number of edges for single DFA state [" + DFA.MAX_STATE_TRANSITIONS_FOR_TABLE + "]"); 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xmaxinlinedfastates m max DFA states before table used rather than inlining [" + CodeGenerator.MADSI_DEFAULT +"]"); 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xmaxswitchcaselabels m don't generate switch() statements for dfas bigger than m [" + CodeGenerator.MSCL_DEFAULT +"]"); 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xminswitchalts m don't generate switch() statements for dfas smaller than m [" + CodeGenerator.MSA_DEFAULT + "]"); 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(" -Xsavelexer don't delete temporary lexers generated from combined grammars"); 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Set the threshold of case labels beyond which ANTLR will not instruct the target template 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to generate switch() { case xxx: ... 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param maxSwitchCaseLabels Maximum number of case lables that ANTLR should allow the target code 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setMaxSwitchCaseLabels(int maxSwitchCaseLabels) { 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MAX_SWITCH_CASE_LABELS = maxSwitchCaseLabels; 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Set the threshold of the number alts, below which ANTLR will not instruct the target 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * template to use a switch statement. 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param minSwitchAlts the minimum number of alts required to use a switch staement 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setMinSwitchAlts(int minSwitchAlts) { 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MIN_SWITCH_ALTS = minSwitchAlts; 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Set the location (base directory) where output files should be produced 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * by the ANTLR tool. 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param outputDirectory 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setOutputDirectory(String outputDirectory) { 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver haveOutputDir = true; 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.outputDirectory = outputDirectory; 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Used by build tools to force the output files to always be 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * relative to the base output directory, even though the tool 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * had to set the output directory to an absolute path as it 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * cannot rely on the workign directory like command line invocation 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * can. 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param forceRelativeOutput true if output files hould always be relative to base output directory 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setForceRelativeOutput(boolean forceRelativeOutput) { 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.forceRelativeOutput = forceRelativeOutput; 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Set the base location of input files. Normally (when the tool is 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * invoked from the command line), the inputDirectory is not set, but 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for build tools such as Maven, we need to be able to locate the input 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * files relative to the base, as the working directory could be anywhere and 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * changing workig directories is not a valid concept for JVMs because of threading and 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so on. Setting the directory just means that the getFileDirectory() method will 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * try to open files relative to this input directory. 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param inputDirectory Input source base directory 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setInputDirectory(String inputDirectory) { 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.inputDirectory = inputDirectory; 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver haveInputDir = true; 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** This method is used by all code generators to create new output 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * files. If the outputDir set by -o is not present it will be created. 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The final filename is sensitive to the output directory and 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the directory where the grammar file was found. If -o is /tmp 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and the original grammar file was foo/t.g then output files 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * go in /tmp/foo. 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The output dir -o spec takes precedence if it's absolute. 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * E.g., if the grammar file dir is absolute the output dir is given 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * precendence. "-o /tmp /usr/lib/t.g" results in "/tmp/T.java" as 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * output (assuming t.g holds T.java). 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If no -o is specified, then just write to the directory where the 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar file was found. 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If outputDirectory==null then write a String. 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public Writer getOutputFile(Grammar g, String fileName) throws IOException { 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (getOutputDirectory() == null) { 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new StringWriter(); 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // output directory is a function of where the grammar file lives 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // for subdir/T.g, you get subdir here. Well, depends on -o etc... 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // But, if this is a .tokens file, then we force the output to 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // be the base output directory (or current directory if there is not a -o) 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File outputDir; 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (fileName.endsWith(CodeGenerator.VOCAB_FILE_EXTENSION)) { 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (haveOutputDir) { 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir = new File(getOutputDirectory()); 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir = new File("."); 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir = getOutputDirectory(g.getFileName()); 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File outputFile = new File(outputDir, fileName); 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!outputDir.exists()) { 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir.mkdirs(); 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FileWriter fw = new FileWriter(outputFile); 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new BufferedWriter(fw); 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return the location where ANTLR will generate output files for a given file. This is a 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * base directory and output files will be relative to here in some cases 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * such as when -o option is used and input files are given relative 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to the input directory. 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param fileNameWithPath path to input source 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public File getOutputDirectory(String fileNameWithPath) { 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File outputDir = new File(getOutputDirectory()); 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fileDirectory; 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Some files are given to us without a PATH but should should 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // still be written to the output directory in the relative path of 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the output directory. The file directory is either the set of sub directories 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // or just or the relative path recorded for the parent grammar. This means 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that when we write the tokens files, or the .java files for imported grammars 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // taht we will write them in the correct place. 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (fileNameWithPath.lastIndexOf(File.separatorChar) == -1) { 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No path is included in the file name, so make the file 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // directory the same as the parent grammar (which might sitll be just "" 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // but when it is not, we will write the file in the correct place. 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fileDirectory = grammarOutputDirectory; 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fileDirectory = fileNameWithPath.substring(0, fileNameWithPath.lastIndexOf(File.separatorChar)); 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (haveOutputDir) { 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // -o /tmp /var/lib/t.g => /tmp/T.java 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // -o subdir/output /usr/lib/t.g => subdir/output/T.java 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // -o . /usr/lib/t.g => ./T.java 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((fileDirectory != null && !forceRelativeOutput) && 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (new File(fileDirectory).isAbsolute() || 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fileDirectory.startsWith("~")) || // isAbsolute doesn't count this :( 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isForceAllFilesToOutputDir()) { 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // somebody set the dir, it takes precendence; write new file there 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir = new File(getOutputDirectory()); 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // -o /tmp subdir/t.g => /tmp/subdir/t.g 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (fileDirectory != null) { 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir = new File(getOutputDirectory(), fileDirectory); 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir = new File(getOutputDirectory()); 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // they didn't specify a -o dir so just write to location 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // where grammar is, absolute or relative, this will only happen 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // with command line invocation as build tools will always 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // supply an output directory. 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputDir = new File(fileDirectory); 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return outputDir; 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Name a file from the -lib dir. Imported grammars and .tokens files 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If we do not locate the file in the library directory, then we try 944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the location of the originating grammar. 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param fileName input name we are looking for 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return Path to file that we think shuold be the import file 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @throws java.io.IOException 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getLibraryFile(String fileName) throws IOException { 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // First, see if we can find the file in the library directory 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File f = new File(getLibraryDirectory() + File.separator + fileName); 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (f.exists()) { 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Found in the library directory 960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return f.getAbsolutePath(); 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Need to assume it is in the same location as the input file. Note that 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this is only relevant for external build tools and when the input grammar 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // was specified relative to the source directory (working directory if using 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the command line. 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return parentGrammarDirectory + File.separator + fileName; 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Return the directory containing the grammar file for this grammar. 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * normally this is a relative path from current directory. People will 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * often do "java org.antlr.Tool grammars/*.g3" So the file will be 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * "grammars/foo.g3" etc... This method returns "grammars". 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If we have been given a specific input directory as a base, then 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we must find the directory relative to this directory, unless the 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file name is given to us in absolute terms. 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getFileDirectory(String fileName) { 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File f; 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (haveInputDir && !fileName.startsWith(File.separator)) { 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver f = new File(inputDirectory, fileName); 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver f = new File(fileName); 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // And ask Java what the base directory of this location is 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return f.getParent(); 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Return a File descriptor for vocab file. Look in library or 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in -o output path. antlr -o foo T.g U.g where U needs T.tokens 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * won't work unless we look in foo too. If we do not find the 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file in the lib directory then must assume that the .tokens file 999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is going to be generated as part of this build and we have defined 1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * .tokens files so that they ALWAYS are generated in the base output 1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * directory, which means the current directory for the command line tool if there 1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * was no output directory specified. 1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public File getImportedVocabFile(String vocabName) { 1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File f = new File(getLibraryDirectory(), 1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File.separator + 1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver vocabName + 1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.VOCAB_FILE_EXTENSION); 1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (f.exists()) { 1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return f; 1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We did not find the vocab file in the lib directory, so we need 1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // to look for it in the output directory which is where .tokens 1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // files are generated (in the base, not relative to the input 1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // location.) 1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (haveOutputDir) { 1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver f = new File(getOutputDirectory(), vocabName + CodeGenerator.VOCAB_FILE_EXTENSION); 1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver f = new File(vocabName + CodeGenerator.VOCAB_FILE_EXTENSION); 1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return f; 1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** If the tool needs to panic/exit, how do we do that? 1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void panic() { 1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("ANTLR panic"); 1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Return a time stamp string accurate to sec: yyyy-mm-dd hh:mm:ss 1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static String getCurrentTimeStamp() { 1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver GregorianCalendar calendar = new java.util.GregorianCalendar(); 1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int y = calendar.get(Calendar.YEAR); 1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int m = calendar.get(Calendar.MONTH) + 1; // zero-based for months 1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int d = calendar.get(Calendar.DAY_OF_MONTH); 1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int h = calendar.get(Calendar.HOUR_OF_DAY); 1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int min = calendar.get(Calendar.MINUTE); 1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int sec = calendar.get(Calendar.SECOND); 1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String sy = String.valueOf(y); 1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String sm = m < 10 ? "0" + m : String.valueOf(m); 1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String sd = d < 10 ? "0" + d : String.valueOf(d); 1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String sh = h < 10 ? "0" + h : String.valueOf(h); 1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String smin = min < 10 ? "0" + min : String.valueOf(min); 1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String ssec = sec < 10 ? "0" + sec : String.valueOf(sec); 1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new StringBuffer().append(sy).append("-").append(sm).append("-").append(sd).append(" ").append(sh).append(":").append(smin).append(":").append(ssec).toString(); 1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Provide the List of all grammar file names that the ANTLR tool will 1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * process or has processed. 1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the grammarFileNames 1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public List<String> getGrammarFileNames() { 1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return grammarFileNames; 1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR has gnerated or will generate a description of 1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * all the NFAs in <a href="http://www.graphviz.org">Dot format</a> 1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the generate_NFA_dot 1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isGenerate_NFA_dot() { 1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return generate_NFA_dot; 1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR has generated or will generate a description of 1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * all the NFAs in <a href="http://www.graphviz.org">Dot format</a> 1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the generate_DFA_dot 1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isGenerate_DFA_dot() { 1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return generate_DFA_dot; 1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return the Path to the base output directory, where ANTLR 1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * will generate all the output files for the current language target as 1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * well as any ancillary files such as .tokens vocab files. 1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the output Directory 1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getOutputDirectory() { 1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return outputDirectory; 1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return the Path to the directory in which ANTLR will search for ancillary 1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * files such as .tokens vocab files and imported grammar files. 1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the lib Directory 1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getLibraryDirectory() { 1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return libDirectory; 1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate if ANTLR has generated, or will generate a debug version of the 1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognizer. Debug versions of a parser communicate with a debugger such 1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * as that contained in ANTLRWorks and at start up will 'hang' waiting for 1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a connection on an IP port (49100 by default). 1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the debug flag 1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isDebug() { 1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return debug; 1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR has generated, or will generate a version of the 1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognizer that prints trace messages on entry and exit of each rule. 1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the trace flag 1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isTrace() { 1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return trace; 1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR has generated or will generate a version of the 1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognizer that gathers statistics about its execution, which it prints when 1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * it terminates. 1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the profile 1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isProfile() { 1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return profile; 1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR has generated or will generate a report of various 1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * elements of the grammar analysis, once it it has finished analyzing a grammar 1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file. 1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the report flag 1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isReport() { 1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return report; 1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR has printed, or will print, a version of the input grammar 1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file(s) that is stripped of any action code embedded within. 1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the printGrammar flag 1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isPrintGrammar() { 1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return printGrammar; 1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR has supplied, or will supply, a list of all the things 1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that the input grammar depends upon and all the things that will be generated 1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * when that grammar is successfully analyzed. 1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the depend flag 1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isDepend() { 1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return depend; 1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR will force all files to the output directory, even 1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * if the input files have relative paths from the input directory. 1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the forceAllFilesToOutputDir flag 1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isForceAllFilesToOutputDir() { 1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return forceAllFilesToOutputDir; 1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR will be verbose when analyzing grammar files, such as 1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * displaying the names of the files it is generating and similar information. 1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the verbose flag 1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isVerbose() { 1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return verbose; 1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Provide the current setting of the conversion timeout on DFA creation. 1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return DFA creation timeout value in milliseconds 1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int getConversionTimeout() { 1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return DFA.MAX_TIME_PER_DFA_CREATION; 1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Returns the current setting of the message format descriptor 1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return Current message format 1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getMessageFormat() { 1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ErrorManager.getMessageFormat().toString(); 1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Returns the number of errors that the analysis/processing threw up. 1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return Error count 1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int getNumErrors() { 1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ErrorManager.getNumErrors(); 1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether the tool will analyze the dependencies of the provided grammar 1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file list and ensure that grammars with dependencies are built 1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * after any of the other gramamrs in the list that they are dependent on. Setting 1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this option also has the side effect that any grammars that are includes for other 1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammars in the list are excluded from individual analysis, which allows the caller 1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to invoke the tool via org.antlr.tool -make *.g and not worry about the inclusion 1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of grammars that are just includes for other grammars or what order the grammars 1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * appear on the command line. 1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This option was coded to make life easier for tool integration (such as Maven) but 1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * may also be useful at the command line. 1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return true if the tool is currently configured to analyze and sort grammar files. 1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean getMake() { 1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return make; 1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Set the message format to one of ANTLR, gnu, vs2005 1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param format 1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setMessageFormat(String format) { 1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.setFormat(format); 1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Provide the List of all grammar file names that the ANTLR tool should process. 1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param grammarFileNames The list of grammar files to process 1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setGrammarFileNames(List<String> grammarFileNames) { 1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.grammarFileNames = grammarFileNames; 1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void addGrammarFile(String grammarFileName) { 1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!grammarFileNames.contains(grammarFileName)) { 1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarFileNames.add(grammarFileName); 1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should generate a description of 1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * all the NFAs in <a href="http://www.graphviz.org">Dot format</a> 1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param generate_NFA_dot True to generate dot descriptions 1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setGenerate_NFA_dot(boolean generate_NFA_dot) { 1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.generate_NFA_dot = generate_NFA_dot; 1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR should generate a description of 1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * all the NFAs in <a href="http://www.graphviz.org">Dot format</a> 1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param generate_DFA_dot True to generate dot descriptions 1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setGenerate_DFA_dot(boolean generate_DFA_dot) { 1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.generate_DFA_dot = generate_DFA_dot; 1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Set the Path to the directory in which ANTLR will search for ancillary 1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * files such as .tokens vocab files and imported grammar files. 1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param libDirectory the libDirectory to set 1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setLibDirectory(String libDirectory) { 1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.libDirectory = libDirectory; 1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should generate a debug version of the 1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognizer. Debug versions of a parser communicate with a debugger such 1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * as that contained in ANTLRWorks and at start up will 'hang' waiting for 1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a connection on an IP port (49100 by default). 1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param debug true to generate a debug mode parser 1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setDebug(boolean debug) { 1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.debug = debug; 1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should generate a version of the 1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognizer that prints trace messages on entry and exit of each rule 1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param trace true to generate a tracing parser 1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setTrace(boolean trace) { 1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.trace = trace; 1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should generate a version of the 1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * recognizer that gathers statistics about its execution, which it prints when 1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * it terminates. 1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param profile true to generate a profiling parser 1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setProfile(boolean profile) { 1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.profile = profile; 1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should generate a report of various 1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * elements of the grammar analysis, once it it has finished analyzing a grammar 1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file. 1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param report true to generate the analysis report 1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setReport(boolean report) { 1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.report = report; 1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should print a version of the input grammar 1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file(s) that is stripped of any action code embedded within. 1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param printGrammar true to generate a stripped file 1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setPrintGrammar(boolean printGrammar) { 1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.printGrammar = printGrammar; 1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should supply a list of all the things 1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that the input grammar depends upon and all the things that will be generated 1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * when that gramamr is successfully analyzed. 1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param depend true to get depends set rather than process the grammar 1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setDepend(boolean depend) { 1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.depend = depend; 1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicates whether ANTLR will force all files to the output directory, even 1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * if the input files have relative paths from the input directory. 1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param forceAllFilesToOutputDir true to force files to output directory 1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setForceAllFilesToOutputDir(boolean forceAllFilesToOutputDir) { 1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.forceAllFilesToOutputDir = forceAllFilesToOutputDir; 1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether ANTLR should be verbose when analyzing grammar files, such as 1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * displaying the names of the files it is generating and similar information. 1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param verbose true to be verbose 1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setVerbose(boolean verbose) { 1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.verbose = verbose; 1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Indicate whether the tool should analyze the dependencies of the provided grammar 1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * file list and ensure that the grammars with dependencies are built 1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * after any of the other gramamrs in the list that they are dependent on. Setting 1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this option also has the side effect that any grammars that are includes for other 1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammars in the list are excluded from individual analysis, which allows the caller 1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to invoke the tool via org.antlr.tool -make *.g and not worry about the inclusion 1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of grammars that are just includes for other grammars or what order the grammars 1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * appear on the command line. 1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This option was coded to make life easier for tool integration (such as Maven) but 1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * may also be useful at the command line. 1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param make 1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setMake(boolean make) { 1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.make = make; 1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1391