in jflex/src/main/java/jflex/generator/Emitter.java [203:376]
private void emitMain(String functionName) {
if (!(scanner.standalone() || scanner.debugOption() || scanner.cupDebug())) return;
if (scanner.cupDebug()) {
println(" /**");
println(" * Converts an int token code into the name of the");
println(" * token by reflection on the cup symbol class/interface " + scanner.cupSymbol());
println(" */");
println(" private static String getTokenName(int token) {");
println(" try {");
println(
" java.lang.reflect.Field [] classFields = "
+ scanner.cupSymbol()
+ ".class.getFields();");
println(" for (int i = 0; i < classFields.length; i++) {");
println(" if (classFields[i].getInt(null) == token) {");
println(" return classFields[i].getName();");
println(" }");
println(" }");
println(" } catch (Exception e) {");
println(" e.printStackTrace(System.err);");
println(" }");
println("");
println(" return \"UNKNOWN TOKEN\";");
println(" }");
println("");
println(" /**");
println(" * Same as " + functionName + " but also prints the token to standard out");
println(" * for debugging.");
println(" */");
if (scanner.cupCompatible() || scanner.cup2Compatible()) {
// cup interface forces public method
print(" public ");
} else {
print(" " + visibility + " ");
}
if (scanner.tokenType() == null) {
if (scanner.isInteger()) print("int");
else if (scanner.isIntWrap()) print("Integer");
else print("Yytoken");
} else print(scanner.tokenType());
print(" debug_");
print(functionName);
print("() throws java.io.IOException");
for (String thrown : scanner.lexThrow()) {
print("\n , ");
print(thrown);
}
if (scanner.scanErrorException() != null) {
print(", ");
print(scanner.scanErrorException());
}
println(" {");
println(" " + scanner.tokenType() + " s = " + functionName + "();");
print(" System.out.println( ");
if (scanner.lineCount()) print("\"line:\" + (yyline+1) + ");
if (scanner.columnCount()) print("\" col:\" + (yycolumn+1) + ");
if (scanner.charCount()) print("\" char:\" + yychar + ");
println("\" --\"+ yytext() + \"--\" + getTokenName(s.sym) + \"--\");");
println(" return s;");
println(" }");
println("");
}
if (scanner.standalone()) {
println(" /**");
println(" * Runs the scanner on input files.");
println(" *");
println(" * This is a standalone scanner, it will print any unmatched");
println(" * text to System.out unchanged.");
println(" *");
println(" * @param argv the command line, contains the filenames to run");
println(" * the scanner on.");
println(" */");
} else {
println(" /**");
println(" * Runs the scanner on input files.");
println(" *");
println(" * This main method is the debugging routine for the scanner.");
println(" * It prints debugging information about each returned token to");
println(" * System.out until the end of file is reached, or an error occured.");
println(" *");
println(" * @param argv the command line, contains the filenames to run");
println(" * the scanner on.");
println(" */");
}
String className = getBaseName(scanner.className());
println(" public static void main(String[] argv) {");
println(" if (argv.length == 0) {");
println(
" System.out.println(\"Usage : java "
+ className
+ " [ --encoding <name> ] <inputfile(s)>\");");
println(" }");
println(" else {");
println(" int firstFilePos = 0;");
println(" String encodingName = \"UTF-8\";");
println(" if (argv[0].equals(\"--encoding\")) {");
println(" firstFilePos = 2;");
println(" encodingName = argv[1];");
println(" try {");
println(" // Side-effect: is encodingName valid?");
println(" java.nio.charset.Charset.forName(encodingName);");
println(" } catch (Exception e) {");
println(" System.out.println(\"Invalid encoding '\" + encodingName + \"'\");");
println(" return;");
println(" }");
println(" }");
println(" for (int i = firstFilePos; i < argv.length; i++) {");
println(" " + className + " scanner = null;");
println(" java.io.FileInputStream stream = null;");
println(" java.io.Reader reader = null;");
println(" try {");
println(" stream = new java.io.FileInputStream(argv[i]);");
println(" reader = new java.io.InputStreamReader(stream, encodingName);");
println(" scanner = new " + className + "(reader);");
if (scanner.standalone()) {
println(" while ( !scanner.zzAtEOF ) scanner." + functionName + "();");
} else if (scanner.cupDebug()) {
println(" while ( !scanner.zzAtEOF ) scanner.debug_" + functionName + "();");
} else {
println(" do {");
println(" System.out.println(scanner." + functionName + "());");
println(" } while (!scanner.zzAtEOF);");
println("");
}
println(" }");
println(" catch (java.io.FileNotFoundException e) {");
println(" System.out.println(\"File not found : \\\"\"+argv[i]+\"\\\"\");");
println(" }");
println(" catch (java.io.IOException e) {");
println(" System.out.println(\"IO error scanning file \\\"\"+argv[i]+\"\\\"\");");
println(" System.out.println(e);");
println(" }");
println(" catch (Exception e) {");
println(" System.out.println(\"Unexpected exception:\");");
println(" e.printStackTrace();");
println(" }");
println(" finally {");
println(" if (reader != null) {");
println(" try {");
println(" reader.close();");
println(" }");
println(" catch (java.io.IOException e) {");
println(" System.out.println(\"IO error closing file \\\"\"+argv[i]+\"\\\"\");");
println(" System.out.println(e);");
println(" }");
println(" }");
println(" if (stream != null) {");
println(" try {");
println(" stream.close();");
println(" }");
println(" catch (java.io.IOException e) {");
println(" System.out.println(\"IO error closing file \\\"\"+argv[i]+\"\\\"\");");
println(" System.out.println(e);");
println(" }");
println(" }");
println(" }");
println(" }");
println(" }");
println(" }");
println("");
}