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