/** * 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; } }