org.javacc.parser.JavaFiles Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ph-javacc-maven-plugin Show documentation
Show all versions of ph-javacc-maven-plugin Show documentation
Maven 3 Plugin for processing JavaCC grammar files.
/* Copyright (c) 2006, Sun Microsystems, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the Sun Microsystems, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.javacc.parser;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import org.javacc.Version;
import org.javacc.utils.JavaFileGenerator;
/**
* Generate CharStream, TokenManager and Exceptions.
*/
public class JavaFiles extends JavaCCGlobals implements JavaCCParserConstants
{
/**
* ID of the latest version (of JavaCC) in which one of the CharStream classes
* or the CharStream interface is modified.
*/
static final String charStreamVersion = Version.majorDotMinor;
/**
* ID of the latest version (of JavaCC) in which the TokenManager interface is
* modified.
*/
static final String tokenManagerVersion = Version.majorDotMinor;
/**
* ID of the latest version (of JavaCC) in which the Token class is modified.
*/
static final String tokenVersion = Version.majorDotMinor;
/**
* ID of the latest version (of JavaCC) in which the ParseException class is
* modified.
*/
static final String parseExceptionVersion = Version.majorDotMinor;
/**
* ID of the latest version (of JavaCC) in which the TokenMgrError class is
* modified.
*/
static final String tokenMgrErrorVersion = Version.majorDotMinor;
public interface JavaResourceTemplateLocations
{
public String getTokenManagerTemplateResourceUrl ();
public String getTokenTemplateResourceUrl ();
public String getTokenMgrErrorTemplateResourceUrl ();
public String getJavaCharStreamTemplateResourceUrl ();
public String getCharStreamTemplateResourceUrl ();
public String getSimpleCharStreamTemplateResourceUrl ();
public String getParseExceptionTemplateResourceUrl ();
}
public static class JavaModernResourceTemplateLocationImpl implements JavaResourceTemplateLocations
{
public String getTokenMgrErrorTemplateResourceUrl ()
{
// Same as Java
return "/templates/TokenMgrError.template";
}
public String getCharStreamTemplateResourceUrl ()
{
// Same as Java
return "/templates/CharStream.template";
}
public String getTokenManagerTemplateResourceUrl ()
{
// Same as Java
return "/templates/TokenManager.template";
}
public String getTokenTemplateResourceUrl ()
{
// Same as Java
return "/templates/Token.template";
}
public String getSimpleCharStreamTemplateResourceUrl ()
{
return "/templates/gwt/SimpleCharStream.template";
}
public String getJavaCharStreamTemplateResourceUrl ()
{
return "/templates/gwt/JavaCharStream.template";
}
public String getParseExceptionTemplateResourceUrl ()
{
return "/templates/gwt/ParseException.template";
}
}
public static class JavaResourceTemplateLocationImpl implements JavaResourceTemplateLocations
{
public String getTokenTemplateResourceUrl ()
{
return "/templates/Token.template";
}
public String getTokenManagerTemplateResourceUrl ()
{
return "/templates/TokenManager.template";
}
public String getTokenMgrErrorTemplateResourceUrl ()
{
return "/templates/TokenMgrError.template";
}
public String getJavaCharStreamTemplateResourceUrl ()
{
return "/templates/JavaCharStream.template";
}
public String getCharStreamTemplateResourceUrl ()
{
return "/templates/CharStream.template";
}
public String getSimpleCharStreamTemplateResourceUrl ()
{
return "/templates/SimpleCharStream.template";
}
public String getParseExceptionTemplateResourceUrl ()
{
return "/templates/ParseException.template";
}
}
public static final JavaResourceTemplateLocations RESOURCES_JAVA_CLASSIC = new JavaResourceTemplateLocationImpl ();
public static final JavaResourceTemplateLocations RESOURCES_JAVA_MODERN = new JavaModernResourceTemplateLocationImpl ();
/**
* Replaces all backslahes with double backslashes.
*/
static String replaceBackslash (final String str)
{
StringBuffer b;
int i = 0;
final int len = str.length ();
while (i < len && str.charAt (i++) != '\\')
;
if (i == len) // No backslash found.
return str;
char c;
b = new StringBuffer ();
for (i = 0; i < len; i++)
if ((c = str.charAt (i)) == '\\')
b.append ("\\\\");
else
b.append (c);
return b.toString ();
}
/**
* Read the version from the comment in the specified file. This method does
* not try to recover from invalid comment syntax, but rather returns version
* 0.0 (which will always be taken to mean the file is out of date).
*
* @param fileName
* eg Token.java
* @return The version as a double, eg 4.1
* @since 4.1
*/
static double getVersion (final String fileName)
{
final String commentHeader = "/* " + getIdString (toolName, fileName) + " Version ";
final File file = new File (Options.getOutputDirectory (), replaceBackslash (fileName));
if (!file.exists ())
{
// Has not yet been created, so it must be up to date.
try
{
final String majorVersion = Version.versionNumber.replaceAll ("[^0-9.]+.*", "");
return Double.parseDouble (majorVersion);
}
catch (final NumberFormatException e)
{
return 0.0; // Should never happen
}
}
BufferedReader reader = null;
try
{
reader = new BufferedReader (new FileReader (file));
String str;
double version = 0.0;
// Although the version comment should be the first line, sometimes the
// user might have put comments before it.
while ((str = reader.readLine ()) != null)
{
if (str.startsWith (commentHeader))
{
str = str.substring (commentHeader.length ());
final int pos = str.indexOf (' ');
if (pos >= 0)
str = str.substring (0, pos);
if (str.length () > 0)
{
try
{
version = Double.parseDouble (str);
}
catch (final NumberFormatException nfe)
{
// Ignore - leave version as 0.0
}
}
break;
}
}
return version;
}
catch (final IOException ioe)
{
return 0.0;
}
finally
{
if (reader != null)
{
try
{
reader.close ();
}
catch (final IOException e)
{}
}
}
}
public static void gen_JavaCharStream (final JavaResourceTemplateLocations locations)
{
try
{
final File file = new File (Options.getOutputDirectory (), "JavaCharStream.java");
final OutputFile outputFile = new OutputFile (file,
charStreamVersion,
new String [] { Options.USEROPTION__STATIC,
Options.USEROPTION__SUPPORT_CLASS_VISIBILITY_PUBLIC });
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final String prefix = (Options.getStatic () ? "static " : "");
final Map options = new HashMap (Options.getOptions ());
options.put ("PREFIX", prefix);
final JavaFileGenerator generator = new JavaFileGenerator (locations.getJavaCharStreamTemplateResourceUrl (),
options);
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create JavaCharStream " + e);
JavaCCErrors.semantic_error ("Could not open file JavaCharStream.java for writing.");
throw new Error ();
}
}
public static void gen_SimpleCharStream (final JavaResourceTemplateLocations locations)
{
try
{
final File file = new File (Options.getOutputDirectory (), "SimpleCharStream.java");
final OutputFile outputFile = new OutputFile (file,
charStreamVersion,
new String [] { Options.USEROPTION__STATIC,
Options.USEROPTION__SUPPORT_CLASS_VISIBILITY_PUBLIC });
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final String prefix = (Options.getStatic () ? "static " : "");
final Map options = new HashMap (Options.getOptions ());
options.put ("PREFIX", prefix);
final JavaFileGenerator generator = new JavaFileGenerator (locations.getSimpleCharStreamTemplateResourceUrl (),
options);
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create SimpleCharStream " + e);
JavaCCErrors.semantic_error ("Could not open file SimpleCharStream.java for writing.");
throw new Error ();
}
}
public static void gen_CharStream (final JavaResourceTemplateLocations locations)
{
try
{
final File file = new File (Options.getOutputDirectory (), "CharStream.java");
final OutputFile outputFile = new OutputFile (file,
charStreamVersion,
new String [] { Options.USEROPTION__STATIC,
Options.USEROPTION__SUPPORT_CLASS_VISIBILITY_PUBLIC });
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final JavaFileGenerator generator = new JavaFileGenerator (locations.getCharStreamTemplateResourceUrl (),
Options.getOptions ());
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create CharStream " + e);
JavaCCErrors.semantic_error ("Could not open file CharStream.java for writing.");
throw new Error ();
}
}
public static void gen_JavaModernFiles ()
{
genMiscFile ("Provider.java", "/templates/gwt/Provider.template");
genMiscFile ("StringProvider.java", "/templates/gwt/StringProvider.template");
// This provides a bridge to standard Java readers.
genMiscFile ("StreamProvider.java", "/templates/gwt/StreamProvider.template");
}
private static void genMiscFile (final String fileName, final String templatePath) throws Error
{
try
{
final File file = new File (Options.getOutputDirectory (), fileName);
final OutputFile outputFile = new OutputFile (file,
parseExceptionVersion,
new String [] {/*
* cba --
* 2013/07/22
* --
* previously
* wired to a
* typo
* version of
* this
* option --
* KEEP_LINE_COL
*/Options.USEROPTION__KEEP_LINE_COLUMN });
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final JavaFileGenerator generator = new JavaFileGenerator (templatePath, Options.getOptions ());
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create " + fileName + " " + e);
JavaCCErrors.semantic_error ("Could not open file " + fileName + " for writing.");
throw new Error ();
}
}
public static void gen_ParseException (final JavaResourceTemplateLocations locations)
{
try
{
final File file = new File (Options.getOutputDirectory (), "ParseException.java");
final OutputFile outputFile = new OutputFile (file,
parseExceptionVersion,
new String [] {/*
* cba --
* 2013/07/22
* --
* previously
* wired to a
* typo
* version of
* this
* option --
* KEEP_LINE_COL
*/Options.USEROPTION__KEEP_LINE_COLUMN });
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final JavaFileGenerator generator = new JavaFileGenerator (locations.getParseExceptionTemplateResourceUrl (),
Options.getOptions ());
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create ParseException " + e);
JavaCCErrors.semantic_error ("Could not open file ParseException.java for writing.");
throw new Error ();
}
}
public static void gen_TokenMgrError (final JavaResourceTemplateLocations locations)
{
final boolean isLegacyExceptionHandling = Options.isLegacyExceptionHandling ();
final String filename = isLegacyExceptionHandling ? "TokenMgrError.java" : "TokenMgrException.java";
try
{
final File file = new File (Options.getOutputDirectory (), filename);
final OutputFile outputFile = new OutputFile (file, tokenMgrErrorVersion, new String [0]);
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final JavaFileGenerator generator = new JavaFileGenerator (locations.getTokenMgrErrorTemplateResourceUrl (),
Options.getOptions ());
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create " + filename + " " + e);
JavaCCErrors.semantic_error ("Could not open file " + filename + " for writing.");
throw new Error ();
}
}
public static void gen_Token (final JavaResourceTemplateLocations locations)
{
try
{
final File file = new File (Options.getOutputDirectory (), "Token.java");
final OutputFile outputFile = new OutputFile (file,
tokenVersion,
new String [] { Options.USEROPTION__TOKEN_EXTENDS, /*
* cba
* --
* 2013
* /
* 07
* /
* 22
* --
* previously
* wired
* to
* a
* typo
* version
* of
* this
* option
* --
* KEEP_LINE_COL
*/
Options.USEROPTION__KEEP_LINE_COLUMN,
Options.USEROPTION__SUPPORT_CLASS_VISIBILITY_PUBLIC });
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final JavaFileGenerator generator = new JavaFileGenerator (locations.getTokenTemplateResourceUrl (),
Options.getOptions ());
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create Token " + e);
JavaCCErrors.semantic_error ("Could not open file Token.java for writing.");
throw new Error ();
}
}
public static void gen_TokenManager (final JavaResourceTemplateLocations locations)
{
try
{
final File file = new File (Options.getOutputDirectory (), "TokenManager.java");
final OutputFile outputFile = new OutputFile (file,
tokenManagerVersion,
new String [] { Options.USEROPTION__SUPPORT_CLASS_VISIBILITY_PUBLIC });
if (!outputFile.needToWrite)
{
return;
}
final PrintWriter ostr = outputFile.getPrintWriter ();
if (cu_to_insertion_point_1.size () != 0 && ((Token) cu_to_insertion_point_1.get (0)).kind == PACKAGE)
{
for (int i = 1; i < cu_to_insertion_point_1.size (); i++)
{
if (((Token) cu_to_insertion_point_1.get (i)).kind == SEMICOLON)
{
cline = ((Token) (cu_to_insertion_point_1.get (0))).beginLine;
ccol = ((Token) (cu_to_insertion_point_1.get (0))).beginColumn;
for (int j = 0; j <= i; j++)
{
printToken ((Token) (cu_to_insertion_point_1.get (j)), ostr);
}
ostr.println ("");
ostr.println ("");
break;
}
}
}
final JavaFileGenerator generator = new JavaFileGenerator (locations.getTokenManagerTemplateResourceUrl (),
Options.getOptions ());
generator.generate (ostr);
ostr.close ();
}
catch (final IOException e)
{
System.err.println ("Failed to create TokenManager " + e);
JavaCCErrors.semantic_error ("Could not open file TokenManager.java for writing.");
throw new Error ();
}
}
public static void reInit ()
{}
}