/**
* java_cup.anttask.CUPTask.java
*
* @author Michael Petter, 2003 Ant-Task for CUP Parser Generator for Java --
* tested with Ant 1.5.1; -- compiles with javac -classpath
* .:${ANT_HOME}/lib/ant.jar java_cup.anttask.CUPTask.java -- overrides
* org.apache.tools.ant.taskdefs.Java -- providing cool interface to CUP --
* mapping all existing parameters to attributes -- trys to add new
* useful features to CUP, like - automatic package discovery -
* re-generate .java only when necessary - possibility to generate into
* a dest-directory my code is not perfect (in some cases it is pretty
* ugly :-) ), but i didn't encounter any major error until now
*/
package java_cup.anttask;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java_cup.version;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
@SuppressWarnings (
{ "all", "unchecked" } )
public class CUPTask extends Task
{
private String srcfile = null;
private String parser = null;
private String _package = null;
private String symbols = null;
private String destdir = null;
private boolean _interface = false;
private boolean nonterms = false;
private String expect = null;
private boolean compact_red = false;
private boolean nowarn = false;
private boolean nosummary = false;
private boolean progress = false;
private boolean dump_grammar = false;
private boolean dump_states = false;
private boolean dump_tables = false;
private boolean dump = false;
private boolean time = false;
private boolean debug = false;
private boolean nopositions = false;
private boolean noscanner = false;
private boolean force = false;
private boolean quiet = false;
/**
* executes the task parses all attributes and validates options...
*/
public void execute () throws BuildException
{
List sc = new ArrayList (); // sc = simulated commandline
// here, we parse our elements
if ( parser != null )
{
sc.add ( "-parser" );
sc.add ( parser );
}
else
parser = "parser"; // set the default name to check actuality
if ( _package != null )
{
sc.add ( "-package" );
sc.add ( _package );
}
if ( symbols != null )
{
sc.add ( "-symbols" );
sc.add ( symbols );
}
else
symbols = "sym";
if ( expect != null )
{
sc.add ( "-expect" );
sc.add ( expect );
}
if ( _interface )
{
sc.add ( "-interface" );
}
if ( nonterms )
{
sc.add ( "-nonterms" );
}
if ( compact_red )
{
sc.add ( "-compact_red" );
}
if ( nowarn )
{
sc.add ( "-nowarn" );
}
if ( nosummary )
{
sc.add ( "-nosummary" );
}
if ( progress )
{
sc.add ( "-progress" );
}
if ( dump_grammar )
{
sc.add ( "-dump_grammar" );
}
if ( dump_states )
{
sc.add ( "-dump_states" );
}
if ( dump_tables )
{
sc.add ( "-dump_tables" );
}
if ( dump )
{
sc.add ( "-dump" );
}
if ( time )
{
sc.add ( "-time" );
}
if ( debug )
{
sc.add ( "-debug" );
}
if ( nopositions )
{
sc.add ( "-nopositions" );
}
if ( noscanner )
{
sc.add ( "-noscanner" );
}
if ( !quiet )
log ( "This is " + version.title_str );
if ( !quiet )
log ( "Authors: " + version.author_str );
if ( !quiet )
log ( "Modified by: " + version.modifier );
if ( !quiet )
log ( "Bugreports to petter@cs.tum.edu" );
// look for package name and add to destdir
String packagename = inspect ( srcfile );
// now, that's sweet:
if ( destdir == null )
{
destdir = System.getProperty ( "user.dir" );
if ( !quiet )
log ( "No destination directory specified; using working directory: "
+ destdir );
}
File dest = new File ( destdir + packagename );
if ( ! ( dest ).exists () )
{
if ( !quiet )
log ( "Destination directory didn't exist; creating new one: "
+ destdir + packagename );
dest.mkdirs ();
force = true;
}
else
{
if ( force && !quiet )
{
log ( "anyway, this generation will be processed because of option force set to \"true\"" );
}
else
{
if ( !quiet )
log ( "checking, whether this run is necessary" );
}
// let's check, whether there exists any Parser fragment...
File parserfile = new File ( destdir + packagename, parser + ".java" );
File symfile = new File ( destdir + packagename, symbols + ".java" );
File cupfile = new File ( srcfile );
if ( !parserfile.exists () || !symfile.exists () )
{
if ( !quiet )
log ( "Either Parserfile or Symbolfile didn't exist" );
force = true;
}
else
{
if ( !quiet )
log ( "Parserfile and symbolfile are existing" );
}
if ( parserfile.lastModified () <= cupfile.lastModified () )
{
if ( !quiet )
log ( "Parserfile " + parserfile + " isn't actual" );
force = true;
}
else
{
if ( !quiet )
log ( "Parserfile " + parserfile + " is actual" );
}
if ( symfile.lastModified () <= cupfile.lastModified () )
{
if ( !quiet )
log ( "Symbolfile " + symfile + " isn't actual" );
force = true;
}
else
{
if ( !quiet )
log ( "Symbolfile" + symfile + " is actual" );
}
if ( !force )
{
if ( !quiet )
log ( "skipping generation of " + srcfile );
if ( !quiet )
log ( "use option force=\"true\" to override" );
return;
}
}
sc.add ( "-destdir" );
sc.add ( dest.getAbsolutePath () );
// also catch the not existing input file
if ( srcfile == null )
throw new BuildException (
"Input file needed: Specify <cup srcfile=\"myfile.cup\"> " );
if ( ! ( new File ( srcfile ) ).exists () )
throw new BuildException ( "Input file not found: srcfile=\"" + srcfile
+ "\" " );
sc.add ( srcfile );
String [] args = new String [ sc.size () ];
for ( int i = 0 ; i < args.length ; i++ )
args [ i ] = ( String ) sc.get ( i );
try
{
java_cup.Main.main ( args );
}
catch ( Exception e )
{
log ( "CUP error occured int CUP task: " + e );
}
// this is a dirty hack to determine the apropriate class path
// URL url = CUPTask.class.getResource("/java_cup/Main.class");
// String path = url.getPath().substring(0,url.getPath().length()-20);
// // if called from a .jar or .zip remove the last "!"
// if (path.endsWith("!")) path=path.substring(0,path.length()-1);
// createClasspath().setPath(path);
//
// setFailonerror(true);
// setFork(true);
//
// here, we prepare for calling CUP
// setClassname("java_cup.Main");
// let's call CUP
// super.execute();
}
/**
* Let's search for package name
*
* @param cupfile where we have to search for the package name
* @return the package folder structure
*/
protected String inspect ( String cupfile )
{
try
{
BufferedReader br = new BufferedReader ( new FileReader ( cupfile ) );
while ( br.ready () )
{
String line = br.readLine ();
if ( ( line.startsWith ( "package" ) ) && ( line.indexOf ( ";" ) != -1 ) )
{
String result = line.substring ( 8, line.indexOf ( ";" ) );
result = result.replace ( '.', System.getProperty ( "file.separator" )
.charAt ( 0 ) );
return System.getProperty ( "file.separator" ) + result;
}
}
}
catch ( IOException ioe )
{
}
return "";
}
/**
* Gets the value of quiet
*
* @return the value of quiet
*/
public boolean getQuiet ()
{
return this.quiet;
}
/**
* Sets the value of quiet
*
* @param argquiet Value to assign to this.quiet
*/
public void setQuiet ( boolean argquiet )
{
this.quiet = argquiet;
}
/**
* Gets the value of force
*
* @return the value of force
*/
public boolean getForce ()
{
return this.force;
}
/**
* Sets the value of force
*
* @param argforce Value to assign to this.force
*/
public void setForce ( boolean argforce )
{
this.force = argforce;
}
/**
* Gets the value of _package
*
* @return the value of _package
*/
public String getPackage ()
{
return this._package;
}
/**
* Sets the value of _package
*
* @param arg_package Value to assign to this._package
*/
public void setPackage ( String arg_package )
{
this._package = arg_package;
}
/**
* Gets the value of destdir
*
* @return the value of destdir
*/
public String getDestdir ()
{
return this.destdir;
}
/**
* Sets the value of destdir
*
* @param destdir Value to assign to this.destdir
*/
public void setDestdir ( String destdir )
{
this.destdir = destdir;
}
/**
* Gets the value of _interface
*
* @return the value of _interface
*/
public boolean isInterface ()
{
return this._interface;
}
/**
* Sets the value of _interface
*
* @param arg_interface Value to assign to this._interface
*/
public void setInterface ( boolean arg_interface )
{
this._interface = arg_interface;
}
/**
* Get the Srcfile value.
*
* @return the Srcfile value.
*/
public String getSrcfile ()
{
return srcfile;
}
/**
* Set the Srcfile value.
*
* @param newSrcfile The new Srcfile value.
*/
public void setSrcfile ( String newSrcfile )
{
this.srcfile = newSrcfile;
}
/**
* Gets the value of parser
*
* @return the value of parser
*/
public String getParser ()
{
return this.parser;
}
/**
* Sets the value of parser
*
* @param argParser Value to assign to this.parser
*/
public void setParser ( String argParser )
{
this.parser = argParser;
}
/**
* Gets the value of symbols
*
* @return the value of symbols
*/
public String getSymbols ()
{
return this.symbols;
}
/**
* Sets the value of symbols
*
* @param argSymbols Value to assign to this.symbols
*/
public void setSymbols ( String argSymbols )
{
this.symbols = argSymbols;
}
/**
* Gets the value of nonterms
*
* @return the value of nonterms
*/
public boolean isNonterms ()
{
return this.nonterms;
}
/**
* Sets the value of nonterms
*
* @param argNonterms Value to assign to this.nonterms
*/
public void setNonterms ( boolean argNonterms )
{
this.nonterms = argNonterms;
}
/**
* Gets the value of expect
*
* @return the value of expect
*/
public String getExpect ()
{
return this.expect;
}
/**
* Sets the value of expect
*
* @param argExpect Value to assign to this.expect
*/
public void setExpect ( String argExpect )
{
this.expect = argExpect;
}
/**
* Gets the value of compact_red
*
* @return the value of compact_red
*/
public boolean isCompact_red ()
{
return this.compact_red;
}
/**
* Sets the value of compact_red
*
* @param argCompact_red Value to assign to this.compact_red
*/
public void setCompact_red ( boolean argCompact_red )
{
this.compact_red = argCompact_red;
}
/**
* Gets the value of nowarn
*
* @return the value of nowarn
*/
public boolean isNowarn ()
{
return this.nowarn;
}
/**
* Sets the value of nowarn
*
* @param argNowarn Value to assign to this.nowarn
*/
public void setNowarn ( boolean argNowarn )
{
this.nowarn = argNowarn;
}
/**
* Gets the value of nosummary
*
* @return the value of nosummary
*/
public boolean isNosummary ()
{
return this.nosummary;
}
/**
* Sets the value of nosummary
*
* @param argNosummary Value to assign to this.nosummary
*/
public void setNosummary ( boolean argNosummary )
{
this.nosummary = argNosummary;
}
/**
* Gets the value of progress
*
* @return the value of progress
*/
public boolean isProgress ()
{
return this.progress;
}
/**
* Sets the value of progress
*
* @param argProgress Value to assign to this.progress
*/
public void setProgress ( boolean argProgress )
{
this.progress = argProgress;
}
/**
* Gets the value of dump_grammar
*
* @return the value of dump_grammar
*/
public boolean isDump_grammar ()
{
return this.dump_grammar;
}
/**
* Sets the value of dump_grammar
*
* @param argDump_grammar Value to assign to this.dump_grammar
*/
public void setDump_grammar ( boolean argDump_grammar )
{
this.dump_grammar = argDump_grammar;
}
/**
* Gets the value of dump_states
*
* @return the value of dump_states
*/
public boolean isDump_states ()
{
return this.dump_states;
}
/**
* Sets the value of dump_states
*
* @param argDump_states Value to assign to this.dump_states
*/
public void setDump_states ( boolean argDump_states )
{
this.dump_states = argDump_states;
}
/**
* Gets the value of dump_tables
*
* @return the value of dump_tables
*/
public boolean isDump_tables ()
{
return this.dump_tables;
}
/**
* Sets the value of dump_tables
*
* @param argDump_tables Value to assign to this.dump_tables
*/
public void setDump_tables ( boolean argDump_tables )
{
this.dump_tables = argDump_tables;
}
/**
* Gets the value of dump
*
* @return the value of dump
*/
public boolean isDump ()
{
return this.dump;
}
/**
* Sets the value of dump
*
* @param argDump Value to assign to this.dump
*/
public void setDump ( boolean argDump )
{
this.dump = argDump;
}
/**
* Gets the value of time
*
* @return the value of time
*/
public boolean isTime ()
{
return this.time;
}
/**
* Sets the value of time
*
* @param argTime Value to assign to this.time
*/
public void setTime ( boolean argTime )
{
this.time = argTime;
}
/**
* Gets the value of debug
*
* @return the value of debug
*/
public boolean isDebug ()
{
return this.debug;
}
/**
* Sets the value of debug
*
* @param argDebug Value to assign to this.debug
*/
public void setDebug ( boolean argDebug )
{
this.debug = argDebug;
}
/**
* Gets the value of nopositions
*
* @return the value of nopositions
*/
public boolean isNopositions ()
{
return this.nopositions;
}
/**
* Sets the value of nopositions
*
* @param argNopositions Value to assign to this.nopositions
*/
public void setNopositions ( boolean argNopositions )
{
this.nopositions = argNopositions;
}
/**
* Gets the value of noscanner
*
* @return the value of noscanner
*/
public boolean isNoscanner ()
{
return this.noscanner;
}
/**
* Sets the value of noscanner
*
* @param argNoscanner Value to assign to this.noscanner
*/
public void setNoscanner ( boolean argNoscanner )
{
this.noscanner = argNoscanner;
}
}