Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Split LexGenerator out of Main #428

Merged
merged 6 commits into from
Oct 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import jflex.Main;
import jflex.LexGenerator;
import jflex.Options;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
Expand Down Expand Up @@ -235,7 +235,7 @@ private void parseLexFile(File lexFile) throws MojoFailureException, MojoExecuti
}

try {
Main.generate(lexFile);
LexGenerator.generate(lexFile);
getLog().info(" generated " + generatedFile);
} catch (Exception e) {
throw new MojoExecutionException(e.getMessage(), e);
Expand Down
2 changes: 1 addition & 1 deletion jflex/src/main/java/jflex/Emitter.java
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ private void emitNextInput() {

private void emitHeader() {
println("// DO NOT EDIT");
println("// Generated by JFlex " + Main.version + " http://jflex.de/");
println("// Generated by JFlex " + LexGenerator.VERSION + " http://jflex.de/");
String path = FileUtil.getRelativePath(Options.getRootDirectory(), inputFile);
if (File.separatorChar == '\\') {
path = FileUtil.slashify(path);
Expand Down
130 changes: 130 additions & 0 deletions jflex/src/main/java/jflex/LexGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* JFlex 1.7.1-SNAPSHOT *
* Copyright (C) 1998-2018 Gerwin Klein <[email protected]> *
* All rights reserved. *
* *
* License: BSD *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

package jflex;

import static jflex.Options.encoding;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
* This is the generator of JFlex, controlling the scanner generation process.
*
* @author Gerwin Klein
* @author Régis Décamps
* @version JFlex 1.7.1-SNAPSHOT
*/
public class LexGenerator {

/** JFlex version */
public static final String VERSION = "1.7.1-SNAPSHOT"; // $NON-NLS-1$

/**
* Generates a scanner for the specified input file.
*
* @param inputFile a file containing a lexical specification to generate a scanner for.
*/
public static void generate(File inputFile) {

Out.resetCounters();

Timer totalTime = new Timer();
Timer time = new Timer();

LexScan scanner = null;
LexParse parser = null;
Reader inputReader = null;

totalTime.start();

try {
Out.println(ErrorMessages.READING, inputFile.toString());
inputReader =
new InputStreamReader(Files.newInputStream(Paths.get(inputFile.toString())), encoding);
scanner = new LexScan(inputReader);
scanner.setFile(inputFile);
parser = new LexParse(scanner);
} catch (IOException e) {
Out.error(ErrorMessages.CANNOT_OPEN, inputFile.toString());
throw new GeneratorException();
}

try {
NFA nfa = (NFA) parser.parse().value;

Out.checkErrors();

if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.NFA_IS) + Out.NL + nfa + Out.NL);

if (Options.dot) nfa.writeDot(Emitter.normalize("nfa.dot", null)); // $NON-NLS-1$

Out.println(ErrorMessages.NFA_STATES, nfa.numStates);

time.start();
DFA dfa = nfa.getDFA();
time.stop();
Out.time(ErrorMessages.DFA_TOOK, time);

dfa.checkActions(scanner, parser);

nfa = null;

if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.DFA_IS) + Out.NL + dfa + Out.NL);

if (Options.dot) dfa.writeDot(Emitter.normalize("dfa-big.dot", null)); // $NON-NLS-1$

Out.checkErrors();

time.start();
dfa.minimize();
time.stop();

Out.time(ErrorMessages.MIN_TOOK, time);

if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.MIN_DFA_IS) + Out.NL + dfa);

if (Options.dot) dfa.writeDot(Emitter.normalize("dfa-min.dot", null)); // $NON-NLS-1$

time.start();

Emitter e = new Emitter(inputFile, parser, dfa);
e.emit();

time.stop();

Out.time(ErrorMessages.WRITE_TOOK, time);

totalTime.stop();

Out.time(ErrorMessages.TOTAL_TIME, totalTime);
} catch (ScannerException e) {
Out.error(e.file, e.message, e.line, e.column);
throw new GeneratorException();
} catch (MacroException e) {
Out.error(e.getMessage());
throw new GeneratorException();
} catch (IOException e) {
Out.error(ErrorMessages.IO_ERROR, e.toString());
throw new GeneratorException();
} catch (OutOfMemoryError e) {
Out.error(ErrorMessages.OUT_OF_MEMORY);
throw new GeneratorException();
} catch (GeneratorException e) {
throw new GeneratorException();
} catch (Exception e) {
e.printStackTrace();
throw new GeneratorException();
}
}
}
128 changes: 14 additions & 114 deletions jflex/src/main/java/jflex/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,12 @@
package jflex;

import static jflex.ErrorMessages.NO_ENCODING;
import static jflex.Options.encoding;
import static jflex.Options.setEncoding;
import static jflex.Options.unused_warning;
import static jflex.Out.error;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand All @@ -36,124 +30,25 @@
import jflex.unicode.UnicodeProperties;

/**
* This is the main class of JFlex controlling the scanner generation process. It is responsible for
* parsing the commandline, getting input files, starting up the GUI if necessary, etc.
* This is the command-line interface.
*
* <p>It is responsible for parsing the commandline, getting input files, starting up the GUI if
* necessary, etc. and invokes {@link LexGenerator} accordingly.
*
* @author Gerwin Klein
* @author Régis Décamps
* @version JFlex 1.7.1-SNAPSHOT
*/
public class Main {

/** JFlex version */
public static final String version = "1.7.1-SNAPSHOT"; // $NON-NLS-1$

/**
* Generates a scanner for the specified input file.
*
* @param inputFile a file containing a lexical specification to generate a scanner for.
*/
public static void generate(File inputFile) {

Out.resetCounters();

Timer totalTime = new Timer();
Timer time = new Timer();

LexScan scanner = null;
LexParse parser = null;
Reader inputReader = null;

totalTime.start();

try {
Out.println(ErrorMessages.READING, inputFile.toString());
inputReader =
new InputStreamReader(Files.newInputStream(Paths.get(inputFile.toString())), encoding);
scanner = new LexScan(inputReader);
scanner.setFile(inputFile);
parser = new LexParse(scanner);
} catch (IOException e) {
Out.error(ErrorMessages.CANNOT_OPEN, inputFile.toString());
throw new GeneratorException();
}

try {
NFA nfa = (NFA) parser.parse().value;

Out.checkErrors();

if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.NFA_IS) + Out.NL + nfa + Out.NL);

if (Options.dot) nfa.writeDot(Emitter.normalize("nfa.dot", null)); // $NON-NLS-1$

Out.println(ErrorMessages.NFA_STATES, nfa.numStates);

time.start();
DFA dfa = nfa.getDFA();
time.stop();
Out.time(ErrorMessages.DFA_TOOK, time);

dfa.checkActions(scanner, parser);

nfa = null;

if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.DFA_IS) + Out.NL + dfa + Out.NL);

if (Options.dot) dfa.writeDot(Emitter.normalize("dfa-big.dot", null)); // $NON-NLS-1$

Out.checkErrors();

time.start();
dfa.minimize();
time.stop();

Out.time(ErrorMessages.MIN_TOOK, time);

if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.MIN_DFA_IS) + Out.NL + dfa);

if (Options.dot) dfa.writeDot(Emitter.normalize("dfa-min.dot", null)); // $NON-NLS-1$

time.start();

Emitter e = new Emitter(inputFile, parser, dfa);
e.emit();

time.stop();

Out.time(ErrorMessages.WRITE_TOOK, time);

totalTime.stop();

Out.time(ErrorMessages.TOTAL_TIME, totalTime);
} catch (ScannerException e) {
Out.error(e.file, e.message, e.line, e.column);
throw new GeneratorException();
} catch (MacroException e) {
Out.error(e.getMessage());
throw new GeneratorException();
} catch (IOException e) {
Out.error(ErrorMessages.IO_ERROR, e.toString());
throw new GeneratorException();
} catch (OutOfMemoryError e) {
Out.error(ErrorMessages.OUT_OF_MEMORY);
throw new GeneratorException();
} catch (GeneratorException e) {
throw new GeneratorException();
} catch (Exception e) {
e.printStackTrace();
throw new GeneratorException();
}
}

/**
* parseOptions.
*
* @param argv an array of {@link java.lang.String} objects.
* @return a {@link java.util.List} object.
* @throws jflex.SilentExit if any.
*/
public static List<File> parseOptions(String argv[]) throws SilentExit {
private static List<File> parseOptions(String argv[]) throws SilentExit {
List<File> files = new ArrayList<>();

for (int i = 0; i < argv.length; i++) {
Expand Down Expand Up @@ -237,7 +132,7 @@ public static List<File> parseOptions(String argv[]) throws SilentExit {

if (Objects.equals(argv[i], "--version")
|| Objects.equals(argv[i], "-version")) { // $NON-NLS-1$ //$NON-NLS-2$
Out.println(ErrorMessages.THIS_IS_JFLEX, version);
Out.println(ErrorMessages.THIS_IS_JFLEX, LexGenerator.VERSION);
throw new SilentExit(0);
}

Expand Down Expand Up @@ -377,7 +272,7 @@ private static void printUnicodePropertyValuesAndAliases(String unicodeVersion)
}

/** Prints the cli usage on stdout. */
public static void printUsage() {
private static void printUsage() {
Out.println(""); // $NON-NLS-1$
Out.println("Usage: jflex <options> <input-files>");
Out.println("");
Expand All @@ -404,7 +299,7 @@ public static void printUsage() {
Out.println("--help");
Out.println("-h print this message");
Out.println("");
Out.println(ErrorMessages.THIS_IS_JFLEX, version);
Out.println(ErrorMessages.THIS_IS_JFLEX, LexGenerator.VERSION);
Out.println("Have a nice day!");
}

Expand All @@ -418,7 +313,9 @@ public static void generate(String argv[]) throws SilentExit {
List<File> files = parseOptions(argv);

if (files.size() > 0) {
for (File file : files) generate(file);
for (File file : files) {
LexGenerator.generate(file);
}
} else {
new MainFrame();
}
Expand All @@ -440,4 +337,7 @@ public static void main(String argv[]) {
System.exit(e.exitCode());
}
}

// Only CLI, not meant for instanciation.
private Main() {}
}
2 changes: 1 addition & 1 deletion jflex/src/main/java/jflex/Out.java
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ public static void printSystemInfo() {
err("OS version: " + System.getProperty("os.version"));
err("Encoding: " + System.getProperty("file.encoding"));
err("Unicode versions: " + UnicodeProperties.UNICODE_VERSIONS);
err("JFlex version: " + Main.version);
err("JFlex version: " + LexGenerator.VERSION);
}

/**
Expand Down
4 changes: 2 additions & 2 deletions jflex/src/main/java/jflex/anttask/JFlexTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import java.io.LineNumberReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jflex.Main;
import jflex.LexGenerator;
import jflex.Options;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
Expand Down Expand Up @@ -69,7 +69,7 @@ public void execute() throws BuildException {
File destFile = new File(outputDir, className + ".java");

if (inputFile.lastModified() > destFile.lastModified()) {
Main.generate(inputFile);
LexGenerator.generate(inputFile);
if (!Options.verbose) System.out.println("Generated: " + destFile.getName());
}
} catch (IOException e1) {
Expand Down
4 changes: 2 additions & 2 deletions jflex/src/main/java/jflex/gui/GeneratorThread.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import java.util.Objects;
import jflex.ErrorMessages;
import jflex.GeneratorException;
import jflex.Main;
import jflex.LexGenerator;
import jflex.Options;
import jflex.Out;

Expand Down Expand Up @@ -62,7 +62,7 @@ public void run() {
if (!Objects.equals(outputDir, "")) {
Options.setDir(outputDir);
}
Main.generate(new File(inputFile));
LexGenerator.generate(new File(inputFile));
Out.statistics();
parent.generationFinished(true);
} catch (GeneratorException e) {
Expand Down
Loading