New attribute outputfile for <jjtree>. PR: 21526 Submitted by: Jene Jasper <jjasper at abz dot nl> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274913 13f79535-47bb-0310-9956-ffa450edef68master
@@ -8,25 +8,25 @@ | |||||
<body> | <body> | ||||
<h2><a name="javacc">JavaCC</a></h2> | <h2><a name="javacc">JavaCC</a></h2> | ||||
<h3>Description</h3> | |||||
<h3>Description</h3> | |||||
<p> | <p> | ||||
Invokes the <a HREF="http://www.webgain.com/products/java_cc/" target="_top">JavaCC</a> compiler | |||||
Invokes the <a HREF="http://javacc.dev.java.net/" target="_top">JavaCC</a> compiler | |||||
compiler on a grammar file. | compiler on a grammar file. | ||||
</p> | </p> | ||||
<p> | <p> | ||||
To use the javacc task, set the <i>target</i> attribute to the name of the | |||||
grammar file to process. You also need to specify the directory containing | |||||
the JavaCC installation using the <i>javacchome</i> attribute, so that ant | |||||
can find the JavaCC classes. Optionally, you can also set the | |||||
To use the javacc task, set the <i>target</i> attribute to the name of the | |||||
grammar file to process. You also need to specify the directory containing | |||||
the JavaCC installation using the <i>javacchome</i> attribute, so that ant | |||||
can find the JavaCC classes. Optionally, you can also set the | |||||
<i>outputdirectory</i> to write the generated file to a specific directory. | <i>outputdirectory</i> to write the generated file to a specific directory. | ||||
Otherwise javacc writes the generated files to the directory containing | Otherwise javacc writes the generated files to the directory containing | ||||
the grammar file. | the grammar file. | ||||
</p> | </p> | ||||
<p> | <p> | ||||
This task only invokes JavaCC if the grammar file is newer than the generated | |||||
This task only invokes JavaCC if the grammar file is newer than the generated | |||||
Java files. javacc assumes that the Java class name of the generated parser | Java files. javacc assumes that the Java class name of the generated parser | ||||
is the same as the name of the grammar file, ignoring the .jj. | is the same as the name of the grammar file, ignoring the .jj. | ||||
If this is not the case, the javacc task will still work, but it will always | |||||
If this is not the case, the javacc task will still work, but it will always | |||||
generate the output files. | generate the output files. | ||||
</p> | </p> | ||||
@@ -115,6 +115,11 @@ | |||||
<td valign="top">Sets the JAVA_UNICODE_ESCAPE grammar option. This is a boolean option.</td> | <td valign="top">Sets the JAVA_UNICODE_ESCAPE grammar option. This is a boolean option.</td> | ||||
<td valign="top" align="center">No</td> | <td valign="top" align="center">No</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">keeplinecolumn</td> | |||||
<td valign="top">Sets the KEEP_LINE_COLUMN grammar option. This is a boolean option.</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | |||||
<tr> | <tr> | ||||
<td valign="top">lookahead</td> | <td valign="top">lookahead</td> | ||||
<td valign="top">Sets the LOOKAHEAD grammar option. This is an integer option.</td> | <td valign="top">Sets the LOOKAHEAD grammar option. This is an integer option.</td> | ||||
@@ -158,10 +163,10 @@ | |||||
</table> | </table> | ||||
<h3>Example</h3> | <h3>Example</h3> | ||||
<blockquote><pre> | <blockquote><pre> | ||||
<javacc | |||||
target="src/Parser.jj" | |||||
<javacc | |||||
target="src/Parser.jj" | |||||
outputdirectory="build/src" | outputdirectory="build/src" | ||||
javacchome="c:/program files/JavaCC" | |||||
javacchome="c:/program files/JavaCC" | |||||
static="true" | static="true" | ||||
/> | /> | ||||
</pre></blockquote> | </pre></blockquote> | ||||
@@ -172,7 +177,7 @@ | |||||
</p> | </p> | ||||
<hr> | <hr> | ||||
<p align="center">Copyright © 2000-2001 Apache Software Foundation. | |||||
<p align="center">Copyright © 2000-2001,2003 Apache Software Foundation. | |||||
All rights | All rights | ||||
Reserved.</p> | Reserved.</p> | ||||
@@ -0,0 +1,101 @@ | |||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> | |||||
<html> | |||||
<head> | |||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | |||||
<meta http-equiv="Content-Language" content="en-us"> | |||||
<title>JJDoc Task</title> | |||||
</head> | |||||
<body> | |||||
<h2> | |||||
<a NAME="jjtree"></a>JJDoc</h2> | |||||
<p><em>Since Ant 1.6</em></p> | |||||
<h3>Description</h3> | |||||
<p>Invokes the <a href="http://javacc.dev.java.net/">JJDoc</a> preprocessor | |||||
for the JavaCC compiler compiler. It takes a JavaCC parser specification | |||||
and produces documentation for the BNF grammar. | |||||
It can operate in three modes, determined by command line options. | |||||
<p>To use the jjdoc task, set the <i>target</i> attribute to the name | |||||
of the JavaCC grammar file to process. You also need to specify the directory | |||||
containing the JavaCC installation using the <i>javacchome</i> attribute, | |||||
so that ant can find the JavaCC classes. Optionally, you can also set the | |||||
<i>outputfile</i> to write the generated BNF documentation file to a specific (directory and) file. | |||||
Otherwise jjdoc writes the generated BNF documentation file as the JavaCC | |||||
grammar file with a suffix .txt or .html.</p> | |||||
<p>This task only invokes JJDoc if the grammar file is newer than the | |||||
generated BNF documentation file.</p> | |||||
<h3>Parameters</h3> | |||||
<table BORDER CELLSPACING=0 CELLPADDING=2 > | |||||
<tr> | |||||
<td VALIGN=TOP><b>Attribute</b></td> | |||||
<td VALIGN=TOP><b>Description</b></td> | |||||
<td ALIGN=CENTER VALIGN=TOP><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td VALIGN=TOP>target</td> | |||||
<td VALIGN=TOP>The javacc grammar file to process.</td> | |||||
<td ALIGN=CENTER VALIGN=TOP>Yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td VALIGN=TOP>javacchome</td> | |||||
<td VALIGN=TOP>The directory containing the JavaCC distribution.</td> | |||||
<td ALIGN=CENTER VALIGN=TOP>Yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td VALIGN=TOP>outputfile</td> | |||||
<td VALIGN=TOP>The file to write the generated BNF documentation file to. If not set, | |||||
the file is written with the same name as the JavaCC grammar file but with a the suffix .html or .txt. </td> | |||||
<td ALIGN=CENTER VALIGN=TOP>No</td> | |||||
</tr> | |||||
<tr> | |||||
<td VALIGN=TOP>text</td> | |||||
<td VALIGN=TOP>Sets the TEXT BNF documentation option. This is a boolean | |||||
option.</td> | |||||
<td ALIGN=CENTER VALIGN=TOP>No</td> | |||||
</tr> | |||||
<tr> | |||||
<td VALIGN=TOP>onetable</td> | |||||
<td VALIGN=TOP>Sets the ONE_TABLE BNF documentation option. This is a boolean option.</td> | |||||
<td ALIGN=CENTER VALIGN=TOP>No</td> | |||||
</tr> | |||||
</table> | |||||
<h3> | |||||
Example</h3> | |||||
<blockquote> | |||||
<pre><jjdoc | |||||
target="src/Parser.jj" | |||||
outputfile="doc/ParserBNF.html" | |||||
javacchome="c:/program files/JavaCC" | |||||
/></pre> | |||||
</blockquote> | |||||
This invokes JJDoc on grammar file src/Parser.jj, writing the generated | |||||
BNF documentation file, ParserBNF.html, file to doc. | |||||
<br> | |||||
<hr> | |||||
<p align="center">Copyright © 2003 Apache Software Foundation. All rights | |||||
Reserved.</p> | |||||
</body> | |||||
</html> | |||||
@@ -12,18 +12,21 @@ | |||||
<h3> | <h3> | ||||
Description</h3> | Description</h3> | ||||
Invokes the <a href="http://www.webgain.com/products/java_cc/">JJTree</a> preprocessor | |||||
<p>Invokes the <a href="http://javacc.dev.java.net/">JJTree</a> preprocessor | |||||
for the JavaCC compiler compiler. It inserts parse tree building actions | for the JavaCC compiler compiler. It inserts parse tree building actions | ||||
at various places in the JavaCC source that it generates. The output of | at various places in the JavaCC source that it generates. The output of | ||||
JJTree is run through JavaCC to create the parser. | JJTree is run through JavaCC to create the parser. | ||||
<p>To use the jjtree task, set the <i>target</i> attribute to the name | <p>To use the jjtree task, set the <i>target</i> attribute to the name | ||||
of the jjtree grammar file to process. You also need to specify the directory | |||||
of the JJTree grammar file to process. You also need to specify the directory | |||||
containing the JavaCC installation using the <i>javacchome</i> attribute, | containing the JavaCC installation using the <i>javacchome</i> attribute, | ||||
so that ant can find the JavaCC classes. Optionally, you can also set the | so that ant can find the JavaCC classes. Optionally, you can also set the | ||||
<i>outputdirectory</i> | <i>outputdirectory</i> | ||||
to write the generated file to a specific directory. Otherwise jjtree writes | |||||
the generated JavaCC grammar file to the directory containing the JJTree | |||||
grammar file.</p> | |||||
to write the generated JavaCC grammar and node files to a specific directory. | |||||
Otherwise jjtree writes the generated JavaCC grammar and node files to the directory | |||||
containing the JJTree grammar file. As an extra option, you can also set the | |||||
<i>outputfile</i> to write the generated JavaCC grammar file to a specific (directory and) file. | |||||
Otherwise jjtree writes the generated JavaCC grammar file as the JJTree | |||||
grammar file with a suffix .jj.</p> | |||||
<p>This task only invokes JJTree if the grammar file is newer than the | <p>This task only invokes JJTree if the grammar file is newer than the | ||||
generated JavaCC file.</p> | generated JavaCC file.</p> | ||||
@@ -57,8 +60,20 @@ generated JavaCC file.</p> | |||||
<tr> | <tr> | ||||
<td VALIGN=TOP>outputdirectory</td> | <td VALIGN=TOP>outputdirectory</td> | ||||
<td VALIGN=TOP>The directory to write the generated file to. If not set, | |||||
the files are written to the directory containing the grammar file. </td> | |||||
<td VALIGN=TOP>The directory to write the generated JavaCC grammar and node files to. | |||||
If not set, the files are written to the directory containing the grammar file. </td> | |||||
<td ALIGN=CENTER VALIGN=TOP>No</td> | |||||
</tr> | |||||
<tr> | |||||
<td VALIGN=TOP>outputfile</td> | |||||
<td VALIGN=TOP>The file to write the generated JavaCC grammar file | |||||
to. If not set, the file is written with the same name as the JJTree | |||||
grammar file but with a the suffix <code>.jj</code>. This is a | |||||
filename relative to <em>outputdirectory</em> if specified, the | |||||
project's basedir.</td> | |||||
<td ALIGN=CENTER VALIGN=TOP>No</td> | <td ALIGN=CENTER VALIGN=TOP>No</td> | ||||
</tr> | </tr> | ||||
@@ -173,7 +188,7 @@ grammar file, Parser.jj, file to build/src. The grammar option NODE_USES_PARSER | |||||
is set to true when invoking JJTree. | is set to true when invoking JJTree. | ||||
<br> | <br> | ||||
<hr> | <hr> | ||||
<p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | |||||
<p align="center">Copyright © 2001-2003 Apache Software Foundation. All rights | |||||
Reserved.</p> | Reserved.</p> | ||||
</body> | </body> | ||||
</html> | </html> | ||||
@@ -37,6 +37,7 @@ | |||||
<a href="OptionalTasks/javah.html">Javah</a><br> | <a href="OptionalTasks/javah.html">Javah</a><br> | ||||
<a href="OptionalTasks/jspc.html">JspC</a><br> | <a href="OptionalTasks/jspc.html">JspC</a><br> | ||||
<a href="OptionalTasks/jdepend.html">JDepend</a><br> | <a href="OptionalTasks/jdepend.html">JDepend</a><br> | ||||
<a href="OptionalTasks/jjdoc.html">JJDoc</a><br> | |||||
<a href="OptionalTasks/jjtree.html">JJTree</a><br> | <a href="OptionalTasks/jjtree.html">JJTree</a><br> | ||||
<a href="OptionalTasks/jlink.html"><i>Jlink</i></a><br> | <a href="OptionalTasks/jlink.html"><i>Jlink</i></a><br> | ||||
<a href="OptionalTasks/jpcoverage.html">JProbe Coverage</a><br> | <a href="OptionalTasks/jpcoverage.html">JProbe Coverage</a><br> | ||||
@@ -318,12 +318,12 @@ documentation.</p> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="OptionalTasks/stylebook.html">Stylebook</a></td> | <td nowrap><a href="OptionalTasks/stylebook.html">Stylebook</a></td> | ||||
<td><p>Executes the Apache Stylebook documentation generator. | |||||
<td><p>Executes the Apache Stylebook documentation generator. | |||||
Unlike the command-line version of this tool, all three arguments | Unlike the command-line version of this tool, all three arguments | ||||
are required to run the Stylebook task.</p></td> | are required to run the Stylebook task.</p></td> | ||||
</tr> | </tr> | ||||
</table> | </table> | ||||
<p></p> | <p></p> | ||||
<table width="100%" border="0" cellpadding="4" cellspacing="0"> | <table width="100%" border="0" cellpadding="4" cellspacing="0"> | ||||
<th align="left"> | <th align="left"> | ||||
@@ -748,7 +748,7 @@ documentation.</p> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="OptionalTasks/script.html">Script</a></td> | <td nowrap><a href="OptionalTasks/script.html">Script</a></td> | ||||
<td><p>Executes a script in a | |||||
<td><p>Executes a script in a | |||||
<a href="http://jakarta.apache.org/bsf/" | <a href="http://jakarta.apache.org/bsf/" | ||||
target="_top">Apache BSF</a>-supported language.</p></td> | target="_top">Apache BSF</a>-supported language.</p></td> | ||||
</tr> | </tr> | ||||
@@ -861,7 +861,7 @@ documentation.</p> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="OptionalTasks/javacc.html">JavaCC</a></td> | <td nowrap><a href="OptionalTasks/javacc.html">JavaCC</a></td> | ||||
<td><p>Invokes the | <td><p>Invokes the | ||||
<a HREF="http://www.webgain.com/products/java_cc/" target="_top"> | |||||
<a HREF="http://javacc.dev.java.net/" target="_top"> | |||||
JavaCC</a> compiler-compiler on a grammar file.</p></td> | JavaCC</a> compiler-compiler on a grammar file.</p></td> | ||||
</tr> | </tr> | ||||
@@ -870,9 +870,19 @@ documentation.</p> | |||||
<td><p>Generates JNI headers from a Java class.</p></td> | <td><p>Generates JNI headers from a Java class.</p></td> | ||||
</tr> | </tr> | ||||
<tr valign="top"> | |||||
<td nowrap><a href="OptionalTasks/jjdoc.html">JJDoc</a></td> | |||||
<td><p>Invokes the <a href="http://javacc.dev.java.net/"> | |||||
JJDoc</a> documentation generator for the JavaCC compiler-compiler. | |||||
JJDoc takes a JavaCC parser specification and produces documentation | |||||
for the BNF grammar. It can operate in three modes, determined by | |||||
command line options. This task only invokes JJDoc if the grammar file | |||||
is newer than the generated BNF grammar documentation.</p></td> | |||||
</tr> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="OptionalTasks/jjtree.html">JJTree</a></td> | <td nowrap><a href="OptionalTasks/jjtree.html">JJTree</a></td> | ||||
<td><p>Invokes the <a href="http://www.webgain.com/products/java_cc/"> | |||||
<td><p>Invokes the <a href="http://javacc.dev.java.net/"> | |||||
JJTree</a> preprocessor for the JavaCC compiler-compiler. It inserts | JJTree</a> preprocessor for the JavaCC compiler-compiler. It inserts | ||||
parse-tree building actions at various places in the JavaCC source that | parse-tree building actions at various places in the JavaCC source that | ||||
it generates. The output of JJTree is run through JavaCC to create the | it generates. The output of JJTree is run through JavaCC to create the | ||||
@@ -948,7 +958,7 @@ documentation.</p> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="CoreTasks/dirname.html">Dirname</a></td> | <td nowrap><a href="CoreTasks/dirname.html">Dirname</a></td> | ||||
<td><p>Sets a property to the value of the specified file up to, | <td><p>Sets a property to the value of the specified file up to, | ||||
but not including, the last path element. | |||||
but not including, the last path element. | |||||
</tr> | </tr> | ||||
<tr valign="top"> | <tr valign="top"> | ||||
@@ -1032,7 +1042,7 @@ documentation.</p> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="OptionalTasks/telnet.html">Telnet</a></td> | <td nowrap><a href="OptionalTasks/telnet.html">Telnet</a></td> | ||||
<td><p>Task to automate a remote <i>telnet</i> session. This task uses | |||||
<td><p>Task to automate a remote <i>telnet</i> session. This task uses | |||||
nested <code><read></code> and <code><write></code> tags | nested <code><read></code> and <code><write></code> tags | ||||
to indicate strings to wait for and specify text to send.</p></td> | to indicate strings to wait for and specify text to send.</p></td> | ||||
</tr> | </tr> | ||||
@@ -1042,7 +1052,7 @@ documentation.</p> | |||||
in the same JVM can have through-the-firewall access to remote web sites.</p></td> | in the same JVM can have through-the-firewall access to remote web sites.</p></td> | ||||
</tr> | </tr> | ||||
</table> | </table> | ||||
<p></p> | <p></p> | ||||
@@ -1083,8 +1093,8 @@ documentation.</p> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="CoreTasks/cvstagdiff.html">CvsTagDiff</a></td> | <td nowrap><a href="CoreTasks/cvstagdiff.html">CvsTagDiff</a></td> | ||||
<td><p>Generates an XML-formatted report file of the changes between | |||||
two tags or dates recorded in a <a href="http://www.cvshome.org/" | |||||
<td><p>Generates an XML-formatted report file of the changes between | |||||
two tags or dates recorded in a <a href="http://www.cvshome.org/" | |||||
target="_top">CVS</a> repository.</p></td> | target="_top">CVS</a> repository.</p></td> | ||||
</tr> | </tr> | ||||
@@ -1135,7 +1145,7 @@ documentation.</p> | |||||
<td><p>Tasks to perform the StarTeam <i>stcheckout</i>, <i>stcheckin</i>, | <td><p>Tasks to perform the StarTeam <i>stcheckout</i>, <i>stcheckin</i>, | ||||
<i>stlabel</i>, and <i>stlist</i> commands. The | <i>stlabel</i>, and <i>stlist</i> commands. The | ||||
<a href="OptionalTasks/starteam.html#starteam">Starteam</a> task | <a href="OptionalTasks/starteam.html#starteam">Starteam</a> task | ||||
is deprecated; use | |||||
is deprecated; use | |||||
<a href="OptionalTasks/starteam.html#stcheckout">STCheckout</a> | <a href="OptionalTasks/starteam.html#stcheckout">STCheckout</a> | ||||
instead.</p></td> | instead.</p></td> | ||||
</tr> | </tr> | ||||
@@ -103,6 +103,7 @@ cab=org.apache.tools.ant.taskdefs.optional.Cab | |||||
ftp=org.apache.tools.ant.taskdefs.optional.net.FTP | ftp=org.apache.tools.ant.taskdefs.optional.net.FTP | ||||
icontract=org.apache.tools.ant.taskdefs.optional.IContract | icontract=org.apache.tools.ant.taskdefs.optional.IContract | ||||
javacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCC | javacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCC | ||||
jjdoc=org.apache.tools.ant.taskdefs.optional.javacc.JJDoc | |||||
jjtree=org.apache.tools.ant.taskdefs.optional.javacc.JJTree | jjtree=org.apache.tools.ant.taskdefs.optional.javacc.JJTree | ||||
stcheckout=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout | stcheckout=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout | ||||
stcheckin=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckin | stcheckin=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckin | ||||
@@ -0,0 +1,242 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2003 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "Ant" and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs.optional.javacc; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.util.Enumeration; | |||||
import java.util.Hashtable; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.Task; | |||||
import org.apache.tools.ant.taskdefs.Execute; | |||||
import org.apache.tools.ant.taskdefs.LogStreamHandler; | |||||
import org.apache.tools.ant.types.Commandline; | |||||
import org.apache.tools.ant.types.CommandlineJava; | |||||
import org.apache.tools.ant.types.Path; | |||||
import org.apache.tools.ant.util.JavaEnvUtils; | |||||
/** | |||||
* Runs the JJDoc compiler compiler. | |||||
* | |||||
* @author Jene Jasper <a href="mailto:jjasper@abz.nl">jjasper@abz.nl</a> | |||||
* @author thomas.haas@softwired-inc.com | |||||
* @author Michael Saunders | |||||
* <a href="mailto:michael@amtec.com">michael@amtec.com</a> | |||||
*/ | |||||
public class JJDoc extends Task { | |||||
// keys to optional attributes | |||||
private static final String OUTPUT_FILE = "OUTPUT_FILE"; | |||||
private static final String TEXT = "TEXT"; | |||||
private static final String ONE_TABLE = "ONE_TABLE"; | |||||
private final Hashtable optionalAttrs = new Hashtable(); | |||||
private String outputFile = null; | |||||
private boolean plainText = false; | |||||
private static final String DEFAULT_SUFFIX_HTML = ".html"; | |||||
private static final String DEFAULT_SUFFIX_TEXT = ".txt"; | |||||
// required attributes | |||||
private File target = null; | |||||
private File javaccHome = null; | |||||
private CommandlineJava cmdl = new CommandlineJava(); | |||||
/** | |||||
* Sets the TEXT BNF documentation option. | |||||
*/ | |||||
public void setText(boolean plainText) { | |||||
optionalAttrs.put(TEXT, new Boolean(plainText)); | |||||
this.plainText = plainText; | |||||
} | |||||
/** | |||||
* Sets the ONE_TABLE documentation option. | |||||
*/ | |||||
public void setOnetable(boolean oneTable) { | |||||
optionalAttrs.put(ONE_TABLE, new Boolean(oneTable)); | |||||
} | |||||
/** | |||||
* The outputfile to write the generated BNF documentation file to. | |||||
* If not set, the file is written with the same name as | |||||
* the JavaCC grammar file with a suffix .html or .txt. | |||||
*/ | |||||
public void setOutputfile(String outputFile) { | |||||
this.outputFile = outputFile; | |||||
} | |||||
/** | |||||
* The javacc grammar file to process. | |||||
*/ | |||||
public void setTarget(File target) { | |||||
this.target = target; | |||||
} | |||||
/** | |||||
* The directory containing the JavaCC distribution. | |||||
*/ | |||||
public void setJavacchome(File javaccHome) { | |||||
this.javaccHome = javaccHome; | |||||
} | |||||
public JJDoc() { | |||||
cmdl.setVm(JavaEnvUtils.getJreExecutable("java")); | |||||
} | |||||
public void execute() throws BuildException { | |||||
// load command line with optional attributes | |||||
Enumeration iter = optionalAttrs.keys(); | |||||
while (iter.hasMoreElements()) { | |||||
String name = (String) iter.nextElement(); | |||||
Object value = optionalAttrs.get(name); | |||||
cmdl.createArgument() | |||||
.setValue("-" + name + ":" + value.toString()); | |||||
} | |||||
if (target == null || !target.isFile()) { | |||||
throw new BuildException("Invalid target: " + target); | |||||
} | |||||
if (outputFile != null) { | |||||
cmdl.createArgument() .setValue("-" + OUTPUT_FILE + ":" | |||||
+ outputFile.replace('\\', '/')); | |||||
} | |||||
// use the directory containing the target as the output directory | |||||
File javaFile = new File(createOutputFileName(target, outputFile, | |||||
plainText)); | |||||
if (javaFile.exists() | |||||
&& target.lastModified() < javaFile.lastModified()) { | |||||
log("Target is already built - skipping (" + target + ")", | |||||
Project.MSG_VERBOSE); | |||||
return; | |||||
} | |||||
cmdl.createArgument().setValue(target.getAbsolutePath()); | |||||
cmdl.setClassname(JavaCC.getMainClass(javaccHome, | |||||
JavaCC.TASKDEF_TYPE_JJDOC)); | |||||
final Path classpath = cmdl.createClasspath(getProject()); | |||||
final File javaccJar = JavaCC.getArchiveFile(javaccHome); | |||||
classpath.createPathElement().setPath(javaccJar.getAbsolutePath()); | |||||
classpath.addJavaRuntime(); | |||||
final Commandline.Argument arg = cmdl.createVmArgument(); | |||||
arg.setValue("-mx140M"); | |||||
arg.setValue("-Dinstall.root=" + javaccHome.getAbsolutePath()); | |||||
final Execute process = | |||||
new Execute(new LogStreamHandler(this, | |||||
Project.MSG_INFO, | |||||
Project.MSG_INFO), | |||||
null); | |||||
log(cmdl.describeCommand(), Project.MSG_VERBOSE); | |||||
process.setCommandline(cmdl.getCommandline()); | |||||
try { | |||||
if (process.execute() != 0) { | |||||
throw new BuildException("JJDoc failed."); | |||||
} | |||||
} catch (IOException e) { | |||||
throw new BuildException("Failed to launch JJDoc", e); | |||||
} | |||||
} | |||||
private String createOutputFileName(File target, String optionalOutputFile, | |||||
boolean plainText) { | |||||
String suffix = DEFAULT_SUFFIX_HTML; | |||||
String javaccFile = target.getAbsolutePath().replace('\\','/'); | |||||
if (plainText) { | |||||
suffix = DEFAULT_SUFFIX_TEXT; | |||||
} | |||||
if ((optionalOutputFile == null) || optionalOutputFile.equals("")) { | |||||
int filePos = javaccFile.lastIndexOf("/"); | |||||
if (filePos >= 0) { | |||||
javaccFile = javaccFile.substring(filePos + 1); | |||||
} | |||||
int suffixPos = javaccFile.lastIndexOf('.'); | |||||
if (suffixPos == -1) { | |||||
optionalOutputFile = javaccFile + suffix; | |||||
} else { | |||||
String currentSuffix = javaccFile.substring(suffixPos); | |||||
if (currentSuffix.equals(suffix)) { | |||||
optionalOutputFile = javaccFile + suffix; | |||||
} else { | |||||
optionalOutputFile = javaccFile.substring(0, suffixPos) | |||||
+ suffix; | |||||
} | |||||
} | |||||
} else { | |||||
optionalOutputFile = optionalOutputFile.replace('\\','/'); | |||||
} | |||||
return (getProject().getBaseDir() + "/" + optionalOutputFile) | |||||
.replace('\\', '/'); | |||||
} | |||||
} |
@@ -72,11 +72,13 @@ import org.apache.tools.ant.util.JavaEnvUtils; | |||||
* Runs the JJTree compiler compiler. | * Runs the JJTree compiler compiler. | ||||
* | * | ||||
* @author thomas.haas@softwired-inc.com | * @author thomas.haas@softwired-inc.com | ||||
* @author Michael Saunders <a href="mailto:michael@amtec.com">michael@amtec.com</a> | |||||
* @author Michael Saunders | |||||
* <a href="mailto:michael@amtec.com">michael@amtec.com</a> | |||||
*/ | */ | ||||
public class JJTree extends Task { | public class JJTree extends Task { | ||||
// keys to optional attributes | // keys to optional attributes | ||||
private static final String OUTPUT_FILE = "OUTPUT_FILE"; | |||||
private static final String BUILD_NODE_FILES = "BUILD_NODE_FILES"; | private static final String BUILD_NODE_FILES = "BUILD_NODE_FILES"; | ||||
private static final String MULTI = "MULTI"; | private static final String MULTI = "MULTI"; | ||||
private static final String NODE_DEFAULT_VOID = "NODE_DEFAULT_VOID"; | private static final String NODE_DEFAULT_VOID = "NODE_DEFAULT_VOID"; | ||||
@@ -92,6 +94,10 @@ public class JJTree extends Task { | |||||
private final Hashtable optionalAttrs = new Hashtable(); | private final Hashtable optionalAttrs = new Hashtable(); | ||||
private String outputFile = null; | |||||
private static final String DEFAULT_SUFFIX = ".jj"; | |||||
// required attributes | // required attributes | ||||
private File outputDirectory = null; | private File outputDirectory = null; | ||||
private File target = null; | private File target = null; | ||||
@@ -178,7 +184,7 @@ public class JJTree extends Task { | |||||
} | } | ||||
/** | /** | ||||
* The directory to write the generated file to. | |||||
* The directory to write the generated JavaCC grammar and node files to. | |||||
* If not set, the files are written to the directory | * If not set, the files are written to the directory | ||||
* containing the grammar file. | * containing the grammar file. | ||||
*/ | */ | ||||
@@ -186,6 +192,15 @@ public class JJTree extends Task { | |||||
this.outputDirectory = outputDirectory; | this.outputDirectory = outputDirectory; | ||||
} | } | ||||
/** | |||||
* The outputfile to write the generated JavaCC grammar file to. | |||||
* If not set, the file is written with the same name as | |||||
* the JJTree grammar file with a suffix .jj. | |||||
*/ | |||||
public void setOutputfile(String outputFile) { | |||||
this.outputFile = outputFile; | |||||
} | |||||
/** | /** | ||||
* The jjtree grammar file to process. | * The jjtree grammar file to process. | ||||
*/ | */ | ||||
@@ -217,32 +232,44 @@ public class JJTree extends Task { | |||||
if (target == null || !target.isFile()) { | if (target == null || !target.isFile()) { | ||||
throw new BuildException("Invalid target: " + target); | throw new BuildException("Invalid target: " + target); | ||||
} | } | ||||
if (outputFile != null) { | |||||
cmdl.createArgument().setValue("-" + OUTPUT_FILE + ":" | |||||
+ outputFile.replace('\\', '/')); | |||||
} | |||||
File javaFile = null; | |||||
// use the directory containing the target as the output directory | // use the directory containing the target as the output directory | ||||
if (outputDirectory == null) { | if (outputDirectory == null) { | ||||
outputDirectory = new File(target.getParent()); | |||||
} | |||||
if (!outputDirectory.isDirectory()) { | |||||
throw new BuildException("'outputdirectory' " + outputDirectory | |||||
+ " is not a directory."); | |||||
javaFile = new File(createOutputFileName(target, outputFile, | |||||
null)); | |||||
} else { | |||||
if (!outputDirectory.isDirectory()) { | |||||
throw new BuildException("'outputdirectory' " + outputDirectory | |||||
+ " is not a directory."); | |||||
} | |||||
// convert backslashes to slashes, otherwise jjtree will | |||||
// put this as comments and this seems to confuse javacc | |||||
cmdl.createArgument().setValue("-OUTPUT_DIRECTORY:" | |||||
+ outputDirectory.getAbsolutePath() | |||||
.replace('\\', '/')); | |||||
javaFile = new File(createOutputFileName(target, outputFile, | |||||
outputDirectory | |||||
.getPath())); | |||||
} | } | ||||
// convert backslashes to slashes, otherwise jjtree will put this as | |||||
// comments and this seems to confuse javacc | |||||
cmdl.createArgument().setValue("-OUTPUT_DIRECTORY:" | |||||
+ outputDirectory.getAbsolutePath().replace('\\', '/')); | |||||
String targetName = target.getName(); | |||||
final File javaFile = new File(outputDirectory, | |||||
targetName.substring(0, targetName.indexOf(".jjt")) + ".jj"); | |||||
if (javaFile.exists() | if (javaFile.exists() | ||||
&& target.lastModified() < javaFile.lastModified()) { | |||||
&& target.lastModified() < javaFile.lastModified()) { | |||||
log("Target is already built - skipping (" + target + ")", | log("Target is already built - skipping (" + target + ")", | ||||
Project.MSG_VERBOSE); | Project.MSG_VERBOSE); | ||||
return; | return; | ||||
} | } | ||||
cmdl.createArgument().setValue(target.getAbsolutePath()); | cmdl.createArgument().setValue(target.getAbsolutePath()); | ||||
cmdl.setClassname(JavaCC.getMainClass(javaccHome, | |||||
cmdl.setClassname(JavaCC.getMainClass(javaccHome, | |||||
JavaCC.TASKDEF_TYPE_JJTREE)); | JavaCC.TASKDEF_TYPE_JJTREE)); | ||||
final Path classpath = cmdl.createClasspath(getProject()); | final Path classpath = cmdl.createClasspath(getProject()); | ||||
@@ -270,4 +297,37 @@ public class JJTree extends Task { | |||||
throw new BuildException("Failed to launch JJTree", e); | throw new BuildException("Failed to launch JJTree", e); | ||||
} | } | ||||
} | } | ||||
private String createOutputFileName(File target, String optionalOutputFile, | |||||
String outputDirectory) { | |||||
String jjtreeFile = target.getAbsolutePath().replace('\\','/'); | |||||
if ((optionalOutputFile == null) || optionalOutputFile.equals("")) { | |||||
int filePos = jjtreeFile.lastIndexOf("/"); | |||||
if (filePos >= 0) { | |||||
jjtreeFile = jjtreeFile.substring(filePos + 1); | |||||
} | |||||
int suffixPos = jjtreeFile.lastIndexOf('.'); | |||||
if (suffixPos == -1) { | |||||
optionalOutputFile = jjtreeFile + DEFAULT_SUFFIX; | |||||
} else { | |||||
String currentSuffix = jjtreeFile.substring(suffixPos); | |||||
if (currentSuffix.equals(DEFAULT_SUFFIX)) { | |||||
optionalOutputFile = jjtreeFile + DEFAULT_SUFFIX; | |||||
} else { | |||||
optionalOutputFile = jjtreeFile.substring(0, suffixPos) | |||||
+ DEFAULT_SUFFIX; | |||||
} | |||||
} | |||||
} | |||||
if ((outputDirectory == null) || outputDirectory.equals("")) { | |||||
outputDirectory = getProject().getBaseDir().getAbsolutePath(); | |||||
} | |||||
return (outputDirectory + "/" + optionalOutputFile).replace('\\', '/'); | |||||
} | |||||
} | } |
@@ -98,6 +98,7 @@ public class JavaCC extends Task { | |||||
private static final String SANITY_CHECK = "SANITY_CHECK"; | private static final String SANITY_CHECK = "SANITY_CHECK"; | ||||
private static final String FORCE_LA_CHECK = "FORCE_LA_CHECK"; | private static final String FORCE_LA_CHECK = "FORCE_LA_CHECK"; | ||||
private static final String CACHE_TOKENS = "CACHE_TOKENS"; | private static final String CACHE_TOKENS = "CACHE_TOKENS"; | ||||
private static final String KEEP_LINE_COLUMN = "KEEP_LINE_COLUMN"; | |||||
private final Hashtable optionalAttrs = new Hashtable(); | private final Hashtable optionalAttrs = new Hashtable(); | ||||
@@ -113,18 +114,28 @@ public class JavaCC extends Task { | |||||
protected static final int TASKDEF_TYPE_JJDOC = 3; | protected static final int TASKDEF_TYPE_JJDOC = 3; | ||||
protected static final String[] ARCHIVE_LOCATIONS = | protected static final String[] ARCHIVE_LOCATIONS = | ||||
new String[] {"JavaCC.zip", "bin/lib/JavaCC.zip", | |||||
"bin/lib/javacc.jar", | |||||
"javacc.jar", // used by jpackage for JavaCC 3.x | |||||
new String[] { | |||||
"JavaCC.zip", | |||||
"bin/lib/JavaCC.zip", | |||||
"bin/lib/javacc.jar", | |||||
"javacc.jar", // used by jpackage for JavaCC 3.x | |||||
}; | }; | ||||
protected static final int[] ARCHIVE_LOCATIONS_VS_MAJOR_VERSION = | |||||
new int[] { | |||||
1, | |||||
2, | |||||
3, | |||||
3, | |||||
}; | |||||
protected static final String COM_PACKAGE = "COM.sun.labs."; | protected static final String COM_PACKAGE = "COM.sun.labs."; | ||||
protected static final String COM_JAVACC_CLASS = "javacc.Main"; | protected static final String COM_JAVACC_CLASS = "javacc.Main"; | ||||
protected static final String COM_JJTREE_CLASS = "jjtree.Main"; | protected static final String COM_JJTREE_CLASS = "jjtree.Main"; | ||||
protected static final String COM_JJDOC_CLASS = "jjdoc.JJDocMain"; | protected static final String COM_JJDOC_CLASS = "jjdoc.JJDocMain"; | ||||
protected static final String ORG_PACKAGE = "org.netbeans.javacc."; | |||||
protected static final String ORG_JAVACC_PACKAGE = "org.javacc."; | |||||
protected static final String ORG_PACKAGE_3_0 = "org.netbeans.javacc."; | |||||
protected static final String ORG_PACKAGE_3_1 = "org.javacc."; | |||||
protected static final String ORG_JAVACC_CLASS = "parser.Main"; | protected static final String ORG_JAVACC_CLASS = "parser.Main"; | ||||
protected static final String ORG_JJTREE_CLASS = COM_JJTREE_CLASS; | protected static final String ORG_JJTREE_CLASS = COM_JJTREE_CLASS; | ||||
protected static final String ORG_JJDOC_CLASS = COM_JJDOC_CLASS; | protected static final String ORG_JJDOC_CLASS = COM_JJDOC_CLASS; | ||||
@@ -269,6 +280,13 @@ public class JavaCC extends Task { | |||||
optionalAttrs.put(CACHE_TOKENS, new Boolean(cacheTokens)); | optionalAttrs.put(CACHE_TOKENS, new Boolean(cacheTokens)); | ||||
} | } | ||||
/** | |||||
* Sets the KEEP_LINE_COLUMN grammar option. | |||||
*/ | |||||
public void setKeeplinecolumn(boolean keepLineColumn) { | |||||
optionalAttrs.put(KEEP_LINE_COLUMN, new Boolean(keepLineColumn)); | |||||
} | |||||
/** | /** | ||||
* The directory to write the generated files to. | * The directory to write the generated files to. | ||||
* If not set, the files are written to the directory | * If not set, the files are written to the directory | ||||
@@ -354,7 +372,7 @@ public class JavaCC extends Task { | |||||
*/ | */ | ||||
protected static File getArchiveFile(File home) throws BuildException { | protected static File getArchiveFile(File home) throws BuildException { | ||||
return new File(home, | return new File(home, | ||||
ARCHIVE_LOCATIONS[getMajorVersionNumber(home) - 1]); | |||||
ARCHIVE_LOCATIONS[getArchiveLocationIndex(home)]); | |||||
} | } | ||||
/** | /** | ||||
@@ -397,7 +415,6 @@ public class JavaCC extends Task { | |||||
break; | break; | ||||
case 3: | case 3: | ||||
case 4: | |||||
/* | /* | ||||
* This is where the fun starts, JavaCC 3.0 uses | * This is where the fun starts, JavaCC 3.0 uses | ||||
* org.netbeans.javacc, 3.1 uses org.javacc - I wonder | * org.netbeans.javacc, 3.1 uses org.javacc - I wonder | ||||
@@ -409,10 +426,10 @@ public class JavaCC extends Task { | |||||
ZipFile zf = null; | ZipFile zf = null; | ||||
try { | try { | ||||
zf = new ZipFile(getArchiveFile(home)); | zf = new ZipFile(getArchiveFile(home)); | ||||
if (zf.getEntry(ORG_PACKAGE.replace('.', '/')) != null) { | |||||
packagePrefix = ORG_PACKAGE; | |||||
if (zf.getEntry(ORG_PACKAGE_3_0.replace('.', '/')) != null) { | |||||
packagePrefix = ORG_PACKAGE_3_0; | |||||
} else { | } else { | ||||
packagePrefix = ORG_JAVACC_PACKAGE; | |||||
packagePrefix = ORG_PACKAGE_3_1; | |||||
} | } | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
throw new BuildException("Error reading javacc.jar", e); | throw new BuildException("Error reading javacc.jar", e); | ||||
@@ -450,23 +467,14 @@ public class JavaCC extends Task { | |||||
} | } | ||||
/** | /** | ||||
* Helper method to determine the major version number of JavaCC. | |||||
* | |||||
* <p>Don't assume any relation between the number returned by | |||||
* this method and the "major version number" of JavaCC | |||||
* installed. Both 3 and 4 map to JavaCC 3.x (with no difference | |||||
* between 3.0 and 3.1).</p> | |||||
* | |||||
* <p>This method is only useful within this class itself, use | |||||
* {@link #getArchiveFile getArchiveFile} and {@link #getMainClass | |||||
* getMainClass} for more widely useful results.</p> | |||||
* Helper method to determine the archive location index. | |||||
* | * | ||||
* @param home the javacc home path directory. | * @param home the javacc home path directory. | ||||
* @throws BuildException thrown if the home directory is invalid | * @throws BuildException thrown if the home directory is invalid | ||||
* or if the archive could not be found despite attempts to do so. | * or if the archive could not be found despite attempts to do so. | ||||
* @return a number that is useless outside the scope of this class | |||||
* @return the archive location index | |||||
*/ | */ | ||||
protected static int getMajorVersionNumber(File home) | |||||
private static int getArchiveLocationIndex(File home) | |||||
throws BuildException { | throws BuildException { | ||||
if (home == null || !home.isDirectory()) { | if (home == null || !home.isDirectory()) { | ||||
@@ -477,7 +485,7 @@ public class JavaCC extends Task { | |||||
File f = new File(home, ARCHIVE_LOCATIONS[i]); | File f = new File(home, ARCHIVE_LOCATIONS[i]); | ||||
if (f.exists()) { | if (f.exists()) { | ||||
return (i + 1); | |||||
return i; | |||||
} | } | ||||
} | } | ||||
@@ -485,6 +493,21 @@ public class JavaCC extends Task { | |||||
+ "or javacc.jar from '" + home + "'."); | + "or javacc.jar from '" + home + "'."); | ||||
} | } | ||||
/** | |||||
* Helper method to determine the major version number of JavaCC. | |||||
* | |||||
* @param home the javacc home path directory. | |||||
* @throws BuildException thrown if the home directory is invalid | |||||
* or if the archive could not be found despite attempts to do so. | |||||
* @return a the major version number | |||||
*/ | |||||
protected static int getMajorVersionNumber(File home) | |||||
throws BuildException { | |||||
return | |||||
ARCHIVE_LOCATIONS_VS_MAJOR_VERSION[getArchiveLocationIndex(home)]; | |||||
} | |||||
/** | /** | ||||
* Determines the output Java file to be generated by the given grammar | * Determines the output Java file to be generated by the given grammar | ||||
* file. | * file. | ||||