4 import MCC.IR.DebugItem;
7 * A generic command-line interface for 6.035 compilers. This class
8 * provides command-line parsing for student projects. It recognizes
9 * the required <tt>-target</tt>, <tt>-debug</tt>, <tt>-opt</tt>, and
10 * <tt>-o</tt> switches, and generates a name for input and output
13 * @author le01, 6.035 Staff (<tt>6.035-staff@mit.edu</tt>)
14 * @version <tt>$Id: CLI.java,v 1.10 2004/07/27 05:42:30 bdemsky Exp $</tt>
18 * Array indicating which optimizations should be performed. If
19 * a particular element is true, it indicates that the optimization
20 * named in the optnames[] parameter to parse with the same index
21 * should be performed.
23 public boolean opts[];
26 * Vector of String containing the command-line arguments which could
27 * not otherwise be parsed.
32 * Vector of String containing the optimizations which could not be
33 * parsed. It is okay to complain about anything in this list, even
34 * without the <tt>-debug</tt> flag.
36 public Vector extraopts;
39 * Name of the file to put the output in.
41 public String outfile;
44 * Name of the file to get input from. This is null if the user didn't
45 * provide a file name.
50 * The debug flag. This is true if <tt>-debug</tt> was passed on
51 * the command line, requesting debugging output.
61 * Public constructor. Sets up default values for all of the
62 * result fields. Specifically, sets the input and output files
63 * to null, the target to DEFAULT, and the extras and extraopts
64 * arrays to new empty Vectors.
69 extras = new Vector();
70 extraopts = new Vector();
75 * Parse the command-line arguments. Sets all of the result fields
78 * <li><TT>-target <I>target</I></TT> sets the CLI.target field based
79 * on the <I>target</I> specified. </li>
80 * <li><TT>scan</TT> or <TT>scanner</TT> specifies CLI.SCAN</li>
81 * <li><TT>parse</TT> specifies CLI.PARSE</li>
82 * <li><TT>inter</TT> specifies CLI.INTER</li>
83 * <li><TT>lowir</TT> specifies CLI.LOWIR</li>
84 * <TT>assembly</TT> or <TT>codegen</TT> specifies CLI.ASSEMBLY</li>
86 * The boolean array opts[] indicates which, if any, of the
87 * optimizations in optnames[] should be performed; these arrays
88 * are in the same order.
90 * @param args Array of arguments passed in to the program's Main
92 * @param optnames Ordered array of recognized optimization names. */
93 public void parse(String args[]) {
95 String optnames[] = {};
99 opts = new boolean[optnames.length];
101 if (args.length==0) {
102 System.out.println("-debugcompiler -- print out debug messages");
103 System.out.println("-depth depthnum constraintnum -- generate dependency graph from constraintnum with depth of depthnum");
104 System.out.println("-depthconj depthnum constraintnum conjunctionnum -- generate dependency graph from constraintnum with depth of depthnum");
105 System.out.println("-instrument -- generate instrumentation code");
106 System.out.println("-aggressivesearch");
107 System.out.println("-prunequantifiernodes");
111 for (int i = 0; i < args.length; i++) {
112 if (args[i].equals("-debugcompiler")) {
115 } else if (args[i].equals("-checkonly")) {
116 Compiler.REPAIR=false;
117 } else if (args[i].equals("-depth")) {
118 Compiler.debuggraphs.add(new DebugItem(Integer.parseInt(args[i+1]),Integer.parseInt(args[i+2])));
120 } else if (args[i].equals("-depthconj")) {
121 Compiler.debuggraphs.add(new DebugItem(Integer.parseInt(args[i+1]),Integer.parseInt(args[i+2]),Integer.parseInt(args[i+3])));
123 } else if (args[i].equals("-debug")) {
124 Compiler.GENERATEDEBUGHOOKS=true;
125 } else if (args[i].equals("-instrument")) {
126 Compiler.GENERATEINSTRUMENT=true;
127 } else if (args[i].equals("-aggressivesearch")) {
128 Compiler.AGGRESSIVESEARCH=true;
129 } else if (args[i].equals("-prunequantifiernodes")) {
130 Compiler.PRUNEQUANTIFIERS=true;
131 } else if (args[i].equals("-verbose") || args[i].equals("-v")) {
134 } else if (args[i].equals("-opt"))
136 else if (args[i].equals("-o"))
138 else if (context == 1) {
140 for (int j = 0; j < optnames.length; j++) {
141 if (args[i].equals("all") ||
142 (args[i].equals(optnames[j]))) {
146 if (args[i].equals("-" + optnames[j])) {
152 extraopts.addElement(args[i]);
153 } else if (context == 2) {
158 for (int j = 0; j < optnames.length; j++) {
159 if (args[i].equals("-" + optnames[j])) {
165 extras.addElement(args[i]);
170 // grab infile and lose extra args
172 while (infile == null && i < extras.size()) {
173 String fn = (String) extras.elementAt(i);
175 if (fn.charAt(0) != '-')
178 extras.removeElementAt(i);