1
3 package jminusminus;
4
5 import java.io.FileInputStream;
6 import java.io.FileNotFoundException;
7
8
34
35 public class JavaCCMain {
36
37
38 private static boolean errorHasOccurred;
39
40
43
44 public static void main(String args[]) {
45 String caller = "java jminusminus.JavaCCMain";
46 String sourceFile = "";
47 String debugOption = "";
48 String outputDir = ".";
49 boolean spimOutput = false;
50 String registerAllocation = "";
51 errorHasOccurred = false;
52 for (int i = 0; i < args.length; i++) {
53 if (args[i].equals("javaccj--")) {
54 caller = "javaccj--";
55 } else if (args[i].endsWith(".java")) {
56 sourceFile = args[i];
57 } else if (args[i].equals("-t") || args[i].equals("-p")
58 || args[i].equals("-pa") || args[i].equals("-a")) {
59 debugOption = args[i];
60 } else if (args[i].endsWith("-d") && (i + 1) < args.length) {
61 outputDir = args[++i];
62 } else if (args[i].endsWith("-s") && (i + 1) < args.length) {
63 spimOutput = true;
64 registerAllocation = args[++i];
65 if (!registerAllocation.equals("naive")
66 && !registerAllocation.equals("linear")
67 && !registerAllocation.equals("graph")
68 || registerAllocation.equals("")) {
69 printUsage(caller);
70 return;
71 }
72 } else if (args[i].endsWith("-r") && (i + 1) < args.length) {
73 NPhysicalRegister.MAX_COUNT = Math.min(18, Integer
74 .parseInt(args[++i]));
75 NPhysicalRegister.MAX_COUNT = Math.max(1,
76 NPhysicalRegister.MAX_COUNT);
77 } else {
78 printUsage(caller);
79 return;
80 }
81 }
82 if (sourceFile.equals("")) {
83 printUsage(caller);
84 return;
85 }
86
87 JavaCCParserTokenManager javaCCScanner = null;
88 try {
89 javaCCScanner = new JavaCCParserTokenManager(new SimpleCharStream(
90 new FileInputStream(sourceFile), 1, 1));
91 } catch (FileNotFoundException e) {
92 System.err.println("Error: file " + sourceFile + " not found.");
93 }
94
95 if (debugOption.equals("-t")) {
96 Token token;
98 do {
99 token = javaCCScanner.getNextToken();
100 if (token.kind == JavaCCParserConstants.ERROR) {
101 System.err.printf(
102 "%s:%d: Unidentified input token: '%s'\n",
103 sourceFile, token.beginLine, token.image);
104 errorHasOccurred |= true;
105 } else {
106 System.out.printf("%d\t : %s = %s\n", token.beginLine,
107 JavaCCParserConstants.tokenImage[token.kind],
108 token.image);
109 }
110 } while (token.kind != JavaCCParserConstants.EOF);
111 return;
112 }
113
114 JCompilationUnit ast = null;
116 JavaCCParser javaCCParser = new JavaCCParser(javaCCScanner);
117 javaCCParser.fileName(sourceFile);
118 try {
119 ast = javaCCParser.compilationUnit();
120 errorHasOccurred |= javaCCParser.errorHasOccurred();
121 } catch (ParseException e) {
122 System.err.println(e.getMessage());
123 }
124 if (debugOption.equals("-p")) {
125 ast.writeToStdOut(new PrettyPrinter());
126 return;
127 }
128 if (errorHasOccurred) {
129 return;
130 }
131
132 ast.preAnalyze();
134 errorHasOccurred |= JAST.compilationUnit.errorHasOccurred();
135 if (debugOption.equals("-pa")) {
136 ast.writeToStdOut(new PrettyPrinter());
137 return;
138 }
139 if (errorHasOccurred) {
140 return;
141 }
142
143 ast.analyze(null);
145 errorHasOccurred |= JAST.compilationUnit.errorHasOccurred();
146 if (debugOption.equals("-a")) {
147 ast.writeToStdOut(new PrettyPrinter());
148 return;
149 }
150
151 CLEmitter clEmitter = new CLEmitter(!spimOutput);
153 clEmitter.destinationDir(outputDir);
154 ast.codegen(clEmitter);
155 errorHasOccurred |= clEmitter.errorHasOccurred();
156 if (errorHasOccurred) {
157 return;
158 }
159
160 if (spimOutput) {
164 NEmitter nEmitter = new NEmitter(sourceFile, ast.clFiles(),
165 registerAllocation);
166 nEmitter.destinationDir(outputDir);
167 nEmitter.write();
168 errorHasOccurred |= nEmitter.errorHasOccurred();
169 }
170 }
171
172
177
178 public static boolean errorHasOccurred() {
179 return errorHasOccurred;
180 }
181
182
188
189 private static void printUsage(String caller) {
190 String usage = "Usage: "
191 + caller
192 + " <options> <source file>\n"
193 + "where possible options include:\n"
194 + " -t Only tokenize input and print tokens to STDOUT\n"
195 + " -p Only parse input and print AST to STDOUT\n"
196 + " -pa Only parse and pre-analyze input and print "
197 + "AST to STDOUT\n"
198 + " -a Only parse, pre-analyze, and analyze input "
199 + "and print AST to STDOUT\n"
200 + " -s <naive|linear|graph> Generate SPIM code\n"
201 + " -r <num> Max. physical registers (1-18) available for allocation; default = 8\n"
202 + " -d <dir> Specify where to place output files; default = .";
203 System.out.println(usage);
204 }
205
206 }
207