KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > java_cup > JavaCUPTask


1 package java_cup;
2
3 import org.apache.tools.ant.BuildException;
4 import org.apache.tools.ant.Task;
5 import java.util.Vector JavaDoc;
6 import java.io.File JavaDoc;
7 import java.io.FileInputStream JavaDoc;
8 import java.io.InputStream JavaDoc;
9 import java.io.IOException JavaDoc;
10
11 /**
12  * <code>JavaCUPTask</code> is an <a
13  * HREF="http://jakarta.apache.org/ant/">ANT</a> task to invoke <a
14  * HREF="http://www.cs.princeton.edu/~appel/modern/java/CUP/">JavaCUP</a>.
15  *
16  * Not all options are exposed yet.
17  *
18  * @author jhyde
19  * @since 7 February, 2002
20  * @version $Id$
21  *
22  * <hr/>
23  *
24  * <h2><a name="javacup">JavaCup</a></h2>
25  * <h3>Description</h3>
26  * <p>
27  * Invokes the <a HREF="http://www.cs.princeton.edu/~appel/modern/java/CUP/" target="_top">CUP
28  * Parser Generator for Java</a> on a grammar file.
29  * </p>
30  * <p>
31  * This task only invokes JavaCUP if the grammar file is newer than the
32  * generated Java files.
33  * </p>
34  *
35  * <h3>Parameters</h3>
36  * <table border="1" cellpadding="2" cellspacing="0">
37  * <tr>
38  * <td valign="top"><b>Attribute</b></td>
39  * <td valign="top"><b>Description</b></td>
40  * <td align="center" valign="top"><b>Required</b></td>
41  * </tr>
42  * <tr>
43  * <td valign="top"><a name="input">input</a></td>
44  * <td valign="top">The name of the file from which to read the JavaCUP
45  * specification.</td>
46  * <td valign="top" align="center">Yes</td>
47  * </tr>
48  * <tr>
49  * <td valign="top"><a name="srcdir">srcdir</a></td>
50  * <td valign="top">The name of the root folder of the java class hierarchy.
51  * Default is the current folder.</td>
52  * <td valign="top" align="center">No</td>
53  * </tr>
54  * <tr>
55  * <td valign="top"><a name="package">package</a></td>
56  * <td valign="top">The name of the package generated classes go in. If not
57  * specified, this is deduced from the path of <code> input</code>, relative
58  * to <code>srcdir</code>.</td>
59  * <td valign="top" align="center">No</td>
60  * </tr>
61  * <tr>
62  * <td valign="top"><a name="parserClass">parserClass</a></td>
63  * <td valign="top">The full name of the parser class.
64  * If not specified, the class is derived from the input file: for example,
65  * if <code>input</code> is &quot;src/com/foo/MyParser.cup&quot;, and <code>srcdir</code>
66  * is &quot;src&quot;, the class will be &quot;com.foo.MyParser&quot;.</td>
67  * <td valign="top" align="center">No</td>
68  * </tr>
69  * <tr>
70  * <td valign="top"><a name="symbolsClass">symbolsClass</a></td>
71  * <td valign="top">The name of the class which holds the symbols constants. If not specified, this is the
72  * parser class name with "Sym" appended, for example &quot;com.foo.MyParserSym&quot;.</td>
73  * <td valign="top" align="center">No</td>
74  * </tr>
75  * <tr>
76  * <td valign="top"><a name="interface">interface</a></td>
77  * <td valign="top">If true, emit the symbol constant <i>interface</i>, rather
78  * than class.</td>
79  * <td valign="top" align="center">No</td>
80  * </tr>
81  * <tr>
82  * <td valign="top"><a name="nonterms">nonterms</a></td>
83  * <td valign="top">If true, put non-terminals in symbol constant class.</td>
84  * <td valign="top" align="center">No</td>
85  * </tr>
86  * <tr>
87  * <td valign="top"><a name="expect">expect</a></td>
88  * <td valign="top"><b>Number of conflicts expected/allowed.
89  * Default is 0.</td>
90  * <td valign="top" align="center">No</td>
91  * </tr>
92  * <tr>
93  * <td valign="top"><a name="compactRed">compactRed</a></td>
94  * <td valign="top">If true, compact tables by defaulting to most frequent reduce.</td>
95  * <td valign="top" align="center">No</td>
96  * </tr>
97  * <tr>
98  * <td valign="top"><a name="warn">warn</a></td>
99  * <td valign="top">If true, warn about useless productions, etc. Default is
100  * true.</td>
101  * <td valign="top" align="center">No</td>
102  * </tr>
103  * <tr>
104  * <td valign="top"><a name="summary">summary</a></td>
105  * <td valign="top">If true, print a summary of parser states, etc. Default is
106  * true.</td>
107  * <td valign="top" align="center">No</td>
108  * </tr>
109  * <tr>
110  * <td valign="top"><a name="progress">progress</a></td>
111  * <td valign="top">If true, print messages to indicate progress of the system.
112  * Default is false.</td>
113  * <td valign="top" align="center">No</td>
114  * </tr>
115  * <tr>
116  * <td valign="top"><a name="time">time</a></td>
117  * <td valign="top">If true, print time usage summary.</td>
118  * <td valign="top" align="center">No</td>
119  * </tr>
120  * <tr>
121  * <td valign="top"><a name="dumpGrammar">dumpGrammar</a></td>
122  * <td valign="top">If true, produce a dump of the symbols and grammar. Default
123  * is false.</td>
124  * <td valign="top" align="center">No</td>
125  * </tr>
126  * <tr>
127  * <td valign="top"><a name="dumpStates">dumpStates</a></td>
128  * <td valign="top">If true, produce a dump of the parse state machine. Default
129  * is false.</td>
130  * <td valign="top" align="center">No</td>
131  * </tr>
132  * <tr>
133  * <td valign="top"><a name="dumpTables">dumpTables</a></td>
134  * <td valign="top">If true, produce a dump of the parse tables. Default is
135  * false.</td>
136  * <td valign="top" align="center">No</td>
137  * </tr>
138  * <tr>
139  * <td valign="top"><a name="dump">dump</a></td>
140  * <td valign="top">If true, switch on <code>dumpGrammar</code>, <code>dumpStates</code>,
141  * and <code>dumpTables</code>. Default is false.</td>
142  * <td valign="top" align="center">No</td>
143  * </tr>
144  * <tr>
145  * <td valign="top"><a name="debug">debug</a></td>
146  * <td valign="top">If true, turn on debugging messages within JavaCUP. Default
147  * is false.</td>
148  * <td valign="top" align="center">No</td>
149  * </tr>
150  * <tr>
151  * <td valign="top"><a name="positions">positions</a></td>
152  * <td valign="top">If true, generate positions code. Default is true.</td>
153  * <td valign="top" align="center">No</td>
154  * </tr>
155  * <tr>
156  * <td valign="top"><a name="scanner">scanner</a></td>
157  * <td valign="top">If false, don't refer to <code> java_cup.runtime.Scanner</code> in the parser
158  * (for compatibility with old runtimes). Default is true.</td>
159  * <td valign="top" align="center">No</td>
160  * </tr>
161  * <tr>
162  * <td valign="top"><a name="version">version</a></td>
163  * <td valign="top">If true, print version information for JavaCUP and halt.</td>
164  * <td valign="top" align="center">No</td>
165  * </tr>
166  * </table>
167  *
168  * <h3>Example</h3>
169  * <blockquote><pre>&lt;javacup
170  * input=&quot;src/com/foo/Parser.cup&quot;
171  * warn=&quot;false&quot;
172  * summary=&quot;false&quot;/&gt;</pre></blockquote>
173  * <p>
174  * This invokes JavaCUP on grammar file src/com/foo/Parser.cup, generating
175  * src/com/foo/Parser.java and src/com/foo/ParserSym.java.
176  * </p>
177  *
178  * <hr/>
179  **/

180 public class JavaCUPTask extends Task {
181
182     String JavaDoc parserClass;
183     String JavaDoc symbolsClass;
184     String JavaDoc inputFileName;
185     File JavaDoc srcDir = new File JavaDoc(System.getProperty("user.dir"));
186     boolean newer = true;
187     Vector JavaDoc argVector = new Vector JavaDoc();
188
189     public void execute() throws BuildException {
190         try {
191             String JavaDoc[] args = getArgs();
192             Main.main(args, inputFileName);
193         } catch (IOException JavaDoc e) {
194             throw new BuildException(e.toString());
195         } catch (internal_error e) {
196             throw new BuildException(e.toString());
197         } catch (Exception JavaDoc e) {
198             throw new BuildException(e.toString());
199         }
200     }
201
202     private String JavaDoc[] getArgs()
203     {
204         if (parserClass == null) {
205             parserClass = Main.fileNameToClass(relativeFileName(inputFileName));
206         }
207         String JavaDoc packageName, className;
208         int lastDot = parserClass.lastIndexOf(".");
209         if (lastDot < 0) {
210             packageName = null;
211             className = parserClass;
212         } else {
213             packageName = parserClass.substring(0, lastDot);
214             className = parserClass.substring(lastDot + 1);
215         }
216         if (packageName != null) {
217             argVector.addElement("-package");
218             argVector.addElement(packageName);
219         }
220         argVector.addElement("-parser");
221         argVector.addElement(className);
222         if (symbolsClass == null) {
223             symbolsClass = className + "Sym";
224         }
225         argVector.addElement("-symbols");
226         argVector.addElement(symbolsClass);
227         if (inputFileName == null) {
228             throw new BuildException("You must specify inputFile.");
229         }
230         if (newer) {
231             argVector.addElement("-newer");
232         }
233         String JavaDoc[] args = new String JavaDoc[argVector.size()];
234         argVector.copyInto(args);
235         return args;
236     }
237
238     /** See parameter <code><a HREF="#parserClass">parserClass</a></code>. **/
239     public void setParserClass(String JavaDoc parserClass) {
240         this.parserClass = parserClass;
241     }
242
243     /** See parameter <code><a HREF="#symbolsClass">symbolsClass</a></code>. **/
244     public void setSymbolsClass(String JavaDoc symbolsClass) {
245         this.symbolsClass = symbolsClass;
246     }
247
248     /** See parameter <code><a HREF="#dump">dump</a></code>. **/
249     public void setDump(boolean dump) {
250         if (dump) {
251             argVector.addElement("-dump");
252         }
253     }
254
255     /** See parameter <code><a HREF="#dumpGrammar">dumpGrammar</a></code>. **/
256     public void setDumpGrammar(boolean dumpGrammar) {
257         if (dumpGrammar) {
258             argVector.addElement("-dump_grammar");
259         }
260     }
261
262     /** See parameter <code><a HREF="#dumpStates">dumpStates</a></code>. **/
263     public void setDumpStates(boolean dumpStates) {
264         if (dumpStates) {
265             argVector.addElement("-dump_states");
266         }
267     }
268
269     /** See parameter <code><a HREF="#dumpTables">dumpTables</a></code>. **/
270     public void setDumpTables(boolean dumpTables) {
271         if (dumpTables) {
272             argVector.addElement("-dump_tables");
273         }
274     }
275
276     /** See parameter <code><a HREF="#nonterms">nonterms</a></code>. **/
277     public void setNonterms(boolean nonterms) {
278         if (nonterms) {
279             argVector.addElement("-nonterms");
280         }
281     }
282
283     /** See parameter <code><a HREF="#expect">expect</a></code>. **/
284     public void setExpect(int expect) {
285         argVector.addElement("-expect");
286         argVector.addElement(expect + "");
287     }
288
289     /** See parameter <code><a HREF="#compactRed">compactRed</a></code>. **/
290     public void setCompactRed(boolean compactRed) {
291         if (compactRed) {
292             argVector.addElement("-compact_red");
293         }
294     }
295
296     /** See parameter <code><a HREF="#warn">warn</a></code>. **/
297     public void setWarn(boolean warn) {
298         if (!warn) {
299             argVector.addElement("-nowarn");
300         }
301     }
302
303     /** See parameter <code><a HREF="#summary">summary</a></code>. **/
304     public void setSummary(boolean summary) {
305         if (!summary) {
306             argVector.addElement("-nosummary");
307         }
308     }
309
310     /** See parameter <code><a HREF="#positions">positions</a></code>. **/
311     public void setPositions(boolean positions) {
312         if (positions) {
313             argVector.addElement("-positions");
314         }
315     }
316
317     /** See parameter <code><a HREF="#scanner">scanner</a></code>. **/
318     public void setScanner(boolean scanner) {
319         if (!scanner) {
320             argVector.addElement("-noscanner");
321         }
322     }
323
324     /** See parameter <code><a HREF="#progress">progress</a></code>. **/
325     public void setProgress(boolean progress) {
326         if (progress) {
327             argVector.addElement("-progress");
328         }
329     }
330
331     /** See parameter <code><a HREF="#time">time</a></code>. **/
332     public void setTime(boolean time) {
333         if (time) {
334             argVector.addElement("-time");
335         }
336     }
337
338     /** See parameter <code><a HREF="#debug">debug</a></code>. **/
339     public void setDebug(boolean debug) {
340         if (debug) {
341             argVector.addElement("-debug");
342         }
343     }
344
345     /** See parameter <code><a HREF="#version">version</a></code>. **/
346     public void setVersion(boolean version) {
347         if (version) {
348             argVector.addElement("-version");
349         }
350     }
351
352     /** See parameter <code><a HREF="#newer">newer</a></code>. **/
353     public void setNewer(boolean newer) {
354         this.newer = newer;
355     }
356
357     /** See parameter <code><a HREF="#interface">interface</a></code>. **/
358     public void setInterface(boolean _interface) {
359         if (_interface) {
360             argVector.addElement("-interface");
361         }
362     }
363
364     /** See parameter <code><a HREF="#input">input</a></code>. **/
365     public void setInput(File JavaDoc inputFile) {
366         inputFileName = inputFile.toString();
367     }
368
369     /** See parameter <code><a HREF="#srcdir">srcdir</a></code>. **/
370     public void setSrcDir(File JavaDoc srcDir) {
371         this.srcDir = srcDir;
372         argVector.addElement("-srcdir");
373         argVector.addElement(srcDir.toString());
374     }
375
376     /**
377      * Makes a filename relative, by subtracting off the current directory, if
378      * possible.
379      **/

380     String JavaDoc relativeFileName(String JavaDoc fileName)
381     {
382         char fileSep = System.getProperty("file.separator").charAt(0); // e.g. '/'
383
String JavaDoc srcDirName = srcDir.toString() + fileSep; // e.g. 'E:/foo/'
384
if (fileName.toUpperCase().startsWith(srcDirName.toUpperCase())) {
385             fileName = fileName.substring(srcDirName.length());
386         }
387         return fileName;
388     }
389 }
390
391
392 // End JavaCUPTask.java
393
Popular Tags