/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * JFlex Anttask                                                           *
 * Copyright (C) 2001       Rafal Mantiuk <Rafal.Mantiuk@bellstream.pl>    *
 * Copyright (C) 2003       changes by Gerwin Klein <lsf@jflex.de>         *
 * All rights reserved.                                                    *
 *                                                                         *
 * License: BSD                                                            *
 *                                                                         *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

package jflex.anttask;

import java.io.File;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jflex.core.OptionUtils;
import jflex.exceptions.GeneratorException;
import jflex.generator.LexGenerator;
import jflex.option.Options;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

JFlex ant task.
Author:Rafal Mantiuk
Version:JFlex 1.8.2
/** * JFlex ant task. * * @author Rafal Mantiuk * @version JFlex 1.8.2 */
public class JFlexTask extends Task { private static final Pattern PACKAGE_PATTERN = Pattern.compile("package\\s+(\\S+)\\s*;"); private static final Pattern CLASS_PATTERN = Pattern.compile("%class\\s+(\\S+)"); private File inputFile; // found out by looking into .flex file private String className = null; private String packageName = null;
for javac-like dest dir behaviour
/** for javac-like dest dir behaviour */
private File destinationDir;
the actual output directory (outputDir = destinationDir + package))
/** the actual output directory (outputDir = destinationDir + package)) */
private File outputDir = null;
Constructor for JFlexTask.
/** Constructor for JFlexTask. */
public JFlexTask() { OptionUtils.setDefaultOptions(); // ant default is different from the rest of JFlex setVerbose(false); setUnusedWarning(true); Options.progress = false; }
Executes the ant task.
Throws:
  • BuildException – if any.
/** * Executes the ant task. * * @throws BuildException if any. */
@Override public void execute() { try { if (inputFile == null) throw new BuildException("Input file needed. Use <jflex file=\"your_scanner.flex\"/>"); if (!inputFile.canRead()) throw new BuildException("Cannot read input file " + inputFile); try { findPackageAndClass(); normalizeOutdir(); File destFile = new File(outputDir, className + ".java"); if (inputFile.lastModified() > destFile.lastModified()) { new LexGenerator(inputFile).generate(); if (!Options.verbose) System.out.println("Generated: " + destFile.getName()); } } catch (IOException e1) { throw new BuildException(e1); } } catch (GeneratorException e) { throw new BuildException("JFlex generation failed", e); } }
Peek into .flex file to get package and class name
Throws:
  • IOException – if there is a problem reading the .flex file
/** * Peek into .flex file to get package and class name * * @throws java.io.IOException if there is a problem reading the .flex file */
public void findPackageAndClass() throws IOException { // find name of the package and class in jflex source file packageName = null; className = null; Reader r = Files.newBufferedReader(inputFile.toPath(), StandardCharsets.UTF_8); try (LineNumberReader reader = new LineNumberReader(r)) { while (className == null || packageName == null) { String line = reader.readLine(); if (line == null) { break; } if (packageName == null) { Matcher matcher = PACKAGE_PATTERN.matcher(line); if (matcher.find()) { packageName = matcher.group(1); } } if (className == null) { Matcher matcher = CLASS_PATTERN.matcher(line); if (matcher.find()) { className = matcher.group(1); } } } // package name may be null, but class name not if (className == null) { className = "Yylex"; } } }
Sets the actual output directory if not already set.

Uses javac logic to determine output dir = dest dir + package name If not destdir has been set, output dir = parent of input file

Assumes that package name is already set.

/** * Sets the actual output directory if not already set. * * <p>Uses javac logic to determine output dir = dest dir + package name If not destdir has been * set, output dir = parent of input file * * <p>Assumes that package name is already set. */
public void normalizeOutdir() { if (outputDir != null) return; // find out what the destination directory is. Append packageName to dest // dir. File destDir; // this is not the default the jflex logic, but javac-like if (destinationDir != null) { if (packageName == null) { destDir = destinationDir; } else { String path = packageName.replace('.', File.separatorChar); destDir = new File(destinationDir, path); } } else { // save parser to the same dir as .flex destDir = new File(inputFile.getParent()); } setOutdir(destDir); }
getPackage.
See Also:
Returns:package name of input file
/** * getPackage. * * @return package name of input file * @see #findPackageAndClass() */
public String getPackage() { return packageName; }
Getter for the field className.
See Also:
Returns:class name of input file
/** * Getter for the field {@code className}. * * @return class name of input file * @see #findPackageAndClass() */
public String getClassName() { return className; }
setDestdir.
Params:
  • destinationDir – a File object.
/** * setDestdir. * * @param destinationDir a {@link java.io.File} object. */
public void setDestdir(File destinationDir) { this.destinationDir = destinationDir; }
setOutdir.
Params:
  • outDir – a File object.
/** * setOutdir. * * @param outDir a {@link java.io.File} object. */
public void setOutdir(File outDir) { this.outputDir = outDir; OptionUtils.setDir(outputDir); }
setFile.
Params:
  • file – a File object.
/** * setFile. * * @param file a {@link java.io.File} object. */
public void setFile(File file) { this.inputFile = file; }
setGenerateDot.
Params:
  • genDot – a boolean.
/** * setGenerateDot. * * @param genDot a boolean. */
public void setGenerateDot(boolean genDot) { setDot(genDot); }
setTimeStatistics.
Params:
  • displayTime – a boolean.
/** * setTimeStatistics. * * @param displayTime a boolean. */
public void setTimeStatistics(boolean displayTime) { Options.time = displayTime; }
setTime.
Params:
  • displayTime – a boolean.
/** * setTime. * * @param displayTime a boolean. */
public void setTime(boolean displayTime) { setTimeStatistics(displayTime); }
setVerbose.
Params:
  • verbose – a boolean.
/** * setVerbose. * * @param verbose a boolean. */
public final void setVerbose(boolean verbose) { Options.verbose = verbose; Options.unused_warning = verbose; }
setUnusedWarning.
Params:
  • warn – a boolean.
/** * setUnusedWarning. * * @param warn a boolean. */
public final void setUnusedWarning(boolean warn) { Options.unused_warning = warn; }
setSkeleton.
Params:
  • skeleton – a File object.
/** * setSkeleton. * * @param skeleton a {@link java.io.File} object. */
public void setSkeleton(File skeleton) { OptionUtils.setSkeleton(skeleton); }
setSkel.
Params:
  • skeleton – a File object.
/** * setSkel. * * @param skeleton a {@link java.io.File} object. */
public void setSkel(File skeleton) { setSkeleton(skeleton); }
setSkipMinimization.
Params:
  • skipMin – a boolean.
/** * setSkipMinimization. * * @param skipMin a boolean. */
public void setSkipMinimization(boolean skipMin) { setNomin(skipMin); }
setNomin.
Params:
  • b – a boolean.
/** * setNomin. * * @param b a boolean. */
public void setNomin(boolean b) { Options.no_minimize = b; }
setNobak.
Params:
  • b – a boolean.
/** * setNobak. * * @param b a boolean. */
public void setNobak(boolean b) { Options.no_backup = b; }
setPack.
Params:
  • b – a boolean.
/** * setPack. * * @param b a boolean. */
public void setPack(boolean b) { /* no-op - this is the only available generation method */ }
setDot.
Params:
  • b – a boolean.
/** * setDot. * * @param b a boolean. */
public void setDot(boolean b) { Options.dot = b; }
setDump.
Params:
  • b – a boolean.
/** * setDump. * * @param b a boolean. */
public void setDump(boolean b) { Options.dump = b; }
setJLex.
Params:
  • b – a boolean.
/** * setJLex. * * @param b a boolean. */
public void setJLex(boolean b) { Options.jlex = b; }
setLegacyDot.
Params:
  • b – a boolean.
/** * setLegacyDot. * * @param b a boolean. */
public void setLegacyDot(boolean b) { Options.legacy_dot = b; }
Set the input encoding. If unset will use the JVM default.
Params:
  • encodingName – the name of the encoding to set (e.g. "utf-8").
/** * Set the input encoding. If unset will use the JVM default. * * @param encodingName the name of the encoding to set (e.g. "utf-8"). */
public void setEncoding(String encodingName) { OptionUtils.setEncoding(encodingName); } }