
java_cup.anttask.CUPTask Maven / Gradle / Ivy
Show all versions of javacup Show documentation
/**
* 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_cup.version;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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 debugsymbols = false;
private boolean nopositions = false;
private boolean xmlactions = false;
private boolean genericlabels = false;
private boolean locations = true;
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 (debugsymbols) {
sc.add("-debugsymbols");
}
if (nopositions) {
sc.add("-nopositions");
}
if (locations) {
sc.add("-locations");
}
if (genericlabels) {
sc.add("-genericlabels");
}
if (xmlactions) {
sc.add("-xmlactions");
}
if (noscanner) {
sc.add("-noscanner");
}
if (!quiet) log("This is " + version.title_str);
if (!quiet) log("Authors : " + version.author_str);
if (!quiet) log("Bugreports to [email protected]");
// 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 ");
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);
}
}
/**
* 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 debug
*
* @return the value of debug
*/
public boolean isDebugSymbols() {
return this.debugsymbols;
}
/**
* Sets the value of debug
*
* @param argDebug Value to assign to this.debug
*/
public void setDebugSymbols(boolean argDebug) {
this.debugsymbols = 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 locations
*
* @return the value of locations
*/
public boolean isLocations() {
return this.locations;
}
/**
* Sets the value of locations
*
* @param argLocations Value to assign to this.locations
*/
public void setLocations(boolean argLocations) {
this.locations = argLocations;
}
/**
* 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;
}
public boolean isXmlactions() {
return xmlactions;
}
public void setXmlactions(boolean xmlactions) {
this.xmlactions = xmlactions;
}
public boolean isGenericlabels() {
return genericlabels;
}
public void setGenericlabels(boolean genericlabels) {
this.genericlabels = genericlabels;
}
}