org.javacc.parser.ParseGen 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 2011 Google Inc. All Rights Reserved.
// Author: [email protected] (Sreeni Viswanadha)
/* 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 static org.javacc.parser.JavaCCGlobals.cu_from_insertion_point_2;
import static org.javacc.parser.JavaCCGlobals.cu_name;
import static org.javacc.parser.JavaCCGlobals.cu_to_insertion_point_1;
import static org.javacc.parser.JavaCCGlobals.cu_to_insertion_point_2;
import static org.javacc.parser.JavaCCGlobals.getFileExtension;
import static org.javacc.parser.JavaCCGlobals.getIdString;
import static org.javacc.parser.JavaCCGlobals.jj2index;
import static org.javacc.parser.JavaCCGlobals.jjtreeGenerated;
import static org.javacc.parser.JavaCCGlobals.lookaheadNeeded;
import static org.javacc.parser.JavaCCGlobals.maskVals;
import static org.javacc.parser.JavaCCGlobals.maskindex;
import static org.javacc.parser.JavaCCGlobals.staticOpt;
import static org.javacc.parser.JavaCCGlobals.tokenCount;
import static org.javacc.parser.JavaCCGlobals.toolName;
import static org.javacc.parser.JavaCCGlobals.toolNames;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Generate the parser.
*/
public class ParseGen extends CodeGenerator implements JavaCCParserConstants
{
public void start (final boolean isJavaModernMode) throws MetaParseException
{
Token t = null;
if (JavaCCErrors.get_error_count () != 0)
{
throw new MetaParseException ();
}
if (Options.getBuildParser ())
{
final List tn = new ArrayList (toolNames);
tn.add (toolName);
// This is the first line generated -- the the comment line at the top of
// the generated parser
genCodeLine ("/* " + getIdString (tn, cu_name + ".java") + " */");
boolean implementsExists = false;
final boolean extendsExists = false;
if (cu_to_insertion_point_1.size () != 0)
{
final Object firstToken = cu_to_insertion_point_1.get (0);
printTokenSetup ((Token) firstToken);
ccol = 1;
for (final Iterator it = cu_to_insertion_point_1.iterator (); it.hasNext ();)
{
t = (Token) it.next ();
if (t.kind == IMPLEMENTS)
{
implementsExists = true;
}
else
if (t.kind == CLASS)
{
implementsExists = false;
}
printToken (t);
}
}
if (implementsExists)
{
genCode (", ");
}
else
{
genCode (" implements ");
}
genCode (cu_name + "Constants ");
if (cu_to_insertion_point_2.size () != 0)
{
printTokenSetup ((Token) (cu_to_insertion_point_2.get (0)));
for (final Iterator it = cu_to_insertion_point_2.iterator (); it.hasNext ();)
{
t = (Token) it.next ();
printToken (t);
}
}
genCodeLine ("");
genCodeLine ("");
new ParseEngine ().build (this);
if (Options.getStatic ())
{
genCodeLine (" static private " + Options.getBooleanType () + " jj_initialized_once = false;");
}
if (Options.getUserTokenManager ())
{
genCodeLine (" /** User defined Token Manager. */");
genCodeLine (" " + staticOpt () + "public TokenManager token_source;");
}
else
{
genCodeLine (" /** Generated Token Manager. */");
genCodeLine (" " + staticOpt () + "public " + cu_name + "TokenManager token_source;");
if (!Options.getUserCharStream ())
{
if (Options.getJavaUnicodeEscape ())
{
genCodeLine (" " + staticOpt () + "JavaCharStream jj_input_stream;");
}
else
{
genCodeLine (" " + staticOpt () + "SimpleCharStream jj_input_stream;");
}
}
}
genCodeLine (" /** Current token. */");
genCodeLine (" " + staticOpt () + "public Token token;");
genCodeLine (" /** Next token. */");
genCodeLine (" " + staticOpt () + "public Token jj_nt;");
if (!Options.getCacheTokens ())
{
genCodeLine (" " + staticOpt () + "private int jj_ntk;");
}
if (jj2index != 0)
{
genCodeLine (" " + staticOpt () + "private Token jj_scanpos, jj_lastpos;");
genCodeLine (" " + staticOpt () + "private int jj_la;");
if (lookaheadNeeded)
{
genCodeLine (" /** Whether we are looking ahead. */");
genCodeLine (" " + staticOpt () + "private " + Options.getBooleanType () + " jj_lookingAhead = false;");
genCodeLine (" " + staticOpt () + "private " + Options.getBooleanType () + " jj_semLA;");
}
}
if (Options.getErrorReporting ())
{
genCodeLine (" " + staticOpt () + "private int jj_gen;");
genCodeLine (" " + staticOpt () + "final private int[] jj_la1 = new int[" + maskindex + "];");
final int tokenMaskSize = (tokenCount - 1) / 32 + 1;
for (int i = 0; i < tokenMaskSize; i++)
{
genCodeLine (" static private int[] jj_la1_" + i + ";");
}
genCodeLine (" static {");
for (int i = 0; i < tokenMaskSize; i++)
{
genCodeLine (" jj_la1_init_" + i + "();");
}
genCodeLine (" }");
for (int i = 0; i < tokenMaskSize; i++)
{
genCodeLine (" private static void jj_la1_init_" + i + "() {");
genCode (" jj_la1_" + i + " = new int[] {");
for (final Iterator it = maskVals.iterator (); it.hasNext ();)
{
final int [] tokenMask = (int []) (it.next ());
genCode ("0x" + Integer.toHexString (tokenMask[i]) + ",");
}
genCodeLine ("};");
genCodeLine (" }");
}
}
if (jj2index != 0 && Options.getErrorReporting ())
{
genCodeLine (" " + staticOpt () + "final private JJCalls[] jj_2_rtns = new JJCalls[" + jj2index + "];");
genCodeLine (" " + staticOpt () + "private " + Options.getBooleanType () + " jj_rescan = false;");
genCodeLine (" " + staticOpt () + "private int jj_gc = 0;");
}
genCodeLine ("");
if (!Options.getUserTokenManager ())
{
if (Options.getUserCharStream ())
{
genCodeLine (" /** Constructor with user supplied CharStream. */");
genCodeLine (" public " + cu_name + "(CharStream stream) {");
if (Options.getStatic ())
{
genCodeLine (" if (jj_initialized_once) {");
genCodeLine (" System.out.println(\"ERROR: Second call to constructor of static parser. \");");
genCodeLine (" System.out.println(\" You must either use ReInit() "
+ "or set the JavaCC option STATIC to false\");");
genCodeLine (" System.out.println(\" during parser generation.\");");
genCodeLine (" throw new " +
(Options.isLegacyExceptionHandling () ? "Error" : "RuntimeException") +
"();");
genCodeLine (" }");
genCodeLine (" jj_initialized_once = true;");
}
if (Options.getTokenManagerUsesParser () && !Options.getStatic ())
{
genCodeLine (" token_source = new " + cu_name + "TokenManager(this, stream);");
}
else
{
genCodeLine (" token_source = new " + cu_name + "TokenManager(stream);");
}
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
if (maskindex > 0)
{
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
}
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" /** Reinitialise. */");
genCodeLine (" " + staticOpt () + "public void ReInit(CharStream stream) {");
if (Options.isTokenManagerRequiresParserAccess ())
{
genCodeLine (" token_source.ReInit(this,stream);");
}
else
{
genCodeLine (" token_source.ReInit(stream);");
}
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (lookaheadNeeded)
{
genCodeLine (" jj_lookingAhead = false;");
}
if (jjtreeGenerated)
{
genCodeLine (" jjtree.reset();");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
if (maskindex > 0)
{
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
}
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
}
else
{
if (!isJavaModernMode)
{
genCodeLine (" /** Constructor with InputStream. */");
genCodeLine (" public " + cu_name + "(java.io.InputStream stream) {");
genCodeLine (" this(stream, null);");
genCodeLine (" }");
genCodeLine (" /** Constructor with InputStream and supplied encoding */");
genCodeLine (" public " + cu_name + "(java.io.InputStream stream, String encoding) {");
if (Options.getStatic ())
{
genCodeLine (" if (jj_initialized_once) {");
genCodeLine (" System.out.println(\"ERROR: Second call to constructor of static parser. \");");
genCodeLine (" System.out.println(\" You must either use ReInit() or "
+ "set the JavaCC option STATIC to false\");");
genCodeLine (" System.out.println(\" during parser generation.\");");
genCodeLine (" throw new " +
(Options.isLegacyExceptionHandling () ? "Error" : "RuntimeException") +
"();");
genCodeLine (" }");
genCodeLine (" jj_initialized_once = true;");
}
if (Options.getJavaUnicodeEscape ())
{
if (!Options.getGenerateChainedException ())
{
genCodeLine (" try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } "
+ "catch(java.io.UnsupportedEncodingException e) {"
+ " throw new RuntimeException(e.getMessage()); }");
}
else
{
genCodeLine (" try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } "
+ "catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }");
}
}
else
{
if (!Options.getGenerateChainedException ())
{
genCodeLine (" try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } "
+ "catch(java.io.UnsupportedEncodingException e) { "
+ "throw new RuntimeException(e.getMessage()); }");
}
else
{
genCodeLine (" try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } "
+ "catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }");
}
}
if (Options.getTokenManagerUsesParser () && !Options.getStatic ())
{
genCodeLine (" token_source = new " + cu_name + "TokenManager(this, jj_input_stream);");
}
else
{
genCodeLine (" token_source = new " + cu_name + "TokenManager(jj_input_stream);");
}
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
if (maskindex > 0)
{
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
}
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" /** Reinitialise. */");
genCodeLine (" " + staticOpt () + "public void ReInit(java.io.InputStream stream) {");
genCodeLine (" ReInit(stream, null);");
genCodeLine (" }");
genCodeLine (" /** Reinitialise. */");
genCodeLine (" " + staticOpt () + "public void ReInit(java.io.InputStream stream, String encoding) {");
if (!Options.getGenerateChainedException ())
{
genCodeLine (" try { jj_input_stream.ReInit(stream, encoding, 1, 1); } "
+ "catch(java.io.UnsupportedEncodingException e) { "
+ "throw new RuntimeException(e.getMessage()); }");
}
else
{
genCodeLine (" try { jj_input_stream.ReInit(stream, encoding, 1, 1); } "
+ "catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }");
}
if (Options.isTokenManagerRequiresParserAccess ())
{
genCodeLine (" token_source.ReInit(this,jj_input_stream);");
}
else
{
genCodeLine (" token_source.ReInit(jj_input_stream);");
}
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (jjtreeGenerated)
{
genCodeLine (" jjtree.reset();");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
genCodeLine ("");
}
final String readerInterfaceName = isJavaModernMode ? "Provider" : "java.io.Reader";
final String stringReaderClass = isJavaModernMode ? "StringProvider" : "java.io.StringReader";
genCodeLine (" /** Constructor. */");
genCodeLine (" public " + cu_name + "(" + readerInterfaceName + " stream) {");
if (Options.getStatic ())
{
genCodeLine (" if (jj_initialized_once) {");
genCodeLine (" System.out.println(\"ERROR: Second call to constructor of static parser. \");");
genCodeLine (" System.out.println(\" You must either use ReInit() or "
+ "set the JavaCC option STATIC to false\");");
genCodeLine (" System.out.println(\" during parser generation.\");");
genCodeLine (" throw new " +
(Options.isLegacyExceptionHandling () ? "Error" : "RuntimeException") +
"();");
genCodeLine (" }");
genCodeLine (" jj_initialized_once = true;");
}
if (Options.getJavaUnicodeEscape ())
{
genCodeLine (" jj_input_stream = new JavaCharStream(stream, 1, 1);");
}
else
{
genCodeLine (" jj_input_stream = new SimpleCharStream(stream, 1, 1);");
}
if (Options.getTokenManagerUsesParser () && !Options.getStatic ())
{
genCodeLine (" token_source = new " + cu_name + "TokenManager(this, jj_input_stream);");
}
else
{
genCodeLine (" token_source = new " + cu_name + "TokenManager(jj_input_stream);");
}
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
if (maskindex > 0)
{
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
}
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
genCodeLine ("");
// Add-in a string based constructor because its convenient (modern
// only to prevent regressions)
if (isJavaModernMode)
{
genCodeLine (" /** Constructor. */");
genCodeLine (" public " +
cu_name +
"(String dsl) throws ParseException, " +
Options.getTokenMgrErrorClass () +
" {");
genCodeLine (" this(new " + stringReaderClass + "(dsl));");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" public void ReInit(String s) {");
genCodeLine (" ReInit(new " + stringReaderClass + "(s));");
genCodeLine (" }");
}
genCodeLine (" /** Reinitialise. */");
genCodeLine (" " + staticOpt () + "public void ReInit(" + readerInterfaceName + " stream) {");
if (Options.getJavaUnicodeEscape ())
{
genCodeLine (" if (jj_input_stream == null) {");
genCodeLine (" jj_input_stream = new JavaCharStream(stream, 1, 1);");
genCodeLine (" } else {");
genCodeLine (" jj_input_stream.ReInit(stream, 1, 1);");
genCodeLine (" }");
}
else
{
genCodeLine (" if (jj_input_stream == null) {");
genCodeLine (" jj_input_stream = new SimpleCharStream(stream, 1, 1);");
genCodeLine (" } else {");
genCodeLine (" jj_input_stream.ReInit(stream, 1, 1);");
genCodeLine (" }");
}
genCodeLine (" if (token_source == null) {");
genCodeLine (" token_source = new " + cu_name + "TokenManager(jj_input_stream);");
genCodeLine (" }");
genCodeLine ("");
if (Options.isTokenManagerRequiresParserAccess ())
{
genCodeLine (" token_source.ReInit(this,jj_input_stream);");
}
else
{
genCodeLine (" token_source.ReInit(jj_input_stream);");
}
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (jjtreeGenerated)
{
genCodeLine (" jjtree.reset();");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
if (maskindex > 0)
{
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
}
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
}
}
genCodeLine ("");
if (Options.getUserTokenManager ())
{
genCodeLine (" /** Constructor with user supplied Token Manager. */");
genCodeLine (" public " + cu_name + "(TokenManager tm) {");
}
else
{
genCodeLine (" /** Constructor with generated Token Manager. */");
genCodeLine (" public " + cu_name + "(" + cu_name + "TokenManager tm) {");
}
if (Options.getStatic ())
{
genCodeLine (" if (jj_initialized_once) {");
genCodeLine (" System.out.println(\"ERROR: Second call to constructor of static parser. \");");
genCodeLine (" System.out.println(\" You must either use ReInit() or "
+ "set the JavaCC option STATIC to false\");");
genCodeLine (" System.out.println(\" during parser generation.\");");
genCodeLine (" throw new " + (Options.isLegacyExceptionHandling () ? "Error" : "RuntimeException") + "();");
genCodeLine (" }");
genCodeLine (" jj_initialized_once = true;");
}
genCodeLine (" token_source = tm;");
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
if (maskindex > 0)
{
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
}
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
genCodeLine ("");
if (Options.getUserTokenManager ())
{
genCodeLine (" /** Reinitialise. */");
genCodeLine (" public void ReInit(TokenManager tm) {");
}
else
{
genCodeLine (" /** Reinitialise. */");
genCodeLine (" public void ReInit(" + cu_name + "TokenManager tm) {");
}
genCodeLine (" token_source = tm;");
genCodeLine (" token = new Token();");
if (Options.getCacheTokens ())
{
genCodeLine (" token.next = jj_nt = token_source.getNextToken();");
}
else
{
genCodeLine (" jj_ntk = -1;");
}
if (jjtreeGenerated)
{
genCodeLine (" jjtree.reset();");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen = 0;");
if (maskindex > 0)
{
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
}
if (jj2index != 0)
{
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
}
}
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" " + staticOpt () + "private Token jj_consume_token(int kind) throws ParseException {");
if (Options.getCacheTokens ())
{
genCodeLine (" Token oldToken = token;");
genCodeLine (" if ((token = jj_nt).next != null) jj_nt = jj_nt.next;");
genCodeLine (" else jj_nt = jj_nt.next = token_source.getNextToken();");
}
else
{
genCodeLine (" Token oldToken;");
genCodeLine (" if ((oldToken = token).next != null) token = token.next;");
genCodeLine (" else token = token.next = token_source.getNextToken();");
genCodeLine (" jj_ntk = -1;");
}
genCodeLine (" if (token.kind == kind) {");
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen++;");
if (jj2index != 0)
{
genCodeLine (" if (++jj_gc > 100) {");
genCodeLine (" jj_gc = 0;");
genCodeLine (" for (int i = 0; i < jj_2_rtns.length; i++) {");
genCodeLine (" JJCalls c = jj_2_rtns[i];");
genCodeLine (" while (c != null) {");
genCodeLine (" if (c.gen < jj_gen) c.first = null;");
genCodeLine (" c = c.next;");
genCodeLine (" }");
genCodeLine (" }");
genCodeLine (" }");
}
}
if (Options.getDebugParser ())
{
genCodeLine (" trace_token(token, \"\");");
}
genCodeLine (" return token;");
genCodeLine (" }");
if (Options.getCacheTokens ())
{
genCodeLine (" jj_nt = token;");
}
genCodeLine (" token = oldToken;");
if (Options.getErrorReporting ())
{
genCodeLine (" jj_kind = kind;");
}
genCodeLine (" throw generateParseException();");
genCodeLine (" }");
genCodeLine ("");
if (jj2index != 0)
{
genCodeLine (" @SuppressWarnings(\"serial\")");
genCodeLine (" static private final class LookaheadSuccess extends " +
(Options.isLegacyExceptionHandling () ? "java.lang.Error" : "java.lang.RuntimeException") +
" { }");
genCodeLine (" " + staticOpt () + "final private LookaheadSuccess jj_ls = new LookaheadSuccess();");
genCodeLine (" " + staticOpt () + "private " + Options.getBooleanType () + " jj_scan_token(int kind) {");
genCodeLine (" if (jj_scanpos == jj_lastpos) {");
genCodeLine (" jj_la--;");
genCodeLine (" if (jj_scanpos.next == null) {");
genCodeLine (" jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();");
genCodeLine (" } else {");
genCodeLine (" jj_lastpos = jj_scanpos = jj_scanpos.next;");
genCodeLine (" }");
genCodeLine (" } else {");
genCodeLine (" jj_scanpos = jj_scanpos.next;");
genCodeLine (" }");
if (Options.getErrorReporting ())
{
genCodeLine (" if (jj_rescan) {");
genCodeLine (" int i = 0; Token tok = token;");
genCodeLine (" while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }");
genCodeLine (" if (tok != null) jj_add_error_token(kind, i);");
if (Options.getDebugLookahead ())
{
genCodeLine (" } else {");
genCodeLine (" trace_scan(jj_scanpos, kind);");
}
genCodeLine (" }");
}
else
if (Options.getDebugLookahead ())
{
genCodeLine (" trace_scan(jj_scanpos, kind);");
}
genCodeLine (" if (jj_scanpos.kind != kind) return true;");
genCodeLine (" if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;");
genCodeLine (" return false;");
genCodeLine (" }");
genCodeLine ("");
}
genCodeLine ("");
genCodeLine ("/** Get the next Token. */");
genCodeLine (" " + staticOpt () + "final public Token getNextToken() {");
if (Options.getCacheTokens ())
{
genCodeLine (" if ((token = jj_nt).next != null) jj_nt = jj_nt.next;");
genCodeLine (" else jj_nt = jj_nt.next = token_source.getNextToken();");
}
else
{
genCodeLine (" if (token.next != null) token = token.next;");
genCodeLine (" else token = token.next = token_source.getNextToken();");
genCodeLine (" jj_ntk = -1;");
}
if (Options.getErrorReporting ())
{
genCodeLine (" jj_gen++;");
}
if (Options.getDebugParser ())
{
genCodeLine (" trace_token(token, \" (in getNextToken)\");");
}
genCodeLine (" return token;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine ("/** Get the specific Token. */");
genCodeLine (" " + staticOpt () + "final public Token getToken(int index) {");
if (lookaheadNeeded)
{
genCodeLine (" Token t = jj_lookingAhead ? jj_scanpos : token;");
}
else
{
genCodeLine (" Token t = token;");
}
genCodeLine (" for (int i = 0; i < index; i++) {");
genCodeLine (" if (t.next != null) t = t.next;");
genCodeLine (" else t = t.next = token_source.getNextToken();");
genCodeLine (" }");
genCodeLine (" return t;");
genCodeLine (" }");
genCodeLine ("");
if (!Options.getCacheTokens ())
{
genCodeLine (" " + staticOpt () + "private int jj_ntk_f() {");
genCodeLine (" if ((jj_nt=token.next) == null)");
genCodeLine (" return (jj_ntk = (token.next=token_source.getNextToken()).kind);");
genCodeLine (" else");
genCodeLine (" return (jj_ntk = jj_nt.kind);");
genCodeLine (" }");
genCodeLine ("");
}
if (Options.getErrorReporting ())
{
if (!Options.getGenerateGenerics ())
{
genCodeLine (" " + staticOpt () + "private java.util.List jj_expentries = new java.util.ArrayList();");
}
else
{
genCodeLine (" " +
staticOpt () +
"private java.util.List jj_expentries = new java.util.ArrayList();");
}
genCodeLine (" " + staticOpt () + "private int[] jj_expentry;");
genCodeLine (" " + staticOpt () + "private int jj_kind = -1;");
if (jj2index != 0)
{
genCodeLine (" " + staticOpt () + "private int[] jj_lasttokens = new int[100];");
genCodeLine (" " + staticOpt () + "private int jj_endpos;");
genCodeLine ("");
genCodeLine (" " + staticOpt () + "private void jj_add_error_token(int kind, int pos) {");
genCodeLine (" if (pos >= 100) {");
genCodeLine (" return;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" if (pos == jj_endpos + 1) {");
genCodeLine (" jj_lasttokens[jj_endpos++] = kind;");
genCodeLine (" } else if (jj_endpos != 0) {");
genCodeLine (" jj_expentry = new int[jj_endpos];");
genCodeLine ("");
genCodeLine (" for (int i = 0; i < jj_endpos; i++) {");
genCodeLine (" jj_expentry[i] = jj_lasttokens[i];");
genCodeLine (" }");
genCodeLine ("");
if (!Options.getGenerateGenerics ())
{
genCodeLine (" for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) {");
genCodeLine (" int[] oldentry = (int[])(it.next());");
}
else
{
genCodeLine (" for (int[] oldentry : jj_expentries) {");
}
genCodeLine (" if (oldentry.length == jj_expentry.length) {");
genCodeLine (" boolean isMatched = true;");
genCodeLine ("");
genCodeLine (" for (int i = 0; i < jj_expentry.length; i++) {");
genCodeLine (" if (oldentry[i] != jj_expentry[i]) {");
genCodeLine (" isMatched = false;");
genCodeLine (" break;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" }");
genCodeLine (" if (isMatched) {");
genCodeLine (" jj_expentries.add(jj_expentry);");
genCodeLine (" break;");
genCodeLine (" }");
genCodeLine (" }");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" if (pos != 0) {");
genCodeLine (" jj_lasttokens[(jj_endpos = pos) - 1] = kind;");
genCodeLine (" }");
genCodeLine (" }");
genCodeLine (" }");
}
genCodeLine ("");
genCodeLine (" /** Generate ParseException. */");
genCodeLine (" " + staticOpt () + "public ParseException generateParseException() {");
genCodeLine (" jj_expentries.clear();");
genCodeLine (" " +
Options.getBooleanType () +
"[] la1tokens = new " +
Options.getBooleanType () +
"[" +
tokenCount +
"];");
genCodeLine (" if (jj_kind >= 0) {");
genCodeLine (" la1tokens[jj_kind] = true;");
genCodeLine (" jj_kind = -1;");
genCodeLine (" }");
genCodeLine (" for (int i = 0; i < " + maskindex + "; i++) {");
genCodeLine (" if (jj_la1[i] == jj_gen) {");
genCodeLine (" for (int j = 0; j < 32; j++) {");
for (int i = 0; i < (tokenCount - 1) / 32 + 1; i++)
{
genCodeLine (" if ((jj_la1_" + i + "[i] & (1<. "
+ "Encountered: \" + mess);");
}
genCodeLine (" }");
}
genCodeLine ("");
if (Options.getDebugParser ())
{
genCodeLine (" " + staticOpt () + "private int trace_indent = 0;");
genCodeLine (" " + staticOpt () + "private " + Options.getBooleanType () + " trace_enabled = true;");
genCodeLine ("");
genCodeLine ("/** Enable tracing. */");
genCodeLine (" " + staticOpt () + "final public void enable_tracing() {");
genCodeLine (" trace_enabled = true;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine ("/** Disable tracing. */");
genCodeLine (" " + staticOpt () + "final public void disable_tracing() {");
genCodeLine (" trace_enabled = false;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" " + staticOpt () + "protected void trace_call(String s) {");
genCodeLine (" if (trace_enabled) {");
genCodeLine (" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
genCodeLine (" System.out.println(\"Call: \" + s);");
genCodeLine (" }");
genCodeLine (" trace_indent = trace_indent + 2;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" " + staticOpt () + "protected void trace_return(String s) {");
genCodeLine (" trace_indent = trace_indent - 2;");
genCodeLine (" if (trace_enabled) {");
genCodeLine (" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
genCodeLine (" System.out.println(\"Return: \" + s);");
genCodeLine (" }");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" " + staticOpt () + "protected void trace_token(Token t, String where) {");
genCodeLine (" if (trace_enabled) {");
genCodeLine (" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
genCodeLine (" System.out.print(\"Consumed token: <\" + tokenImage[t.kind]);");
genCodeLine (" if (t.kind != 0 && !tokenImage[t.kind].equals(\"\\\"\" + t.image + \"\\\"\")) {");
genCodeLine (" System.out.print(\": \\\"\" + " +
Options.getTokenMgrErrorClass () +
".addEscapes(" +
"t.image) + \"\\\"\");");
genCodeLine (" }");
genCodeLine (" System.out.println(\" at line \" + t.beginLine + "
+ "\" column \" + t.beginColumn + \">\" + where);");
genCodeLine (" }");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" " + staticOpt () + "protected void trace_scan(Token t1, int t2) {");
genCodeLine (" if (trace_enabled) {");
genCodeLine (" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
genCodeLine (" System.out.print(\"Visited token: <\" + tokenImage[t1.kind]);");
genCodeLine (" if (t1.kind != 0 && !tokenImage[t1.kind].equals(\"\\\"\" + t1.image + \"\\\"\")) {");
genCodeLine (" System.out.print(\": \\\"\" + " +
Options.getTokenMgrErrorClass () +
".addEscapes(" +
"t1.image) + \"\\\"\");");
genCodeLine (" }");
genCodeLine (" System.out.println(\" at line \" + t1.beginLine + \""
+ " column \" + t1.beginColumn + \">; Expected token: <\" + tokenImage[t2] + \">\");");
genCodeLine (" }");
genCodeLine (" }");
genCodeLine ("");
}
else
{
genCodeLine (" /** Enable tracing. */");
genCodeLine (" " + staticOpt () + "final public void enable_tracing() {");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" /** Disable tracing. */");
genCodeLine (" " + staticOpt () + "final public void disable_tracing() {");
genCodeLine (" }");
genCodeLine ("");
}
if (jj2index != 0 && Options.getErrorReporting ())
{
genCodeLine (" " + staticOpt () + "private void jj_rescan_token() {");
genCodeLine (" jj_rescan = true;");
genCodeLine (" for (int i = 0; i < " + jj2index + "; i++) {");
genCodeLine (" try {");
genCodeLine (" JJCalls p = jj_2_rtns[i];");
genCodeLine ("");
genCodeLine (" do {");
genCodeLine (" if (p.gen > jj_gen) {");
genCodeLine (" jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;");
genCodeLine (" switch (i) {");
for (int i = 0; i < jj2index; i++)
{
genCodeLine (" case " + i + ": jj_3_" + (i + 1) + "(); break;");
}
genCodeLine (" }");
genCodeLine (" }");
genCodeLine (" p = p.next;");
genCodeLine (" } while (p != null);");
genCodeLine ("");
genCodeLine (" } catch(LookaheadSuccess ls) { }");
genCodeLine (" }");
genCodeLine (" jj_rescan = false;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" " + staticOpt () + "private void jj_save(int index, int xla) {");
genCodeLine (" JJCalls p = jj_2_rtns[index];");
genCodeLine (" while (p.gen > jj_gen) {");
genCodeLine (" if (p.next == null) { p = p.next = new JJCalls(); break; }");
genCodeLine (" p = p.next;");
genCodeLine (" }");
genCodeLine ("");
genCodeLine (" p.gen = jj_gen + xla - jj_la; ");
genCodeLine (" p.first = token;");
genCodeLine (" p.arg = xla;");
genCodeLine (" }");
genCodeLine ("");
}
if (jj2index != 0 && Options.getErrorReporting ())
{
genCodeLine (" static final class JJCalls {");
genCodeLine (" int gen;");
genCodeLine (" Token first;");
genCodeLine (" int arg;");
genCodeLine (" JJCalls next;");
genCodeLine (" }");
genCodeLine ("");
}
if (cu_from_insertion_point_2.size () != 0)
{
printTokenSetup ((Token) (cu_from_insertion_point_2.get (0)));
ccol = 1;
for (final Iterator it = cu_from_insertion_point_2.iterator (); it.hasNext ();)
{
t = (Token) it.next ();
printToken (t);
}
printTrailingComments (t);
}
genCodeLine ("");
saveOutput (Options.getOutputDirectory () +
File.separator +
cu_name +
getFileExtension (Options.getOutputLanguage ()));
} // matches "if (Options.getBuildParser())"
}
public static void reInit ()
{
lookaheadNeeded = false;
}
}