diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java
index fdb9388..ba930ac 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java
@@ -1,4 +1,4 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. DDLParser.java */
+/* Generated By:JJTree&JavaCC: Do not edit this line. DDLParser.java */
 /*******************************************************************************
  * Copyright (c) 2011 Oracle. All rights reserved.
  * This program and the accompanying materials are made available under the
@@ -10,3487 +10,3157 @@
  *
  * Contributors:
  *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
+ ******************************************************************************/
+package org.eclipse.persistence.tools.oracleddl.parser;
+
 //javase imports
-import java.io.InputStream;
-import java.util.List;
-import java.util.HashMap;
-import java.util.Map;
-
+import java.io.InputStream;
+import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+
 //metadata imports
-import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentTypeDirection;
-import org.eclipse.persistence.tools.oracleddl.metadata.BlobType;
-import org.eclipse.persistence.tools.oracleddl.metadata.CharType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ClobType;
-import org.eclipse.persistence.tools.oracleddl.metadata.CompositeDatabaseType;
-import org.eclipse.persistence.tools.oracleddl.metadata.DatabaseType;
-import org.eclipse.persistence.tools.oracleddl.metadata.DecimalType;
-import org.eclipse.persistence.tools.oracleddl.metadata.DoubleType;
-import org.eclipse.persistence.tools.oracleddl.metadata.FieldType;
-import org.eclipse.persistence.tools.oracleddl.metadata.FloatType;
-import org.eclipse.persistence.tools.oracleddl.metadata.FunctionType;
-import org.eclipse.persistence.tools.oracleddl.metadata.IntervalDayToSecond;
-import org.eclipse.persistence.tools.oracleddl.metadata.IntervalYearToMonth;
-import org.eclipse.persistence.tools.oracleddl.metadata.LongType;
-import org.eclipse.persistence.tools.oracleddl.metadata.LongRawType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NCharType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NClobType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NumericType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NVarChar2Type;
-import org.eclipse.persistence.tools.oracleddl.metadata.ObjectType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ObjectTableType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCollectionType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCursorType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLPackageType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLRecordType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLSubType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ProcedureType;
-import org.eclipse.persistence.tools.oracleddl.metadata.RawType;
-import org.eclipse.persistence.tools.oracleddl.metadata.RealType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ROWTYPEType;
-import org.eclipse.persistence.tools.oracleddl.metadata.TableType;
-import org.eclipse.persistence.tools.oracleddl.metadata.TimeStampType;
-import org.eclipse.persistence.tools.oracleddl.metadata.TYPEType;
-import org.eclipse.persistence.tools.oracleddl.metadata.URowIdType;
-import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedSizedType;
-import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedType;
-import org.eclipse.persistence.tools.oracleddl.metadata.VarCharType;
-import org.eclipse.persistence.tools.oracleddl.metadata.VarChar2Type;
-import org.eclipse.persistence.tools.oracleddl.metadata.VArrayType;
-import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypesRepository;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BFILE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_FLOAT_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_DOUBLE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BOOLEAN_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.DATE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.MLSLABEL_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.NATURAL_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.PLS_INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.POSITIVE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.ROWID_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIGN_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_DOUBLE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_FLOAT_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SMALLINT_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SYS_REFCURSOR_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.TIME_TYPE;
-
+import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentTypeDirection;
+import org.eclipse.persistence.tools.oracleddl.metadata.BlobType;
+import org.eclipse.persistence.tools.oracleddl.metadata.CharType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ClobType;
+import org.eclipse.persistence.tools.oracleddl.metadata.CompositeDatabaseType;
+import org.eclipse.persistence.tools.oracleddl.metadata.DatabaseType;
+import org.eclipse.persistence.tools.oracleddl.metadata.DecimalType;
+import org.eclipse.persistence.tools.oracleddl.metadata.DoubleType;
+import org.eclipse.persistence.tools.oracleddl.metadata.FieldType;
+import org.eclipse.persistence.tools.oracleddl.metadata.FloatType;
+import org.eclipse.persistence.tools.oracleddl.metadata.FunctionType;
+import org.eclipse.persistence.tools.oracleddl.metadata.IntervalDayToSecond;
+import org.eclipse.persistence.tools.oracleddl.metadata.IntervalYearToMonth;
+import org.eclipse.persistence.tools.oracleddl.metadata.LongType;
+import org.eclipse.persistence.tools.oracleddl.metadata.LongRawType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NCharType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NClobType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NumericType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NVarChar2Type;
+import org.eclipse.persistence.tools.oracleddl.metadata.ObjectType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ObjectTableType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCollectionType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCursorType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLPackageType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLRecordType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLSubType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ProcedureType;
+import org.eclipse.persistence.tools.oracleddl.metadata.RawType;
+import org.eclipse.persistence.tools.oracleddl.metadata.RealType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ROWTYPEType;
+import org.eclipse.persistence.tools.oracleddl.metadata.TableType;
+import org.eclipse.persistence.tools.oracleddl.metadata.TimeStampType;
+import org.eclipse.persistence.tools.oracleddl.metadata.TYPEType;
+import org.eclipse.persistence.tools.oracleddl.metadata.URowIdType;
+import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedSizedType;
+import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedType;
+import org.eclipse.persistence.tools.oracleddl.metadata.VarCharType;
+import org.eclipse.persistence.tools.oracleddl.metadata.VarChar2Type;
+import org.eclipse.persistence.tools.oracleddl.metadata.VArrayType;
+import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypesRepository;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BFILE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_FLOAT_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_DOUBLE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BOOLEAN_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.DATE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.MLSLABEL_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.NATURAL_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.PLS_INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.POSITIVE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.ROWID_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIGN_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_DOUBLE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_FLOAT_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SMALLINT_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SYS_REFCURSOR_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.TIME_TYPE;
+
 @SuppressWarnings("all")
-public class DDLParser/*@bgen(jjtree)*/implements DDLParserTreeConstants, DDLParserConstants {/*@bgen(jjtree)*/
-  protected JJTDDLParserState jjtree = new JJTDDLParserState();
-    protected Map<String, DatabaseType> localTypes = new HashMap<String, DatabaseType>();
-
-    protected DatabaseTypesRepository typesRepository = new DatabaseTypesRepository();
-
-    public DDLParser() {
-        super();
-    }
-
-    public void setTypesRepository(DatabaseTypesRepository typesRepository) {
-        this.typesRepository = typesRepository;
-    }
-    public DatabaseTypesRepository getTypesRepository() {
-        return typesRepository;
-    }
-
-    protected String removeQuotes(String quotedString) {
-        return quotedString.substring(1, quotedString.length() - 1);
-    }
-
+public class DDLParser/*@bgen(jjtree)*/implements DDLParserTreeConstants, DDLParserConstants {/*@bgen(jjtree)*/
+  protected JJTDDLParserState jjtree = new JJTDDLParserState();
+    protected Map<String, DatabaseType> localTypes = new HashMap<String, DatabaseType>();
+
+    protected DatabaseTypesRepository typesRepository = new DatabaseTypesRepository();
+
+    public DDLParser() {
+        super();
+    }
+
+    public void setTypesRepository(DatabaseTypesRepository typesRepository) {
+        this.typesRepository = typesRepository;
+    }
+    public DatabaseTypesRepository getTypesRepository() {
+        return typesRepository;
+    }
+
+    protected String removeQuotes(String quotedString) {
+        return quotedString.substring(1, quotedString.length() - 1);
+    }
+
 // stripped-down version of PLSQL grammar: only parses package/top-level DDL specifications
-
+
 // PLSQLPackage at 'top-level'
-  final public PLSQLPackageType parsePLSQLPackage() throws ParseException {
- PLSQLPackageType packageType = new PLSQLPackageType();
- String schema = null;
- String packageName = null;
-    jj_consume_token(R_CREATE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_OR:
-      orReplace();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(K_PACKAGE);
-    if (jj_2_1(2)) {
-      schema = OracleObjectName();
-      jj_consume_token(O_DOT);
-    } else {
-      ;
-    }
-    packageName = OracleObjectName();
-          if (schema != null) {
-            packageType.setSchema(schema);
-          }
-          packageType.setPackageName(packageName);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_AUTHID:
-      invokerRights();
-      break;
-    default:
-      ;
-    }
-    as();
-    label_1:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case R_CURSOR:
-      case R_FUNCTION:
-      case R_PROCEDURE:
-      case R_SUBTYPE:
-      case R_TYPE:
-      case K_PRAGMA:
-      case S_IDENTIFIER:
-        ;
-        break;
-      default:
-        break label_1;
-      }
-      packageDeclaration(packageType);
-    }
-    jj_consume_token(R_END);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case S_IDENTIFIER:
-    case S_QUOTED_IDENTIFIER:
-      OracleObjectName();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(O_SEMICOLON);
-    jj_consume_token(0);
-      typesRepository.setDatabaseType(packageName, packageType);
-      {if (true) return packageType;}
-    throw new Error("Missing return statement in function");
-  }
-
+  final public PLSQLPackageType parsePLSQLPackage() throws ParseException {
+ PLSQLPackageType packageType = new PLSQLPackageType();
+ String dottedName = null;
+ String schema = null;
+ String packageName = null;
+    jj_consume_token(R_CREATE);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_OR:
+      orReplace();
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(K_PACKAGE);
+    dottedName = OracleObjectNamePossiblyDotted();
+          packageName = dottedName;
+          if (dottedName.contains(".")) {
+              int idx = dottedName.indexOf(".");
+              schema = dottedName.substring(0, idx);
+              packageName = dottedName.substring(idx+1, dottedName.length());
+          }
+          if (schema != null) {
+            packageType.setSchema(schema);
+          }
+          packageType.setPackageName(packageName);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_AUTHID:
+      invokerRights();
+      break;
+    default:
+      ;
+    }
+    as();
+    label_1:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_CURSOR:
+      case R_FUNCTION:
+      case R_PROCEDURE:
+      case R_SUBTYPE:
+      case R_TYPE:
+      case K_PRAGMA:
+      case S_IDENTIFIER:
+        ;
+        break;
+      default:
+        break label_1;
+      }
+      packageDeclaration(packageType);
+    }
+    jj_consume_token(R_END);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case S_IDENTIFIER:
+    case S_QUOTED_IDENTIFIER:
+      OracleObjectName();
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(O_SEMICOLON);
+    jj_consume_token(0);
+      typesRepository.setDatabaseType(packageName, packageType);
+      {if (true) return packageType;}
+    throw new Error("Missing return statement in function");
+  }
+
 // procedure at 'top-level'
-  final public ProcedureType parseTopLevelProcedure() throws ParseException {
- ProcedureType procedureType = null;
- String schema = null;
- String procedureName = null;
-    jj_consume_token(R_CREATE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_OR:
-      orReplace();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(R_PROCEDURE);
-    if (jj_2_2(2)) {
-      schema = OracleObjectName();
-      jj_consume_token(O_DOT);
-    } else {
-      ;
-    }
-    procedureName = OracleObjectName();
-          procedureType = new ProcedureType(procedureName);
-              if (schema != null) {
-                  procedureType.setSchema(schema);
-              }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_OPENPAREN:
-      jj_consume_token(O_OPENPAREN);
-      argumentList(procedureType);
-      jj_consume_token(O_CLOSEPAREN);
-      break;
-    default:
-      ;
-    }
-    as();
-    skipToEnd();
-      typesRepository.setDatabaseType(procedureName, procedureType);
-      {if (true) return procedureType;}
-    throw new Error("Missing return statement in function");
-  }
-
+  final public ProcedureType parseTopLevelProcedure() throws ParseException {
+ ProcedureType procedureType = null;
+ String dottedName = null;
+ String schema = null;
+ String procedureName = null;
+    jj_consume_token(R_CREATE);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_OR:
+      orReplace();
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(R_PROCEDURE);
+    dottedName = OracleObjectNamePossiblyDotted();
+          procedureName = dottedName;
+          if (dottedName.contains(".")) {
+              int idx = dottedName.indexOf(".");
+              schema = dottedName.substring(0, idx);
+              procedureName = dottedName.substring(idx+1, dottedName.length());
+          }
+          procedureType = new ProcedureType(procedureName);
+              if (schema != null) {
+                  procedureType.setSchema(schema);
+              }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_OPENPAREN:
+      jj_consume_token(O_OPENPAREN);
+      argumentList(procedureType);
+      jj_consume_token(O_CLOSEPAREN);
+      break;
+    default:
+      ;
+    }
+    as();
+    skipToEnd();
+      typesRepository.setDatabaseType(procedureName, procedureType);
+      {if (true) return procedureType;}
+    throw new Error("Missing return statement in function");
+  }
+
 // function at 'top-level'
-  final public FunctionType parseTopLevelFunction() throws ParseException {
- FunctionType functionType = null;
- String schema = null;
- String functionName = null;
- ArgumentType returnType = null;
-    jj_consume_token(R_CREATE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_OR:
-      orReplace();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(R_FUNCTION);
-    if (jj_2_3(2)) {
-      schema = OracleObjectName();
-      jj_consume_token(O_DOT);
-    } else {
-      ;
-    }
-    functionName = OracleObjectName();
-              functionType = new FunctionType(functionName);
-          if (schema != null) {
-              functionType.setSchema(schema);
-          }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_OPENPAREN:
-      jj_consume_token(O_OPENPAREN);
-      argumentList(functionType);
-      jj_consume_token(O_CLOSEPAREN);
-      break;
-    default:
-      ;
-    }
-    returnType = functionReturnSpec();
-    as();
-    skipToEnd();
-      functionType.setReturnArgument(returnType);
-      typesRepository.setDatabaseType(functionName, functionType);
-      {if (true) return functionType;}
-    throw new Error("Missing return statement in function");
-  }
-
+  final public FunctionType parseTopLevelFunction() throws ParseException {
+ FunctionType functionType = null;
+ String dottedName = null;
+ String schema = null;
+ String functionName = null;
+ ArgumentType returnType = null;
+    jj_consume_token(R_CREATE);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_OR:
+      orReplace();
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(R_FUNCTION);
+    dottedName = OracleObjectNamePossiblyDotted();
+          functionName = dottedName;
+          if (dottedName.contains(".")) {
+              int idx = dottedName.indexOf(".");
+              schema = dottedName.substring(0, idx);
+              functionName = dottedName.substring(idx+1, dottedName.length());
+          }
+              functionType = new FunctionType(functionName);
+          if (schema != null) {
+              functionType.setSchema(schema);
+          }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_OPENPAREN:
+      jj_consume_token(O_OPENPAREN);
+      argumentList(functionType);
+      jj_consume_token(O_CLOSEPAREN);
+      break;
+    default:
+      ;
+    }
+    returnType = functionReturnSpec();
+    as();
+    skipToEnd();
+      functionType.setReturnArgument(returnType);
+      typesRepository.setDatabaseType(functionName, functionType);
+      {if (true) return functionType;}
+    throw new Error("Missing return statement in function");
+  }
+
 // table at 'top-level'
-  final public TableType parseTable() throws ParseException {
- TableType tableType = null;
- String schema = null;
- String tableName = null;
- Token iot = null;
-    jj_consume_token(R_CREATE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_GLOBAL:
-      jj_consume_token(K_GLOBAL);
-      jj_consume_token(K_TEMPORARY);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(R_TABLE);
-    if (jj_2_4(2)) {
-      schema = OracleObjectName();
-      jj_consume_token(O_DOT);
-    } else {
-      ;
-    }
-    tableName = OracleObjectName();
-          tableType = new TableType(tableName);
-                  if (schema != null) {
-                       tableType.setSchema(schema);
-                  }
-    jj_consume_token(O_OPENPAREN);
-    columnDeclarations(tableType);
-    jj_consume_token(O_CLOSEPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_ORGANIZATION:
-      jj_consume_token(K_ORGANIZATION);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_INDEX:
-      iot = jj_consume_token(R_INDEX);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOCOMPRESS:
-      jj_consume_token(R_NOCOMPRESS);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_OVERFLOW:
-      jj_consume_token(K_OVERFLOW);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_ON:
-      jj_consume_token(R_ON);
-      jj_consume_token(K_COMMIT);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_DELETE:
-      case K_PRESERVE:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case K_DELETE:
-          jj_consume_token(K_DELETE);
-          break;
-        case K_PRESERVE:
-          jj_consume_token(K_PRESERVE);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(K_ROWS);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(O_SEMICOLON);
-    jj_consume_token(0);
-         if (iot != null) {
-             tableType.setIOT(true);
-         }
-         typesRepository.setDatabaseType(tableName, tableType);
-         {if (true) return tableType;}
-    throw new Error("Missing return statement in function");
-  }
-
+  final public TableType parseTable() throws ParseException {
+ TableType tableType = null;
+ String dottedName = null;
+ String schema = null;
+ String tableName = null;
+ Token iot = null;
+    jj_consume_token(R_CREATE);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_GLOBAL:
+      jj_consume_token(K_GLOBAL);
+      jj_consume_token(K_TEMPORARY);
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(R_TABLE);
+    dottedName = OracleObjectNamePossiblyDotted();
+          tableName = dottedName;
+          if (dottedName.contains(".")) {
+              int idx = dottedName.indexOf(".");
+              schema = dottedName.substring(0, idx);
+              tableName = dottedName.substring(idx+1, dottedName.length());
+          }
+          tableType = new TableType(tableName);
+                  if (schema != null) {
+                       tableType.setSchema(schema);
+                  }
+    jj_consume_token(O_OPENPAREN);
+    columnDeclarations(tableType);
+    jj_consume_token(O_CLOSEPAREN);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_ORGANIZATION:
+      jj_consume_token(K_ORGANIZATION);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_INDEX:
+      iot = jj_consume_token(R_INDEX);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOCOMPRESS:
+      jj_consume_token(R_NOCOMPRESS);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_OVERFLOW:
+      jj_consume_token(K_OVERFLOW);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_ON:
+      onCommit();
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(O_SEMICOLON);
+    jj_consume_token(0);
+         if (iot != null) {
+             tableType.setIOT(true);
+         }
+         typesRepository.setDatabaseType(tableName, tableType);
+         {if (true) return tableType;}
+    throw new Error("Missing return statement in function");
+  }
+
 // type at 'top-level'
-  final public CompositeDatabaseType parseType() throws ParseException {
- CompositeDatabaseType databaseType = null;
- DatabaseType enclosedType = null;
- String schema = null;
- String typeName = null;
- Token vsize = null;
- boolean varray = false;
- boolean nestedTable = false;
-    jj_consume_token(R_CREATE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_OR:
-      orReplace();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(R_TYPE);
-    if (jj_2_5(2)) {
-      schema = OracleObjectName();
-      jj_consume_token(O_DOT);
-    } else {
-      ;
-    }
-    typeName = OracleObjectName();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_FORCE:
-      jj_consume_token(K_FORCE);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_OID:
-      jj_consume_token(K_OID);
-      jj_consume_token(S_CHAR_LITERAL);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_AUTHID:
-      invokerRights();
-      break;
-    default:
-      ;
-    }
-    as();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_TABLE:
-    case K_OBJECT:
-    case K_VARRAY:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_OBJECT:
-        jj_consume_token(K_OBJECT);
-        jj_consume_token(O_OPENPAREN);
-                databaseType = new ObjectType(typeName);
-                if (schema != null) {
-                    ((ObjectType)databaseType).setSchema(schema);
-                }
-        columnDeclarations(databaseType);
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      case K_VARRAY:
-        jj_consume_token(K_VARRAY);
-        jj_consume_token(O_OPENPAREN);
-        vsize = jj_consume_token(S_NUMBER);
-        jj_consume_token(O_CLOSEPAREN);
-        jj_consume_token(R_OF);
-                databaseType = new VArrayType(typeName);
-                if (schema != null) {
-                    ((VArrayType)databaseType).setSchema(schema);
-                }
-                if (vsize != null) {
-                    Long size = Long.decode(vsize.image);
-                    ((VArrayType)databaseType).setSize(size);
-                }
-        enclosedType = columnTypeSpec(databaseType);
-        break;
-      case R_TABLE:
-        jj_consume_token(R_TABLE);
-        jj_consume_token(R_OF);
-                databaseType = new ObjectTableType(typeName);
-                if (schema != null) {
-                    ((ObjectTableType)databaseType).setSchema(schema);
-                }
-        enclosedType = columnTypeSpec(databaseType);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOT:
-    case K_FINAL:
-    case K_INSTANTIABLE:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case R_NOT:
-        jj_consume_token(R_NOT);
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_FINAL:
-        jj_consume_token(K_FINAL);
-        break;
-      case K_INSTANTIABLE:
-        jj_consume_token(K_INSTANTIABLE);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_SEMICOLON:
-      jj_consume_token(O_SEMICOLON);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(0);
-        if (enclosedType != null) {
-            ((CompositeDatabaseType)databaseType).setEnclosedType(enclosedType);
-        }
-        typesRepository.setDatabaseType(typeName, databaseType);
-        {if (true) return databaseType;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public void columnDeclarations(CompositeDatabaseType enclosingType) throws ParseException {
-    columnDeclaration(enclosingType);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_COMMA:
-      jj_consume_token(O_COMMA);
-      columnDeclarations(enclosingType);
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void columnDeclaration(CompositeDatabaseType enclosingType) throws ParseException {
- String s = null;
- String pk = null;
- boolean notNull = false;
- DatabaseType columnType = null;
- FieldType column = null;
-    if (jj_2_6(2)) {
-      s = OracleObjectName();
-           column = new FieldType(s);
-                   if (enclosingType != null) {
-                       if (enclosingType.isPLSQLRecordType()) {
-                               ((PLSQLRecordType)enclosingType).addField(column);
-                       }
-                           else if (enclosingType.isTableType()) {
-                               ((TableType)enclosingType).addColumn(column);
-                           }
-                           else if (enclosingType.isObjectType()) {
-                               ((ObjectType)enclosingType).addField(column);
-                           }
-                   }
-      columnType = columnTypeSpec(enclosingType);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case R_NOT:
-        jj_consume_token(R_NOT);
-        jj_consume_token(R_NULL);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case K_ENABLE:
-          jj_consume_token(K_ENABLE);
-          break;
-        default:
-          ;
-        }
-                                                                                     notNull = true;
-        break;
-      default:
-        ;
-      }
-    } else if (jj_2_7(2)) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_CONSTRAINT:
-        jj_consume_token(K_CONSTRAINT);
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case S_IDENTIFIER:
-      case S_QUOTED_IDENTIFIER:
-        OracleObjectName();
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_PRIMARY:
-        jj_consume_token(K_PRIMARY);
-        jj_consume_token(K_KEY);
-        jj_consume_token(O_OPENPAREN);
-        pkList((TableType)enclosingType);
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      case R_CHECK:
-        jj_consume_token(R_CHECK);
-        jj_consume_token(O_OPENPAREN);
-        skipToClosingParen();
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      case R_UNIQUE:
-        jj_consume_token(R_UNIQUE);
-        jj_consume_token(O_OPENPAREN);
-        uniqList();
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      jj_consume_token(K_ENABLE);
-    } else {
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-      if (column != null) {
-              column.setEnclosedType(columnType);
-              if (columnType instanceof UnresolvedType) {
-                  ((UnresolvedType)columnType).setOwningType(column);
-              }
-              if (notNull) {
-                  column.setNotNull();
-              }
-          }
-  }
-
-  final public DatabaseType columnTypeSpec(CompositeDatabaseType enclosingType) throws ParseException {
- String s = null;
- Token t = null;
- DatabaseType dt = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_BFILE:
-    case K_BINARY_DOUBLE:
-    case K_BINARY_FLOAT:
-    case K_BINARY_INTEGER:
-    case K_BLOB:
-    case K_BOOLEAN:
-    case K_CHAR:
-    case K_CHARACTER:
-    case K_CLOB:
-    case K_DATE:
-    case K_DEC:
-    case K_DECIMAL:
-    case K_DOUBLE:
-    case K_FLOAT:
-    case K_INT:
-    case K_INTEGER:
-    case K_INTERVAL:
-    case K_LONG:
-    case K_MLSLABEL:
-    case K_NATIONAL:
-    case K_NATURAL:
-    case K_NCHAR:
-    case K_NCLOB:
-    case K_NUMBER:
-    case K_NUMERIC:
-    case K_NVARCHAR2:
-    case K_NVARCHAR:
-    case K_PLS_INTEGER:
-    case K_POSITIVE:
-    case K_RAW:
-    case K_REAL:
-    case K_ROWID:
-    case K_SIGNTYPE:
-    case K_SIMPLE_DOUBLE:
-    case K_SIMPLE_FLOAT:
-    case K_SIMPLE_INTEGER:
-    case K_SMALLINT:
-    case K_SYS_REFCURSOR:
-    case K_TIME:
-    case K_TIMESTAMP:
-    case K_UROWID:
-    case K_VARCHAR2:
-    case K_VARCHAR:
-      dt = datatype();
-      break;
-    case S_IDENTIFIER:
-    case S_QUOTED_IDENTIFIER:
-      s = columnSpec();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_OPENPAREN:
-        jj_consume_token(O_OPENPAREN);
-        t = jj_consume_token(S_NUMBER);
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      default:
-        ;
-      }
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_CONSTRAINT:
-      jj_consume_token(K_CONSTRAINT);
-      jj_consume_token(S_QUOTED_IDENTIFIER);
-      break;
-    default:
-      ;
-    }
-      if (s != null) {
-          for (String typeName : localTypes.keySet()) {
-              if (typeName.equals(s)) {
-                  dt = localTypes.get(s);
-                  break;
-              }
-          }
-          if (dt == null) {
-              if (t != null) {
-                  Long size = Long.decode(t.image);
-                  dt = new UnresolvedSizedType(s, size);
-              }
-              else {
-                  dt = new UnresolvedType(s);
-              }
-              ((UnresolvedType)dt).setOwningType(enclosingType);
-          }
-      }
-      {if (true) return dt;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public void uniqList() throws ParseException {
-    OracleObjectName();
-    label_2:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_COMMA:
-        ;
-        break;
-      default:
-        break label_2;
-      }
-      jj_consume_token(O_COMMA);
-      OracleObjectName();
-    }
-  }
-
-  final public void pkList(TableType tableType) throws ParseException {
-    pk(tableType);
-    label_3:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_COMMA:
-        ;
-        break;
-      default:
-        break label_3;
-      }
-      jj_consume_token(O_COMMA);
-      pk(tableType);
-    }
-  }
-
-  final public void pk(TableType tableType) throws ParseException {
-String s = null;
-    s = OracleObjectName();
-       List<FieldType> columns = tableType.getColumns();
-       for (FieldType column : columns) {
-            if (column.getFieldName().equals(s)) {
-                column.setPk();
-                break;
-            }
-       }
-  }
-
-  final public void packageDeclaration(PLSQLPackageType packageType) throws ParseException {
-    if (jj_2_8(2)) {
-      variableDeclaration(packageType);
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case R_SUBTYPE:
-      case R_TYPE:
-        typeOrSubTypeDeclaration(packageType);
-        break;
-      case R_CURSOR:
-        cursorDeclaration(packageType);
-        break;
-      case R_PROCEDURE:
-        procedureSpec(packageType);
-        break;
-      case R_FUNCTION:
-        functionSpec(packageType);
-        break;
-      case S_IDENTIFIER:
-        exceptionDeclaration(packageType);
-        break;
-      case K_PRAGMA:
-        pragmaDeclaration(packageType);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void variableDeclaration(PLSQLPackageType packageType) throws ParseException {
- Token varName = null;
- DatabaseType varType;
-    varName = jj_consume_token(S_IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_CONSTANT:
-      jj_consume_token(K_CONSTANT);
-      break;
-    default:
-      ;
-    }
-    varType = typeSpec();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOT:
-      jj_consume_token(R_NOT);
-      jj_consume_token(R_NULL);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_ASSIGN:
-    case R_DEFAULT:
-      variableDefaultAssignment();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(O_SEMICOLON);
-        FieldType variable = new FieldType(varName.image);
-        variable.setEnclosedType(varType);
-        packageType.addLocalVariable(variable);
-  }
-
-  final public void variableDefaultAssignment() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_ASSIGN:
-      jj_consume_token(O_ASSIGN);
-      break;
-    case R_DEFAULT:
-      jj_consume_token(R_DEFAULT);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    skipToSemiColon();
-  }
-
-  final public DatabaseType datatype() throws ParseException {
- Token t = null;
- DatabaseType dt = null;
- Token precision = null;
- Long sl;
- Long pl;
- Token scale = null;
- Token withTimeZone = null;
- Token withLocalTimeZone = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_BINARY_INTEGER:
-      jj_consume_token(K_BINARY_INTEGER);
-                          {if (true) return BINARY_INTEGER_TYPE;}
-      break;
-    case K_BINARY_FLOAT:
-      jj_consume_token(K_BINARY_FLOAT);
-                          {if (true) return BINARY_FLOAT_TYPE;}
-      break;
-    case K_BINARY_DOUBLE:
-      jj_consume_token(K_BINARY_DOUBLE);
-                          {if (true) return BINARY_DOUBLE_TYPE;}
-      break;
-    case K_NATURAL:
-      jj_consume_token(K_NATURAL);
-                          {if (true) return NATURAL_TYPE;}
-      break;
-    case K_POSITIVE:
-      jj_consume_token(K_POSITIVE);
-                          {if (true) return POSITIVE_TYPE;}
-      break;
-    case K_SIGNTYPE:
-      jj_consume_token(K_SIGNTYPE);
-                          {if (true) return SIGN_TYPE;}
-      break;
-    case K_DEC:
-    case K_DECIMAL:
-    case K_NUMBER:
-    case K_NUMERIC:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_NUMBER:
-        t = jj_consume_token(K_NUMBER);
-        break;
-      case K_NUMERIC:
-        t = jj_consume_token(K_NUMERIC);
-        break;
-      case K_DECIMAL:
-        t = jj_consume_token(K_DECIMAL);
-        break;
-      case K_DEC:
-        t = jj_consume_token(K_DEC);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_OPENPAREN:
-        jj_consume_token(O_OPENPAREN);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case O_ASTERISK:
-        case S_NUMBER:
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_ASTERISK:
-            precision = jj_consume_token(O_ASTERISK);
-            break;
-          case S_NUMBER:
-            precision = jj_consume_token(S_NUMBER);
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          ;
-        }
-        label_4:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_COMMA:
-            ;
-            break;
-          default:
-            break label_4;
-          }
-          jj_consume_token(O_COMMA);
-          scale = jj_consume_token(S_NUMBER);
-        }
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      default:
-        ;
-      }
-            if (t.kind == K_NUMBER || t.kind == K_NUMERIC) {
-                if (precision != null && precision.image.equals("*")) {
-                    precision = null;
-                }
-                if (precision == null) {
-                    if (scale != null && scale.image.equals("0")) {
-                        dt = INTEGER_TYPE;
-                    }
-                    else {
-                        dt = new NumericType();
-                    }
-                }
-                    else {
-                        pl = Long.decode(precision.image);
-                        if (scale == null) {
-                        dt = new NumericType(pl);
-                    }
-                    else {
-                        sl = Long.decode(scale.image);
-                        dt = new NumericType(pl, sl);
-                        }
-                    }
-                //sometimes need to know difference between NUMERIC and NUMBER
-                if (dt != INTEGER_TYPE && t.kind == K_NUMBER) {
-                    ((NumericType)dt).setNumberSynonym(true);
-                }
-            }
-            else  if (t.kind == K_DECIMAL || t.kind == K_DEC) {
-                if (precision != null && precision.image.equals("*")) {
-                    precision = null;
-                }
-                if (precision == null) {
-                    dt = new DecimalType();
-                }
-                else {
-                    pl = Long.decode(precision.image);
-                    if (scale == null) {
-                        dt = new DecimalType(pl);
-                    }
-                    else {
-                        sl = Long.decode(scale.image);
-                        dt = new DecimalType(pl, sl);
-                    }
-                }
-            }
-            {if (true) return dt;}
-      break;
-    case K_LONG:
-      jj_consume_token(K_LONG);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_RAW:
-        t = jj_consume_token(K_RAW);
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_OPENPAREN:
-        jj_consume_token(O_OPENPAREN);
-        precision = jj_consume_token(S_NUMBER);
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      default:
-        ;
-      }
-              if (t == null) {
-              if (precision == null) {
-                  dt = new LongType();
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  dt = new LongType(pl);
-              }
-              }
-              else {
-              if (precision == null) {
-                  dt = new LongRawType();
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  dt = new LongRawType(pl);
-              }
-            }
-            {if (true) return dt;}
-      break;
-    case K_RAW:
-      jj_consume_token(K_RAW);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_OPENPAREN:
-        jj_consume_token(O_OPENPAREN);
-        precision = jj_consume_token(S_NUMBER);
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      default:
-        ;
-      }
-            if (precision == null) {
-                dt = new RawType();
-            }
-            else {
-                pl = Long.decode(precision.image);
-                dt = new RawType(pl);
-            }
-            {if (true) return dt;}
-      break;
-    case K_BOOLEAN:
-      jj_consume_token(K_BOOLEAN);
-                    {if (true) return BOOLEAN_TYPE;}
-      break;
-    case K_DATE:
-      jj_consume_token(K_DATE);
-                 {if (true) return DATE_TYPE;}
-      break;
-    default:
-      if (jj_2_17(2)) {
-        jj_consume_token(K_INTERVAL);
-        jj_consume_token(K_DAY);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case O_OPENPAREN:
-          jj_consume_token(O_OPENPAREN);
-          precision = jj_consume_token(S_NUMBER);
-          jj_consume_token(O_CLOSEPAREN);
-          break;
-        default:
-          ;
-        }
-        jj_consume_token(R_TO);
-        jj_consume_token(K_SECOND);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case O_OPENPAREN:
-          jj_consume_token(O_OPENPAREN);
-          scale = jj_consume_token(S_NUMBER);
-          jj_consume_token(O_CLOSEPAREN);
-          break;
-        default:
-          ;
-        }
-                if (precision == null) {
-                dt = new IntervalDayToSecond();
-            }
-            else {
-                pl = Long.decode(precision.image);
-                if (scale == null) {
-                    dt = new IntervalDayToSecond(pl);
-                }
-                else {
-                    sl = Long.decode(scale.image);
-                    dt = new IntervalDayToSecond(pl, sl);
-                }
-            }
-            {if (true) return dt;}
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case K_INTERVAL:
-          jj_consume_token(K_INTERVAL);
-          jj_consume_token(K_YEAR);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          jj_consume_token(R_TO);
-          jj_consume_token(K_MONTH);
-            if (precision == null) {
-                dt = new IntervalYearToMonth();
-            }
-            else {
-                pl = Long.decode(precision.image);
-                dt = new IntervalYearToMonth(pl);
-            }
-            {if (true) return dt;}
-          break;
-        case K_TIME:
-          jj_consume_token(K_TIME);
-                 {if (true) return TIME_TYPE;}
-          break;
-        case K_TIMESTAMP:
-          jj_consume_token(K_TIMESTAMP);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case R_WITH:
-            jj_consume_token(R_WITH);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case K_LOCAL:
-              withLocalTimeZone = jj_consume_token(K_LOCAL);
-              break;
-            default:
-              ;
-            }
-            withTimeZone = jj_consume_token(K_TIME);
-            jj_consume_token(K_ZONE);
-            break;
-          default:
-            ;
-          }
-          if (precision == null) {
-              dt = new TimeStampType();
-          }
-          else {
-              pl = Long.decode(precision.image);
-              dt = new TimeStampType(pl);
-          }
-          if (withLocalTimeZone !=  null) {
-              ((TimeStampType)dt).setWithLocalTimeZone();
-          }
-          else if (withTimeZone != null) {
-              ((TimeStampType)dt).setWithTimeZone();
-          }
-          {if (true) return dt;}
-          break;
-        case K_INTEGER:
-          jj_consume_token(K_INTEGER);
-                     {if (true) return INTEGER_TYPE;}
-          break;
-        case K_INT:
-          jj_consume_token(K_INT);
-                     {if (true) return INTEGER_TYPE;}
-          break;
-        case K_SMALLINT:
-          jj_consume_token(K_SMALLINT);
-                     {if (true) return SMALLINT_TYPE;}
-          break;
-        case K_FLOAT:
-          jj_consume_token(K_FLOAT);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (precision == null) {
-              {if (true) return new FloatType();}
-          }
-          else {
-              pl = Long.decode(precision.image);
-              FloatType ft = new FloatType(pl);
-              {if (true) return ft;}
-          }
-          break;
-        case K_REAL:
-          jj_consume_token(K_REAL);
-                 {if (true) return new RealType();}
-          break;
-        case K_MLSLABEL:
-          jj_consume_token(K_MLSLABEL);
-                     {if (true) return MLSLABEL_TYPE;}
-          break;
-        case K_PLS_INTEGER:
-          jj_consume_token(K_PLS_INTEGER);
-                        {if (true) return PLS_INTEGER_TYPE;}
-          break;
-        case K_SIMPLE_INTEGER:
-          jj_consume_token(K_SIMPLE_INTEGER);
-                           {if (true) return SIMPLE_INTEGER_TYPE;}
-          break;
-        case K_SIMPLE_FLOAT:
-          jj_consume_token(K_SIMPLE_FLOAT);
-                         {if (true) return SIMPLE_FLOAT_TYPE;}
-          break;
-        case K_SIMPLE_DOUBLE:
-          jj_consume_token(K_SIMPLE_DOUBLE);
-                          {if (true) return SIMPLE_DOUBLE_TYPE;}
-          break;
-        case K_SYS_REFCURSOR:
-          jj_consume_token(K_SYS_REFCURSOR);
-                           {if (true) return SYS_REFCURSOR_TYPE;}
-          break;
-        case K_BLOB:
-          jj_consume_token(K_BLOB);
-                  {if (true) return new BlobType();}
-          break;
-        case K_NCLOB:
-          jj_consume_token(K_NCLOB);
-                  {if (true) return new NClobType();}
-          break;
-        case K_BFILE:
-          jj_consume_token(K_BFILE);
-                   {if (true) return BFILE_TYPE;}
-          break;
-        case K_ROWID:
-          jj_consume_token(K_ROWID);
-                  {if (true) return ROWID_TYPE;}
-          break;
-        case K_UROWID:
-          jj_consume_token(K_UROWID);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (precision == null) {
-              {if (true) return new URowIdType();}
-          }
-          else {
-              pl = Long.decode(precision.image);
-              {if (true) return new URowIdType(pl);}
-          }
-          break;
-        case K_DOUBLE:
-          jj_consume_token(K_DOUBLE);
-          jj_consume_token(K_PRECISION);
-                                 {if (true) return new DoubleType();}
-          break;
-        case K_CHAR:
-          jj_consume_token(K_CHAR);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_VARYING:
-            t = jj_consume_token(K_VARYING);
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case K_BYTE:
-            case K_CHAR:
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case K_BYTE:
-                jj_consume_token(K_BYTE);
-                break;
-              case K_CHAR:
-                jj_consume_token(K_CHAR);
-                break;
-              default:
-                jj_consume_token(-1);
-                throw new ParseException();
-              }
-              break;
-            default:
-              ;
-            }
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (jj_2_10(2)) {
-            jj_consume_token(K_CHARACTER);
-            jj_consume_token(K_SET);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case S_IDENTIFIER:
-            case S_QUOTED_IDENTIFIER:
-              if (jj_2_9(2)) {
-                jj_consume_token(S_IDENTIFIER);
-              } else {
-                switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-                case S_IDENTIFIER:
-                case S_QUOTED_IDENTIFIER:
-                  columnSpec();
-                  jj_consume_token(K_CHARSET);
-                  break;
-                default:
-                  jj_consume_token(-1);
-                  throw new ParseException();
-                }
-              }
-              break;
-            default:
-              ;
-            }
-          } else {
-            ;
-          }
-          if (t == null) {
-              if (precision == null) {
-                  {if (true) return new CharType();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new CharType(pl);}
-              }
-          }
-          else {
-              // ANSI syntax for VARCHAR2
-              if (precision == null) {
-                  {if (true) return new VarChar2Type();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new VarChar2Type(pl);}
-              }
-          }
-          break;
-        case K_VARCHAR:
-          jj_consume_token(K_VARCHAR);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_VARYING:
-            jj_consume_token(K_VARYING);
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case K_BYTE:
-            case K_CHAR:
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case K_BYTE:
-                jj_consume_token(K_BYTE);
-                break;
-              case K_CHAR:
-                jj_consume_token(K_CHAR);
-                break;
-              default:
-                jj_consume_token(-1);
-                throw new ParseException();
-              }
-              break;
-            default:
-              ;
-            }
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (jj_2_12(2)) {
-            jj_consume_token(K_CHARACTER);
-            jj_consume_token(K_SET);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case S_IDENTIFIER:
-            case S_QUOTED_IDENTIFIER:
-              if (jj_2_11(2)) {
-                jj_consume_token(S_IDENTIFIER);
-              } else {
-                switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-                case S_IDENTIFIER:
-                case S_QUOTED_IDENTIFIER:
-                  columnSpec();
-                  jj_consume_token(K_CHARSET);
-                  break;
-                default:
-                  jj_consume_token(-1);
-                  throw new ParseException();
-                }
-              }
-              break;
-            default:
-              ;
-            }
-          } else {
-            ;
-          }
-          if (precision == null) {
-              {if (true) return new VarCharType();}
-          }
-          else {
-              pl = Long.decode(precision.image);
-              {if (true) return new VarCharType(pl);}
-          }
-          break;
-        case K_VARCHAR2:
-          jj_consume_token(K_VARCHAR2);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_VARYING:
-            jj_consume_token(K_VARYING);
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case K_BYTE:
-            case K_CHAR:
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case K_BYTE:
-                jj_consume_token(K_BYTE);
-                break;
-              case K_CHAR:
-                jj_consume_token(K_CHAR);
-                break;
-              default:
-                jj_consume_token(-1);
-                throw new ParseException();
-              }
-              break;
-            default:
-              ;
-            }
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (jj_2_14(2)) {
-            jj_consume_token(K_CHARACTER);
-            jj_consume_token(K_SET);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case S_IDENTIFIER:
-            case S_QUOTED_IDENTIFIER:
-              if (jj_2_13(2)) {
-                jj_consume_token(S_IDENTIFIER);
-              } else {
-                switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-                case S_IDENTIFIER:
-                case S_QUOTED_IDENTIFIER:
-                  columnSpec();
-                  jj_consume_token(K_CHARSET);
-                  break;
-                default:
-                  jj_consume_token(-1);
-                  throw new ParseException();
-                }
-              }
-              break;
-            default:
-              ;
-            }
-          } else {
-            ;
-          }
-            if (precision == null) {
-                {if (true) return new VarChar2Type();}
-            }
-            else {
-                pl = Long.decode(precision.image);
-                {if (true) return new VarChar2Type(pl);}
-            }
-          break;
-        case K_CHARACTER:
-          jj_consume_token(K_CHARACTER);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_VARYING:
-            t = jj_consume_token(K_VARYING);
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (t == null) {
-              if (precision == null) {
-                  {if (true) return new CharType();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new CharType(pl);}
-              }
-          }
-          else {
-              // ANSI syntax for VARCHAR
-              if (precision == null) {
-                  {if (true) return new VarCharType();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new VarCharType(pl);}
-              }
-          }
-          break;
-        case K_NCHAR:
-          jj_consume_token(K_NCHAR);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_VARYING:
-            t = jj_consume_token(K_VARYING);
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (t == null) {
-              if (precision == null) {
-                  {if (true) return new NCharType();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new NCharType(pl);}
-              }
-          }
-          else {
-              // ANSI syntax for NVARCHAR2
-              if (precision == null) {
-                  {if (true) return new NVarChar2Type();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new NVarChar2Type(pl);}
-              }
-          }
-          break;
-        case K_NVARCHAR:
-          jj_consume_token(K_NVARCHAR);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-            if (precision == null) {
-                {if (true) return new NVarChar2Type();}
-            }
-            else {
-                pl = Long.decode(precision.image);
-                {if (true) return new NVarChar2Type(pl);}
-            }
-          break;
-        case K_NVARCHAR2:
-          jj_consume_token(K_NVARCHAR2);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-            if (precision == null) {
-                {if (true) return new NVarChar2Type();}
-            }
-            else {
-                pl = Long.decode(precision.image);
-                {if (true) return new NVarChar2Type(pl);}
-            }
-          break;
-        case K_NATIONAL:
-          jj_consume_token(K_NATIONAL);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_CHARACTER:
-            jj_consume_token(K_CHARACTER);
-            break;
-          case K_CHAR:
-            jj_consume_token(K_CHAR);
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_VARYING:
-            t = jj_consume_token(K_VARYING);
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_OPENPAREN:
-            jj_consume_token(O_OPENPAREN);
-            precision = jj_consume_token(S_NUMBER);
-            jj_consume_token(O_CLOSEPAREN);
-            break;
-          default:
-            ;
-          }
-          if (t == null) {
-              if (precision == null) {
-                  {if (true) return new NCharType();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new NCharType(pl);}
-              }
-          }
-          else {
-              // ANSI syntax for NVARCHAR2
-              if (precision == null) {
-                  {if (true) return new NVarChar2Type();}
-              }
-              else {
-                  pl = Long.decode(precision.image);
-                  {if (true) return new NVarChar2Type(pl);}
-              }
-          }
-          break;
-        case K_CLOB:
-          jj_consume_token(K_CLOB);
-          if (jj_2_16(2)) {
-            jj_consume_token(K_CHARACTER);
-            jj_consume_token(K_SET);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case S_IDENTIFIER:
-            case S_QUOTED_IDENTIFIER:
-              if (jj_2_15(2)) {
-                jj_consume_token(S_IDENTIFIER);
-              } else {
-                switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-                case S_IDENTIFIER:
-                case S_QUOTED_IDENTIFIER:
-                  columnSpec();
-                  jj_consume_token(K_CHARSET);
-                  break;
-                default:
-                  jj_consume_token(-1);
-                  throw new ParseException();
-                }
-              }
-              break;
-            default:
-              ;
-            }
-          } else {
-            ;
-          }
-                                                                                                                   {if (true) return new ClobType();}
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    }
-    throw new Error("Missing return statement in function");
-  }
-
-  final public DatabaseType typeSpec() throws ParseException {
- boolean isTYPEType = false;
- boolean isROWTYPEType = false;
- DatabaseType dataType = null;
- String spec = null;
- String s = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_BFILE:
-    case K_BINARY_DOUBLE:
-    case K_BINARY_FLOAT:
-    case K_BINARY_INTEGER:
-    case K_BLOB:
-    case K_BOOLEAN:
-    case K_CHAR:
-    case K_CHARACTER:
-    case K_CLOB:
-    case K_DATE:
-    case K_DEC:
-    case K_DECIMAL:
-    case K_DOUBLE:
-    case K_FLOAT:
-    case K_INT:
-    case K_INTEGER:
-    case K_INTERVAL:
-    case K_LONG:
-    case K_MLSLABEL:
-    case K_NATIONAL:
-    case K_NATURAL:
-    case K_NCHAR:
-    case K_NCLOB:
-    case K_NUMBER:
-    case K_NUMERIC:
-    case K_NVARCHAR2:
-    case K_NVARCHAR:
-    case K_PLS_INTEGER:
-    case K_POSITIVE:
-    case K_RAW:
-    case K_REAL:
-    case K_ROWID:
-    case K_SIGNTYPE:
-    case K_SIMPLE_DOUBLE:
-    case K_SIMPLE_FLOAT:
-    case K_SIMPLE_INTEGER:
-    case K_SMALLINT:
-    case K_SYS_REFCURSOR:
-    case K_TIME:
-    case K_TIMESTAMP:
-    case K_UROWID:
-    case K_VARCHAR2:
-    case K_VARCHAR:
-      dataType = datatype();
-      break;
-    case S_IDENTIFIER:
-    case S_QUOTED_IDENTIFIER:
-      spec = columnSpec();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_OPENPAREN:
-      case R_ANCHORED_ROWTYPE:
-      case R_ANCHORED_TYPE:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case O_OPENPAREN:
-          jj_consume_token(O_OPENPAREN);
-          jj_consume_token(S_NUMBER);
-          jj_consume_token(O_CLOSEPAREN);
-          break;
-        case R_ANCHORED_TYPE:
-          jj_consume_token(R_ANCHORED_TYPE);
-             isTYPEType=true;
-             s = spec + removeQuotes(tokenImage[R_ANCHORED_TYPE]);
-          break;
-        case R_ANCHORED_ROWTYPE:
-          jj_consume_token(R_ANCHORED_ROWTYPE);
-             isROWTYPEType =true;
-             s = spec + removeQuotes(tokenImage[R_ANCHORED_ROWTYPE]);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        ;
-      }
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-      if (dataType == null && localTypes != null) {
-          for (String typeName : localTypes.keySet()) {
-              if (typeName.equals(spec)) {
-                  dataType = localTypes.get(spec);
-                  break;
-              }
-          }
-      }
-      if (dataType == null) {
-          UnresolvedType uType = new UnresolvedType(spec);
-          if (isTYPEType) {
-              TYPEType tType = new TYPEType(s);
-              tType.setEnclosedType(uType);
-              uType.setOwningType(tType);
-              dataType = tType;
-              localTypes.put(spec, dataType);
-          }
-          else if (isROWTYPEType) {
-              ROWTYPEType rType = new ROWTYPEType(s);
-              rType.setEnclosedType(uType);
-              uType.setOwningType(rType);
-              dataType = rType;
-              localTypes.put(spec, dataType);
-          }
-          else {
-              dataType = uType;
-          }
-      }
-      {if (true) return dataType;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public String columnSpec() throws ParseException {
- String s1 = null;
- String s2 = null;
- String s3 = null;
-    s1 = OracleObjectName();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_DOT:
-      jj_consume_token(O_DOT);
-      s2 = OracleObjectName();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_DOT:
-        jj_consume_token(O_DOT);
-        s3 = OracleObjectName();
-        break;
-      default:
-        ;
-      }
-      break;
-    default:
-      ;
-    }
-      StringBuilder sb = new StringBuilder(s1);
-      if (s2 != null) {
-          sb.append('.');
-          sb.append(s2);
-          if (s3 != null) {
-              sb.append('.');
-              sb.append(s3);
-          }
-      }
-      {if (true) return sb.toString();}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public String tableSpec() throws ParseException {
-    OracleObjectName();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_DOT:
-      jj_consume_token(O_DOT);
-      OracleObjectName();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_ATSIGN:
-        jj_consume_token(O_ATSIGN);
-        jj_consume_token(S_IDENTIFIER);
-        break;
-      default:
-        ;
-      }
-      break;
-    default:
-      ;
-    }
-     {if (true) return token.image;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public String typeName() throws ParseException {
-    OracleObjectName();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_DOT:
-      jj_consume_token(O_DOT);
-      OracleObjectName();
-      break;
-    default:
-      ;
-    }
-     {if (true) return token.image;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public void typeOrSubTypeDeclaration(PLSQLPackageType packageType) throws ParseException {
- String s = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_TYPE:
-      typeDeclaration(packageType);
-      break;
-    case R_SUBTYPE:
-      subtypeDeclaration(packageType);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void typeDeclaration(PLSQLPackageType packageType) throws ParseException {
- String s = null;
-    jj_consume_token(R_TYPE);
-    s = typeName();
-    jj_consume_token(R_IS);
-    aTypeDeclaration(packageType, s);
-    jj_consume_token(O_SEMICOLON);
-  }
-
-  final public void aTypeDeclaration(PLSQLPackageType packageType, String typeName) throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_RECORD:
-      recordDeclaration(packageType, typeName);
-      break;
-    case R_TABLE:
-      plsqlTableDeclaration(packageType, typeName);
-      break;
-    case K_VARRAY:
-    case K_VARYING:
-      varrayDeclaration(packageType);
-      break;
-    case K_REF:
-      refCursorDeclaration(packageType, typeName);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void recordDeclaration(PLSQLPackageType packageType, String typeName) throws ParseException {
-  PLSQLRecordType plsqlRecordType = new PLSQLRecordType(typeName);
-  plsqlRecordType.setParentType(packageType);
-    jj_consume_token(K_RECORD);
-    jj_consume_token(O_OPENPAREN);
-    fieldDeclarations(plsqlRecordType);
-    jj_consume_token(O_CLOSEPAREN);
-      packageType.addType(plsqlRecordType);
-      localTypes.put(typeName, plsqlRecordType);
-  }
-
-  final public void fieldDeclarations(PLSQLRecordType plsqlRecordType) throws ParseException {
-    fieldDeclaration(plsqlRecordType);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_COMMA:
-      jj_consume_token(O_COMMA);
-      fieldDeclarations(plsqlRecordType);
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void fieldDeclaration(PLSQLRecordType plsqlRecordType) throws ParseException {
-  String s = null;
-  DatabaseType dataType = null;
-  FieldType fieldType = null;
-    s = typeName();
-    dataType = typeSpec();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOT:
-      jj_consume_token(R_NOT);
-      jj_consume_token(R_NULL);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_ASSIGN:
-    case R_DEFAULT:
-      fieldDefaultAssignment();
-      break;
-    default:
-      ;
-    }
-      fieldType = new FieldType(s);
-      fieldType.setEnclosedType(dataType);
-      plsqlRecordType.addField(fieldType);
-      if (dataType instanceof UnresolvedType) {
-          ((UnresolvedType)dataType).setOwningType(plsqlRecordType);
-      }
-  }
-
-  final public void fieldDefaultAssignment() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_ASSIGN:
-      jj_consume_token(O_ASSIGN);
-      break;
-    case R_DEFAULT:
-      jj_consume_token(R_DEFAULT);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    skipToNextArg();
-  }
-
-  final public void subtypeDeclaration(PLSQLPackageType packageType) throws ParseException {
- String subtypeName;
-DatabaseType subtype;
-Token notNull = null;
-Token rangeStart = null;
-Token rangeEnd = null;
-    jj_consume_token(R_SUBTYPE);
-    subtypeName = OracleObjectName();
-    jj_consume_token(R_IS);
-    subtype = typeSpec();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_RANGE:
-      jj_consume_token(K_RANGE);
-      rangeStart = jj_consume_token(S_NUMBER);
-      jj_consume_token(O_DOUBLEDOT);
-      rangeEnd = jj_consume_token(S_NUMBER);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOT:
-      jj_consume_token(R_NOT);
-      notNull = jj_consume_token(R_NULL);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(O_SEMICOLON);
-      PLSQLSubType newPLSQLSubType = new PLSQLSubType(subtypeName);
-      newPLSQLSubType.setEnclosedType(subtype);
-      if (subtype instanceof UnresolvedType) {
-          ((UnresolvedType)subtype).setOwningType(newPLSQLSubType);
-      }
-      packageType.addType(newPLSQLSubType);
-      if (notNull != null) {
-          newPLSQLSubType.setNotNull(true);
-      }
-      if (rangeStart != null) {
-          long rStart = Long.decode(rangeStart.image).longValue();
-          long rEnd = Long.decode(rangeEnd.image).longValue();
-          newPLSQLSubType.setHasRange(true);
-          newPLSQLSubType.setRangeStart(rStart);
-          newPLSQLSubType.setRangeEnd(rEnd);
-      }
-      localTypes.put(subtypeName, newPLSQLSubType);
-  }
-
-  final public void plsqlTableDeclaration(PLSQLPackageType packageType, String typeName) throws ParseException {
-  PLSQLCollectionType plsqlTable = new PLSQLCollectionType(typeName);
-  plsqlTable.setParentType(packageType);
-  DatabaseType nestedType;
-    jj_consume_token(R_TABLE);
-    jj_consume_token(R_OF);
-    nestedType = typeSpec();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOT:
-      jj_consume_token(R_NOT);
-      jj_consume_token(R_NULL);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_INDEX:
-      jj_consume_token(R_INDEX);
-      jj_consume_token(R_BY);
-      plsqlTableIndexByDeclaration(plsqlTable);
-      break;
-    default:
-      ;
-    }
-      if (nestedType instanceof UnresolvedType) {
-        ((UnresolvedType)nestedType).setOwningType(plsqlTable);
-      }
-      plsqlTable.setEnclosedType(nestedType);
-      packageType.addType(plsqlTable);
-      localTypes.put(typeName, plsqlTable);
-  }
-
-  final public void plsqlTableIndexByDeclaration(PLSQLCollectionType plsqlTable) throws ParseException {
-  DatabaseType indexType = null;
-  Token precision = null;
-  Token otherIndexByType = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_PLS_INTEGER:
-      jj_consume_token(K_PLS_INTEGER);
-                       indexType = PLS_INTEGER_TYPE;
-      break;
-    case K_BINARY_INTEGER:
-      jj_consume_token(K_BINARY_INTEGER);
-                           indexType = BINARY_INTEGER_TYPE;
-      break;
-    case K_VARCHAR2:
-      jj_consume_token(K_VARCHAR2);
-      jj_consume_token(O_OPENPAREN);
-      precision = jj_consume_token(S_NUMBER);
-      jj_consume_token(O_CLOSEPAREN);
-        if (precision == null) {
-            indexType = new VarChar2Type();
-        }
-        else {
-            Long pl = Long.decode(precision.image);
-            indexType = new VarChar2Type(pl);
-        }
-      break;
-    case K_STRING:
-      otherIndexByType = jj_consume_token(K_STRING);
-      jj_consume_token(O_OPENPAREN);
-      jj_consume_token(S_NUMBER);
-      jj_consume_token(O_CLOSEPAREN);
-        String indexTypename = otherIndexByType.image;
-        for (String typeName : localTypes.keySet()) {
-            if (typeName.equals(indexTypename)) {
-                indexType = localTypes.get(indexTypename);
-                break;
-            }
-        }
-        //what else can INDEX BY be? Unresolved for now ...
-        if (indexType == null) {
-            indexType = new UnresolvedType(indexTypename);
-            ((UnresolvedType)indexType).setOwningType(plsqlTable);
-        }
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-      plsqlTable.setIndexed(true);
-      plsqlTable.setIndexType(indexType);
-  }
-
-  final public void varrayDeclaration(PLSQLPackageType packageType) throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_VARRAY:
-      jj_consume_token(K_VARRAY);
-      break;
-    case K_VARYING:
-      jj_consume_token(K_VARYING);
-      jj_consume_token(K_ARRAY);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    jj_consume_token(O_OPENPAREN);
-    jj_consume_token(S_NUMBER);
-    jj_consume_token(O_CLOSEPAREN);
-    jj_consume_token(R_OF);
-    datatype();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOT:
-      jj_consume_token(R_NOT);
-      jj_consume_token(R_NULL);
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void refCursorDeclaration(PLSQLPackageType packageType, String cursorTypeName) throws ParseException {
- PLSQLCursorType cursorType = null;
-    jj_consume_token(K_REF);
-    jj_consume_token(R_CURSOR);
-        cursorType = new PLSQLCursorType(cursorTypeName);
-        packageType.addCursor(cursorType);
-        localTypes.put(cursorTypeName, cursorType);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_RETURN:
-      refCursorTypeSpec(cursorType, packageType);
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void refCursorTypeSpec(PLSQLCursorType cursorType, PLSQLPackageType packageType) throws ParseException {
- String s = null;
- String spec = null;
- boolean isTYPEType = false;
- boolean isROWTYPEType = false;
- DatabaseType localType = null;
-    jj_consume_token(K_RETURN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case S_IDENTIFIER:
-    case S_QUOTED_IDENTIFIER:
-      if (jj_2_18(3)) {
-        spec = columnSpec();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case R_ANCHORED_TYPE:
-          jj_consume_token(R_ANCHORED_TYPE);
-          isTYPEType = true;
-          s = spec + tokenImage[R_ANCHORED_TYPE].substring(1, tokenImage[R_ANCHORED_TYPE].length() - 1);
-          break;
-        default:
-          ;
-        }
-      } else if (jj_2_19(3)) {
-        spec = tableSpec();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case R_ANCHORED_ROWTYPE:
-          jj_consume_token(R_ANCHORED_ROWTYPE);
-          isROWTYPEType = true;
-          s = spec + tokenImage[R_ANCHORED_ROWTYPE].substring(1, tokenImage[R_ANCHORED_ROWTYPE].length() - 1);
-          break;
-        default:
-          ;
-        }
-      } else {
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      ;
-    }
-      //check local variables first
-          for (FieldType varField : packageType.getLocalVariables()) {
-              if (spec.equals(varField.getFieldName())) {
-              if (isTYPEType) {
-                  TYPEType tType = new TYPEType(s);
-                  UnresolvedType uType = new UnresolvedType(s);
-                  tType.setEnclosedType(uType);
-                  uType.setOwningType(tType);
-                  localType = tType;
-              }
-              else if (isROWTYPEType) {
-                  ROWTYPEType rType = new ROWTYPEType(s);
-                  UnresolvedType uType = new UnresolvedType(s);
-                  rType.setEnclosedType(uType);
-                  uType.setOwningType(rType);
-                  localType = rType;
-              }
-              else {
-                  localType = varField.getEnclosedType();
-              }
-              cursorType.setEnclosedType(localType);
-                  break;
-              }
-          }
-      if (localType == null) {
-          localType = localTypes.get(spec);
-          if (localType == null) {
-                  UnresolvedType uType = new UnresolvedType(spec);
-                  if (isTYPEType) {
-                      TYPEType tType = new TYPEType(s);
-                      tType.setEnclosedType(uType);
-                      uType.setOwningType(tType);
-                      cursorType.setEnclosedType(tType);
-                  }
-                  else if (isROWTYPEType) {
-                      ROWTYPEType rType = new ROWTYPEType(s);
-                      rType.setEnclosedType(uType);
-                      uType.setOwningType(rType);
-                      cursorType.setEnclosedType(rType);
-                  }
-                  else {
-                      uType.setOwningType(cursorType);
-                      cursorType.setEnclosedType(uType);
-                  }
-              }
-              else {
-                  cursorType.setEnclosedType(localType);
-              }
-          }
-  }
-
-  final public void cursorDeclaration(PLSQLPackageType packageType) throws ParseException {
- Token t = null;
-    jj_consume_token(R_CURSOR);
-    t = jj_consume_token(S_IDENTIFIER);
-    jj_consume_token(O_SEMICOLON);
-  }
-
+  final public CompositeDatabaseType parseType() throws ParseException {
+ CompositeDatabaseType databaseType = null;
+ DatabaseType enclosedType = null;
+ String dottedName = null;
+ String schema = null;
+ String typeName = null;
+ Token vsize = null;
+ boolean varray = false;
+ boolean nestedTable = false;
+    jj_consume_token(R_CREATE);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_OR:
+      orReplace();
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(R_TYPE);
+    dottedName = OracleObjectNamePossiblyDotted();
+          typeName = dottedName;
+          if (dottedName.contains(".")) {
+              int idx = dottedName.indexOf(".");
+              schema = dottedName.substring(0, idx);
+              typeName = dottedName.substring(idx+1, dottedName.length());
+          }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_FORCE:
+      jj_consume_token(K_FORCE);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_OID:
+      jj_consume_token(K_OID);
+      jj_consume_token(S_CHAR_LITERAL);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_AUTHID:
+      invokerRights();
+      break;
+    default:
+      ;
+    }
+    as();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_TABLE:
+    case K_OBJECT:
+    case K_VARRAY:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_OBJECT:
+        jj_consume_token(K_OBJECT);
+        jj_consume_token(O_OPENPAREN);
+                databaseType = new ObjectType(typeName);
+                if (schema != null) {
+                    ((ObjectType)databaseType).setSchema(schema);
+                }
+        columnDeclarations(databaseType);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      case K_VARRAY:
+        jj_consume_token(K_VARRAY);
+        jj_consume_token(O_OPENPAREN);
+        vsize = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        jj_consume_token(R_OF);
+                databaseType = new VArrayType(typeName);
+                if (schema != null) {
+                    ((VArrayType)databaseType).setSchema(schema);
+                }
+                if (vsize != null) {
+                    Long size = Long.decode(vsize.image);
+                    ((VArrayType)databaseType).setSize(size);
+                }
+        enclosedType = columnTypeSpec(databaseType);
+        break;
+      case R_TABLE:
+        jj_consume_token(R_TABLE);
+        jj_consume_token(R_OF);
+                databaseType = new ObjectTableType(typeName);
+                if (schema != null) {
+                    ((ObjectTableType)databaseType).setSchema(schema);
+                }
+        enclosedType = columnTypeSpec(databaseType);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOT:
+    case K_FINAL:
+    case K_INSTANTIABLE:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_NOT:
+        jj_consume_token(R_NOT);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_FINAL:
+        jj_consume_token(K_FINAL);
+        break;
+      case K_INSTANTIABLE:
+        jj_consume_token(K_INSTANTIABLE);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_SEMICOLON:
+      jj_consume_token(O_SEMICOLON);
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(0);
+        if (enclosedType != null) {
+            ((CompositeDatabaseType)databaseType).setEnclosedType(enclosedType);
+        }
+        typesRepository.setDatabaseType(typeName, databaseType);
+        {if (true) return databaseType;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void columnDeclarations(CompositeDatabaseType enclosingType) throws ParseException {
+    columnDeclaration(enclosingType);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_COMMA:
+      jj_consume_token(O_COMMA);
+      columnDeclarations(enclosingType);
+      break;
+    default:
+      ;
+    }
+  }
+
+  final public void columnDeclaration(CompositeDatabaseType enclosingType) throws ParseException {
+ String s = null;
+ String pk = null;
+ boolean notNull = false;
+ DatabaseType columnType = null;
+ FieldType column = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case S_IDENTIFIER:
+    case S_QUOTED_IDENTIFIER:
+      s = OracleObjectName();
+           column = new FieldType(s);
+                   if (enclosingType != null) {
+                       if (enclosingType.isPLSQLRecordType()) {
+                               ((PLSQLRecordType)enclosingType).addField(column);
+                       }
+                           else if (enclosingType.isTableType()) {
+                               ((TableType)enclosingType).addColumn(column);
+                           }
+                           else if (enclosingType.isObjectType()) {
+                               ((ObjectType)enclosingType).addField(column);
+                           }
+                   }
+      columnType = columnTypeSpec(enclosingType);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_NOT:
+        jj_consume_token(R_NOT);
+        jj_consume_token(R_NULL);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_ENABLE:
+          jj_consume_token(K_ENABLE);
+          break;
+        default:
+          ;
+        }
+                                                                                     notNull = true;
+        break;
+      default:
+        ;
+      }
+      break;
+    case R_CHECK:
+    case R_UNIQUE:
+    case K_CONSTRAINT:
+    case K_PRIMARY:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_CONSTRAINT:
+        jj_consume_token(K_CONSTRAINT);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S_IDENTIFIER:
+      case S_QUOTED_IDENTIFIER:
+        OracleObjectName();
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_PRIMARY:
+        jj_consume_token(K_PRIMARY);
+        jj_consume_token(K_KEY);
+        jj_consume_token(O_OPENPAREN);
+        pkList((TableType)enclosingType);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      case R_CHECK:
+        jj_consume_token(R_CHECK);
+        jj_consume_token(O_OPENPAREN);
+        skipToClosingParen();
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      case R_UNIQUE:
+        jj_consume_token(R_UNIQUE);
+        jj_consume_token(O_OPENPAREN);
+        uniqList();
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      jj_consume_token(K_ENABLE);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+      if (column != null) {
+              column.setEnclosedType(columnType);
+              if (columnType instanceof UnresolvedType) {
+                  ((UnresolvedType)columnType).setOwningType(column);
+              }
+              if (notNull) {
+                  column.setNotNull();
+              }
+          }
+  }
+
+  final public DatabaseType columnTypeSpec(CompositeDatabaseType enclosingType) throws ParseException {
+ String s = null;
+ Token t = null;
+ DatabaseType dt = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_BFILE:
+    case K_BINARY_DOUBLE:
+    case K_BINARY_FLOAT:
+    case K_BINARY_INTEGER:
+    case K_BLOB:
+    case K_BOOLEAN:
+    case K_CHAR:
+    case K_CHARACTER:
+    case K_CLOB:
+    case K_DATE:
+    case K_DEC:
+    case K_DECIMAL:
+    case K_DOUBLE:
+    case K_FLOAT:
+    case K_INT:
+    case K_INTEGER:
+    case K_INTERVAL:
+    case K_LONG:
+    case K_MLSLABEL:
+    case K_NATIONAL:
+    case K_NATURAL:
+    case K_NCHAR:
+    case K_NCLOB:
+    case K_NUMBER:
+    case K_NUMERIC:
+    case K_NVARCHAR2:
+    case K_NVARCHAR:
+    case K_PLS_INTEGER:
+    case K_POSITIVE:
+    case K_RAW:
+    case K_REAL:
+    case K_ROWID:
+    case K_SIGNTYPE:
+    case K_SIMPLE_DOUBLE:
+    case K_SIMPLE_FLOAT:
+    case K_SIMPLE_INTEGER:
+    case K_SMALLINT:
+    case K_SYS_REFCURSOR:
+    case K_TIME:
+    case K_TIMESTAMP:
+    case K_UROWID:
+    case K_VARCHAR2:
+    case K_VARCHAR:
+      dt = datatype();
+      break;
+    case S_IDENTIFIER:
+    case S_QUOTED_IDENTIFIER:
+      s = columnSpec();
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        t = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_CONSTRAINT:
+      jj_consume_token(K_CONSTRAINT);
+      jj_consume_token(S_QUOTED_IDENTIFIER);
+      break;
+    default:
+      ;
+    }
+      if (s != null) {
+          for (String typeName : localTypes.keySet()) {
+              if (typeName.equals(s)) {
+                  dt = localTypes.get(s);
+                  break;
+              }
+          }
+          if (dt == null) {
+              if (t != null) {
+                  Long size = Long.decode(t.image);
+                  dt = new UnresolvedSizedType(s, size);
+              }
+              else {
+                  dt = new UnresolvedType(s);
+              }
+              ((UnresolvedType)dt).setOwningType(enclosingType);
+          }
+      }
+      {if (true) return dt;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void uniqList() throws ParseException {
+    OracleObjectName();
+    label_2:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_COMMA:
+        ;
+        break;
+      default:
+        break label_2;
+      }
+      jj_consume_token(O_COMMA);
+      OracleObjectName();
+    }
+  }
+
+  final public void pkList(TableType tableType) throws ParseException {
+    pk(tableType);
+    label_3:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_COMMA:
+        ;
+        break;
+      default:
+        break label_3;
+      }
+      jj_consume_token(O_COMMA);
+      pk(tableType);
+    }
+  }
+
+  final public void pk(TableType tableType) throws ParseException {
+String s = null;
+    s = OracleObjectName();
+       List<FieldType> columns = tableType.getColumns();
+       for (FieldType column : columns) {
+            if (column.getFieldName().equals(s)) {
+                column.setPk();
+                break;
+            }
+       }
+  }
+
+  final public void packageDeclaration(PLSQLPackageType packageType) throws ParseException {
+    if (jj_2_1(2)) {
+      variableDeclaration(packageType);
+    } else {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_SUBTYPE:
+      case R_TYPE:
+        typeOrSubTypeDeclaration(packageType);
+        break;
+      case R_CURSOR:
+        cursorDeclaration(packageType);
+        break;
+      case R_PROCEDURE:
+        procedureSpec(packageType);
+        break;
+      case R_FUNCTION:
+        functionSpec(packageType);
+        break;
+      case S_IDENTIFIER:
+        exceptionDeclaration();
+        break;
+      case K_PRAGMA:
+        pragmaDeclaration();
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+    }
+  }
+
+  final public void variableDeclaration(PLSQLPackageType packageType) throws ParseException {
+ Token varName = null;
+ DatabaseType varType;
+    varName = jj_consume_token(S_IDENTIFIER);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_CONSTANT:
+      jj_consume_token(K_CONSTANT);
+      break;
+    default:
+      ;
+    }
+    varType = typeSpec();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOT:
+      jj_consume_token(R_NOT);
+      jj_consume_token(R_NULL);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_ASSIGN:
+    case R_DEFAULT:
+      variableDefaultAssignment();
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(O_SEMICOLON);
+        FieldType variable = new FieldType(varName.image);
+        variable.setEnclosedType(varType);
+        packageType.addLocalVariable(variable);
+  }
+
+  final public void variableDefaultAssignment() throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_ASSIGN:
+      jj_consume_token(O_ASSIGN);
+      break;
+    case R_DEFAULT:
+      jj_consume_token(R_DEFAULT);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    skipToSemiColon();
+  }
+
+  final public DatabaseType datatype() throws ParseException {
+ Token t = null;
+ DatabaseType dt = null;
+ Token precision = null;
+ Long sl;
+ Long pl;
+ Token scale = null;
+ Token withTimeZone = null;
+ Token withLocalTimeZone = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_BINARY_INTEGER:
+      jj_consume_token(K_BINARY_INTEGER);
+                          {if (true) return BINARY_INTEGER_TYPE;}
+      break;
+    case K_BINARY_FLOAT:
+      jj_consume_token(K_BINARY_FLOAT);
+                          {if (true) return BINARY_FLOAT_TYPE;}
+      break;
+    case K_BINARY_DOUBLE:
+      jj_consume_token(K_BINARY_DOUBLE);
+                          {if (true) return BINARY_DOUBLE_TYPE;}
+      break;
+    case K_NATURAL:
+      jj_consume_token(K_NATURAL);
+                          {if (true) return NATURAL_TYPE;}
+      break;
+    case K_POSITIVE:
+      jj_consume_token(K_POSITIVE);
+                          {if (true) return POSITIVE_TYPE;}
+      break;
+    case K_SIGNTYPE:
+      jj_consume_token(K_SIGNTYPE);
+                          {if (true) return SIGN_TYPE;}
+      break;
+    case K_DEC:
+    case K_DECIMAL:
+    case K_NUMBER:
+    case K_NUMERIC:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_NUMBER:
+        t = jj_consume_token(K_NUMBER);
+        break;
+      case K_NUMERIC:
+        t = jj_consume_token(K_NUMERIC);
+        break;
+      case K_DECIMAL:
+        t = jj_consume_token(K_DECIMAL);
+        break;
+      case K_DEC:
+        t = jj_consume_token(K_DEC);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case O_ASTERISK:
+        case S_NUMBER:
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case O_ASTERISK:
+            precision = jj_consume_token(O_ASTERISK);
+            break;
+          case S_NUMBER:
+            precision = jj_consume_token(S_NUMBER);
+            break;
+          default:
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          break;
+        default:
+          ;
+        }
+        label_4:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case O_COMMA:
+            ;
+            break;
+          default:
+            break label_4;
+          }
+          jj_consume_token(O_COMMA);
+          scale = jj_consume_token(S_NUMBER);
+        }
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+            if (t.kind == K_NUMBER || t.kind == K_NUMERIC) {
+                if (precision != null && precision.image.equals("*")) {
+                    precision = null;
+                }
+                if (precision == null) {
+                    if (scale != null && scale.image.equals("0")) {
+                        dt = INTEGER_TYPE;
+                    }
+                    else {
+                        dt = new NumericType();
+                    }
+                }
+                    else {
+                        pl = Long.decode(precision.image);
+                        if (scale == null) {
+                        dt = new NumericType(pl);
+                    }
+                    else {
+                        sl = Long.decode(scale.image);
+                        dt = new NumericType(pl, sl);
+                        }
+                    }
+                //sometimes need to know difference between NUMERIC and NUMBER
+                if (dt != INTEGER_TYPE && t.kind == K_NUMBER) {
+                    ((NumericType)dt).setNumberSynonym(true);
+                }
+            }
+            else  if (t.kind == K_DECIMAL || t.kind == K_DEC) {
+                if (precision != null && precision.image.equals("*")) {
+                    precision = null;
+                }
+                if (precision == null) {
+                    dt = new DecimalType();
+                }
+                else {
+                    pl = Long.decode(precision.image);
+                    if (scale == null) {
+                        dt = new DecimalType(pl);
+                    }
+                    else {
+                        sl = Long.decode(scale.image);
+                        dt = new DecimalType(pl, sl);
+                    }
+                }
+            }
+            {if (true) return dt;}
+      break;
+    case K_LONG:
+      jj_consume_token(K_LONG);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_RAW:
+        t = jj_consume_token(K_RAW);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+              if (t == null) {
+              if (precision == null) {
+                  dt = new LongType();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  dt = new LongType(pl);
+              }
+              }
+              else {
+              if (precision == null) {
+                  dt = new LongRawType();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  dt = new LongRawType(pl);
+              }
+            }
+            {if (true) return dt;}
+      break;
+    case K_RAW:
+      jj_consume_token(K_RAW);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+            if (precision == null) {
+                dt = new RawType();
+            }
+            else {
+                pl = Long.decode(precision.image);
+                dt = new RawType(pl);
+            }
+            {if (true) return dt;}
+      break;
+    case K_BOOLEAN:
+      jj_consume_token(K_BOOLEAN);
+                    {if (true) return BOOLEAN_TYPE;}
+      break;
+    case K_DATE:
+      jj_consume_token(K_DATE);
+                 {if (true) return DATE_TYPE;}
+      break;
+    case K_INTERVAL:
+      jj_consume_token(K_INTERVAL);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_DAY:
+        jj_consume_token(K_DAY);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case O_OPENPAREN:
+          jj_consume_token(O_OPENPAREN);
+          precision = jj_consume_token(S_NUMBER);
+          jj_consume_token(O_CLOSEPAREN);
+          break;
+        default:
+          ;
+        }
+        jj_consume_token(R_TO);
+        jj_consume_token(K_SECOND);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case O_OPENPAREN:
+          jj_consume_token(O_OPENPAREN);
+          scale = jj_consume_token(S_NUMBER);
+          jj_consume_token(O_CLOSEPAREN);
+          break;
+        default:
+          ;
+        }
+                if (precision == null) {
+                        dt = new IntervalDayToSecond();
+                    }
+                    else {
+                        pl = Long.decode(precision.image);
+                        if (scale == null) {
+                            dt = new IntervalDayToSecond(pl);
+                        }
+                        else {
+                            sl = Long.decode(scale.image);
+                            dt = new IntervalDayToSecond(pl, sl);
+                        }
+                    }
+                {if (true) return dt;}
+        break;
+      case K_YEAR:
+        jj_consume_token(K_YEAR);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case O_OPENPAREN:
+          jj_consume_token(O_OPENPAREN);
+          jj_consume_token(S_NUMBER);
+          jj_consume_token(O_CLOSEPAREN);
+          break;
+        default:
+          ;
+        }
+        jj_consume_token(R_TO);
+        jj_consume_token(K_MONTH);
+                if (precision == null) {
+                    dt = new IntervalYearToMonth();
+                }
+                else {
+                    pl = Long.decode(precision.image);
+                    dt = new IntervalYearToMonth(pl);
+                }
+                {if (true) return dt;}
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      break;
+    case K_TIME:
+      jj_consume_token(K_TIME);
+                 {if (true) return TIME_TYPE;}
+      break;
+    case K_TIMESTAMP:
+      jj_consume_token(K_TIMESTAMP);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_WITH:
+        jj_consume_token(R_WITH);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_LOCAL:
+          withLocalTimeZone = jj_consume_token(K_LOCAL);
+          break;
+        default:
+          ;
+        }
+        withTimeZone = jj_consume_token(K_TIME);
+        jj_consume_token(K_ZONE);
+        break;
+      default:
+        ;
+      }
+          if (precision == null) {
+              dt = new TimeStampType();
+          }
+          else {
+              pl = Long.decode(precision.image);
+              dt = new TimeStampType(pl);
+          }
+          if (withLocalTimeZone !=  null) {
+              ((TimeStampType)dt).setWithLocalTimeZone();
+          }
+          else if (withTimeZone != null) {
+              ((TimeStampType)dt).setWithTimeZone();
+          }
+          {if (true) return dt;}
+      break;
+    case K_INTEGER:
+      jj_consume_token(K_INTEGER);
+                     {if (true) return INTEGER_TYPE;}
+      break;
+    case K_INT:
+      jj_consume_token(K_INT);
+                     {if (true) return INTEGER_TYPE;}
+      break;
+    case K_SMALLINT:
+      jj_consume_token(K_SMALLINT);
+                     {if (true) return SMALLINT_TYPE;}
+      break;
+    case K_FLOAT:
+      jj_consume_token(K_FLOAT);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+          if (precision == null) {
+              {if (true) return new FloatType();}
+          }
+          else {
+              pl = Long.decode(precision.image);
+              FloatType ft = new FloatType(pl);
+              {if (true) return ft;}
+          }
+      break;
+    case K_REAL:
+      jj_consume_token(K_REAL);
+                 {if (true) return new RealType();}
+      break;
+    case K_MLSLABEL:
+      jj_consume_token(K_MLSLABEL);
+                     {if (true) return MLSLABEL_TYPE;}
+      break;
+    case K_PLS_INTEGER:
+      jj_consume_token(K_PLS_INTEGER);
+                        {if (true) return PLS_INTEGER_TYPE;}
+      break;
+    case K_SIMPLE_INTEGER:
+      jj_consume_token(K_SIMPLE_INTEGER);
+                           {if (true) return SIMPLE_INTEGER_TYPE;}
+      break;
+    case K_SIMPLE_FLOAT:
+      jj_consume_token(K_SIMPLE_FLOAT);
+                         {if (true) return SIMPLE_FLOAT_TYPE;}
+      break;
+    case K_SIMPLE_DOUBLE:
+      jj_consume_token(K_SIMPLE_DOUBLE);
+                          {if (true) return SIMPLE_DOUBLE_TYPE;}
+      break;
+    case K_SYS_REFCURSOR:
+      jj_consume_token(K_SYS_REFCURSOR);
+                           {if (true) return SYS_REFCURSOR_TYPE;}
+      break;
+    case K_BLOB:
+      jj_consume_token(K_BLOB);
+                  {if (true) return new BlobType();}
+      break;
+    case K_NCLOB:
+      jj_consume_token(K_NCLOB);
+                  {if (true) return new NClobType();}
+      break;
+    case K_BFILE:
+      jj_consume_token(K_BFILE);
+                   {if (true) return BFILE_TYPE;}
+      break;
+    case K_ROWID:
+      jj_consume_token(K_ROWID);
+                  {if (true) return ROWID_TYPE;}
+      break;
+    case K_UROWID:
+      jj_consume_token(K_UROWID);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+          if (precision == null) {
+              {if (true) return new URowIdType();}
+          }
+          else {
+              pl = Long.decode(precision.image);
+              {if (true) return new URowIdType(pl);}
+          }
+      break;
+    case K_DOUBLE:
+      jj_consume_token(K_DOUBLE);
+      jj_consume_token(K_PRECISION);
+                                 {if (true) return new DoubleType();}
+      break;
+    case K_CHAR:
+      jj_consume_token(K_CHAR);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_VARYING:
+        t = jj_consume_token(K_VARYING);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_BYTE:
+        case K_CHAR:
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case K_BYTE:
+            jj_consume_token(K_BYTE);
+            break;
+          case K_CHAR:
+            jj_consume_token(K_CHAR);
+            break;
+          default:
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          break;
+        default:
+          ;
+        }
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_CHARACTER:
+        jj_consume_token(K_CHARACTER);
+        jj_consume_token(K_SET);
+        jj_consume_token(S_IDENTIFIER);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_CHARSET:
+          jj_consume_token(K_CHARSET);
+          break;
+        default:
+          ;
+        }
+        break;
+      default:
+        ;
+      }
+          if (t == null) {
+              if (precision == null) {
+                  {if (true) return new CharType();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new CharType(pl);}
+              }
+          }
+          else {
+              // ANSI syntax for VARCHAR2
+              if (precision == null) {
+                  {if (true) return new VarChar2Type();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new VarChar2Type(pl);}
+              }
+          }
+      break;
+    case K_VARCHAR:
+      jj_consume_token(K_VARCHAR);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_VARYING:
+        jj_consume_token(K_VARYING);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_BYTE:
+        case K_CHAR:
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case K_BYTE:
+            jj_consume_token(K_BYTE);
+            break;
+          case K_CHAR:
+            jj_consume_token(K_CHAR);
+            break;
+          default:
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          break;
+        default:
+          ;
+        }
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_CHARACTER:
+        jj_consume_token(K_CHARACTER);
+        jj_consume_token(K_SET);
+        jj_consume_token(S_IDENTIFIER);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_CHARSET:
+          jj_consume_token(K_CHARSET);
+          break;
+        default:
+          ;
+        }
+        break;
+      default:
+        ;
+      }
+          if (precision == null) {
+              {if (true) return new VarCharType();}
+          }
+          else {
+              pl = Long.decode(precision.image);
+              {if (true) return new VarCharType(pl);}
+          }
+      break;
+    case K_VARCHAR2:
+      jj_consume_token(K_VARCHAR2);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_VARYING:
+        jj_consume_token(K_VARYING);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_BYTE:
+        case K_CHAR:
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case K_BYTE:
+            jj_consume_token(K_BYTE);
+            break;
+          case K_CHAR:
+            jj_consume_token(K_CHAR);
+            break;
+          default:
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          break;
+        default:
+          ;
+        }
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_CHARACTER:
+        jj_consume_token(K_CHARACTER);
+        jj_consume_token(K_SET);
+        jj_consume_token(S_IDENTIFIER);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_CHARSET:
+          jj_consume_token(K_CHARSET);
+          break;
+        default:
+          ;
+        }
+        break;
+      default:
+        ;
+      }
+            if (precision == null) {
+                {if (true) return new VarChar2Type();}
+            }
+            else {
+                pl = Long.decode(precision.image);
+                {if (true) return new VarChar2Type(pl);}
+            }
+      break;
+    case K_CHARACTER:
+      jj_consume_token(K_CHARACTER);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_VARYING:
+        t = jj_consume_token(K_VARYING);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+          if (t == null) {
+              if (precision == null) {
+                  {if (true) return new CharType();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new CharType(pl);}
+              }
+          }
+          else {
+              // ANSI syntax for VARCHAR
+              if (precision == null) {
+                  {if (true) return new VarCharType();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new VarCharType(pl);}
+              }
+          }
+      break;
+    case K_NCHAR:
+      jj_consume_token(K_NCHAR);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_VARYING:
+        t = jj_consume_token(K_VARYING);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+          if (t == null) {
+              if (precision == null) {
+                  {if (true) return new NCharType();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new NCharType(pl);}
+              }
+          }
+          else {
+              // ANSI syntax for NVARCHAR2
+              if (precision == null) {
+                  {if (true) return new NVarChar2Type();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new NVarChar2Type(pl);}
+              }
+          }
+      break;
+    case K_NVARCHAR:
+      jj_consume_token(K_NVARCHAR);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+            if (precision == null) {
+                {if (true) return new NVarChar2Type();}
+            }
+            else {
+                pl = Long.decode(precision.image);
+                {if (true) return new NVarChar2Type(pl);}
+            }
+      break;
+    case K_NVARCHAR2:
+      jj_consume_token(K_NVARCHAR2);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+            if (precision == null) {
+                {if (true) return new NVarChar2Type();}
+            }
+            else {
+                pl = Long.decode(precision.image);
+                {if (true) return new NVarChar2Type(pl);}
+            }
+      break;
+    case K_NATIONAL:
+      jj_consume_token(K_NATIONAL);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_CHARACTER:
+        jj_consume_token(K_CHARACTER);
+        break;
+      case K_CHAR:
+        jj_consume_token(K_CHAR);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_VARYING:
+        t = jj_consume_token(K_VARYING);
+        break;
+      default:
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+        jj_consume_token(O_OPENPAREN);
+        precision = jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        ;
+      }
+          if (t == null) {
+              if (precision == null) {
+                  {if (true) return new NCharType();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new NCharType(pl);}
+              }
+          }
+          else {
+              // ANSI syntax for NVARCHAR2
+              if (precision == null) {
+                  {if (true) return new NVarChar2Type();}
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  {if (true) return new NVarChar2Type(pl);}
+              }
+          }
+      break;
+    case K_CLOB:
+      jj_consume_token(K_CLOB);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_CHARACTER:
+        jj_consume_token(K_CHARACTER);
+        jj_consume_token(K_SET);
+        jj_consume_token(S_IDENTIFIER);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_CHARSET:
+          jj_consume_token(K_CHARSET);
+          break;
+        default:
+          ;
+        }
+        break;
+      default:
+        ;
+      }
+                                                                          {if (true) return new ClobType();}
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+  final public DatabaseType typeSpec() throws ParseException {
+ boolean isTYPEType = false;
+ boolean isROWTYPEType = false;
+ DatabaseType dataType = null;
+ String spec = null;
+ String s = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_BFILE:
+    case K_BINARY_DOUBLE:
+    case K_BINARY_FLOAT:
+    case K_BINARY_INTEGER:
+    case K_BLOB:
+    case K_BOOLEAN:
+    case K_CHAR:
+    case K_CHARACTER:
+    case K_CLOB:
+    case K_DATE:
+    case K_DEC:
+    case K_DECIMAL:
+    case K_DOUBLE:
+    case K_FLOAT:
+    case K_INT:
+    case K_INTEGER:
+    case K_INTERVAL:
+    case K_LONG:
+    case K_MLSLABEL:
+    case K_NATIONAL:
+    case K_NATURAL:
+    case K_NCHAR:
+    case K_NCLOB:
+    case K_NUMBER:
+    case K_NUMERIC:
+    case K_NVARCHAR2:
+    case K_NVARCHAR:
+    case K_PLS_INTEGER:
+    case K_POSITIVE:
+    case K_RAW:
+    case K_REAL:
+    case K_ROWID:
+    case K_SIGNTYPE:
+    case K_SIMPLE_DOUBLE:
+    case K_SIMPLE_FLOAT:
+    case K_SIMPLE_INTEGER:
+    case K_SMALLINT:
+    case K_SYS_REFCURSOR:
+    case K_TIME:
+    case K_TIMESTAMP:
+    case K_UROWID:
+    case K_VARCHAR2:
+    case K_VARCHAR:
+      dataType = datatype();
+      break;
+    case S_IDENTIFIER:
+    case S_QUOTED_IDENTIFIER:
+      spec = columnSpec();
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_OPENPAREN:
+      case R_ANCHORED_ROWTYPE:
+      case R_ANCHORED_TYPE:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case O_OPENPAREN:
+          jj_consume_token(O_OPENPAREN);
+          jj_consume_token(S_NUMBER);
+          jj_consume_token(O_CLOSEPAREN);
+          break;
+        case R_ANCHORED_TYPE:
+          jj_consume_token(R_ANCHORED_TYPE);
+             isTYPEType=true;
+             s = spec + removeQuotes(tokenImage[R_ANCHORED_TYPE]);
+          break;
+        case R_ANCHORED_ROWTYPE:
+          jj_consume_token(R_ANCHORED_ROWTYPE);
+             isROWTYPEType =true;
+             s = spec + removeQuotes(tokenImage[R_ANCHORED_ROWTYPE]);
+          break;
+        default:
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+        break;
+      default:
+        ;
+      }
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+      if (dataType == null && localTypes != null) {
+          for (String typeName : localTypes.keySet()) {
+              if (typeName.equals(spec)) {
+                  dataType = localTypes.get(spec);
+                  break;
+              }
+          }
+      }
+      if (dataType == null) {
+          UnresolvedType uType = new UnresolvedType(spec);
+          if (isTYPEType) {
+              TYPEType tType = new TYPEType(s);
+              tType.setEnclosedType(uType);
+              uType.setOwningType(tType);
+              dataType = tType;
+              localTypes.put(spec, dataType);
+          }
+          else if (isROWTYPEType) {
+              ROWTYPEType rType = new ROWTYPEType(s);
+              rType.setEnclosedType(uType);
+              uType.setOwningType(rType);
+              dataType = rType;
+              localTypes.put(spec, dataType);
+          }
+          else {
+              dataType = uType;
+          }
+      }
+      {if (true) return dataType;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String columnSpec() throws ParseException {
+ String s1 = null;
+ String s2 = null;
+ String s3 = null;
+    s1 = OracleObjectName();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_DOT:
+      jj_consume_token(O_DOT);
+      s2 = OracleObjectName();
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_DOT:
+        jj_consume_token(O_DOT);
+        s3 = OracleObjectName();
+        break;
+      default:
+        ;
+      }
+      break;
+    default:
+      ;
+    }
+      StringBuilder sb = new StringBuilder(s1);
+      if (s2 != null) {
+          sb.append('.');
+          sb.append(s2);
+          if (s3 != null) {
+              sb.append('.');
+              sb.append(s3);
+          }
+      }
+      {if (true) return sb.toString();}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String tableSpec() throws ParseException {
+    OracleObjectName();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_DOT:
+      jj_consume_token(O_DOT);
+      OracleObjectName();
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_ATSIGN:
+        jj_consume_token(O_ATSIGN);
+        jj_consume_token(S_IDENTIFIER);
+        break;
+      default:
+        ;
+      }
+      break;
+    default:
+      ;
+    }
+     {if (true) return token.image;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String typeName() throws ParseException {
+    OracleObjectName();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_DOT:
+      jj_consume_token(O_DOT);
+      OracleObjectName();
+      break;
+    default:
+      ;
+    }
+     {if (true) return token.image;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void typeOrSubTypeDeclaration(PLSQLPackageType packageType) throws ParseException {
+ String s = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_TYPE:
+      typeDeclaration(packageType);
+      break;
+    case R_SUBTYPE:
+      subtypeDeclaration(packageType);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+  }
+
+  final public void typeDeclaration(PLSQLPackageType packageType) throws ParseException {
+ String s = null;
+    jj_consume_token(R_TYPE);
+    s = typeName();
+    jj_consume_token(R_IS);
+    aTypeDeclaration(packageType, s);
+    jj_consume_token(O_SEMICOLON);
+  }
+
+  final public void aTypeDeclaration(PLSQLPackageType packageType, String typeName) throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_RECORD:
+      recordDeclaration(packageType, typeName);
+      break;
+    case R_TABLE:
+      plsqlTableDeclaration(packageType, typeName);
+      break;
+    case K_VARRAY:
+    case K_VARYING:
+      varrayDeclaration(packageType);
+      break;
+    case K_REF:
+      refCursorDeclaration(packageType, typeName);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+  }
+
+  final public void recordDeclaration(PLSQLPackageType packageType, String typeName) throws ParseException {
+  PLSQLRecordType plsqlRecordType = new PLSQLRecordType(typeName);
+  plsqlRecordType.setParentType(packageType);
+    jj_consume_token(K_RECORD);
+    jj_consume_token(O_OPENPAREN);
+    fieldDeclarations(plsqlRecordType);
+    jj_consume_token(O_CLOSEPAREN);
+      packageType.addType(plsqlRecordType);
+      localTypes.put(typeName, plsqlRecordType);
+  }
+
+  final public void fieldDeclarations(PLSQLRecordType plsqlRecordType) throws ParseException {
+    fieldDeclaration(plsqlRecordType);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_COMMA:
+      jj_consume_token(O_COMMA);
+      fieldDeclarations(plsqlRecordType);
+      break;
+    default:
+      ;
+    }
+  }
+
+  final public void fieldDeclaration(PLSQLRecordType plsqlRecordType) throws ParseException {
+  String s = null;
+  DatabaseType dataType = null;
+  FieldType fieldType = null;
+    s = typeName();
+    dataType = typeSpec();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOT:
+      jj_consume_token(R_NOT);
+      jj_consume_token(R_NULL);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_ASSIGN:
+    case R_DEFAULT:
+      fieldDefaultAssignment();
+      break;
+    default:
+      ;
+    }
+      fieldType = new FieldType(s);
+      fieldType.setEnclosedType(dataType);
+      plsqlRecordType.addField(fieldType);
+      if (dataType instanceof UnresolvedType) {
+          ((UnresolvedType)dataType).setOwningType(plsqlRecordType);
+      }
+  }
+
+  final public void fieldDefaultAssignment() throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_ASSIGN:
+      jj_consume_token(O_ASSIGN);
+      break;
+    case R_DEFAULT:
+      jj_consume_token(R_DEFAULT);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    skipToNextArg();
+  }
+
+  final public void subtypeDeclaration(PLSQLPackageType packageType) throws ParseException {
+ String subtypeName;
+DatabaseType subtype;
+Token notNull = null;
+Token rangeStart = null;
+Token rangeEnd = null;
+    jj_consume_token(R_SUBTYPE);
+    subtypeName = OracleObjectName();
+    jj_consume_token(R_IS);
+    subtype = typeSpec();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_RANGE:
+      jj_consume_token(K_RANGE);
+      rangeStart = jj_consume_token(S_NUMBER);
+      jj_consume_token(O_DOUBLEDOT);
+      rangeEnd = jj_consume_token(S_NUMBER);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOT:
+      jj_consume_token(R_NOT);
+      notNull = jj_consume_token(R_NULL);
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(O_SEMICOLON);
+      PLSQLSubType newPLSQLSubType = new PLSQLSubType(subtypeName);
+      newPLSQLSubType.setEnclosedType(subtype);
+      if (subtype instanceof UnresolvedType) {
+          ((UnresolvedType)subtype).setOwningType(newPLSQLSubType);
+      }
+      packageType.addType(newPLSQLSubType);
+      if (notNull != null) {
+          newPLSQLSubType.setNotNull(true);
+      }
+      if (rangeStart != null) {
+          long rStart = Long.decode(rangeStart.image).longValue();
+          long rEnd = Long.decode(rangeEnd.image).longValue();
+          newPLSQLSubType.setHasRange(true);
+          newPLSQLSubType.setRangeStart(rStart);
+          newPLSQLSubType.setRangeEnd(rEnd);
+      }
+      localTypes.put(subtypeName, newPLSQLSubType);
+  }
+
+  final public void plsqlTableDeclaration(PLSQLPackageType packageType, String typeName) throws ParseException {
+  PLSQLCollectionType plsqlTable = new PLSQLCollectionType(typeName);
+  plsqlTable.setParentType(packageType);
+  DatabaseType nestedType;
+    jj_consume_token(R_TABLE);
+    jj_consume_token(R_OF);
+    nestedType = typeSpec();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOT:
+      jj_consume_token(R_NOT);
+      jj_consume_token(R_NULL);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_INDEX:
+      jj_consume_token(R_INDEX);
+      jj_consume_token(R_BY);
+      plsqlTableIndexByDeclaration(plsqlTable);
+      break;
+    default:
+      ;
+    }
+      if (nestedType instanceof UnresolvedType) {
+        ((UnresolvedType)nestedType).setOwningType(plsqlTable);
+      }
+      plsqlTable.setEnclosedType(nestedType);
+      packageType.addType(plsqlTable);
+      localTypes.put(typeName, plsqlTable);
+  }
+
+  final public void plsqlTableIndexByDeclaration(PLSQLCollectionType plsqlTable) throws ParseException {
+  DatabaseType indexType = null;
+  Token precision = null;
+  Token otherIndexByType = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_PLS_INTEGER:
+      jj_consume_token(K_PLS_INTEGER);
+                       indexType = PLS_INTEGER_TYPE;
+      break;
+    case K_BINARY_INTEGER:
+      jj_consume_token(K_BINARY_INTEGER);
+                           indexType = BINARY_INTEGER_TYPE;
+      break;
+    case K_VARCHAR2:
+      jj_consume_token(K_VARCHAR2);
+      jj_consume_token(O_OPENPAREN);
+      precision = jj_consume_token(S_NUMBER);
+      jj_consume_token(O_CLOSEPAREN);
+        if (precision == null) {
+            indexType = new VarChar2Type();
+        }
+        else {
+            Long pl = Long.decode(precision.image);
+            indexType = new VarChar2Type(pl);
+        }
+      break;
+    case K_STRING:
+      otherIndexByType = jj_consume_token(K_STRING);
+      jj_consume_token(O_OPENPAREN);
+      jj_consume_token(S_NUMBER);
+      jj_consume_token(O_CLOSEPAREN);
+        String indexTypename = otherIndexByType.image;
+        for (String typeName : localTypes.keySet()) {
+            if (typeName.equals(indexTypename)) {
+                indexType = localTypes.get(indexTypename);
+                break;
+            }
+        }
+        //what else can INDEX BY be? Unresolved for now ...
+        if (indexType == null) {
+            indexType = new UnresolvedType(indexTypename);
+            ((UnresolvedType)indexType).setOwningType(plsqlTable);
+        }
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+      plsqlTable.setIndexed(true);
+      plsqlTable.setIndexType(indexType);
+  }
+
+  final public void varrayDeclaration(PLSQLPackageType packageType) throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_VARRAY:
+      jj_consume_token(K_VARRAY);
+      break;
+    case K_VARYING:
+      jj_consume_token(K_VARYING);
+      jj_consume_token(K_ARRAY);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    jj_consume_token(O_OPENPAREN);
+    jj_consume_token(S_NUMBER);
+    jj_consume_token(O_CLOSEPAREN);
+    jj_consume_token(R_OF);
+    datatype();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOT:
+      jj_consume_token(R_NOT);
+      jj_consume_token(R_NULL);
+      break;
+    default:
+      ;
+    }
+  }
+
+  final public void refCursorDeclaration(PLSQLPackageType packageType, String cursorTypeName) throws ParseException {
+ PLSQLCursorType cursorType = null;
+    jj_consume_token(K_REF);
+    jj_consume_token(R_CURSOR);
+        cursorType = new PLSQLCursorType(cursorTypeName);
+        packageType.addCursor(cursorType);
+        localTypes.put(cursorTypeName, cursorType);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_RETURN:
+      refCursorTypeSpec(cursorType, packageType);
+      break;
+    default:
+      ;
+    }
+  }
+
+  final public void refCursorTypeSpec(PLSQLCursorType cursorType, PLSQLPackageType packageType) throws ParseException {
+ String s = null;
+ Token spec = null;
+ boolean isTYPEType = false;
+ boolean isROWTYPEType = false;
+ DatabaseType localType = null;
+    jj_consume_token(K_RETURN);
+    spec = jj_consume_token(S_IDENTIFIER);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_ANCHORED_ROWTYPE:
+    case R_ANCHORED_TYPE:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_ANCHORED_TYPE:
+        jj_consume_token(R_ANCHORED_TYPE);
+                  isTYPEType = true;
+                  s = spec.image + removeQuotes(tokenImage[R_ANCHORED_TYPE]);
+        break;
+      case R_ANCHORED_ROWTYPE:
+        jj_consume_token(R_ANCHORED_ROWTYPE);
+              isROWTYPEType = true;
+              s = spec.image + removeQuotes(tokenImage[R_ANCHORED_ROWTYPE]);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      break;
+    default:
+      ;
+    }
+      //check local variables first
+          for (FieldType varField : packageType.getLocalVariables()) {
+              if (spec.image.equals(varField.getFieldName())) {
+              if (isTYPEType) {
+                  TYPEType tType = new TYPEType(s);
+                  UnresolvedType uType = new UnresolvedType(s);
+                  tType.setEnclosedType(uType);
+                  uType.setOwningType(tType);
+                  localType = tType;
+              }
+              else if (isROWTYPEType) {
+                  ROWTYPEType rType = new ROWTYPEType(s);
+                  UnresolvedType uType = new UnresolvedType(s);
+                  rType.setEnclosedType(uType);
+                  uType.setOwningType(rType);
+                  localType = rType;
+              }
+              else {
+                  localType = varField.getEnclosedType();
+              }
+              cursorType.setEnclosedType(localType);
+                  break;
+              }
+          }
+      if (localType == null) {
+          localType = localTypes.get(spec.image);
+          if (localType == null) {
+                  UnresolvedType uType = new UnresolvedType(spec.image);
+                  if (isTYPEType) {
+                      TYPEType tType = new TYPEType(s);
+                      tType.setEnclosedType(uType);
+                      uType.setOwningType(tType);
+                      cursorType.setEnclosedType(tType);
+                  }
+                  else if (isROWTYPEType) {
+                      ROWTYPEType rType = new ROWTYPEType(s);
+                      rType.setEnclosedType(uType);
+                      uType.setOwningType(rType);
+                      cursorType.setEnclosedType(rType);
+                  }
+                  else {
+                      uType.setOwningType(cursorType);
+                      cursorType.setEnclosedType(uType);
+                  }
+              }
+              else {
+                  cursorType.setEnclosedType(localType);
+              }
+          }
+  }
+
+  final public void cursorDeclaration(PLSQLPackageType packageType) throws ParseException {
+ Token t = null;
+    jj_consume_token(R_CURSOR);
+    t = jj_consume_token(S_IDENTIFIER);
+    jj_consume_token(O_SEMICOLON);
+  }
+
 // Procedure Specification
-  final public void procedureSpec(PLSQLPackageType packageType) throws ParseException {
- Token t = null;
- ProcedureType procedureType = null;
-    jj_consume_token(R_PROCEDURE);
-    t = jj_consume_token(S_IDENTIFIER);
-            procedureType = new ProcedureType(t.image);
-            procedureType.setCatalogName(packageType.getPackageName());
-            procedureType.setSchema(packageType.getSchema());
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_OPENPAREN:
-      jj_consume_token(O_OPENPAREN);
-      argumentList(procedureType);
-      jj_consume_token(O_CLOSEPAREN);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(O_SEMICOLON);
-      packageType.addProcedure(procedureType);
-  }
-
-  final public void argumentList(ProcedureType procedureType) throws ParseException {
-    argument(procedureType);
-    label_5:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case O_COMMA:
-        ;
-        break;
-      default:
-        break label_5;
-      }
-      jj_consume_token(O_COMMA);
-      argument(procedureType);
-    }
-  }
-
+  final public void procedureSpec(PLSQLPackageType packageType) throws ParseException {
+ Token t = null;
+ ProcedureType procedureType = null;
+    jj_consume_token(R_PROCEDURE);
+    t = jj_consume_token(S_IDENTIFIER);
+            procedureType = new ProcedureType(t.image);
+            procedureType.setCatalogName(packageType.getPackageName());
+            procedureType.setSchema(packageType.getSchema());
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_OPENPAREN:
+      jj_consume_token(O_OPENPAREN);
+      argumentList(procedureType);
+      jj_consume_token(O_CLOSEPAREN);
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(O_SEMICOLON);
+      packageType.addProcedure(procedureType);
+  }
+
+  final public void argumentList(ProcedureType procedureType) throws ParseException {
+    argument(procedureType);
+    label_5:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case O_COMMA:
+        ;
+        break;
+      default:
+        break label_5;
+      }
+      jj_consume_token(O_COMMA);
+      argument(procedureType);
+    }
+  }
+
 // Function Specification
-  final public void functionSpec(PLSQLPackageType packageType) throws ParseException {
- Token t = null;
- FunctionType functionType = null;
- ArgumentType returnDataType = null;
-    jj_consume_token(R_FUNCTION);
-    t = jj_consume_token(S_IDENTIFIER);
-            functionType = new FunctionType(t.image);
-            functionType.setCatalogName(packageType.getPackageName());
-            functionType.setSchema(packageType.getSchema());
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_OPENPAREN:
-      jj_consume_token(O_OPENPAREN);
-      argumentList(functionType);
-      jj_consume_token(O_CLOSEPAREN);
-      break;
-    default:
-      ;
-    }
-    returnDataType = functionReturnSpec();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_DETERMINISTIC:
-    case K_PARALLEL_ENABLE:
-    case K_PIPELINED:
-    case K_RESULT_CACHE:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_DETERMINISTIC:
-        jj_consume_token(K_DETERMINISTIC);
-        break;
-      case K_PIPELINED:
-        jj_consume_token(K_PIPELINED);
-        break;
-      case K_PARALLEL_ENABLE:
-        jj_consume_token(K_PARALLEL_ENABLE);
-        break;
-      case K_RESULT_CACHE:
-        jj_consume_token(K_RESULT_CACHE);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(O_SEMICOLON);
-      functionType.setReturnArgument(returnDataType);
-      packageType.addProcedure(functionType);
-  }
-
-  final public ArgumentType functionReturnSpec() throws ParseException {
- DatabaseType dataType = null;
-    jj_consume_token(K_RETURN);
-    dataType = typeSpec();
-      ArgumentType returnType = new ArgumentType(null);
-      returnType.setDirection(ArgumentTypeDirection.RETURN);
-      returnType.setEnclosedType(dataType);
-      if (dataType instanceof UnresolvedType) {
-          ((UnresolvedType)dataType).setOwningType(returnType);
-      }
-      {if (true) return returnType;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public void argument(ProcedureType procedureType) throws ParseException {
- Token t = null;
- ArgumentType argumentType = null;
- DatabaseType argumentDataType = null;
+  final public void functionSpec(PLSQLPackageType packageType) throws ParseException {
+ Token t = null;
+ FunctionType functionType = null;
+ ArgumentType returnDataType = null;
+    jj_consume_token(R_FUNCTION);
+    t = jj_consume_token(S_IDENTIFIER);
+            functionType = new FunctionType(t.image);
+            functionType.setCatalogName(packageType.getPackageName());
+            functionType.setSchema(packageType.getSchema());
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_OPENPAREN:
+      jj_consume_token(O_OPENPAREN);
+      argumentList(functionType);
+      jj_consume_token(O_CLOSEPAREN);
+      break;
+    default:
+      ;
+    }
+    returnDataType = functionReturnSpec();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_DETERMINISTIC:
+    case K_PARALLEL_ENABLE:
+    case K_PIPELINED:
+    case K_RESULT_CACHE:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_DETERMINISTIC:
+        jj_consume_token(K_DETERMINISTIC);
+        break;
+      case K_PIPELINED:
+        jj_consume_token(K_PIPELINED);
+        break;
+      case K_PARALLEL_ENABLE:
+        jj_consume_token(K_PARALLEL_ENABLE);
+        break;
+      case K_RESULT_CACHE:
+        jj_consume_token(K_RESULT_CACHE);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(O_SEMICOLON);
+      functionType.setReturnArgument(returnDataType);
+      packageType.addProcedure(functionType);
+  }
+
+  final public ArgumentType functionReturnSpec() throws ParseException {
+ DatabaseType dataType = null;
+    jj_consume_token(K_RETURN);
+    dataType = typeSpec();
+      ArgumentType returnType = new ArgumentType(null);
+      returnType.setDirection(ArgumentTypeDirection.RETURN);
+      returnType.setEnclosedType(dataType);
+      if (dataType instanceof UnresolvedType) {
+          ((UnresolvedType)dataType).setOwningType(returnType);
+      }
+      {if (true) return returnType;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void argument(ProcedureType procedureType) throws ParseException {
+ Token t = null;
+ ArgumentType argumentType = null;
+ DatabaseType argumentDataType = null;
  ArgumentTypeDirection argDirection = ArgumentTypeDirection.IN; // by default, arguments are IN
- String direction = null;
- boolean defaultAssignment = false;
-    t = jj_consume_token(S_IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_IN:
-    case K_OUT:
-      direction = direction();
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_NOCOPY:
-      jj_consume_token(K_NOCOPY);
-      break;
-    default:
-      ;
-    }
-    argumentDataType = typeSpec();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_ASSIGN:
-    case R_DEFAULT:
-      defaultAssignment = argumentDefaultAssignment();
-      break;
-    default:
-      ;
-    }
-      argumentType = new ArgumentType(t.image);
-      argumentType.setEnclosedType(argumentDataType);
-      if (argumentDataType instanceof UnresolvedType) {
-          ((UnresolvedType)argumentDataType).setOwningType(argumentType);
-      }
-      if (direction != null) {
-          if ("OUT".equals(direction)) {
-              argDirection = ArgumentTypeDirection.OUT;
-          }
-          else if ("IN OUT".equals(direction)) {
-              argDirection = ArgumentTypeDirection.INOUT;
-          }
-          argumentType.setDirection(argDirection);
-      }
-      if (defaultAssignment) {
-          argumentType.setOptional();
-      }
-      procedureType.addArgument(argumentType);
-  }
-
-  final public boolean argumentDefaultAssignment() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_ASSIGN:
-      jj_consume_token(O_ASSIGN);
-      break;
-    case R_DEFAULT:
-      jj_consume_token(R_DEFAULT);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    skipToNextArg();
-      {if (true) return true;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public void exceptionDeclaration(PLSQLPackageType packageType) throws ParseException {
-    jj_consume_token(S_IDENTIFIER);
-    jj_consume_token(R_EXCEPTION);
-    jj_consume_token(O_SEMICOLON);
-  }
-
-  final public void pragmaDeclaration(PLSQLPackageType packageType) throws ParseException {
-    jj_consume_token(K_PRAGMA);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_AUTONOMOUS_TRANSACTION:
-    case K_EXCEPTION_INIT:
-    case K_INLINE:
-    case K_RESTRICT_REFERENCES:
-    case K_SERIALLY_REUSABLE:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_AUTONOMOUS_TRANSACTION:
-        jj_consume_token(K_AUTONOMOUS_TRANSACTION);
-        break;
-      case K_EXCEPTION_INIT:
-        jj_consume_token(K_EXCEPTION_INIT);
-        jj_consume_token(O_OPENPAREN);
-        jj_consume_token(S_IDENTIFIER);
-        jj_consume_token(O_COMMA);
-        jj_consume_token(S_NUMBER);
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      case K_SERIALLY_REUSABLE:
-        jj_consume_token(K_SERIALLY_REUSABLE);
-        break;
-      case K_INLINE:
-        jj_consume_token(K_INLINE);
-        jj_consume_token(O_OPENPAREN);
-        jj_consume_token(S_IDENTIFIER);
-        jj_consume_token(O_COMMA);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case R_NO:
-        case R_YES:
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case R_YES:
-            jj_consume_token(R_YES);
-            break;
-          case R_NO:
-            jj_consume_token(R_NO);
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          ;
-        }
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      case K_RESTRICT_REFERENCES:
-        jj_consume_token(K_RESTRICT_REFERENCES);
-        jj_consume_token(O_OPENPAREN);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case R_DEFAULT:
-        case S_IDENTIFIER:
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case S_IDENTIFIER:
-            jj_consume_token(S_IDENTIFIER);
-            break;
-          case R_DEFAULT:
-            jj_consume_token(R_DEFAULT);
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          ;
-        }
-        label_6:
-        while (true) {
-          jj_consume_token(O_COMMA);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case K_RNDS:
-          case K_RNPS:
-          case K_TRUST:
-          case K_WNDS:
-          case K_WNPS:
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case K_RNDS:
-              jj_consume_token(K_RNDS);
-              break;
-            case K_WNDS:
-              jj_consume_token(K_WNDS);
-              break;
-            case K_RNPS:
-              jj_consume_token(K_RNPS);
-              break;
-            case K_WNPS:
-              jj_consume_token(K_WNPS);
-              break;
-            case K_TRUST:
-              jj_consume_token(K_TRUST);
-              break;
-            default:
-              jj_consume_token(-1);
-              throw new ParseException();
-            }
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case O_COMMA:
-            ;
-            break;
-          default:
-            break label_6;
-          }
-        }
-        jj_consume_token(O_CLOSEPAREN);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(O_SEMICOLON);
-  }
-
-  final public void orReplace() throws ParseException {
-    jj_consume_token(R_OR);
-    jj_consume_token(K_REPLACE);
-  }
-
-  final public void invokerRights() throws ParseException {
-    jj_consume_token(K_AUTHID);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_CURRENT_USER:
-      jj_consume_token(K_CURRENT_USER);
-      break;
-    case K_DEFINER:
-      jj_consume_token(K_DEFINER);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void as() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_AS:
-      jj_consume_token(R_AS);
-      break;
-    case R_IS:
-      jj_consume_token(R_IS);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public String direction() throws ParseException {
- String dir = "";
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_IN:
-      jj_consume_token(R_IN);
-                dir = "IN";
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_OUT:
-        jj_consume_token(K_OUT);
-                                        dir += " OUT";
-        break;
-      default:
-        ;
-      }
-      break;
-    case K_OUT:
-      jj_consume_token(K_OUT);
-                 dir = "OUT";
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-      {if (true) return dir;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public String OracleObjectName() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case S_IDENTIFIER:
-      jj_consume_token(S_IDENTIFIER);
-                      {if (true) return token.image;}
-      break;
-    case S_QUOTED_IDENTIFIER:
-      jj_consume_token(S_QUOTED_IDENTIFIER);
-                              {if (true) return removeQuotes(token.image);}
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    throw new Error("Missing return statement in function");
-  }
-
-  final public void skipToSemiColon() throws ParseException {
-        Token t = getNextToken();
-        while (t.kind != O_SEMICOLON) {
-                t = getNextToken();
-        }
-        token_source.input_stream.backup(1);
-  }
-
-  final public void skipToClosingParen() throws ParseException {
-        Token t = getNextToken();
-        while (t.kind != O_CLOSEPAREN) {
-            t = getNextToken();
-        }
-        token_source.input_stream.backup(1);
-  }
-
-  final public void skipToNextArg() throws ParseException {
-        Token t = getNextToken();
-        while (t.kind != O_COMMA && t.kind != O_CLOSEPAREN) {
-            t = getNextToken();
-        }
-        token_source.input_stream.backup(1);
-  }
-
-  final public void skipToEnd() throws ParseException {
-      /** skip through all the tokens. */
-      Token t = getNextToken();
-      while (t.kind != EOF) {
-          t = getNextToken();
-      }
-  }
-
-  private boolean jj_2_1(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_2(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_2(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_3(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_3(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_4(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_4(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_5(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_5(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_6(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_6(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_7(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_7(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_8(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_8(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_9(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_9(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_10(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_10(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_11(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_11(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_12(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_12(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_13(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_13(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_14(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_14(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_15(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_15(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_16(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_16(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_17(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_17(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_18(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_18(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_19(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_19(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_3R_62() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_24() {
-    if (jj_scan_token(O_DOT)) return true;
-    if (jj_3R_7()) return true;
-    return false;
-  }
-
-  private boolean jj_3_9() {
-    if (jj_scan_token(S_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_18() {
-    if (jj_3R_14()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_15()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_14() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_19() {
-    if (jj_3R_16()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_17()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_61() {
-    if (jj_scan_token(K_VARCHAR2)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_23() {
-    if (jj_scan_token(O_DOT)) return true;
-    if (jj_3R_7()) return true;
-    return false;
-  }
-
-  private boolean jj_3_12() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_16() {
-    if (jj_3R_7()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_24()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_60() {
-    if (jj_scan_token(K_VARCHAR)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_34() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(174)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(175)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(148)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(147)) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_33() {
-    if (jj_scan_token(K_SIGNTYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_32() {
-    if (jj_scan_token(K_POSITIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_31() {
-    if (jj_scan_token(K_NATURAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_30() {
-    if (jj_scan_token(K_BINARY_DOUBLE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_29() {
-    if (jj_scan_token(K_BINARY_FLOAT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_25() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_28()) {
-    jj_scanpos = xsp;
-    if (jj_3R_29()) {
-    jj_scanpos = xsp;
-    if (jj_3R_30()) {
-    jj_scanpos = xsp;
-    if (jj_3R_31()) {
-    jj_scanpos = xsp;
-    if (jj_3R_32()) {
-    jj_scanpos = xsp;
-    if (jj_3R_33()) {
-    jj_scanpos = xsp;
-    if (jj_3R_34()) {
-    jj_scanpos = xsp;
-    if (jj_3R_35()) {
-    jj_scanpos = xsp;
-    if (jj_3R_36()) {
-    jj_scanpos = xsp;
-    if (jj_3R_37()) {
-    jj_scanpos = xsp;
-    if (jj_3R_38()) {
-    jj_scanpos = xsp;
-    if (jj_3_17()) {
-    jj_scanpos = xsp;
-    if (jj_3R_39()) {
-    jj_scanpos = xsp;
-    if (jj_3R_40()) {
-    jj_scanpos = xsp;
-    if (jj_3R_41()) {
-    jj_scanpos = xsp;
-    if (jj_3R_42()) {
-    jj_scanpos = xsp;
-    if (jj_3R_43()) {
-    jj_scanpos = xsp;
-    if (jj_3R_44()) {
-    jj_scanpos = xsp;
-    if (jj_3R_45()) {
-    jj_scanpos = xsp;
-    if (jj_3R_46()) {
-    jj_scanpos = xsp;
-    if (jj_3R_47()) {
-    jj_scanpos = xsp;
-    if (jj_3R_48()) {
-    jj_scanpos = xsp;
-    if (jj_3R_49()) {
-    jj_scanpos = xsp;
-    if (jj_3R_50()) {
-    jj_scanpos = xsp;
-    if (jj_3R_51()) {
-    jj_scanpos = xsp;
-    if (jj_3R_52()) {
-    jj_scanpos = xsp;
-    if (jj_3R_53()) {
-    jj_scanpos = xsp;
-    if (jj_3R_54()) {
-    jj_scanpos = xsp;
-    if (jj_3R_55()) {
-    jj_scanpos = xsp;
-    if (jj_3R_56()) {
-    jj_scanpos = xsp;
-    if (jj_3R_57()) {
-    jj_scanpos = xsp;
-    if (jj_3R_58()) {
-    jj_scanpos = xsp;
-    if (jj_3R_59()) {
-    jj_scanpos = xsp;
-    if (jj_3R_60()) {
-    jj_scanpos = xsp;
-    if (jj_3R_61()) {
-    jj_scanpos = xsp;
-    if (jj_3R_62()) {
-    jj_scanpos = xsp;
-    if (jj_3R_63()) {
-    jj_scanpos = xsp;
-    if (jj_3R_64()) {
-    jj_scanpos = xsp;
-    if (jj_3R_65()) {
-    jj_scanpos = xsp;
-    if (jj_3R_66()) {
-    jj_scanpos = xsp;
-    if (jj_3R_67()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_28() {
-    if (jj_scan_token(K_BINARY_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_3R_7()) return true;
-    if (jj_scan_token(O_DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_14() {
-    if (jj_3R_7()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_23()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_10() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_59() {
-    if (jj_scan_token(K_CHAR)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_58() {
-    if (jj_scan_token(K_DOUBLE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_57() {
-    if (jj_scan_token(K_UROWID)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_56() {
-    if (jj_scan_token(K_ROWID)) return true;
-    return false;
-  }
-
-  private boolean jj_3_15() {
-    if (jj_scan_token(S_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_55() {
-    if (jj_scan_token(K_BFILE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_54() {
-    if (jj_scan_token(K_NCLOB)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_13() {
-    if (jj_scan_token(S_IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(142)) jj_scanpos = xsp;
-    if (jj_3R_22()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_53() {
-    if (jj_scan_token(K_BLOB)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_52() {
-    if (jj_scan_token(K_SYS_REFCURSOR)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_51() {
-    if (jj_scan_token(K_SIMPLE_DOUBLE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_50() {
-    if (jj_scan_token(K_SIMPLE_FLOAT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_49() {
-    if (jj_scan_token(K_SIMPLE_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_48() {
-    if (jj_scan_token(K_PLS_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_47() {
-    if (jj_scan_token(K_MLSLABEL)) return true;
-    return false;
-  }
-
-  private boolean jj_3_4() {
-    if (jj_3R_7()) return true;
-    if (jj_scan_token(O_DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_46() {
-    if (jj_scan_token(K_REAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3_8() {
-    if (jj_3R_13()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_45() {
-    if (jj_scan_token(K_FLOAT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_44() {
-    if (jj_scan_token(K_SMALLINT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_43() {
-    if (jj_scan_token(K_INT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_42() {
-    if (jj_scan_token(K_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_3() {
-    if (jj_3R_7()) return true;
-    if (jj_scan_token(O_DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_27() {
-    if (jj_3R_14()) return true;
-    return false;
-  }
-
-  private boolean jj_3_16() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_26() {
-    if (jj_3R_25()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_22() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_26()) {
-    jj_scanpos = xsp;
-    if (jj_3R_27()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_41() {
-    if (jj_scan_token(K_TIMESTAMP)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_40() {
-    if (jj_scan_token(K_TIME)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_67() {
-    if (jj_scan_token(K_CLOB)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_39() {
-    if (jj_scan_token(K_INTERVAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    if (jj_3R_7()) return true;
-    if (jj_scan_token(O_DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_66() {
-    if (jj_scan_token(K_NATIONAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_21() {
-    if (jj_3R_14()) return true;
-    return false;
-  }
-
-  private boolean jj_3_17() {
-    if (jj_scan_token(K_INTERVAL)) return true;
-    if (jj_scan_token(K_DAY)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_20() {
-    if (jj_3R_25()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_38() {
-    if (jj_scan_token(K_DATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_37() {
-    if (jj_scan_token(K_BOOLEAN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_9() {
-    if (jj_3R_7()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_8() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_20()) {
-    jj_scanpos = xsp;
-    if (jj_3R_21()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_65() {
-    if (jj_scan_token(K_NVARCHAR2)) return true;
-    return false;
-  }
-
-  private boolean jj_3_1() {
-    if (jj_3R_7()) return true;
-    if (jj_scan_token(O_DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_36() {
-    if (jj_scan_token(K_RAW)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_12() {
-    if (jj_scan_token(R_UNIQUE)) return true;
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_11() {
-    if (jj_scan_token(R_CHECK)) return true;
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_10() {
-    if (jj_scan_token(K_PRIMARY)) return true;
-    if (jj_scan_token(K_KEY)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_64() {
-    if (jj_scan_token(K_NVARCHAR)) return true;
-    return false;
-  }
-
-  private boolean jj_3_7() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(143)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_9()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_10()) {
-    jj_scanpos = xsp;
-    if (jj_3R_11()) {
-    jj_scanpos = xsp;
-    if (jj_3R_12()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_13() {
-    if (jj_scan_token(S_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_19() {
-    if (jj_scan_token(S_QUOTED_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_15() {
-    if (jj_scan_token(R_ANCHORED_TYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_18() {
-    if (jj_scan_token(S_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_7() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_18()) {
-    jj_scanpos = xsp;
-    if (jj_3R_19()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_35() {
-    if (jj_scan_token(K_LONG)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_17() {
-    if (jj_scan_token(R_ANCHORED_ROWTYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_63() {
-    if (jj_scan_token(K_NCHAR)) return true;
-    return false;
-  }
-
-  private boolean jj_3_11() {
-    if (jj_scan_token(S_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_6() {
-    if (jj_3R_7()) return true;
-    if (jj_3R_8()) return true;
-    return false;
-  }
-
-  /** Generated Token Manager. */
-  public DDLParserTokenManager token_source;
-  JavaCharStream jj_input_stream;
-  /** Current token. */
-  public Token token;
-  /** Next token. */
-  public Token jj_nt;
-  private int jj_ntk;
-  private Token jj_scanpos, jj_lastpos;
-  private int jj_la;
-
-  /** Constructor with InputStream. */
-  public DDLParser(java.io.InputStream stream) {
-     this(stream, null);
-  }
-  /** Constructor with InputStream and supplied encoding */
-  public DDLParser(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source = new DDLParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream) {
-     ReInit(stream, null);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jjtree.reset();
-  }
-
-  /** Constructor. */
-  public DDLParser(java.io.Reader stream) {
-    jj_input_stream = new JavaCharStream(stream, 1, 1);
-    token_source = new DDLParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jjtree.reset();
-  }
-
-  /** Constructor with generated Token Manager. */
-  public DDLParser(DDLParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(DDLParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jjtree.reset();
-  }
-
-  private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      return token;
-    }
-    token = oldToken;
-    throw generateParseException();
-  }
-
-  static private final class LookaheadSuccess extends java.lang.Error { }
-  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
-  private boolean jj_scan_token(int kind) {
-    if (jj_scanpos == jj_lastpos) {
-      jj_la--;
-      if (jj_scanpos.next == null) {
-        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
-      } else {
-        jj_lastpos = jj_scanpos = jj_scanpos.next;
-      }
-    } else {
-      jj_scanpos = jj_scanpos.next;
-    }
-    if (jj_scanpos.kind != kind) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
-    return false;
-  }
-
-
-/** Get the next Token. */
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    return token;
-  }
-
-/** Get the specific Token. */
-  final public Token getToken(int index) {
-    Token t = token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
-    }
-    return t;
-  }
-
-  private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
-
-  /** Generate ParseException. */
-  public ParseException generateParseException() {
-    Token errortok = token.next;
-    int line = errortok.beginLine, column = errortok.beginColumn;
-    String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;
-    return new ParseException("Parse error at line " + line + ", column " + column + ".  Encountered: " + mess);
-  }
-
-  /** Enable tracing. */
-  final public void enable_tracing() {
-  }
-
-  /** Disable tracing. */
-  final public void disable_tracing() {
-  }
-
-}
+ String direction = null;
+ boolean defaultAssignment = false;
+    t = jj_consume_token(S_IDENTIFIER);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_IN:
+    case K_OUT:
+      direction = direction();
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_NOCOPY:
+      jj_consume_token(K_NOCOPY);
+      break;
+    default:
+      ;
+    }
+    argumentDataType = typeSpec();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_ASSIGN:
+    case R_DEFAULT:
+      defaultAssignment = argumentDefaultAssignment();
+      break;
+    default:
+      ;
+    }
+      argumentType = new ArgumentType(t.image);
+      argumentType.setEnclosedType(argumentDataType);
+      if (argumentDataType instanceof UnresolvedType) {
+          ((UnresolvedType)argumentDataType).setOwningType(argumentType);
+      }
+      if (direction != null) {
+          if ("OUT".equals(direction)) {
+              argDirection = ArgumentTypeDirection.OUT;
+          }
+          else if ("IN OUT".equals(direction)) {
+              argDirection = ArgumentTypeDirection.INOUT;
+          }
+          argumentType.setDirection(argDirection);
+      }
+      if (defaultAssignment) {
+          argumentType.setOptional();
+      }
+      procedureType.addArgument(argumentType);
+  }
+
+  final public boolean argumentDefaultAssignment() throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_ASSIGN:
+      jj_consume_token(O_ASSIGN);
+      break;
+    case R_DEFAULT:
+      jj_consume_token(R_DEFAULT);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    skipToNextArg();
+      {if (true) return true;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void exceptionDeclaration() throws ParseException {
+    jj_consume_token(S_IDENTIFIER);
+    jj_consume_token(R_EXCEPTION);
+    jj_consume_token(O_SEMICOLON);
+  }
+
+  final public void pragmaDeclaration() throws ParseException {
+    jj_consume_token(K_PRAGMA);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_AUTONOMOUS_TRANSACTION:
+    case K_EXCEPTION_INIT:
+    case K_INLINE:
+    case K_RESTRICT_REFERENCES:
+    case K_SERIALLY_REUSABLE:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_AUTONOMOUS_TRANSACTION:
+        jj_consume_token(K_AUTONOMOUS_TRANSACTION);
+        break;
+      case K_EXCEPTION_INIT:
+        jj_consume_token(K_EXCEPTION_INIT);
+        jj_consume_token(O_OPENPAREN);
+        jj_consume_token(S_IDENTIFIER);
+        jj_consume_token(O_COMMA);
+        jj_consume_token(S_NUMBER);
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      case K_SERIALLY_REUSABLE:
+        jj_consume_token(K_SERIALLY_REUSABLE);
+        break;
+      case K_INLINE:
+        jj_consume_token(K_INLINE);
+        jj_consume_token(O_OPENPAREN);
+        jj_consume_token(S_IDENTIFIER);
+        jj_consume_token(O_COMMA);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case R_NO:
+        case R_YES:
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case R_YES:
+            jj_consume_token(R_YES);
+            break;
+          case R_NO:
+            jj_consume_token(R_NO);
+            break;
+          default:
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          break;
+        default:
+          ;
+        }
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      case K_RESTRICT_REFERENCES:
+        jj_consume_token(K_RESTRICT_REFERENCES);
+        jj_consume_token(O_OPENPAREN);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case R_DEFAULT:
+        case S_IDENTIFIER:
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S_IDENTIFIER:
+            jj_consume_token(S_IDENTIFIER);
+            break;
+          case R_DEFAULT:
+            jj_consume_token(R_DEFAULT);
+            break;
+          default:
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          break;
+        default:
+          ;
+        }
+        label_6:
+        while (true) {
+          jj_consume_token(O_COMMA);
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case K_RNDS:
+          case K_RNPS:
+          case K_TRUST:
+          case K_WNDS:
+          case K_WNPS:
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case K_RNDS:
+              jj_consume_token(K_RNDS);
+              break;
+            case K_WNDS:
+              jj_consume_token(K_WNDS);
+              break;
+            case K_RNPS:
+              jj_consume_token(K_RNPS);
+              break;
+            case K_WNPS:
+              jj_consume_token(K_WNPS);
+              break;
+            case K_TRUST:
+              jj_consume_token(K_TRUST);
+              break;
+            default:
+              jj_consume_token(-1);
+              throw new ParseException();
+            }
+            break;
+          default:
+            ;
+          }
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case O_COMMA:
+            ;
+            break;
+          default:
+            break label_6;
+          }
+        }
+        jj_consume_token(O_CLOSEPAREN);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      break;
+    default:
+      ;
+    }
+    jj_consume_token(O_SEMICOLON);
+  }
+
+  final public void orReplace() throws ParseException {
+    jj_consume_token(R_OR);
+    jj_consume_token(K_REPLACE);
+  }
+
+  final public void invokerRights() throws ParseException {
+    jj_consume_token(K_AUTHID);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_CURRENT_USER:
+      jj_consume_token(K_CURRENT_USER);
+      break;
+    case K_DEFINER:
+      jj_consume_token(K_DEFINER);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+  }
+
+  final public void as() throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_AS:
+      jj_consume_token(R_AS);
+      break;
+    case R_IS:
+      jj_consume_token(R_IS);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+  }
+
+  final public void onCommit() throws ParseException {
+    jj_consume_token(R_ON);
+    jj_consume_token(K_COMMIT);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_DELETE:
+      jj_consume_token(K_DELETE);
+      break;
+    case K_PRESERVE:
+      jj_consume_token(K_PRESERVE);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    jj_consume_token(K_ROWS);
+  }
+
+  final public String direction() throws ParseException {
+ String dir = "";
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_IN:
+      jj_consume_token(R_IN);
+                dir = "IN";
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_OUT:
+        jj_consume_token(K_OUT);
+                                        dir += " OUT";
+        break;
+      default:
+        ;
+      }
+      break;
+    case K_OUT:
+      jj_consume_token(K_OUT);
+                 dir = "OUT";
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+      {if (true) return dir;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String OracleObjectName() throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case S_IDENTIFIER:
+      jj_consume_token(S_IDENTIFIER);
+                      {if (true) return token.image;}
+      break;
+    case S_QUOTED_IDENTIFIER:
+      jj_consume_token(S_QUOTED_IDENTIFIER);
+                              {if (true) return removeQuotes(token.image);}
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String OracleObjectNamePossiblyDotted() throws ParseException {
+ String possiblyDottedName = "";
+ String afterDot = null;
+    possiblyDottedName = OracleObjectName();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_DOT:
+      jj_consume_token(O_DOT);
+      afterDot = OracleObjectName();
+      break;
+    default:
+      ;
+    }
+      if (afterDot != null) {
+          possiblyDottedName += "." + afterDot;
+      }
+      {if (true) return possiblyDottedName;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void skipToSemiColon() throws ParseException {
+        Token t = getNextToken();
+        while (t.kind != O_SEMICOLON) {
+                t = getNextToken();
+        }
+        token_source.input_stream.backup(1);
+  }
+
+  final public void skipToClosingParen() throws ParseException {
+        Token t = getNextToken();
+        while (t.kind != O_CLOSEPAREN) {
+            t = getNextToken();
+        }
+        token_source.input_stream.backup(1);
+  }
+
+  final public void skipToNextArg() throws ParseException {
+        Token t = getNextToken();
+        while (t.kind != O_COMMA && t.kind != O_CLOSEPAREN) {
+            t = getNextToken();
+        }
+        token_source.input_stream.backup(1);
+  }
+
+  final public void skipToEnd() throws ParseException {
+      /** skip through all the tokens. */
+      Token t = getNextToken();
+      while (t.kind != EOF) {
+          t = getNextToken();
+      }
+  }
+
+  private boolean jj_2_1(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_1(); }
+    catch(LookaheadSuccess ls) { return true; }
+  }
+
+  private boolean jj_3R_16() {
+    if (jj_scan_token(K_NATURAL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_15() {
+    if (jj_scan_token(K_BINARY_DOUBLE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_14() {
+    if (jj_scan_token(K_BINARY_FLOAT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_24() {
+    if (jj_scan_token(K_INTERVAL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_11() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_13()) {
+    jj_scanpos = xsp;
+    if (jj_3R_14()) {
+    jj_scanpos = xsp;
+    if (jj_3R_15()) {
+    jj_scanpos = xsp;
+    if (jj_3R_16()) {
+    jj_scanpos = xsp;
+    if (jj_3R_17()) {
+    jj_scanpos = xsp;
+    if (jj_3R_18()) {
+    jj_scanpos = xsp;
+    if (jj_3R_19()) {
+    jj_scanpos = xsp;
+    if (jj_3R_20()) {
+    jj_scanpos = xsp;
+    if (jj_3R_21()) {
+    jj_scanpos = xsp;
+    if (jj_3R_22()) {
+    jj_scanpos = xsp;
+    if (jj_3R_23()) {
+    jj_scanpos = xsp;
+    if (jj_3R_24()) {
+    jj_scanpos = xsp;
+    if (jj_3R_25()) {
+    jj_scanpos = xsp;
+    if (jj_3R_26()) {
+    jj_scanpos = xsp;
+    if (jj_3R_27()) {
+    jj_scanpos = xsp;
+    if (jj_3R_28()) {
+    jj_scanpos = xsp;
+    if (jj_3R_29()) {
+    jj_scanpos = xsp;
+    if (jj_3R_30()) {
+    jj_scanpos = xsp;
+    if (jj_3R_31()) {
+    jj_scanpos = xsp;
+    if (jj_3R_32()) {
+    jj_scanpos = xsp;
+    if (jj_3R_33()) {
+    jj_scanpos = xsp;
+    if (jj_3R_34()) {
+    jj_scanpos = xsp;
+    if (jj_3R_35()) {
+    jj_scanpos = xsp;
+    if (jj_3R_36()) {
+    jj_scanpos = xsp;
+    if (jj_3R_37()) {
+    jj_scanpos = xsp;
+    if (jj_3R_38()) {
+    jj_scanpos = xsp;
+    if (jj_3R_39()) {
+    jj_scanpos = xsp;
+    if (jj_3R_40()) {
+    jj_scanpos = xsp;
+    if (jj_3R_41()) {
+    jj_scanpos = xsp;
+    if (jj_3R_42()) {
+    jj_scanpos = xsp;
+    if (jj_3R_43()) {
+    jj_scanpos = xsp;
+    if (jj_3R_44()) {
+    jj_scanpos = xsp;
+    if (jj_3R_45()) {
+    jj_scanpos = xsp;
+    if (jj_3R_46()) {
+    jj_scanpos = xsp;
+    if (jj_3R_47()) {
+    jj_scanpos = xsp;
+    if (jj_3R_48()) {
+    jj_scanpos = xsp;
+    if (jj_3R_49()) {
+    jj_scanpos = xsp;
+    if (jj_3R_50()) {
+    jj_scanpos = xsp;
+    if (jj_3R_51()) {
+    jj_scanpos = xsp;
+    if (jj_3R_52()) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_13() {
+    if (jj_scan_token(K_BINARY_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_23() {
+    if (jj_scan_token(K_DATE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_22() {
+    if (jj_scan_token(K_BOOLEAN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_12() {
+    if (jj_3R_53()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_50() {
+    if (jj_scan_token(K_NVARCHAR2)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_44() {
+    if (jj_scan_token(K_CHAR)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_43() {
+    if (jj_scan_token(K_DOUBLE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_21() {
+    if (jj_scan_token(K_RAW)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_49() {
+    if (jj_scan_token(K_NVARCHAR)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_55() {
+    if (jj_scan_token(S_QUOTED_IDENTIFIER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_54() {
+    if (jj_scan_token(S_IDENTIFIER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_53() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_54()) {
+    jj_scanpos = xsp;
+    if (jj_3R_55()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_42() {
+    if (jj_scan_token(K_UROWID)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_41() {
+    if (jj_scan_token(K_ROWID)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_40() {
+    if (jj_scan_token(K_BFILE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_39() {
+    if (jj_scan_token(K_NCLOB)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_38() {
+    if (jj_scan_token(K_BLOB)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_37() {
+    if (jj_scan_token(K_SYS_REFCURSOR)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_36() {
+    if (jj_scan_token(K_SIMPLE_DOUBLE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_35() {
+    if (jj_scan_token(K_SIMPLE_FLOAT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_7() {
+    if (jj_scan_token(S_IDENTIFIER)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(142)) jj_scanpos = xsp;
+    if (jj_3R_8()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_34() {
+    if (jj_scan_token(K_SIMPLE_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_33() {
+    if (jj_scan_token(K_PLS_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_32() {
+    if (jj_scan_token(K_MLSLABEL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_31() {
+    if (jj_scan_token(K_REAL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_20() {
+    if (jj_scan_token(K_LONG)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_48() {
+    if (jj_scan_token(K_NCHAR)) return true;
+    return false;
+  }
+
+  private boolean jj_3_1() {
+    if (jj_3R_7()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_30() {
+    if (jj_scan_token(K_FLOAT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_29() {
+    if (jj_scan_token(K_SMALLINT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_28() {
+    if (jj_scan_token(K_INT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_27() {
+    if (jj_scan_token(K_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_10() {
+    if (jj_3R_12()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_9() {
+    if (jj_3R_11()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_47() {
+    if (jj_scan_token(K_CHARACTER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_8() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_9()) {
+    jj_scanpos = xsp;
+    if (jj_3R_10()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_26() {
+    if (jj_scan_token(K_TIMESTAMP)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_25() {
+    if (jj_scan_token(K_TIME)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_52() {
+    if (jj_scan_token(K_CLOB)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_46() {
+    if (jj_scan_token(K_VARCHAR2)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_45() {
+    if (jj_scan_token(K_VARCHAR)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_19() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(174)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(175)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(148)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(147)) return true;
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_18() {
+    if (jj_scan_token(K_SIGNTYPE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_51() {
+    if (jj_scan_token(K_NATIONAL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_17() {
+    if (jj_scan_token(K_POSITIVE)) return true;
+    return false;
+  }
+
+  /** Generated Token Manager. */
+  public DDLParserTokenManager token_source;
+  JavaCharStream jj_input_stream;
+  /** Current token. */
+  public Token token;
+  /** Next token. */
+  public Token jj_nt;
+  private int jj_ntk;
+  private Token jj_scanpos, jj_lastpos;
+  private int jj_la;
+
+  /** Constructor with InputStream. */
+  public DDLParser(java.io.InputStream stream) {
+     this(stream, null);
+  }
+  /** Constructor with InputStream and supplied encoding */
+  public DDLParser(java.io.InputStream stream, String encoding) {
+    try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
+    token_source = new DDLParserTokenManager(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream stream) {
+     ReInit(stream, null);
+  }
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream stream, String encoding) {
+    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
+    token_source.ReInit(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+    jjtree.reset();
+  }
+
+  /** Constructor. */
+  public DDLParser(java.io.Reader stream) {
+    jj_input_stream = new JavaCharStream(stream, 1, 1);
+    token_source = new DDLParserTokenManager(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(java.io.Reader stream) {
+    jj_input_stream.ReInit(stream, 1, 1);
+    token_source.ReInit(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+    jjtree.reset();
+  }
+
+  /** Constructor with generated Token Manager. */
+  public DDLParser(DDLParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(DDLParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+    jjtree.reset();
+  }
+
+  private Token jj_consume_token(int kind) throws ParseException {
+    Token oldToken;
+    if ((oldToken = token).next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    if (token.kind == kind) {
+      return token;
+    }
+    token = oldToken;
+    throw generateParseException();
+  }
+
+  static private final class LookaheadSuccess extends java.lang.Error { }
+  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
+  private boolean jj_scan_token(int kind) {
+    if (jj_scanpos == jj_lastpos) {
+      jj_la--;
+      if (jj_scanpos.next == null) {
+        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
+      } else {
+        jj_lastpos = jj_scanpos = jj_scanpos.next;
+      }
+    } else {
+      jj_scanpos = jj_scanpos.next;
+    }
+    if (jj_scanpos.kind != kind) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
+    return false;
+  }
+
+
+/** Get the next Token. */
+  final public Token getNextToken() {
+    if (token.next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    return token;
+  }
+
+/** Get the specific Token. */
+  final public Token getToken(int index) {
+    Token t = token;
+    for (int i = 0; i < index; i++) {
+      if (t.next != null) t = t.next;
+      else t = t.next = token_source.getNextToken();
+    }
+    return t;
+  }
+
+  private int jj_ntk() {
+    if ((jj_nt=token.next) == null)
+      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
+    else
+      return (jj_ntk = jj_nt.kind);
+  }
+
+  /** Generate ParseException. */
+  public ParseException generateParseException() {
+    Token errortok = token.next;
+    int line = errortok.beginLine, column = errortok.beginColumn;
+    String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;
+    return new ParseException("Parse error at line " + line + ", column " + column + ".  Encountered: " + mess);
+  }
+
+  /** Enable tracing. */
+  final public void enable_tracing() {
+  }
+
+  /** Disable tracing. */
+  final public void disable_tracing() {
+  }
+
+}
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj
index 485f6f1..7c22814 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj
Binary files differ
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
index b9b60d1..04407b0 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
Binary files differ
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserConstants.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserConstants.java
index 47e7193..6fbbb9a 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserConstants.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserConstants.java
@@ -1,4 +1,4 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. DDLParserConstants.java */
+/* Generated By:JJTree&JavaCC: Do not edit this line. DDLParserConstants.java */
 /*******************************************************************************
  * Copyright (c) 2011 Oracle. All rights reserved.
  * This program and the accompanying materials are made available under the
@@ -10,715 +10,715 @@
  *
  * Contributors:
  *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-
-/**
- * Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
- */
+ ******************************************************************************/
+package org.eclipse.persistence.tools.oracleddl.parser;
+
+
+/**
+ * Token literal values and constants.
+ * Generated by org.javacc.parser.OtherFilesGen#start()
+ */
 @SuppressWarnings("all")
-public interface DDLParserConstants {
-
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int COMMENT_LINE = 6;
-  /** RegularExpression Id. */
-  int COMMENT_BLOCK = 7;
-  /** RegularExpression Id. */
-  int O_ASSIGN = 8;
-  /** RegularExpression Id. */
-  int O_ASTERISK = 9;
-  /** RegularExpression Id. */
-  int O_ATSIGN = 10;
-  /** RegularExpression Id. */
-  int O_CLOSEPAREN = 11;
-  /** RegularExpression Id. */
-  int O_CONCAT = 12;
-  /** RegularExpression Id. */
-  int O_COLON = 13;
-  /** RegularExpression Id. */
-  int O_COMMA = 14;
-  /** RegularExpression Id. */
-  int O_DOT = 15;
-  /** RegularExpression Id. */
-  int O_DOUBLEDOT = 16;
-  /** RegularExpression Id. */
-  int O_DOLLAR = 17;
-  /** RegularExpression Id. */
-  int O_PERCENT = 18;
-  /** RegularExpression Id. */
-  int O_EQUAL = 19;
-  /** RegularExpression Id. */
-  int O_GREATER = 20;
-  /** RegularExpression Id. */
-  int O_GREATEREQUAL = 21;
-  /** RegularExpression Id. */
-  int O_JOINPLUS = 22;
-  /** RegularExpression Id. */
-  int O_LESS = 23;
-  /** RegularExpression Id. */
-  int O_LESSEQUAL = 24;
-  /** RegularExpression Id. */
-  int O_MINUS = 25;
-  /** RegularExpression Id. */
-  int O_NOTEQUAL2 = 26;
-  /** RegularExpression Id. */
-  int O_NOTEQUAL = 27;
-  /** RegularExpression Id. */
-  int O_OPENPAREN = 28;
-  /** RegularExpression Id. */
-  int O_PLUS = 29;
-  /** RegularExpression Id. */
-  int O_POUND = 30;
-  /** RegularExpression Id. */
-  int O_QUESTIONMARK = 31;
-  /** RegularExpression Id. */
-  int O_SEMICOLON = 32;
-  /** RegularExpression Id. */
-  int O_SLASH = 33;
-  /** RegularExpression Id. */
-  int O_TILDE = 34;
-  /** RegularExpression Id. */
-  int S_NUMBER = 35;
-  /** RegularExpression Id. */
-  int FLOAT = 36;
-  /** RegularExpression Id. */
-  int INTEGER = 37;
-  /** RegularExpression Id. */
-  int DIGIT = 38;
-  /** RegularExpression Id. */
-  int R_ALL = 39;
-  /** RegularExpression Id. */
-  int R_ALTER = 40;
-  /** RegularExpression Id. */
-  int R_ANCHORED_ROWTYPE = 41;
-  /** RegularExpression Id. */
-  int R_ANCHORED_TYPE = 42;
-  /** RegularExpression Id. */
-  int R_AND = 43;
-  /** RegularExpression Id. */
-  int R_AS = 44;
-  /** RegularExpression Id. */
-  int R_ASC = 45;
-  /** RegularExpression Id. */
-  int R_AT = 46;
-  /** RegularExpression Id. */
-  int R_BEGIN = 47;
-  /** RegularExpression Id. */
-  int R_BETWEEN = 48;
-  /** RegularExpression Id. */
-  int R_BY = 49;
-  /** RegularExpression Id. */
-  int R_CASE = 50;
-  /** RegularExpression Id. */
-  int R_CHECK = 51;
-  /** RegularExpression Id. */
-  int R_CLUSTERS = 52;
-  /** RegularExpression Id. */
-  int R_CLUSTER = 53;
-  /** RegularExpression Id. */
-  int R_COLAUTH = 54;
-  /** RegularExpression Id. */
-  int R_COLUMNS = 55;
-  /** RegularExpression Id. */
-  int R_COMPRESS = 56;
-  /** RegularExpression Id. */
-  int R_CONNECT = 57;
-  /** RegularExpression Id. */
-  int R_CRASH = 58;
-  /** RegularExpression Id. */
-  int R_CREATE = 59;
-  /** RegularExpression Id. */
-  int R_CURSOR = 60;
-  /** RegularExpression Id. */
-  int R_DECLARE = 61;
-  /** RegularExpression Id. */
-  int R_DEFAULT = 62;
-  /** RegularExpression Id. */
-  int R_DESC = 63;
-  /** RegularExpression Id. */
-  int R_DISTINCT = 64;
-  /** RegularExpression Id. */
-  int R_DROP = 65;
-  /** RegularExpression Id. */
-  int R_ELSE = 66;
-  /** RegularExpression Id. */
-  int R_END = 67;
-  /** RegularExpression Id. */
-  int R_EXCEPTION = 68;
-  /** RegularExpression Id. */
-  int R_EXCLUSIVE = 69;
-  /** RegularExpression Id. */
-  int R_FETCH = 70;
-  /** RegularExpression Id. */
-  int R_FOR = 71;
-  /** RegularExpression Id. */
-  int R_FROM = 72;
-  /** RegularExpression Id. */
-  int R_FUNCTION = 73;
-  /** RegularExpression Id. */
-  int R_GOTO = 74;
-  /** RegularExpression Id. */
-  int R_GRANT = 75;
-  /** RegularExpression Id. */
-  int R_GROUP = 76;
-  /** RegularExpression Id. */
-  int R_HAVING = 77;
-  /** RegularExpression Id. */
-  int R_IDENTIFIED = 78;
-  /** RegularExpression Id. */
-  int R_IF = 79;
-  /** RegularExpression Id. */
-  int R_IN = 80;
-  /** RegularExpression Id. */
-  int R_INDEX = 81;
-  /** RegularExpression Id. */
-  int R_INDEXES = 82;
-  /** RegularExpression Id. */
-  int R_INSERT = 83;
-  /** RegularExpression Id. */
-  int R_INTERSECT = 84;
-  /** RegularExpression Id. */
-  int R_INTO = 85;
-  /** RegularExpression Id. */
-  int R_IS = 86;
-  /** RegularExpression Id. */
-  int R_LIKE = 87;
-  /** RegularExpression Id. */
-  int R_LOCK = 88;
-  /** RegularExpression Id. */
-  int R_MINUS = 89;
-  /** RegularExpression Id. */
-  int R_MODE = 90;
-  /** RegularExpression Id. */
-  int R_NOCOMPRESS = 91;
-  /** RegularExpression Id. */
-  int R_NO = 92;
-  /** RegularExpression Id. */
-  int R_NOT = 93;
-  /** RegularExpression Id. */
-  int R_NOWAIT = 94;
-  /** RegularExpression Id. */
-  int R_NULL = 95;
-  /** RegularExpression Id. */
-  int R_OF = 96;
-  /** RegularExpression Id. */
-  int R_ON = 97;
-  /** RegularExpression Id. */
-  int R_OPTION = 98;
-  /** RegularExpression Id. */
-  int R_OR = 99;
-  /** RegularExpression Id. */
-  int R_ORDER = 100;
-  /** RegularExpression Id. */
-  int R_OVERLAPS = 101;
-  /** RegularExpression Id. */
-  int R_PROCEDURE = 102;
-  /** RegularExpression Id. */
-  int R_PUBLIC = 103;
-  /** RegularExpression Id. */
-  int R_RESOURCE = 104;
-  /** RegularExpression Id. */
-  int R_REVOKE = 105;
-  /** RegularExpression Id. */
-  int R_SELECT = 106;
-  /** RegularExpression Id. */
-  int R_SHARE = 107;
-  /** RegularExpression Id. */
-  int R_SIZE = 108;
-  /** RegularExpression Id. */
-  int R_SQL = 109;
-  /** RegularExpression Id. */
-  int R_START = 110;
-  /** RegularExpression Id. */
-  int R_SUBTYPE = 111;
-  /** RegularExpression Id. */
-  int R_TABAUTH = 112;
-  /** RegularExpression Id. */
-  int R_TABLE = 113;
-  /** RegularExpression Id. */
-  int R_THEN = 114;
-  /** RegularExpression Id. */
-  int R_TO = 115;
-  /** RegularExpression Id. */
-  int R_TYPE = 116;
-  /** RegularExpression Id. */
-  int R_UNION = 117;
-  /** RegularExpression Id. */
-  int R_UNIQUE = 118;
-  /** RegularExpression Id. */
-  int R_UPDATE = 119;
-  /** RegularExpression Id. */
-  int R_VALUES = 120;
-  /** RegularExpression Id. */
-  int R_VIEW = 121;
-  /** RegularExpression Id. */
-  int R_VIEWS = 122;
-  /** RegularExpression Id. */
-  int R_WHEN = 123;
-  /** RegularExpression Id. */
-  int R_WHERE = 124;
-  /** RegularExpression Id. */
-  int R_WITH = 125;
-  /** RegularExpression Id. */
-  int R_YES = 126;
-  /** RegularExpression Id. */
-  int K_ARRAY = 127;
-  /** RegularExpression Id. */
-  int K_AUTHID = 128;
-  /** RegularExpression Id. */
-  int K_AUTONOMOUS_TRANSACTION = 129;
-  /** RegularExpression Id. */
-  int K_BFILE = 130;
-  /** RegularExpression Id. */
-  int K_BINARY_DOUBLE = 131;
-  /** RegularExpression Id. */
-  int K_BINARY_FLOAT = 132;
-  /** RegularExpression Id. */
-  int K_BINARY_INTEGER = 133;
-  /** RegularExpression Id. */
-  int K_BLOB = 134;
-  /** RegularExpression Id. */
-  int K_BOOLEAN = 135;
-  /** RegularExpression Id. */
-  int K_BYTE = 136;
-  /** RegularExpression Id. */
-  int K_CHAR = 137;
-  /** RegularExpression Id. */
-  int K_CHARACTER = 138;
-  /** RegularExpression Id. */
-  int K_CHARSET = 139;
-  /** RegularExpression Id. */
-  int K_CLOB = 140;
-  /** RegularExpression Id. */
-  int K_COMMIT = 141;
-  /** RegularExpression Id. */
-  int K_CONSTANT = 142;
-  /** RegularExpression Id. */
-  int K_CONSTRAINT = 143;
-  /** RegularExpression Id. */
-  int K_CURRENT_USER = 144;
-  /** RegularExpression Id. */
-  int K_DATE = 145;
-  /** RegularExpression Id. */
-  int K_DAY = 146;
-  /** RegularExpression Id. */
-  int K_DEC = 147;
-  /** RegularExpression Id. */
-  int K_DECIMAL = 148;
-  /** RegularExpression Id. */
-  int K_DEFINER = 149;
-  /** RegularExpression Id. */
-  int K_DELETE = 150;
-  /** RegularExpression Id. */
-  int K_DETERMINISTIC = 151;
-  /** RegularExpression Id. */
-  int K_DOUBLE = 152;
-  /** RegularExpression Id. */
-  int K_ENABLE = 153;
-  /** RegularExpression Id. */
-  int K_EXCEPTION_INIT = 154;
-  /** RegularExpression Id. */
-  int K_FINAL = 155;
-  /** RegularExpression Id. */
-  int K_FLOAT = 156;
-  /** RegularExpression Id. */
-  int K_FORCE = 157;
-  /** RegularExpression Id. */
-  int K_GLOBAL = 158;
-  /** RegularExpression Id. */
-  int K_INLINE = 159;
-  /** RegularExpression Id. */
-  int K_INSTANTIABLE = 160;
-  /** RegularExpression Id. */
-  int K_INT = 161;
-  /** RegularExpression Id. */
-  int K_INTEGER = 162;
-  /** RegularExpression Id. */
-  int K_INTERVAL = 163;
-  /** RegularExpression Id. */
-  int K_KEY = 164;
-  /** RegularExpression Id. */
-  int K_LOCAL = 165;
-  /** RegularExpression Id. */
-  int K_LONG = 166;
-  /** RegularExpression Id. */
-  int K_MLSLABEL = 167;
-  /** RegularExpression Id. */
-  int K_MONTH = 168;
-  /** RegularExpression Id. */
-  int K_NATIONAL = 169;
-  /** RegularExpression Id. */
-  int K_NATURAL = 170;
-  /** RegularExpression Id. */
-  int K_NCHAR = 171;
-  /** RegularExpression Id. */
-  int K_NCLOB = 172;
-  /** RegularExpression Id. */
-  int K_NOCOPY = 173;
-  /** RegularExpression Id. */
-  int K_NUMBER = 174;
-  /** RegularExpression Id. */
-  int K_NUMERIC = 175;
-  /** RegularExpression Id. */
-  int K_NVARCHAR2 = 176;
-  /** RegularExpression Id. */
-  int K_NVARCHAR = 177;
-  /** RegularExpression Id. */
-  int K_OBJECT = 178;
-  /** RegularExpression Id. */
-  int K_OID = 179;
-  /** RegularExpression Id. */
-  int K_ORGANIZATION = 180;
-  /** RegularExpression Id. */
-  int K_OUT = 181;
-  /** RegularExpression Id. */
-  int K_OVERFLOW = 182;
-  /** RegularExpression Id. */
-  int K_PACKAGE = 183;
-  /** RegularExpression Id. */
-  int K_PARALLEL_ENABLE = 184;
-  /** RegularExpression Id. */
-  int K_PIPELINED = 185;
-  /** RegularExpression Id. */
-  int K_PLS_INTEGER = 186;
-  /** RegularExpression Id. */
-  int K_POSITIVE = 187;
-  /** RegularExpression Id. */
-  int K_PRAGMA = 188;
-  /** RegularExpression Id. */
-  int K_PRECISION = 189;
-  /** RegularExpression Id. */
-  int K_PRESERVE = 190;
-  /** RegularExpression Id. */
-  int K_PRIMARY = 191;
-  /** RegularExpression Id. */
-  int K_RANGE = 192;
-  /** RegularExpression Id. */
-  int K_RAW = 193;
-  /** RegularExpression Id. */
-  int K_REAL = 194;
-  /** RegularExpression Id. */
-  int K_RECORD = 195;
-  /** RegularExpression Id. */
-  int K_REF = 196;
-  /** RegularExpression Id. */
-  int K_REPLACE = 197;
-  /** RegularExpression Id. */
-  int K_RESTRICT_REFERENCES = 198;
-  /** RegularExpression Id. */
-  int K_RESULT_CACHE = 199;
-  /** RegularExpression Id. */
-  int K_RETURN = 200;
-  /** RegularExpression Id. */
-  int K_RNDS = 201;
-  /** RegularExpression Id. */
-  int K_RNPS = 202;
-  /** RegularExpression Id. */
-  int K_ROWID = 203;
-  /** RegularExpression Id. */
-  int K_ROWS = 204;
-  /** RegularExpression Id. */
-  int K_SECOND = 205;
-  /** RegularExpression Id. */
-  int K_SERIALLY_REUSABLE = 206;
-  /** RegularExpression Id. */
-  int K_SET = 207;
-  /** RegularExpression Id. */
-  int K_SIGNTYPE = 208;
-  /** RegularExpression Id. */
-  int K_SIMPLE_DOUBLE = 209;
-  /** RegularExpression Id. */
-  int K_SIMPLE_FLOAT = 210;
-  /** RegularExpression Id. */
-  int K_SIMPLE_INTEGER = 211;
-  /** RegularExpression Id. */
-  int K_SMALLINT = 212;
-  /** RegularExpression Id. */
-  int K_STRING = 213;
-  /** RegularExpression Id. */
-  int K_SYS_REFCURSOR = 214;
-  /** RegularExpression Id. */
-  int K_TEMPORARY = 215;
-  /** RegularExpression Id. */
-  int K_TIME = 216;
-  /** RegularExpression Id. */
-  int K_TIMESTAMP = 217;
-  /** RegularExpression Id. */
-  int K_TRUST = 218;
-  /** RegularExpression Id. */
-  int K_UROWID = 219;
-  /** RegularExpression Id. */
-  int K_VARCHAR2 = 220;
-  /** RegularExpression Id. */
-  int K_VARCHAR = 221;
-  /** RegularExpression Id. */
-  int K_VARRAY = 222;
-  /** RegularExpression Id. */
-  int K_VARYING = 223;
-  /** RegularExpression Id. */
-  int K_WNDS = 224;
-  /** RegularExpression Id. */
-  int K_WNPS = 225;
-  /** RegularExpression Id. */
-  int K_YEAR = 226;
-  /** RegularExpression Id. */
-  int K_ZONE = 227;
-  /** RegularExpression Id. */
-  int S_IDENTIFIER = 228;
-  /** RegularExpression Id. */
-  int LETTER = 229;
-  /** RegularExpression Id. */
-  int SPECIAL_CHARS = 230;
-  /** RegularExpression Id. */
-  int S_BIND = 231;
-  /** RegularExpression Id. */
-  int S_CHAR_LITERAL = 232;
-  /** RegularExpression Id. */
-  int S_QUOTED_IDENTIFIER = 233;
-
-  /** Lexical state. */
-  int DEFAULT = 0;
-
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "\" \"",
-    "\"\\t\"",
-    "\"\\n\"",
-    "\"\\r\"",
-    "\"\\f\"",
-    "<COMMENT_LINE>",
-    "<COMMENT_BLOCK>",
-    "\":=\"",
-    "\"*\"",
-    "\"@\"",
-    "\")\"",
-    "\"||\"",
-    "\":\"",
-    "\",\"",
-    "\".\"",
-    "\"..\"",
-    "\"$\"",
-    "\"%\"",
-    "\"=\"",
-    "\">\"",
-    "\">=\"",
-    "\"(+)\"",
-    "\"<\"",
-    "\"<=\"",
-    "\"-\"",
-    "\"<>\"",
-    "\"!=\"",
-    "\"(\"",
-    "\"+\"",
-    "\"#\"",
-    "\"?\"",
-    "\";\"",
-    "\"/\"",
-    "\"~\"",
-    "<S_NUMBER>",
-    "<FLOAT>",
-    "<INTEGER>",
-    "<DIGIT>",
-    "\"ALL\"",
-    "\"ALTER\"",
-    "\"%ROWTYPE\"",
-    "\"%TYPE\"",
-    "\"AND\"",
-    "\"AS\"",
-    "\"ASC\"",
-    "\"AT\"",
-    "\"BEGIN\"",
-    "\"BETWEEN\"",
-    "\"BY\"",
-    "\"CASE\"",
-    "\"CHECK\"",
-    "\"CLUSTERS\"",
-    "\"CLUSTER\"",
-    "\"COLAUTH\"",
-    "\"COLUMNS\"",
-    "\"COMPRESS\"",
-    "\"CONNECT\"",
-    "\"CRASH\"",
-    "\"CREATE\"",
-    "\"CURSOR\"",
-    "\"DECLARE\"",
-    "\"DEFAULT\"",
-    "\"DESC\"",
-    "\"DISTINCT\"",
-    "\"DROP\"",
-    "\"ELSE\"",
-    "\"END\"",
-    "\"EXCEPTION\"",
-    "\"EXCLUSIVE\"",
-    "\"FETCH\"",
-    "\"FOR\"",
-    "\"FROM\"",
-    "\"FUNCTION\"",
-    "\"GOTO\"",
-    "\"GRANT\"",
-    "\"GROUP\"",
-    "\"HAVING\"",
-    "\"IDENTIFIED\"",
-    "\"IF\"",
-    "\"IN\"",
-    "\"INDEX\"",
-    "\"INDEXES\"",
-    "\"INSERT\"",
-    "\"INTERSECT\"",
-    "\"INTO\"",
-    "\"IS\"",
-    "\"LIKE\"",
-    "\"LOCK\"",
-    "\"MINUS\"",
-    "\"MODE\"",
-    "\"NOCOMPRESS\"",
-    "\"\\\'NO\\\'\"",
-    "\"NOT\"",
-    "\"NOWAIT\"",
-    "\"NULL\"",
-    "\"OF\"",
-    "\"ON\"",
-    "\"OPTION\"",
-    "\"OR\"",
-    "\"ORDER\"",
-    "\"OVERLAPS\"",
-    "\"PROCEDURE\"",
-    "\"PUBLIC\"",
-    "\"RESOURCE\"",
-    "\"REVOLE\"",
-    "\"SELECT\"",
-    "\"SHARE\"",
-    "\"SIZE\"",
-    "\"SQL\"",
-    "\"START\"",
-    "\"SUBTYPE\"",
-    "\"TABAUTH\"",
-    "\"TABLE\"",
-    "\"THEN\"",
-    "\"TO\"",
-    "\"TYPE\"",
-    "\"UNION\"",
-    "\"UNIQUE\"",
-    "\"UPDATE\"",
-    "\"VALUES\"",
-    "\"VIEW\"",
-    "\"VIEWS\"",
-    "\"WHEN\"",
-    "\"WHERE\"",
-    "\"WITH\"",
-    "\"\\\'YES\\\'\"",
-    "\"ARRAY\"",
-    "\"AUTHID\"",
-    "\"AUTONOMOUS_TRANSACTION\"",
-    "\"BFILE\"",
-    "\"BINARY_DOUBLE\"",
-    "\"BINARY_FLOAT\"",
-    "\"BINARY_INTEGER\"",
-    "\"BLOB\"",
-    "\"BOOLEAN\"",
-    "\"BYTE\"",
-    "\"CHAR\"",
-    "\"CHARACTER\"",
-    "\"CHARSET\"",
-    "\"CLOB\"",
-    "\"COMMIT\"",
-    "\"CONSTANT\"",
-    "\"CONSTRAINT\"",
-    "\"CURRENT_USER\"",
-    "\"DATE\"",
-    "\"DAY\"",
-    "\"DEC\"",
-    "\"DECIMAL\"",
-    "\"DEFINER\"",
-    "\"DELETE\"",
-    "\"DETERMINISTIC\"",
-    "\"DOUBLE\"",
-    "\"ENABLE\"",
-    "\"EXCEPTION_INIT\"",
-    "\"FINAL\"",
-    "\"FLOAT\"",
-    "\"FORCE\"",
-    "\"GLOBAL\"",
-    "\"INLINE\"",
-    "\"INSTANTIABLE\"",
-    "\"INT\"",
-    "\"INTEGER\"",
-    "\"INTERVAL\"",
-    "\"KEY\"",
-    "\"LOCAL\"",
-    "\"LONG\"",
-    "\"MLSLABEL\"",
-    "\"MONTH\"",
-    "\"NATIONAL\"",
-    "\"NATURAL\"",
-    "\"NCHAR\"",
-    "\"NCLOB\"",
-    "\"NOCOPY\"",
-    "\"NUMBER\"",
-    "\"NUMERIC\"",
-    "\"NVARCHAR2\"",
-    "\"NVARCHAR\"",
-    "\"OBJECT\"",
-    "\"OID\"",
-    "\"ORGANIZATION\"",
-    "\"OUT\"",
-    "\"OVERFLOW\"",
-    "\"PACKAGE\"",
-    "\"PARALLEL_ENABLE\"",
-    "\"PIPELINED\"",
-    "\"PLS_INTEGER\"",
-    "\"POSITIVE\"",
-    "\"PRAGMA\"",
-    "\"PRECISION\"",
-    "\"PRESERVE\"",
-    "\"PRIMARY\"",
-    "\"RANGE\"",
-    "\"RAW\"",
-    "\"REAL\"",
-    "\"RECORD\"",
-    "\"REF\"",
-    "\"REPLACE\"",
-    "\"RESTRICT_REFERENCES\"",
-    "\"RESULT_CACHE\"",
-    "\"RETURN\"",
-    "\"RNDS\"",
-    "\"RNPS\"",
-    "\"ROWID\"",
-    "\"ROWS\"",
-    "\"SECOND\"",
-    "\"SERIALLY_REUSABLE\"",
-    "\"SET\"",
-    "\"SIGNTYPE\"",
-    "\"SIMPLE_DOUBLE\"",
-    "\"SIMPLE_FLOAT\"",
-    "\"SIMPLE_INTEGER\"",
-    "\"SMALLINT\"",
-    "\"STRING\"",
-    "\"SYS_REFCURSOR\"",
-    "\"TEMPORARY\"",
-    "\"TIME\"",
-    "\"TIMESTAMP\"",
-    "\"TRUST\"",
-    "\"UROWID\"",
-    "\"VARCHAR2\"",
-    "\"VARCHAR\"",
-    "\"VARRAY\"",
-    "\"VARYING\"",
-    "\"WNDS\"",
-    "\"WNPS\"",
-    "\"YEAR\"",
-    "\"ZONE\"",
-    "<S_IDENTIFIER>",
-    "<LETTER>",
-    "<SPECIAL_CHARS>",
-    "<S_BIND>",
-    "<S_CHAR_LITERAL>",
-    "<S_QUOTED_IDENTIFIER>",
-  };
-
-}
+public interface DDLParserConstants {
+
+  /** End of File. */
+  int EOF = 0;
+  /** RegularExpression Id. */
+  int COMMENT_LINE = 6;
+  /** RegularExpression Id. */
+  int COMMENT_BLOCK = 7;
+  /** RegularExpression Id. */
+  int O_ASSIGN = 8;
+  /** RegularExpression Id. */
+  int O_ASTERISK = 9;
+  /** RegularExpression Id. */
+  int O_ATSIGN = 10;
+  /** RegularExpression Id. */
+  int O_CLOSEPAREN = 11;
+  /** RegularExpression Id. */
+  int O_CONCAT = 12;
+  /** RegularExpression Id. */
+  int O_COLON = 13;
+  /** RegularExpression Id. */
+  int O_COMMA = 14;
+  /** RegularExpression Id. */
+  int O_DOT = 15;
+  /** RegularExpression Id. */
+  int O_DOUBLEDOT = 16;
+  /** RegularExpression Id. */
+  int O_DOLLAR = 17;
+  /** RegularExpression Id. */
+  int O_PERCENT = 18;
+  /** RegularExpression Id. */
+  int O_EQUAL = 19;
+  /** RegularExpression Id. */
+  int O_GREATER = 20;
+  /** RegularExpression Id. */
+  int O_GREATEREQUAL = 21;
+  /** RegularExpression Id. */
+  int O_JOINPLUS = 22;
+  /** RegularExpression Id. */
+  int O_LESS = 23;
+  /** RegularExpression Id. */
+  int O_LESSEQUAL = 24;
+  /** RegularExpression Id. */
+  int O_MINUS = 25;
+  /** RegularExpression Id. */
+  int O_NOTEQUAL2 = 26;
+  /** RegularExpression Id. */
+  int O_NOTEQUAL = 27;
+  /** RegularExpression Id. */
+  int O_OPENPAREN = 28;
+  /** RegularExpression Id. */
+  int O_PLUS = 29;
+  /** RegularExpression Id. */
+  int O_POUND = 30;
+  /** RegularExpression Id. */
+  int O_QUESTIONMARK = 31;
+  /** RegularExpression Id. */
+  int O_SEMICOLON = 32;
+  /** RegularExpression Id. */
+  int O_SLASH = 33;
+  /** RegularExpression Id. */
+  int O_TILDE = 34;
+  /** RegularExpression Id. */
+  int S_NUMBER = 35;
+  /** RegularExpression Id. */
+  int FLOAT = 36;
+  /** RegularExpression Id. */
+  int INTEGER = 37;
+  /** RegularExpression Id. */
+  int DIGIT = 38;
+  /** RegularExpression Id. */
+  int R_ALL = 39;
+  /** RegularExpression Id. */
+  int R_ALTER = 40;
+  /** RegularExpression Id. */
+  int R_ANCHORED_ROWTYPE = 41;
+  /** RegularExpression Id. */
+  int R_ANCHORED_TYPE = 42;
+  /** RegularExpression Id. */
+  int R_AND = 43;
+  /** RegularExpression Id. */
+  int R_AS = 44;
+  /** RegularExpression Id. */
+  int R_ASC = 45;
+  /** RegularExpression Id. */
+  int R_AT = 46;
+  /** RegularExpression Id. */
+  int R_BEGIN = 47;
+  /** RegularExpression Id. */
+  int R_BETWEEN = 48;
+  /** RegularExpression Id. */
+  int R_BY = 49;
+  /** RegularExpression Id. */
+  int R_CASE = 50;
+  /** RegularExpression Id. */
+  int R_CHECK = 51;
+  /** RegularExpression Id. */
+  int R_CLUSTERS = 52;
+  /** RegularExpression Id. */
+  int R_CLUSTER = 53;
+  /** RegularExpression Id. */
+  int R_COLAUTH = 54;
+  /** RegularExpression Id. */
+  int R_COLUMNS = 55;
+  /** RegularExpression Id. */
+  int R_COMPRESS = 56;
+  /** RegularExpression Id. */
+  int R_CONNECT = 57;
+  /** RegularExpression Id. */
+  int R_CRASH = 58;
+  /** RegularExpression Id. */
+  int R_CREATE = 59;
+  /** RegularExpression Id. */
+  int R_CURSOR = 60;
+  /** RegularExpression Id. */
+  int R_DECLARE = 61;
+  /** RegularExpression Id. */
+  int R_DEFAULT = 62;
+  /** RegularExpression Id. */
+  int R_DESC = 63;
+  /** RegularExpression Id. */
+  int R_DISTINCT = 64;
+  /** RegularExpression Id. */
+  int R_DROP = 65;
+  /** RegularExpression Id. */
+  int R_ELSE = 66;
+  /** RegularExpression Id. */
+  int R_END = 67;
+  /** RegularExpression Id. */
+  int R_EXCEPTION = 68;
+  /** RegularExpression Id. */
+  int R_EXCLUSIVE = 69;
+  /** RegularExpression Id. */
+  int R_FETCH = 70;
+  /** RegularExpression Id. */
+  int R_FOR = 71;
+  /** RegularExpression Id. */
+  int R_FROM = 72;
+  /** RegularExpression Id. */
+  int R_FUNCTION = 73;
+  /** RegularExpression Id. */
+  int R_GOTO = 74;
+  /** RegularExpression Id. */
+  int R_GRANT = 75;
+  /** RegularExpression Id. */
+  int R_GROUP = 76;
+  /** RegularExpression Id. */
+  int R_HAVING = 77;
+  /** RegularExpression Id. */
+  int R_IDENTIFIED = 78;
+  /** RegularExpression Id. */
+  int R_IF = 79;
+  /** RegularExpression Id. */
+  int R_IN = 80;
+  /** RegularExpression Id. */
+  int R_INDEX = 81;
+  /** RegularExpression Id. */
+  int R_INDEXES = 82;
+  /** RegularExpression Id. */
+  int R_INSERT = 83;
+  /** RegularExpression Id. */
+  int R_INTERSECT = 84;
+  /** RegularExpression Id. */
+  int R_INTO = 85;
+  /** RegularExpression Id. */
+  int R_IS = 86;
+  /** RegularExpression Id. */
+  int R_LIKE = 87;
+  /** RegularExpression Id. */
+  int R_LOCK = 88;
+  /** RegularExpression Id. */
+  int R_MINUS = 89;
+  /** RegularExpression Id. */
+  int R_MODE = 90;
+  /** RegularExpression Id. */
+  int R_NOCOMPRESS = 91;
+  /** RegularExpression Id. */
+  int R_NO = 92;
+  /** RegularExpression Id. */
+  int R_NOT = 93;
+  /** RegularExpression Id. */
+  int R_NOWAIT = 94;
+  /** RegularExpression Id. */
+  int R_NULL = 95;
+  /** RegularExpression Id. */
+  int R_OF = 96;
+  /** RegularExpression Id. */
+  int R_ON = 97;
+  /** RegularExpression Id. */
+  int R_OPTION = 98;
+  /** RegularExpression Id. */
+  int R_OR = 99;
+  /** RegularExpression Id. */
+  int R_ORDER = 100;
+  /** RegularExpression Id. */
+  int R_OVERLAPS = 101;
+  /** RegularExpression Id. */
+  int R_PROCEDURE = 102;
+  /** RegularExpression Id. */
+  int R_PUBLIC = 103;
+  /** RegularExpression Id. */
+  int R_RESOURCE = 104;
+  /** RegularExpression Id. */
+  int R_REVOKE = 105;
+  /** RegularExpression Id. */
+  int R_SELECT = 106;
+  /** RegularExpression Id. */
+  int R_SHARE = 107;
+  /** RegularExpression Id. */
+  int R_SIZE = 108;
+  /** RegularExpression Id. */
+  int R_SQL = 109;
+  /** RegularExpression Id. */
+  int R_START = 110;
+  /** RegularExpression Id. */
+  int R_SUBTYPE = 111;
+  /** RegularExpression Id. */
+  int R_TABAUTH = 112;
+  /** RegularExpression Id. */
+  int R_TABLE = 113;
+  /** RegularExpression Id. */
+  int R_THEN = 114;
+  /** RegularExpression Id. */
+  int R_TO = 115;
+  /** RegularExpression Id. */
+  int R_TYPE = 116;
+  /** RegularExpression Id. */
+  int R_UNION = 117;
+  /** RegularExpression Id. */
+  int R_UNIQUE = 118;
+  /** RegularExpression Id. */
+  int R_UPDATE = 119;
+  /** RegularExpression Id. */
+  int R_VALUES = 120;
+  /** RegularExpression Id. */
+  int R_VIEW = 121;
+  /** RegularExpression Id. */
+  int R_VIEWS = 122;
+  /** RegularExpression Id. */
+  int R_WHEN = 123;
+  /** RegularExpression Id. */
+  int R_WHERE = 124;
+  /** RegularExpression Id. */
+  int R_WITH = 125;
+  /** RegularExpression Id. */
+  int R_YES = 126;
+  /** RegularExpression Id. */
+  int K_ARRAY = 127;
+  /** RegularExpression Id. */
+  int K_AUTHID = 128;
+  /** RegularExpression Id. */
+  int K_AUTONOMOUS_TRANSACTION = 129;
+  /** RegularExpression Id. */
+  int K_BFILE = 130;
+  /** RegularExpression Id. */
+  int K_BINARY_DOUBLE = 131;
+  /** RegularExpression Id. */
+  int K_BINARY_FLOAT = 132;
+  /** RegularExpression Id. */
+  int K_BINARY_INTEGER = 133;
+  /** RegularExpression Id. */
+  int K_BLOB = 134;
+  /** RegularExpression Id. */
+  int K_BOOLEAN = 135;
+  /** RegularExpression Id. */
+  int K_BYTE = 136;
+  /** RegularExpression Id. */
+  int K_CHAR = 137;
+  /** RegularExpression Id. */
+  int K_CHARACTER = 138;
+  /** RegularExpression Id. */
+  int K_CHARSET = 139;
+  /** RegularExpression Id. */
+  int K_CLOB = 140;
+  /** RegularExpression Id. */
+  int K_COMMIT = 141;
+  /** RegularExpression Id. */
+  int K_CONSTANT = 142;
+  /** RegularExpression Id. */
+  int K_CONSTRAINT = 143;
+  /** RegularExpression Id. */
+  int K_CURRENT_USER = 144;
+  /** RegularExpression Id. */
+  int K_DATE = 145;
+  /** RegularExpression Id. */
+  int K_DAY = 146;
+  /** RegularExpression Id. */
+  int K_DEC = 147;
+  /** RegularExpression Id. */
+  int K_DECIMAL = 148;
+  /** RegularExpression Id. */
+  int K_DEFINER = 149;
+  /** RegularExpression Id. */
+  int K_DELETE = 150;
+  /** RegularExpression Id. */
+  int K_DETERMINISTIC = 151;
+  /** RegularExpression Id. */
+  int K_DOUBLE = 152;
+  /** RegularExpression Id. */
+  int K_ENABLE = 153;
+  /** RegularExpression Id. */
+  int K_EXCEPTION_INIT = 154;
+  /** RegularExpression Id. */
+  int K_FINAL = 155;
+  /** RegularExpression Id. */
+  int K_FLOAT = 156;
+  /** RegularExpression Id. */
+  int K_FORCE = 157;
+  /** RegularExpression Id. */
+  int K_GLOBAL = 158;
+  /** RegularExpression Id. */
+  int K_INLINE = 159;
+  /** RegularExpression Id. */
+  int K_INSTANTIABLE = 160;
+  /** RegularExpression Id. */
+  int K_INT = 161;
+  /** RegularExpression Id. */
+  int K_INTEGER = 162;
+  /** RegularExpression Id. */
+  int K_INTERVAL = 163;
+  /** RegularExpression Id. */
+  int K_KEY = 164;
+  /** RegularExpression Id. */
+  int K_LOCAL = 165;
+  /** RegularExpression Id. */
+  int K_LONG = 166;
+  /** RegularExpression Id. */
+  int K_MLSLABEL = 167;
+  /** RegularExpression Id. */
+  int K_MONTH = 168;
+  /** RegularExpression Id. */
+  int K_NATIONAL = 169;
+  /** RegularExpression Id. */
+  int K_NATURAL = 170;
+  /** RegularExpression Id. */
+  int K_NCHAR = 171;
+  /** RegularExpression Id. */
+  int K_NCLOB = 172;
+  /** RegularExpression Id. */
+  int K_NOCOPY = 173;
+  /** RegularExpression Id. */
+  int K_NUMBER = 174;
+  /** RegularExpression Id. */
+  int K_NUMERIC = 175;
+  /** RegularExpression Id. */
+  int K_NVARCHAR2 = 176;
+  /** RegularExpression Id. */
+  int K_NVARCHAR = 177;
+  /** RegularExpression Id. */
+  int K_OBJECT = 178;
+  /** RegularExpression Id. */
+  int K_OID = 179;
+  /** RegularExpression Id. */
+  int K_ORGANIZATION = 180;
+  /** RegularExpression Id. */
+  int K_OUT = 181;
+  /** RegularExpression Id. */
+  int K_OVERFLOW = 182;
+  /** RegularExpression Id. */
+  int K_PACKAGE = 183;
+  /** RegularExpression Id. */
+  int K_PARALLEL_ENABLE = 184;
+  /** RegularExpression Id. */
+  int K_PIPELINED = 185;
+  /** RegularExpression Id. */
+  int K_PLS_INTEGER = 186;
+  /** RegularExpression Id. */
+  int K_POSITIVE = 187;
+  /** RegularExpression Id. */
+  int K_PRAGMA = 188;
+  /** RegularExpression Id. */
+  int K_PRECISION = 189;
+  /** RegularExpression Id. */
+  int K_PRESERVE = 190;
+  /** RegularExpression Id. */
+  int K_PRIMARY = 191;
+  /** RegularExpression Id. */
+  int K_RANGE = 192;
+  /** RegularExpression Id. */
+  int K_RAW = 193;
+  /** RegularExpression Id. */
+  int K_REAL = 194;
+  /** RegularExpression Id. */
+  int K_RECORD = 195;
+  /** RegularExpression Id. */
+  int K_REF = 196;
+  /** RegularExpression Id. */
+  int K_REPLACE = 197;
+  /** RegularExpression Id. */
+  int K_RESTRICT_REFERENCES = 198;
+  /** RegularExpression Id. */
+  int K_RESULT_CACHE = 199;
+  /** RegularExpression Id. */
+  int K_RETURN = 200;
+  /** RegularExpression Id. */
+  int K_RNDS = 201;
+  /** RegularExpression Id. */
+  int K_RNPS = 202;
+  /** RegularExpression Id. */
+  int K_ROWID = 203;
+  /** RegularExpression Id. */
+  int K_ROWS = 204;
+  /** RegularExpression Id. */
+  int K_SECOND = 205;
+  /** RegularExpression Id. */
+  int K_SERIALLY_REUSABLE = 206;
+  /** RegularExpression Id. */
+  int K_SET = 207;
+  /** RegularExpression Id. */
+  int K_SIGNTYPE = 208;
+  /** RegularExpression Id. */
+  int K_SIMPLE_DOUBLE = 209;
+  /** RegularExpression Id. */
+  int K_SIMPLE_FLOAT = 210;
+  /** RegularExpression Id. */
+  int K_SIMPLE_INTEGER = 211;
+  /** RegularExpression Id. */
+  int K_SMALLINT = 212;
+  /** RegularExpression Id. */
+  int K_STRING = 213;
+  /** RegularExpression Id. */
+  int K_SYS_REFCURSOR = 214;
+  /** RegularExpression Id. */
+  int K_TEMPORARY = 215;
+  /** RegularExpression Id. */
+  int K_TIME = 216;
+  /** RegularExpression Id. */
+  int K_TIMESTAMP = 217;
+  /** RegularExpression Id. */
+  int K_TRUST = 218;
+  /** RegularExpression Id. */
+  int K_UROWID = 219;
+  /** RegularExpression Id. */
+  int K_VARCHAR2 = 220;
+  /** RegularExpression Id. */
+  int K_VARCHAR = 221;
+  /** RegularExpression Id. */
+  int K_VARRAY = 222;
+  /** RegularExpression Id. */
+  int K_VARYING = 223;
+  /** RegularExpression Id. */
+  int K_WNDS = 224;
+  /** RegularExpression Id. */
+  int K_WNPS = 225;
+  /** RegularExpression Id. */
+  int K_YEAR = 226;
+  /** RegularExpression Id. */
+  int K_ZONE = 227;
+  /** RegularExpression Id. */
+  int S_IDENTIFIER = 228;
+  /** RegularExpression Id. */
+  int LETTER = 229;
+  /** RegularExpression Id. */
+  int SPECIAL_CHARS = 230;
+  /** RegularExpression Id. */
+  int S_BIND = 231;
+  /** RegularExpression Id. */
+  int S_CHAR_LITERAL = 232;
+  /** RegularExpression Id. */
+  int S_QUOTED_IDENTIFIER = 233;
+
+  /** Lexical state. */
+  int DEFAULT = 0;
+
+  /** Literal token values. */
+  String[] tokenImage = {
+    "<EOF>",
+    "\" \"",
+    "\"\\t\"",
+    "\"\\n\"",
+    "\"\\r\"",
+    "\"\\f\"",
+    "<COMMENT_LINE>",
+    "<COMMENT_BLOCK>",
+    "\":=\"",
+    "\"*\"",
+    "\"@\"",
+    "\")\"",
+    "\"||\"",
+    "\":\"",
+    "\",\"",
+    "\".\"",
+    "\"..\"",
+    "\"$\"",
+    "\"%\"",
+    "\"=\"",
+    "\">\"",
+    "\">=\"",
+    "\"(+)\"",
+    "\"<\"",
+    "\"<=\"",
+    "\"-\"",
+    "\"<>\"",
+    "\"!=\"",
+    "\"(\"",
+    "\"+\"",
+    "\"#\"",
+    "\"?\"",
+    "\";\"",
+    "\"/\"",
+    "\"~\"",
+    "<S_NUMBER>",
+    "<FLOAT>",
+    "<INTEGER>",
+    "<DIGIT>",
+    "\"ALL\"",
+    "\"ALTER\"",
+    "\"%ROWTYPE\"",
+    "\"%TYPE\"",
+    "\"AND\"",
+    "\"AS\"",
+    "\"ASC\"",
+    "\"AT\"",
+    "\"BEGIN\"",
+    "\"BETWEEN\"",
+    "\"BY\"",
+    "\"CASE\"",
+    "\"CHECK\"",
+    "\"CLUSTERS\"",
+    "\"CLUSTER\"",
+    "\"COLAUTH\"",
+    "\"COLUMNS\"",
+    "\"COMPRESS\"",
+    "\"CONNECT\"",
+    "\"CRASH\"",
+    "\"CREATE\"",
+    "\"CURSOR\"",
+    "\"DECLARE\"",
+    "\"DEFAULT\"",
+    "\"DESC\"",
+    "\"DISTINCT\"",
+    "\"DROP\"",
+    "\"ELSE\"",
+    "\"END\"",
+    "\"EXCEPTION\"",
+    "\"EXCLUSIVE\"",
+    "\"FETCH\"",
+    "\"FOR\"",
+    "\"FROM\"",
+    "\"FUNCTION\"",
+    "\"GOTO\"",
+    "\"GRANT\"",
+    "\"GROUP\"",
+    "\"HAVING\"",
+    "\"IDENTIFIED\"",
+    "\"IF\"",
+    "\"IN\"",
+    "\"INDEX\"",
+    "\"INDEXES\"",
+    "\"INSERT\"",
+    "\"INTERSECT\"",
+    "\"INTO\"",
+    "\"IS\"",
+    "\"LIKE\"",
+    "\"LOCK\"",
+    "\"MINUS\"",
+    "\"MODE\"",
+    "\"NOCOMPRESS\"",
+    "\"\\\'NO\\\'\"",
+    "\"NOT\"",
+    "\"NOWAIT\"",
+    "\"NULL\"",
+    "\"OF\"",
+    "\"ON\"",
+    "\"OPTION\"",
+    "\"OR\"",
+    "\"ORDER\"",
+    "\"OVERLAPS\"",
+    "\"PROCEDURE\"",
+    "\"PUBLIC\"",
+    "\"RESOURCE\"",
+    "\"REVOLE\"",
+    "\"SELECT\"",
+    "\"SHARE\"",
+    "\"SIZE\"",
+    "\"SQL\"",
+    "\"START\"",
+    "\"SUBTYPE\"",
+    "\"TABAUTH\"",
+    "\"TABLE\"",
+    "\"THEN\"",
+    "\"TO\"",
+    "\"TYPE\"",
+    "\"UNION\"",
+    "\"UNIQUE\"",
+    "\"UPDATE\"",
+    "\"VALUES\"",
+    "\"VIEW\"",
+    "\"VIEWS\"",
+    "\"WHEN\"",
+    "\"WHERE\"",
+    "\"WITH\"",
+    "\"\\\'YES\\\'\"",
+    "\"ARRAY\"",
+    "\"AUTHID\"",
+    "\"AUTONOMOUS_TRANSACTION\"",
+    "\"BFILE\"",
+    "\"BINARY_DOUBLE\"",
+    "\"BINARY_FLOAT\"",
+    "\"BINARY_INTEGER\"",
+    "\"BLOB\"",
+    "\"BOOLEAN\"",
+    "\"BYTE\"",
+    "\"CHAR\"",
+    "\"CHARACTER\"",
+    "\"CHARSET\"",
+    "\"CLOB\"",
+    "\"COMMIT\"",
+    "\"CONSTANT\"",
+    "\"CONSTRAINT\"",
+    "\"CURRENT_USER\"",
+    "\"DATE\"",
+    "\"DAY\"",
+    "\"DEC\"",
+    "\"DECIMAL\"",
+    "\"DEFINER\"",
+    "\"DELETE\"",
+    "\"DETERMINISTIC\"",
+    "\"DOUBLE\"",
+    "\"ENABLE\"",
+    "\"EXCEPTION_INIT\"",
+    "\"FINAL\"",
+    "\"FLOAT\"",
+    "\"FORCE\"",
+    "\"GLOBAL\"",
+    "\"INLINE\"",
+    "\"INSTANTIABLE\"",
+    "\"INT\"",
+    "\"INTEGER\"",
+    "\"INTERVAL\"",
+    "\"KEY\"",
+    "\"LOCAL\"",
+    "\"LONG\"",
+    "\"MLSLABEL\"",
+    "\"MONTH\"",
+    "\"NATIONAL\"",
+    "\"NATURAL\"",
+    "\"NCHAR\"",
+    "\"NCLOB\"",
+    "\"NOCOPY\"",
+    "\"NUMBER\"",
+    "\"NUMERIC\"",
+    "\"NVARCHAR2\"",
+    "\"NVARCHAR\"",
+    "\"OBJECT\"",
+    "\"OID\"",
+    "\"ORGANIZATION\"",
+    "\"OUT\"",
+    "\"OVERFLOW\"",
+    "\"PACKAGE\"",
+    "\"PARALLEL_ENABLE\"",
+    "\"PIPELINED\"",
+    "\"PLS_INTEGER\"",
+    "\"POSITIVE\"",
+    "\"PRAGMA\"",
+    "\"PRECISION\"",
+    "\"PRESERVE\"",
+    "\"PRIMARY\"",
+    "\"RANGE\"",
+    "\"RAW\"",
+    "\"REAL\"",
+    "\"RECORD\"",
+    "\"REF\"",
+    "\"REPLACE\"",
+    "\"RESTRICT_REFERENCES\"",
+    "\"RESULT_CACHE\"",
+    "\"RETURN\"",
+    "\"RNDS\"",
+    "\"RNPS\"",
+    "\"ROWID\"",
+    "\"ROWS\"",
+    "\"SECOND\"",
+    "\"SERIALLY_REUSABLE\"",
+    "\"SET\"",
+    "\"SIGNTYPE\"",
+    "\"SIMPLE_DOUBLE\"",
+    "\"SIMPLE_FLOAT\"",
+    "\"SIMPLE_INTEGER\"",
+    "\"SMALLINT\"",
+    "\"STRING\"",
+    "\"SYS_REFCURSOR\"",
+    "\"TEMPORARY\"",
+    "\"TIME\"",
+    "\"TIMESTAMP\"",
+    "\"TRUST\"",
+    "\"UROWID\"",
+    "\"VARCHAR2\"",
+    "\"VARCHAR\"",
+    "\"VARRAY\"",
+    "\"VARYING\"",
+    "\"WNDS\"",
+    "\"WNPS\"",
+    "\"YEAR\"",
+    "\"ZONE\"",
+    "<S_IDENTIFIER>",
+    "<LETTER>",
+    "<SPECIAL_CHARS>",
+    "<S_BIND>",
+    "<S_CHAR_LITERAL>",
+    "<S_QUOTED_IDENTIFIER>",
+  };
+
+}
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTokenManager.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTokenManager.java
index 00b33f4..bfe2599 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTokenManager.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTokenManager.java
@@ -1,4 +1,4 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. DDLParserTokenManager.java */
+/* Generated By:JJTree&JavaCC: Do not edit this line. DDLParserTokenManager.java */
 /*******************************************************************************
  * Copyright (c) 2011 Oracle. All rights reserved.
  * This program and the accompanying materials are made available under the
@@ -10,4147 +10,4147 @@
  *
  * Contributors:
  *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
+ ******************************************************************************/
+package org.eclipse.persistence.tools.oracleddl.parser;
 //javase imports
-import java.io.InputStream;
-import java.util.List;
-import java.util.HashMap;
-import java.util.Map;
+import java.io.InputStream;
+import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 //metadata imports
-import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentTypeDirection;
-import org.eclipse.persistence.tools.oracleddl.metadata.BlobType;
-import org.eclipse.persistence.tools.oracleddl.metadata.CharType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ClobType;
-import org.eclipse.persistence.tools.oracleddl.metadata.CompositeDatabaseType;
-import org.eclipse.persistence.tools.oracleddl.metadata.DatabaseType;
-import org.eclipse.persistence.tools.oracleddl.metadata.DecimalType;
-import org.eclipse.persistence.tools.oracleddl.metadata.DoubleType;
-import org.eclipse.persistence.tools.oracleddl.metadata.FieldType;
-import org.eclipse.persistence.tools.oracleddl.metadata.FloatType;
-import org.eclipse.persistence.tools.oracleddl.metadata.FunctionType;
-import org.eclipse.persistence.tools.oracleddl.metadata.IntervalDayToSecond;
-import org.eclipse.persistence.tools.oracleddl.metadata.IntervalYearToMonth;
-import org.eclipse.persistence.tools.oracleddl.metadata.LongType;
-import org.eclipse.persistence.tools.oracleddl.metadata.LongRawType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NCharType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NClobType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NumericType;
-import org.eclipse.persistence.tools.oracleddl.metadata.NVarChar2Type;
-import org.eclipse.persistence.tools.oracleddl.metadata.ObjectType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ObjectTableType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCollectionType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCursorType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLPackageType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLRecordType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLType;
-import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLSubType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ProcedureType;
-import org.eclipse.persistence.tools.oracleddl.metadata.RawType;
-import org.eclipse.persistence.tools.oracleddl.metadata.RealType;
-import org.eclipse.persistence.tools.oracleddl.metadata.ROWTYPEType;
-import org.eclipse.persistence.tools.oracleddl.metadata.TableType;
-import org.eclipse.persistence.tools.oracleddl.metadata.TimeStampType;
-import org.eclipse.persistence.tools.oracleddl.metadata.TYPEType;
-import org.eclipse.persistence.tools.oracleddl.metadata.URowIdType;
-import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedSizedType;
-import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedType;
-import org.eclipse.persistence.tools.oracleddl.metadata.VarCharType;
-import org.eclipse.persistence.tools.oracleddl.metadata.VarChar2Type;
-import org.eclipse.persistence.tools.oracleddl.metadata.VArrayType;
-import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypesRepository;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BFILE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_FLOAT_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_DOUBLE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BOOLEAN_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.DATE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.MLSLABEL_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.NATURAL_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.PLS_INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.POSITIVE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.ROWID_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIGN_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_INTEGER_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_DOUBLE_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_FLOAT_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SMALLINT_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SYS_REFCURSOR_TYPE;
-import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.TIME_TYPE;
-
-/** Token Manager. */
+import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentTypeDirection;
+import org.eclipse.persistence.tools.oracleddl.metadata.BlobType;
+import org.eclipse.persistence.tools.oracleddl.metadata.CharType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ClobType;
+import org.eclipse.persistence.tools.oracleddl.metadata.CompositeDatabaseType;
+import org.eclipse.persistence.tools.oracleddl.metadata.DatabaseType;
+import org.eclipse.persistence.tools.oracleddl.metadata.DecimalType;
+import org.eclipse.persistence.tools.oracleddl.metadata.DoubleType;
+import org.eclipse.persistence.tools.oracleddl.metadata.FieldType;
+import org.eclipse.persistence.tools.oracleddl.metadata.FloatType;
+import org.eclipse.persistence.tools.oracleddl.metadata.FunctionType;
+import org.eclipse.persistence.tools.oracleddl.metadata.IntervalDayToSecond;
+import org.eclipse.persistence.tools.oracleddl.metadata.IntervalYearToMonth;
+import org.eclipse.persistence.tools.oracleddl.metadata.LongType;
+import org.eclipse.persistence.tools.oracleddl.metadata.LongRawType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NCharType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NClobType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NumericType;
+import org.eclipse.persistence.tools.oracleddl.metadata.NVarChar2Type;
+import org.eclipse.persistence.tools.oracleddl.metadata.ObjectType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ObjectTableType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCollectionType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCursorType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLPackageType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLRecordType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLType;
+import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLSubType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ProcedureType;
+import org.eclipse.persistence.tools.oracleddl.metadata.RawType;
+import org.eclipse.persistence.tools.oracleddl.metadata.RealType;
+import org.eclipse.persistence.tools.oracleddl.metadata.ROWTYPEType;
+import org.eclipse.persistence.tools.oracleddl.metadata.TableType;
+import org.eclipse.persistence.tools.oracleddl.metadata.TimeStampType;
+import org.eclipse.persistence.tools.oracleddl.metadata.TYPEType;
+import org.eclipse.persistence.tools.oracleddl.metadata.URowIdType;
+import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedSizedType;
+import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedType;
+import org.eclipse.persistence.tools.oracleddl.metadata.VarCharType;
+import org.eclipse.persistence.tools.oracleddl.metadata.VarChar2Type;
+import org.eclipse.persistence.tools.oracleddl.metadata.VArrayType;
+import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypesRepository;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BFILE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_FLOAT_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BINARY_DOUBLE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.BOOLEAN_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.DATE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.MLSLABEL_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.NATURAL_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.PLS_INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.POSITIVE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.ROWID_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIGN_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_INTEGER_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_DOUBLE_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SIMPLE_FLOAT_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SMALLINT_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.SYS_REFCURSOR_TYPE;
+import static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.TIME_TYPE;
+
+/** Token Manager. */
 @SuppressWarnings("all")
-public class DDLParserTokenManager implements DDLParserConstants
-{
-
-  /** Debug output. */
-  public  java.io.PrintStream debugStream = System.out;
-  /** Set debug output. */
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 9:
-         jjmatchedKind = 2;
-         return jjMoveNfa_0(5, 0);
-      case 10:
-         jjmatchedKind = 3;
-         return jjMoveNfa_0(5, 0);
-      case 12:
-         jjmatchedKind = 5;
-         return jjMoveNfa_0(5, 0);
-      case 13:
-         jjmatchedKind = 4;
-         return jjMoveNfa_0(5, 0);
-      case 32:
-         jjmatchedKind = 1;
-         return jjMoveNfa_0(5, 0);
-      case 33:
-         return jjMoveStringLiteralDfa1_0(0x8000000L, 0x0L, 0x0L, 0x0L);
-      case 35:
-         jjmatchedKind = 30;
-         return jjMoveNfa_0(5, 0);
-      case 36:
-         jjmatchedKind = 17;
-         return jjMoveNfa_0(5, 0);
-      case 37:
-         jjmatchedKind = 18;
-         return jjMoveStringLiteralDfa1_0(0x60000000000L, 0x0L, 0x0L, 0x0L);
-      case 39:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000000010000000L, 0x0L, 0x0L);
-      case 40:
-         jjmatchedKind = 28;
-         return jjMoveStringLiteralDfa1_0(0x400000L, 0x0L, 0x0L, 0x0L);
-      case 41:
-         jjmatchedKind = 11;
-         return jjMoveNfa_0(5, 0);
-      case 42:
-         jjmatchedKind = 9;
-         return jjMoveNfa_0(5, 0);
-      case 43:
-         jjmatchedKind = 29;
-         return jjMoveNfa_0(5, 0);
-      case 44:
-         jjmatchedKind = 14;
-         return jjMoveNfa_0(5, 0);
-      case 45:
-         jjmatchedKind = 25;
-         return jjMoveNfa_0(5, 0);
-      case 46:
-         jjmatchedKind = 15;
-         return jjMoveStringLiteralDfa1_0(0x10000L, 0x0L, 0x0L, 0x0L);
-      case 47:
-         jjmatchedKind = 33;
-         return jjMoveNfa_0(5, 0);
-      case 58:
-         jjmatchedKind = 13;
-         return jjMoveStringLiteralDfa1_0(0x100L, 0x0L, 0x0L, 0x0L);
-      case 59:
-         jjmatchedKind = 32;
-         return jjMoveNfa_0(5, 0);
-      case 60:
-         jjmatchedKind = 23;
-         return jjMoveStringLiteralDfa1_0(0x5000000L, 0x0L, 0x0L, 0x0L);
-      case 61:
-         jjmatchedKind = 19;
-         return jjMoveNfa_0(5, 0);
-      case 62:
-         jjmatchedKind = 20;
-         return jjMoveStringLiteralDfa1_0(0x200000L, 0x0L, 0x0L, 0x0L);
-      case 63:
-         jjmatchedKind = 31;
-         return jjMoveNfa_0(5, 0);
-      case 64:
-         jjmatchedKind = 10;
-         return jjMoveNfa_0(5, 0);
-      case 65:
-         return jjMoveStringLiteralDfa1_0(0x798000000000L, 0x8000000000000000L, 0x3L, 0x0L);
-      case 66:
-         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
-      case 67:
-         return jjMoveStringLiteralDfa1_0(0x1ffc000000000000L, 0x0L, 0x1fe00L, 0x0L);
-      case 68:
-         return jjMoveStringLiteralDfa1_0(0xe000000000000000L, 0x3L, 0x1fe0000L, 0x0L);
-      case 69:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3cL, 0x6000000L, 0x0L);
-      case 70:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3c0L, 0x38000000L, 0x0L);
-      case 71:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00L, 0x40000000L, 0x0L);
-      case 72:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000L, 0x0L, 0x0L);
-      case 73:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7fc000L, 0xf80000000L, 0x0L);
-      case 75:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x1000000000L, 0x0L);
-      case 76:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1800000L, 0x6000000000L, 0x0L);
-      case 77:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x18000000000L, 0x0L);
-      case 78:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe8000000L, 0x3fe0000000000L, 0x0L);
-      case 79:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000L, 0x7c000000000000L, 0x0L);
-      case 80:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xc000000000L, 0xff80000000000000L, 0x0L);
-      case 82:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x30000000000L, 0x0L, 0x1fffL);
-      case 83:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xfc0000000000L, 0x0L, 0x7fe000L);
-      case 84:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1f000000000000L, 0x0L, 0x7800000L);
-      case 85:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe0000000000000L, 0x0L, 0x8000000L);
-      case 86:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x700000000000000L, 0x0L, 0xf0000000L);
-      case 87:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3800000000000000L, 0x0L, 0x300000000L);
-      case 89:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000000L);
-      case 90:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000000L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x798000000000L, 0x8000000000000000L, 0x3L, 0x0L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0x1ffc000000000000L, 0x0L, 0x1fe00L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0xe000000000000000L, 0x3L, 0x1fe0000L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3cL, 0x6000000L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3c0L, 0x38000000L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00L, 0x40000000L, 0x0L);
-      case 104:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000L, 0x0L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7fc000L, 0xf80000000L, 0x0L);
-      case 107:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x1000000000L, 0x0L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1800000L, 0x6000000000L, 0x0L);
-      case 109:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x18000000000L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe8000000L, 0x3fe0000000000L, 0x0L);
-      case 111:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000L, 0x7c000000000000L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xc000000000L, 0xff80000000000000L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x30000000000L, 0x0L, 0x1fffL);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xfc0000000000L, 0x0L, 0x7fe000L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1f000000000000L, 0x0L, 0x7800000L);
-      case 117:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe0000000000000L, 0x0L, 0x8000000L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x700000000000000L, 0x0L, 0xf0000000L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3800000000000000L, 0x0L, 0x300000000L);
-      case 121:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000000L);
-      case 122:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000000L);
-      case 124:
-         return jjMoveStringLiteralDfa1_0(0x1000L, 0x0L, 0x0L, 0x0L);
-      case 126:
-         jjmatchedKind = 34;
-         return jjMoveNfa_0(5, 0);
-      default :
-         return jjMoveNfa_0(5, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2, long active3)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 0);
-   }
-   switch(curChar)
-   {
-      case 43:
-         return jjMoveStringLiteralDfa2_0(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L);
-      case 46:
-         if ((active0 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 16;
-            jjmatchedPos = 1;
-         }
-         break;
-      case 61:
-         if ((active0 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 8;
-            jjmatchedPos = 1;
-         }
-         else if ((active0 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 21;
-            jjmatchedPos = 1;
-         }
-         else if ((active0 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 24;
-            jjmatchedPos = 1;
-         }
-         else if ((active0 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 27;
-            jjmatchedPos = 1;
-         }
-         break;
-      case 62:
-         if ((active0 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 26;
-            jjmatchedPos = 1;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0x103000000002000L, active2, 0x180060000060000L, active3, 0xf0000003L);
-      case 66:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x180000000000L, active3, 0L);
-      case 68:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0L);
-      case 69:
-         return jjMoveStringLiteralDfa2_0(active0, 0xe001800000000000L, active1, 0x70000000040L, active2, 0x1000f80000L, active3, 0x40080e1fcL);
-      case 70:
-         if ((active1 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 79;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 96;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
-      case 72:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0x1804080000000000L, active2, 0xe00L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2600100002800001L, active2, 0x208000008000038L, active3, 0x30f0000L);
-      case 76:
-         return jjMoveStringLiteralDfa2_0(active0, 0x30018000000000L, active1, 0x4L, active2, 0x400008050001040L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000L);
-      case 78:
-         if ((active1 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 80;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 97;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x600000103e0008L, active2, 0xf82000000L, active3, 0x300000600L);
-      case 79:
-         if ((active1 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 115;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x3c0000000000000L, active1, 0x6d000480L, active2, 0x80021602100e080L, active3, 0x800001800L);
-      case 80:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80000400000000L, active2, 0L, active3, 0L);
-      case 81:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L);
-      case 82:
-         if ((active1 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 99;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xc00020000000000L, active1, 0x8000005000001902L, active2, 0xf010000000000000L, active3, 0xc000000L);
-      case 83:
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 44;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 86;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x200000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 84:
-         if ((active0 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 46;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0x400000000000L, active2, 0L, active3, 0x200000L);
-      case 85:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1000000000000000L, active1, 0x808080000200L, active2, 0x20c00000010003L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2000000000L, active2, 0x43000000000000L, active3, 0L);
-      case 88:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x30L, active2, 0x4000000L, active3, 0L);
-      case 89:
-         if ((active0 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 49;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4010000000000000L, active2, 0x100L, active3, 0x400000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0x103000000002000L, active2, 0x180060000060000L, active3, 0xf0000003L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x180000000000L, active3, 0L);
-      case 100:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0xe001800000000000L, active1, 0x70000000040L, active2, 0x1000f80000L, active3, 0x40080e1fcL);
-      case 102:
-         if ((active1 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 79;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 96;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0x1804080000000000L, active2, 0xe00L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2600100002800001L, active2, 0x208000008000038L, active3, 0x30f0000L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x30018000000000L, active1, 0x4L, active2, 0x400008050001040L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000L);
-      case 110:
-         if ((active1 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 80;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 97;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x600000103e0008L, active2, 0xf82000000L, active3, 0x300000600L);
-      case 111:
-         if ((active1 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 115;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x3c0000000000000L, active1, 0x6d000480L, active2, 0x80021602100e080L, active3, 0x800001800L);
-      case 112:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80000400000000L, active2, 0L, active3, 0L);
-      case 113:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L);
-      case 114:
-         if ((active1 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 99;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xc00020000000000L, active1, 0x8000005000001902L, active2, 0xf010000000000000L, active3, 0xc000000L);
-      case 115:
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 44;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 86;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x200000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 116:
-         if ((active0 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 46;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0x400000000000L, active2, 0L, active3, 0x200000L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1000000000000000L, active1, 0x808080000200L, active2, 0x20c00000010003L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2000000000L, active2, 0x43000000000000L, active3, 0L);
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x30L, active2, 0x4000000L, active3, 0L);
-      case 121:
-         if ((active0 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 49;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4010000000000000L, active2, 0x100L, active3, 0x400000L);
-      case 124:
-         if ((active0 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 12;
-            jjmatchedPos = 1;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 1);
-}
-private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 1);
-   }
-   switch(curChar)
-   {
-      case 41:
-         if ((active0 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 22;
-            jjmatchedPos = 2;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x480000000800L, active2, 0x1003000002000e00L, active3, 0x400100004L);
-      case 66:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x3808000000000L, active2, 0L, active3, 0L);
-      case 67:
-         if ((active0 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 45;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 147;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000000L, active1, 0x9000030L, active2, 0x80202004100000L, active3, 0x2008L);
-      case 68:
-         if ((active0 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 43;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 67;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 179;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80001004060000L, active2, 0L, active3, 0x100000200L);
-      case 69:
-         return jjMoveStringLiteralDfa3_0(active0, 0x808000000000000L, active1, 0x5e04002000004000L, active2, 0x6040000000000000L, active3, 0L);
-      case 70:
-         if ((active3 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 196;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x10000000000000L, active3, 0x10000L);
-      case 72:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x60000000000000L, active2, 0x8000000000000004L, active3, 0L);
-      case 74:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
-      case 75:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x800000L, active2, 0L, active3, 0L);
-      case 76:
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 39;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 109;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0xc0000000000000L, active1, 0x100040080000000L, active2, 0x100080400000L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L, active1, 0L, active2, 0xc00000002000L, active3, 0x38e0000L);
-      case 78:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0x2000200L, active2, 0x1400800c038L, active3, 0x800000001L);
-      case 79:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x4010001102L, active2, 0x500010c0L, active3, 0x8000000L);
-      case 80:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x10000000000000L, active2, 0x200000000000000L, active3, 0x200000420L);
-      case 82:
-         if ((active1 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 71;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x8000000000000000L, active2, 0x100000020010000L, active3, 0xf0204000L);
-      case 83:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8004000000000000L, active1, 0x10000080005L, active2, 0xc00008100000000L, active3, 0x4000c0L);
-      case 84:
-         if ((active1 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 93;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 161;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 181;
-            jjmatchedPos = 2;
-         }
-         else if ((active3 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 207;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x2000000400300440L, active2, 0x60c00820103L, active3, 0x100L);
-      case 85:
-         return jjMoveStringLiteralDfa3_0(active0, 0x30000000000000L, active1, 0L, active2, 0x1000000L, active3, 0x4000000L);
-      case 86:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x20000002000L, active2, 0L, active3, 0L);
-      case 87:
-         if ((active3 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 193;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000L, active2, 0L, active3, 0x1800L);
-      case 89:
-         if ((active2 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 146;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 164;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 90:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x100000000000L, active2, 0L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x480000000800L, active2, 0x1003000002000e00L, active3, 0x400100004L);
-      case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x3808000000000L, active2, 0L, active3, 0L);
-      case 99:
-         if ((active0 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 45;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 147;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000000L, active1, 0x9000030L, active2, 0x80202004100000L, active3, 0x2008L);
-      case 100:
-         if ((active0 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 43;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 67;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 179;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80001004060000L, active2, 0L, active3, 0x100000200L);
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x808000000000000L, active1, 0x5e04002000004000L, active2, 0x6040000000000000L, active3, 0L);
-      case 102:
-         if ((active3 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 196;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x10000000000000L, active3, 0x10000L);
-      case 104:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x60000000000000L, active2, 0x8000000000000004L, active3, 0L);
-      case 106:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
-      case 107:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x800000L, active2, 0L, active3, 0L);
-      case 108:
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 39;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 109;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0xc0000000000000L, active1, 0x100040080000000L, active2, 0x100080400000L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L, active1, 0L, active2, 0xc00000002000L, active3, 0x38e0000L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0x2000200L, active2, 0x1400800c038L, active3, 0x800000001L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x4010001102L, active2, 0x500010c0L, active3, 0x8000000L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x10000000000000L, active2, 0x200000000000000L, active3, 0x200000420L);
-      case 114:
-         if ((active1 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 71;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x8000000000000000L, active2, 0x100000020010000L, active3, 0xf0204000L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8004000000000000L, active1, 0x10000080005L, active2, 0xc00008100000000L, active3, 0x4000c0L);
-      case 116:
-         if ((active1 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 93;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 161;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 181;
-            jjmatchedPos = 2;
-         }
-         else if ((active3 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 207;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x2000000400300440L, active2, 0x60c00820103L, active3, 0x100L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x30000000000000L, active1, 0L, active2, 0x1000000L, active3, 0x4000000L);
-      case 118:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x20000002000L, active2, 0L, active3, 0L);
-      case 119:
-         if ((active3 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 193;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000L, active2, 0L, active3, 0x1800L);
-      case 121:
-         if ((active2 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 146;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 164;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 122:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x100000000000L, active2, 0L, active3, 0L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 2);
-}
-private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 2);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 2);
-   }
-   switch(curChar)
-   {
-      case 39:
-         if ((active1 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 92;
-            jjmatchedPos = 3;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4840000000000000L, active1, 0x8081000040000000L, active2, 0x110082018000038L, active3, 0L);
-      case 66:
-         if ((active2 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 134;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 140;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400043000000L, active3, 0L);
-      case 67:
-         if ((active0 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 63;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0x4000000240L, active2, 0x2000000020000000L, active3, 0x30000000L);
-      case 69:
-         if ((active0 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 50;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 66;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 87;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 90;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 108;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 116;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 136;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 145;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 216;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 227;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x410001e0010L, active2, 0x204800c04c00000L, active3, 0x2000000L);
-      case 71:
-         if ((active2 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 166;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0x1L);
-      case 72:
-         if ((active1 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 125;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x400002000L, active2, 0x800020080300000L, active3, 0x204800L);
-      case 75:
-         if ((active1 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 88;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
-      case 76:
-         if ((active1 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 95;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 194;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000000L, active1, 0x2008000000020L, active2, 0x8000000084L, active3, 0x100020L);
-      case 77:
-         if ((active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 72;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000002000L, active3, 0L);
-      case 78:
-         if ((active1 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 114;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 123;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x200000000000000L, active1, 0x4800L, active2, 0L, active3, 0x10000L);
-      case 79:
-         if ((active1 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 85;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20030008000000L, active2, 0x300000000002L, active3, 0x2008L);
-      case 80:
-         if ((active1 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 65;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x100040000000000L, active1, 0L, active2, 0L, active3, 0x8e0000L);
-      case 81:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x40000000000000L, active2, 0L, active3, 0L);
-      case 82:
-         if ((active2 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 137;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 226;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1000482000000000L, active2, 0x43000000010c00L, active3, 0x40000000L);
-      case 83:
-         if ((active3 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 201;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 202;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 204;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 224;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 225;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1430000000000000L, active1, 0x4000000000000000L, active2, 0x400000000000c000L, active3, 0x4000000L);
-      case 84:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000000001L, active2, 0x10100000000L, active3, 0x40L);
-      case 85:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x100000002001000L, active2, 0x40000000000L, active3, 0x180L);
-      case 87:
-         if ((active1 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 121;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x400000000000000L, active2, 0L, active3, 0x8000000L);
-      case 89:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x80000000L);
-      case 95:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400000000000000L, active3, 0x400000L);
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4840000000000000L, active1, 0x8081000040000000L, active2, 0x110082018000038L, active3, 0L);
-      case 98:
-         if ((active2 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 134;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 140;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400043000000L, active3, 0L);
-      case 99:
-         if ((active0 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 63;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0x4000000240L, active2, 0x2000000020000000L, active3, 0x30000000L);
-      case 101:
-         if ((active0 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 50;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 66;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 87;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 90;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 108;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 116;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 136;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 145;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 216;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 227;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x410001e0010L, active2, 0x204800c04c00000L, active3, 0x2000000L);
-      case 103:
-         if ((active2 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 166;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0x1L);
-      case 104:
-         if ((active1 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 125;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x400002000L, active2, 0x800020080300000L, active3, 0x204800L);
-      case 107:
-         if ((active1 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 88;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
-      case 108:
-         if ((active1 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 95;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 194;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000000L, active1, 0x2008000000020L, active2, 0x8000000084L, active3, 0x100020L);
-      case 109:
-         if ((active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 72;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000002000L, active3, 0L);
-      case 110:
-         if ((active1 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 114;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 123;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x200000000000000L, active1, 0x4800L, active2, 0L, active3, 0x10000L);
-      case 111:
-         if ((active1 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 85;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20030008000000L, active2, 0x300000000002L, active3, 0x2008L);
-      case 112:
-         if ((active1 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 65;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x100040000000000L, active1, 0L, active2, 0L, active3, 0x8e0000L);
-      case 113:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x40000000000000L, active2, 0L, active3, 0L);
-      case 114:
-         if ((active2 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 137;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 226;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1000482000000000L, active2, 0x43000000010c00L, active3, 0x40000000L);
-      case 115:
-         if ((active3 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 201;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 202;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 204;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 224;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 225;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1430000000000000L, active1, 0x4000000000000000L, active2, 0x400000000000c000L, active3, 0x4000000L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000000001L, active2, 0x10100000000L, active3, 0x40L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x100000002001000L, active2, 0x40000000000L, active3, 0x180L);
-      case 119:
-         if ((active1 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 121;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x400000000000000L, active2, 0L, active3, 0x8000000L);
-      case 121:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x80000000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 3);
-}
-private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 3);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 3);
-   }
-   switch(curChar)
-   {
-      case 39:
-         if ((active1 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 126;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa5_0(active0, 0x2000000000000000L, active1, 0L, active2, 0x8080008140000400L, active3, 0x40004020L);
-      case 66:
-         if ((active2 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 172;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 67:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000L, active2, 0x7000000000000L, active3, 0L);
-      case 68:
-         if ((active3 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 203;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 69:
-         if ((active0 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 42;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 107;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 113;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 124;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 130;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 157;
-            jjmatchedPos = 4;
-         }
-         else if ((active3 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 192;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x201000000000000L, active1, 0x100004000000000L, active2, 0x4000400000010080L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x400000000L, active3, 0L);
-      case 72:
-         if ((active0 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 58;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 70;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 168;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x30000000L);
-      case 73:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8040000001L, active2, 0x2400000000002001L, active3, 0x88000000L);
-      case 75:
-         if ((active0 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 51;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 76:
-         if ((active2 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 155;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 165;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x22000000000L, active2, 0x300000003000000L, active3, 0x1e0080L);
-      case 77:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x8000000L, active2, 0x1000000000100000L, active3, 0L);
-      case 78:
-         if ((active0 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 47;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 117;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000L, active2, 0x10000080200002L, active3, 0x202000L);
-      case 79:
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0x400000000L, active2, 0x20000000000L, active3, 0x800000L);
-      case 80:
-         if ((active1 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x10L, active2, 0x200004000000L, active3, 0L);
-      case 82:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 100;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 171;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x180000L, active2, 0x840800800038L, active3, 0x400148L);
-      case 83:
-         if ((active1 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 89;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 122;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x800L, active3, 0x2000000L);
-      case 84:
-         if ((active1 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 75;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 110;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 156;
-            jjmatchedPos = 4;
-         }
-         else if ((active3 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 218;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x830020000000000L, active1, 0x80000000004200L, active2, 0x80000000040c000L, active3, 0x10000L);
-      case 85:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4040000000000000L, active1, 0x41010000000020L, active2, 0L, active3, 0L);
-      case 88:
-         if ((active1 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 81;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000L, active2, 0L, active3, 0L);
-      case 89:
-         if ((active1 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 127;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0x2000000000000000L, active1, 0L, active2, 0x8080008140000400L, active3, 0x40004020L);
-      case 98:
-         if ((active2 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 172;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000L, active2, 0x7000000000000L, active3, 0L);
-      case 100:
-         if ((active3 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 203;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 101:
-         if ((active0 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 42;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 107;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 113;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 124;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 130;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 157;
-            jjmatchedPos = 4;
-         }
-         else if ((active3 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 192;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x201000000000000L, active1, 0x100004000000000L, active2, 0x4000400000010080L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x400000000L, active3, 0L);
-      case 104:
-         if ((active0 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 58;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 70;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 168;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x30000000L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8040000001L, active2, 0x2400000000002001L, active3, 0x88000000L);
-      case 107:
-         if ((active0 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 51;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 108:
-         if ((active2 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 155;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 165;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x22000000000L, active2, 0x300000003000000L, active3, 0x1e0080L);
-      case 109:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x8000000L, active2, 0x1000000000100000L, active3, 0L);
-      case 110:
-         if ((active0 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 47;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 117;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000L, active2, 0x10000080200002L, active3, 0x202000L);
-      case 111:
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0x400000000L, active2, 0x20000000000L, active3, 0x800000L);
-      case 112:
-         if ((active1 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x10L, active2, 0x200004000000L, active3, 0L);
-      case 114:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 100;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 171;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x180000L, active2, 0x840800800038L, active3, 0x400148L);
-      case 115:
-         if ((active1 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 89;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 122;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x800L, active3, 0x2000000L);
-      case 116:
-         if ((active1 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 75;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 110;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 156;
-            jjmatchedPos = 4;
-         }
-         else if ((active3 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 218;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x830020000000000L, active1, 0x80000000004200L, active2, 0x80000000040c000L, active3, 0x10000L);
-      case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4040000000000000L, active1, 0x41010000000020L, active2, 0L, active3, 0L);
-      case 120:
-         if ((active1 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 81;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000L, active2, 0L, active3, 0L);
-      case 121:
-         if ((active1 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 127;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 4);
-}
-private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 4);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 4);
-   }
-   switch(curChar)
-   {
-      case 65:
-         if ((active2 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 188;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000000L, active2, 0x40000104080L, active3, 0x30000000L);
-      case 66:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L);
-      case 67:
-         if ((active1 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 103;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000000L, active1, 0L, active2, 0x400L, active3, 0x20L);
-      case 68:
-         if ((active2 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 128;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 195;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 205;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 219;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
-      case 69:
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 59;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 105;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 118;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 119;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 150;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 152;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 153;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 159;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x131000000000000L, active1, 0x40000L, active2, 0x400200800L, active3, 0x4e0000L);
-      case 71:
-         if ((active1 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 77;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 213;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
-      case 72:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x3000000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4200L, active2, 0xa10800000000000L, active3, 0x100040L);
-      case 76:
-         if ((active2 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 158;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x140000000000000L, active3, 0x4000L);
-      case 77:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
-      case 78:
-         if ((active1 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 98;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 200;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x1L, active2, 0x400020100010000L, active3, 0x80000000L);
-      case 79:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
-      case 80:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800008000000L, active2, 0L, active3, 0L);
-      case 82:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 60;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 174;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0x10000000000L, active2, 0xc000000000008000L, active3, 0x800000L);
-      case 83:
-         if ((active1 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 120;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x100020L, active2, 0x2000000000000000L, active3, 0L);
-      case 84:
-         if ((active1 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 83;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 94;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 106;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 141;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 178;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x40000000000000L, active1, 0x1000000000010L, active2, 0x4000000L, active3, 0x2000080L);
-      case 86:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
-      case 89:
-         if ((active2 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 173;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 222;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x10000L);
-      case 97:
-         if ((active2 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 188;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000000L, active2, 0x40000104080L, active3, 0x30000000L);
-      case 98:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L);
-      case 99:
-         if ((active1 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 103;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000000L, active1, 0L, active2, 0x400L, active3, 0x20L);
-      case 100:
-         if ((active2 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 128;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 195;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 205;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 219;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
-      case 101:
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 59;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 105;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 118;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 119;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 150;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 152;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 153;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 159;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x131000000000000L, active1, 0x40000L, active2, 0x400200800L, active3, 0x4e0000L);
-      case 103:
-         if ((active1 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 77;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 213;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
-      case 104:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x3000000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4200L, active2, 0xa10800000000000L, active3, 0x100040L);
-      case 108:
-         if ((active2 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 158;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x140000000000000L, active3, 0x4000L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
-      case 110:
-         if ((active1 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 98;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 200;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x1L, active2, 0x400020100010000L, active3, 0x80000000L);
-      case 111:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800008000000L, active2, 0L, active3, 0L);
-      case 114:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 60;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 174;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0x10000000000L, active2, 0xc000000000008000L, active3, 0x800000L);
-      case 115:
-         if ((active1 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 120;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x100020L, active2, 0x2000000000000000L, active3, 0L);
-      case 116:
-         if ((active1 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 83;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 94;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 106;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 141;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 178;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x40000000000000L, active1, 0x1000000000010L, active2, 0x4000000L, active3, 0x2000080L);
-      case 118:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
-      case 121:
-         if ((active2 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 173;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 222;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x10000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 5);
-}
-private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 5);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 5);
-   }
-   switch(curChar)
-   {
-      case 65:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x3020800008000L, active3, 0x2800000L);
-      case 67:
-         if ((active2 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 175;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000001L, active2, 0L, active3, 0x40L);
-      case 69:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 61;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 111;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 183;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 197;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x100000L, active2, 0x100008000000000L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0x400000L);
-      case 71:
-         if ((active3 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 223;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 72:
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 54;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 112;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 73:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x30L, active2, 0x2000000004800000L, active3, 0L);
-      case 76:
-         if ((active2 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 148;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 170;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
-      case 77:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
-      case 78:
-         if ((active0 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 48;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 135;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x200000000004000L, active3, 0x100000L);
-      case 79:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x200L, active2, 0x40000000000000L, active3, 0L);
-      case 80:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x2000000000L, active2, 0L, active3, 0x10000L);
-      case 82:
-         if ((active0 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 53;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 149;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 162;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 221;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000000L, active1, 0x8000000L, active2, 0L, active3, 0x10000000L);
-      case 83:
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 55;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 82;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x100000000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 84:
-         if ((active0 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 57;
-            jjmatchedPos = 6;
-         }
-         else if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 62;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 139;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x400000100010400L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x4800000000000000L, active3, 0L);
-      case 89:
-         if ((active2 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 191;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 90:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 95:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x38L, active3, 0xe0080L);
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x3020800008000L, active3, 0x2800000L);
-      case 99:
-         if ((active2 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 175;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000001L, active2, 0L, active3, 0x40L);
-      case 101:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 61;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 111;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 183;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 197;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x100000L, active2, 0x100008000000000L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0x400000L);
-      case 103:
-         if ((active3 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 223;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 104:
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 54;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 112;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x30L, active2, 0x2000000004800000L, active3, 0L);
-      case 108:
-         if ((active2 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 148;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 170;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
-      case 109:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
-      case 110:
-         if ((active0 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 48;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 135;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x200000000004000L, active3, 0x100000L);
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x200L, active2, 0x40000000000000L, active3, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x2000000000L, active2, 0L, active3, 0x10000L);
-      case 114:
-         if ((active0 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 53;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 149;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 162;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 221;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000000L, active1, 0x8000000L, active2, 0L, active3, 0x10000000L);
-      case 115:
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 55;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 82;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x100000000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 116:
-         if ((active0 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 57;
-            jjmatchedPos = 6;
-         }
-         else if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 62;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 139;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x400000100010400L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x4800000000000000L, active3, 0L);
-      case 121:
-         if ((active2 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 191;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 6);
-}
-private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 6);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 6);
-   }
-   switch(curChar)
-   {
-      case 50:
-         if ((active3 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 220;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0x400080L);
-      case 68:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x20000L);
-      case 69:
-         if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 104;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 187;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 190;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 208;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x8000000L, active2, 0x600000000000400L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x40000L);
-      case 73:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000L, active2, 0x100008020L, active3, 0x80000L);
-      case 76:
-         if ((active2 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 163;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 167;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 169;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x100000000000000L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000000L);
-      case 78:
-         if ((active1 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 73;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10L, active2, 0x2000000004000002L, active3, 0L);
-      case 82:
-         if ((active2 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 177;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000000000L, active2, 0x1000000000000L, active3, 0x800000L);
-      case 83:
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 52;
-            jjmatchedPos = 7;
-         }
-         else if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 56;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 84:
-         if ((active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 64;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 142;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 212;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x40L);
-      case 86:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20L, active2, 0L, active3, 0L);
-      case 87:
-         if ((active2 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 182;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 89:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
-      case 95:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0x400080L);
-      case 100:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x20000L);
-      case 101:
-         if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 104;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 187;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 190;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 208;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x8000000L, active2, 0x600000000000400L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x40000L);
-      case 105:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000L, active2, 0x100008020L, active3, 0x80000L);
-      case 108:
-         if ((active2 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 163;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 167;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 169;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x100000000000000L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000000L);
-      case 110:
-         if ((active1 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 73;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10L, active2, 0x2000000004000002L, active3, 0L);
-      case 114:
-         if ((active2 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 177;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000000000L, active2, 0x1000000000000L, active3, 0x800000L);
-      case 115:
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 52;
-            jjmatchedPos = 7;
-         }
-         else if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 56;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 116:
-         if ((active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 64;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 142;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 212;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x40L);
-      case 118:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20L, active2, 0L, active3, 0L);
-      case 119:
-         if ((active2 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 182;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 121:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 7);
-}
-private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 7);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 7);
-   }
-   switch(curChar)
-   {
-      case 50:
-         if ((active2 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 176;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x100000000L, active3, 0x80L);
-      case 68:
-         if ((active2 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 185;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 69:
-         if ((active1 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 69;
-            jjmatchedPos = 8;
-         }
-         else if ((active1 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active1, 0x4000L, active2, 0L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x400000000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x800000L, active3, 0L);
-      case 76:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
-      case 78:
-         if ((active1 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 68;
-            jjmatchedPos = 8;
-         }
-         else if ((active2 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 189;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x4008020L, active3, 0x80000L);
-      case 79:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
-      case 80:
-         if ((active3 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 217;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 82:
-         if ((active2 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 138;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 83:
-         return jjMoveStringLiteralDfa9_0(active1, 0x8000000L, active2, 0L, active3, 0L);
-      case 84:
-         if ((active1 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 84;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10002L, active3, 0x400000L);
-      case 89:
-         if ((active3 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 215;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 95:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x100000000000000L, active3, 0x4040L);
-      case 97:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x100000000L, active3, 0x80L);
-      case 100:
-         if ((active2 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 185;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 101:
-         if ((active1 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 69;
-            jjmatchedPos = 8;
-         }
-         else if ((active1 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active1, 0x4000L, active2, 0L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x400000000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x800000L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
-      case 110:
-         if ((active1 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 68;
-            jjmatchedPos = 8;
-         }
-         else if ((active2 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 189;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x4008020L, active3, 0x80000L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
-      case 112:
-         if ((active3 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 217;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 114:
-         if ((active2 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 138;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 115:
-         return jjMoveStringLiteralDfa9_0(active1, 0x8000000L, active2, 0L, active3, 0L);
-      case 116:
-         if ((active1 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 84;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10002L, active3, 0x400000L);
-      case 121:
-         if ((active3 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 215;
-            jjmatchedPos = 8;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 8);
-}
-private int jjMoveStringLiteralDfa9_0(long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 8);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 8);
-   }
-   switch(curChar)
-   {
-      case 66:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x100000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x80L);
-      case 68:
-         if ((active1 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 9;
-         }
-         break;
-      case 69:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x500000000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
-      case 82:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x404040L);
-      case 83:
-         if ((active1 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 91;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x810002L, active3, 0L);
-      case 84:
-         if ((active2 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 143;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x20L, active3, 0x80000L);
-      case 85:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
-      case 95:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x4000000L, active3, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x100000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x80L);
-      case 100:
-         if ((active1 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 9;
-         }
-         break;
-      case 101:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x500000000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
-      case 114:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x404040L);
-      case 115:
-         if ((active1 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 91;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x810002L, active3, 0L);
-      case 116:
-         if ((active2 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 143;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x20L, active3, 0x80000L);
-      case 117:
-         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 9);
-}
-private int jjMoveStringLiteralDfa10_0(long old1, long active1, long old2, long active2, long old3, long active3)
-{
-   if (((active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 9);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 9);
-   }
-   switch(curChar)
-   {
-      case 65:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10L, active3, 0x40000L);
-      case 66:
-         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x20000L);
-      case 69:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10020L, active3, 0x84040L);
-      case 72:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x80L);
-      case 73:
-         return jjMoveStringLiteralDfa11_0(active2, 0x4000000L, active3, 0L);
-      case 76:
-         return jjMoveStringLiteralDfa11_0(active2, 0x100000000L, active3, 0L);
-      case 78:
-         return jjMoveStringLiteralDfa11_0(active2, 0x100000000000000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 186;
-            jjmatchedPos = 10;
-         }
-         break;
-      case 83:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x400000L);
-      case 84:
-         return jjMoveStringLiteralDfa11_0(active2, 0x800000L, active3, 0L);
-      case 95:
-         return jjMoveStringLiteralDfa11_0(active2, 0x2L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10L, active3, 0x40000L);
-      case 98:
-         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x20000L);
-      case 101:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10020L, active3, 0x84040L);
-      case 104:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x80L);
-      case 105:
-         return jjMoveStringLiteralDfa11_0(active2, 0x4000000L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa11_0(active2, 0x100000000L, active3, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa11_0(active2, 0x100000000000000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 186;
-            jjmatchedPos = 10;
-         }
-         break;
-      case 115:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x400000L);
-      case 116:
-         return jjMoveStringLiteralDfa11_0(active2, 0x800000L, active3, 0L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 10);
-}
-private int jjMoveStringLiteralDfa11_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 10);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 10);
-   }
-   switch(curChar)
-   {
-      case 65:
-         return jjMoveStringLiteralDfa12_0(active2, 0x100000000000000L, active3, 0L);
-      case 69:
-         if ((active2 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 160;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 199;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 70:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x40L);
-      case 71:
-         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x80000L);
-      case 73:
-         return jjMoveStringLiteralDfa12_0(active2, 0x800000L, active3, 0L);
-      case 76:
-         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x20000L);
-      case 78:
-         if ((active2 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 180;
-            jjmatchedPos = 11;
-         }
-         return jjMoveStringLiteralDfa12_0(active2, 0x4000000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x400000L);
-      case 82:
-         if ((active2 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 144;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 84:
-         if ((active2 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 132;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 210;
-            jjmatchedPos = 11;
-         }
-         return jjMoveStringLiteralDfa12_0(active2, 0x2L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x4000L);
-      case 97:
-         return jjMoveStringLiteralDfa12_0(active2, 0x100000000000000L, active3, 0L);
-      case 101:
-         if ((active2 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 160;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 199;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 102:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x40L);
-      case 103:
-         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x80000L);
-      case 105:
-         return jjMoveStringLiteralDfa12_0(active2, 0x800000L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x20000L);
-      case 110:
-         if ((active2 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 180;
-            jjmatchedPos = 11;
-         }
-         return jjMoveStringLiteralDfa12_0(active2, 0x4000000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x400000L);
-      case 114:
-         if ((active2 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 144;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 116:
-         if ((active2 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 132;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 210;
-            jjmatchedPos = 11;
-         }
-         return jjMoveStringLiteralDfa12_0(active2, 0x2L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x4000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 11);
-}
-private int jjMoveStringLiteralDfa12_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 11);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 11);
-   }
-   switch(curChar)
-   {
-      case 66:
-         return jjMoveStringLiteralDfa13_0(active2, 0x100000000000000L, active3, 0L);
-      case 67:
-         if ((active2 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 151;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 69:
-         if ((active2 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 131;
-            jjmatchedPos = 12;
-         }
-         else if ((active3 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 209;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x80040L);
-      case 73:
-         return jjMoveStringLiteralDfa13_0(active2, 0x4000000L, active3, 0L);
-      case 82:
-         if ((active3 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 214;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x2L, active3, 0L);
-      case 83:
-         return jjMoveStringLiteralDfa13_0(active2, 0L, active3, 0x4000L);
-      case 98:
-         return jjMoveStringLiteralDfa13_0(active2, 0x100000000000000L, active3, 0L);
-      case 99:
-         if ((active2 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 151;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 101:
-         if ((active2 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 131;
-            jjmatchedPos = 12;
-         }
-         else if ((active3 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 209;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x80040L);
-      case 105:
-         return jjMoveStringLiteralDfa13_0(active2, 0x4000000L, active3, 0L);
-      case 114:
-         if ((active3 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 214;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x2L, active3, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa13_0(active2, 0L, active3, 0x4000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 12);
-}
-private int jjMoveStringLiteralDfa13_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 12);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 12);
-   }
-   switch(curChar)
-   {
-      case 65:
-         return jjMoveStringLiteralDfa14_0(active2, 0x2L, active3, 0x4000L);
-      case 76:
-         return jjMoveStringLiteralDfa14_0(active2, 0x100000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 133;
-            jjmatchedPos = 13;
-         }
-         else if ((active3 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 211;
-            jjmatchedPos = 13;
-         }
-         return jjMoveStringLiteralDfa14_0(active2, 0L, active3, 0x40L);
-      case 84:
-         if ((active2 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 154;
-            jjmatchedPos = 13;
-         }
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa14_0(active2, 0x2L, active3, 0x4000L);
-      case 108:
-         return jjMoveStringLiteralDfa14_0(active2, 0x100000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 133;
-            jjmatchedPos = 13;
-         }
-         else if ((active3 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 211;
-            jjmatchedPos = 13;
-         }
-         return jjMoveStringLiteralDfa14_0(active2, 0L, active3, 0x40L);
-      case 116:
-         if ((active2 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 154;
-            jjmatchedPos = 13;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 13);
-}
-private int jjMoveStringLiteralDfa14_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 13);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 13);
-   }
-   switch(curChar)
-   {
-      case 66:
-         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x4000L);
-      case 69:
-         if ((active2 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 184;
-            jjmatchedPos = 14;
-         }
-         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x40L);
-      case 78:
-         return jjMoveStringLiteralDfa15_0(active2, 0x2L, active3, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x4000L);
-      case 101:
-         if ((active2 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 184;
-            jjmatchedPos = 14;
-         }
-         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x40L);
-      case 110:
-         return jjMoveStringLiteralDfa15_0(active2, 0x2L, active3, 0L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 14);
-}
-private int jjMoveStringLiteralDfa15_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 14);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 14);
-   }
-   switch(curChar)
-   {
-      case 76:
-         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x4000L);
-      case 78:
-         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x40L);
-      case 83:
-         return jjMoveStringLiteralDfa16_0(active2, 0x2L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x4000L);
-      case 110:
-         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x40L);
-      case 115:
-         return jjMoveStringLiteralDfa16_0(active2, 0x2L, active3, 0L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 15);
-}
-private int jjMoveStringLiteralDfa16_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 15);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 15);
-   }
-   switch(curChar)
-   {
-      case 65:
-         return jjMoveStringLiteralDfa17_0(active2, 0x2L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa17_0(active2, 0L, active3, 0x40L);
-      case 69:
-         if ((active3 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 206;
-            jjmatchedPos = 16;
-         }
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa17_0(active2, 0x2L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa17_0(active2, 0L, active3, 0x40L);
-      case 101:
-         if ((active3 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 206;
-            jjmatchedPos = 16;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 16);
-}
-private int jjMoveStringLiteralDfa17_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 16);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 16);
-   }
-   switch(curChar)
-   {
-      case 67:
-         return jjMoveStringLiteralDfa18_0(active2, 0x2L, active3, 0L);
-      case 69:
-         return jjMoveStringLiteralDfa18_0(active2, 0L, active3, 0x40L);
-      case 99:
-         return jjMoveStringLiteralDfa18_0(active2, 0x2L, active3, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa18_0(active2, 0L, active3, 0x40L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 17);
-}
-private int jjMoveStringLiteralDfa18_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 17);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 17);
-   }
-   switch(curChar)
-   {
-      case 83:
-         if ((active3 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 198;
-            jjmatchedPos = 18;
-         }
-         break;
-      case 84:
-         return jjMoveStringLiteralDfa19_0(active2, 0x2L, active3, 0L);
-      case 115:
-         if ((active3 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 198;
-            jjmatchedPos = 18;
-         }
-         break;
-      case 116:
-         return jjMoveStringLiteralDfa19_0(active2, 0x2L, active3, 0L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 18);
-}
-private int jjMoveStringLiteralDfa19_0(long old2, long active2, long old3, long active3)
-{
-   if (((active2 &= old2) | (active3 &= old3)) == 0L)
-      return jjMoveNfa_0(5, 18);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 18);
-   }
-   switch(curChar)
-   {
-      case 73:
-         return jjMoveStringLiteralDfa20_0(active2, 0x2L);
-      case 105:
-         return jjMoveStringLiteralDfa20_0(active2, 0x2L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 19);
-}
-private int jjMoveStringLiteralDfa20_0(long old2, long active2)
-{
-   if (((active2 &= old2)) == 0L)
-      return jjMoveNfa_0(5, 19);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 19);
-   }
-   switch(curChar)
-   {
-      case 79:
-         return jjMoveStringLiteralDfa21_0(active2, 0x2L);
-      case 111:
-         return jjMoveStringLiteralDfa21_0(active2, 0x2L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 20);
-}
-private int jjMoveStringLiteralDfa21_0(long old2, long active2)
-{
-   if (((active2 &= old2)) == 0L)
-      return jjMoveNfa_0(5, 20);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 20);
-   }
-   switch(curChar)
-   {
-      case 78:
-         if ((active2 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 129;
-            jjmatchedPos = 21;
-         }
-         break;
-      case 110:
-         if ((active2 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 129;
-            jjmatchedPos = 21;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 21);
-}
+public class DDLParserTokenManager implements DDLParserConstants
+{
+
+  /** Debug output. */
+  public  java.io.PrintStream debugStream = System.out;
+  /** Set debug output. */
+  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private int jjStopAtPos(int pos, int kind)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   return pos + 1;
+}
+private int jjMoveStringLiteralDfa0_0()
+{
+   switch(curChar)
+   {
+      case 9:
+         jjmatchedKind = 2;
+         return jjMoveNfa_0(5, 0);
+      case 10:
+         jjmatchedKind = 3;
+         return jjMoveNfa_0(5, 0);
+      case 12:
+         jjmatchedKind = 5;
+         return jjMoveNfa_0(5, 0);
+      case 13:
+         jjmatchedKind = 4;
+         return jjMoveNfa_0(5, 0);
+      case 32:
+         jjmatchedKind = 1;
+         return jjMoveNfa_0(5, 0);
+      case 33:
+         return jjMoveStringLiteralDfa1_0(0x8000000L, 0x0L, 0x0L, 0x0L);
+      case 35:
+         jjmatchedKind = 30;
+         return jjMoveNfa_0(5, 0);
+      case 36:
+         jjmatchedKind = 17;
+         return jjMoveNfa_0(5, 0);
+      case 37:
+         jjmatchedKind = 18;
+         return jjMoveStringLiteralDfa1_0(0x60000000000L, 0x0L, 0x0L, 0x0L);
+      case 39:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000000010000000L, 0x0L, 0x0L);
+      case 40:
+         jjmatchedKind = 28;
+         return jjMoveStringLiteralDfa1_0(0x400000L, 0x0L, 0x0L, 0x0L);
+      case 41:
+         jjmatchedKind = 11;
+         return jjMoveNfa_0(5, 0);
+      case 42:
+         jjmatchedKind = 9;
+         return jjMoveNfa_0(5, 0);
+      case 43:
+         jjmatchedKind = 29;
+         return jjMoveNfa_0(5, 0);
+      case 44:
+         jjmatchedKind = 14;
+         return jjMoveNfa_0(5, 0);
+      case 45:
+         jjmatchedKind = 25;
+         return jjMoveNfa_0(5, 0);
+      case 46:
+         jjmatchedKind = 15;
+         return jjMoveStringLiteralDfa1_0(0x10000L, 0x0L, 0x0L, 0x0L);
+      case 47:
+         jjmatchedKind = 33;
+         return jjMoveNfa_0(5, 0);
+      case 58:
+         jjmatchedKind = 13;
+         return jjMoveStringLiteralDfa1_0(0x100L, 0x0L, 0x0L, 0x0L);
+      case 59:
+         jjmatchedKind = 32;
+         return jjMoveNfa_0(5, 0);
+      case 60:
+         jjmatchedKind = 23;
+         return jjMoveStringLiteralDfa1_0(0x5000000L, 0x0L, 0x0L, 0x0L);
+      case 61:
+         jjmatchedKind = 19;
+         return jjMoveNfa_0(5, 0);
+      case 62:
+         jjmatchedKind = 20;
+         return jjMoveStringLiteralDfa1_0(0x200000L, 0x0L, 0x0L, 0x0L);
+      case 63:
+         jjmatchedKind = 31;
+         return jjMoveNfa_0(5, 0);
+      case 64:
+         jjmatchedKind = 10;
+         return jjMoveNfa_0(5, 0);
+      case 65:
+         return jjMoveStringLiteralDfa1_0(0x798000000000L, 0x8000000000000000L, 0x3L, 0x0L);
+      case 66:
+         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
+      case 67:
+         return jjMoveStringLiteralDfa1_0(0x1ffc000000000000L, 0x0L, 0x1fe00L, 0x0L);
+      case 68:
+         return jjMoveStringLiteralDfa1_0(0xe000000000000000L, 0x3L, 0x1fe0000L, 0x0L);
+      case 69:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3cL, 0x6000000L, 0x0L);
+      case 70:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3c0L, 0x38000000L, 0x0L);
+      case 71:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00L, 0x40000000L, 0x0L);
+      case 72:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000L, 0x0L, 0x0L);
+      case 73:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7fc000L, 0xf80000000L, 0x0L);
+      case 75:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x1000000000L, 0x0L);
+      case 76:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1800000L, 0x6000000000L, 0x0L);
+      case 77:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x18000000000L, 0x0L);
+      case 78:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xe8000000L, 0x3fe0000000000L, 0x0L);
+      case 79:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000L, 0x7c000000000000L, 0x0L);
+      case 80:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xc000000000L, 0xff80000000000000L, 0x0L);
+      case 82:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x30000000000L, 0x0L, 0x1fffL);
+      case 83:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xfc0000000000L, 0x0L, 0x7fe000L);
+      case 84:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1f000000000000L, 0x0L, 0x7800000L);
+      case 85:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xe0000000000000L, 0x0L, 0x8000000L);
+      case 86:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x700000000000000L, 0x0L, 0xf0000000L);
+      case 87:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3800000000000000L, 0x0L, 0x300000000L);
+      case 89:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000000L);
+      case 90:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000000L);
+      case 97:
+         return jjMoveStringLiteralDfa1_0(0x798000000000L, 0x8000000000000000L, 0x3L, 0x0L);
+      case 98:
+         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
+      case 99:
+         return jjMoveStringLiteralDfa1_0(0x1ffc000000000000L, 0x0L, 0x1fe00L, 0x0L);
+      case 100:
+         return jjMoveStringLiteralDfa1_0(0xe000000000000000L, 0x3L, 0x1fe0000L, 0x0L);
+      case 101:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3cL, 0x6000000L, 0x0L);
+      case 102:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3c0L, 0x38000000L, 0x0L);
+      case 103:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00L, 0x40000000L, 0x0L);
+      case 104:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000L, 0x0L, 0x0L);
+      case 105:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7fc000L, 0xf80000000L, 0x0L);
+      case 107:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x1000000000L, 0x0L);
+      case 108:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1800000L, 0x6000000000L, 0x0L);
+      case 109:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x18000000000L, 0x0L);
+      case 110:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xe8000000L, 0x3fe0000000000L, 0x0L);
+      case 111:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000L, 0x7c000000000000L, 0x0L);
+      case 112:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xc000000000L, 0xff80000000000000L, 0x0L);
+      case 114:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x30000000000L, 0x0L, 0x1fffL);
+      case 115:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xfc0000000000L, 0x0L, 0x7fe000L);
+      case 116:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1f000000000000L, 0x0L, 0x7800000L);
+      case 117:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xe0000000000000L, 0x0L, 0x8000000L);
+      case 118:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x700000000000000L, 0x0L, 0xf0000000L);
+      case 119:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3800000000000000L, 0x0L, 0x300000000L);
+      case 121:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000000L);
+      case 122:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000000L);
+      case 124:
+         return jjMoveStringLiteralDfa1_0(0x1000L, 0x0L, 0x0L, 0x0L);
+      case 126:
+         jjmatchedKind = 34;
+         return jjMoveNfa_0(5, 0);
+      default :
+         return jjMoveNfa_0(5, 0);
+   }
+}
+private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2, long active3)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 0);
+   }
+   switch(curChar)
+   {
+      case 43:
+         return jjMoveStringLiteralDfa2_0(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L);
+      case 46:
+         if ((active0 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 16;
+            jjmatchedPos = 1;
+         }
+         break;
+      case 61:
+         if ((active0 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 8;
+            jjmatchedPos = 1;
+         }
+         else if ((active0 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 21;
+            jjmatchedPos = 1;
+         }
+         else if ((active0 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 24;
+            jjmatchedPos = 1;
+         }
+         else if ((active0 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 27;
+            jjmatchedPos = 1;
+         }
+         break;
+      case 62:
+         if ((active0 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 26;
+            jjmatchedPos = 1;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0x103000000002000L, active2, 0x180060000060000L, active3, 0xf0000003L);
+      case 66:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
+      case 67:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x180000000000L, active3, 0L);
+      case 68:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0L);
+      case 69:
+         return jjMoveStringLiteralDfa2_0(active0, 0xe001800000000000L, active1, 0x70000000040L, active2, 0x1000f80000L, active3, 0x40080e1fcL);
+      case 70:
+         if ((active1 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 79;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 96;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
+      case 72:
+         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0x1804080000000000L, active2, 0xe00L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2600100002800001L, active2, 0x208000008000038L, active3, 0x30f0000L);
+      case 76:
+         return jjMoveStringLiteralDfa2_0(active0, 0x30018000000000L, active1, 0x4L, active2, 0x400008050001040L, active3, 0L);
+      case 77:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000L);
+      case 78:
+         if ((active1 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 80;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 97;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x600000103e0008L, active2, 0xf82000000L, active3, 0x300000600L);
+      case 79:
+         if ((active1 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 115;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x3c0000000000000L, active1, 0x6d000480L, active2, 0x80021602100e080L, active3, 0x800001800L);
+      case 80:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80000400000000L, active2, 0L, active3, 0L);
+      case 81:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L);
+      case 82:
+         if ((active1 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 99;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0xc00020000000000L, active1, 0x8000005000001902L, active2, 0xf010000000000000L, active3, 0xc000000L);
+      case 83:
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 44;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 86;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x200000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 84:
+         if ((active0 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 46;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0x400000000000L, active2, 0L, active3, 0x200000L);
+      case 85:
+         return jjMoveStringLiteralDfa2_0(active0, 0x1000000000000000L, active1, 0x808080000200L, active2, 0x20c00000010003L, active3, 0L);
+      case 86:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2000000000L, active2, 0x43000000000000L, active3, 0L);
+      case 88:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x30L, active2, 0x4000000L, active3, 0L);
+      case 89:
+         if ((active0 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 49;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4010000000000000L, active2, 0x100L, active3, 0x400000L);
+      case 97:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0x103000000002000L, active2, 0x180060000060000L, active3, 0xf0000003L);
+      case 98:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
+      case 99:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x180000000000L, active3, 0L);
+      case 100:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0L);
+      case 101:
+         return jjMoveStringLiteralDfa2_0(active0, 0xe001800000000000L, active1, 0x70000000040L, active2, 0x1000f80000L, active3, 0x40080e1fcL);
+      case 102:
+         if ((active1 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 79;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 96;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
+      case 104:
+         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0x1804080000000000L, active2, 0xe00L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2600100002800001L, active2, 0x208000008000038L, active3, 0x30f0000L);
+      case 108:
+         return jjMoveStringLiteralDfa2_0(active0, 0x30018000000000L, active1, 0x4L, active2, 0x400008050001040L, active3, 0L);
+      case 109:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000L);
+      case 110:
+         if ((active1 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 80;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 97;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x600000103e0008L, active2, 0xf82000000L, active3, 0x300000600L);
+      case 111:
+         if ((active1 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 115;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x3c0000000000000L, active1, 0x6d000480L, active2, 0x80021602100e080L, active3, 0x800001800L);
+      case 112:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80000400000000L, active2, 0L, active3, 0L);
+      case 113:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L);
+      case 114:
+         if ((active1 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 99;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0xc00020000000000L, active1, 0x8000005000001902L, active2, 0xf010000000000000L, active3, 0xc000000L);
+      case 115:
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 44;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 86;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x200000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 116:
+         if ((active0 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 46;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0x400000000000L, active2, 0L, active3, 0x200000L);
+      case 117:
+         return jjMoveStringLiteralDfa2_0(active0, 0x1000000000000000L, active1, 0x808080000200L, active2, 0x20c00000010003L, active3, 0L);
+      case 118:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2000000000L, active2, 0x43000000000000L, active3, 0L);
+      case 120:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x30L, active2, 0x4000000L, active3, 0L);
+      case 121:
+         if ((active0 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 49;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4010000000000000L, active2, 0x100L, active3, 0x400000L);
+      case 124:
+         if ((active0 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 12;
+            jjmatchedPos = 1;
+         }
+         break;
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 1);
+}
+private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 1);
+   }
+   switch(curChar)
+   {
+      case 41:
+         if ((active0 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 22;
+            jjmatchedPos = 2;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x480000000800L, active2, 0x1003000002000e00L, active3, 0x400100004L);
+      case 66:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x3808000000000L, active2, 0L, active3, 0L);
+      case 67:
+         if ((active0 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 45;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 147;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000000L, active1, 0x9000030L, active2, 0x80202004100000L, active3, 0x2008L);
+      case 68:
+         if ((active0 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 43;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 67;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 179;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80001004060000L, active2, 0L, active3, 0x100000200L);
+      case 69:
+         return jjMoveStringLiteralDfa3_0(active0, 0x808000000000000L, active1, 0x5e04002000004000L, active2, 0x6040000000000000L, active3, 0L);
+      case 70:
+         if ((active3 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 196;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 71:
+         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x10000000000000L, active3, 0x10000L);
+      case 72:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x60000000000000L, active2, 0x8000000000000004L, active3, 0L);
+      case 74:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
+      case 75:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x800000L, active2, 0L, active3, 0L);
+      case 76:
+         if ((active0 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 39;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 109;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0xc0000000000000L, active1, 0x100040080000000L, active2, 0x100080400000L, active3, 0L);
+      case 77:
+         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L, active1, 0L, active2, 0xc00000002000L, active3, 0x38e0000L);
+      case 78:
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0x2000200L, active2, 0x1400800c038L, active3, 0x800000001L);
+      case 79:
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x4010001102L, active2, 0x500010c0L, active3, 0x8000000L);
+      case 80:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x10000000000000L, active2, 0x200000000000000L, active3, 0x200000420L);
+      case 82:
+         if ((active1 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 71;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x8000000000000000L, active2, 0x100000020010000L, active3, 0xf0204000L);
+      case 83:
+         return jjMoveStringLiteralDfa3_0(active0, 0x8004000000000000L, active1, 0x10000080005L, active2, 0xc00008100000000L, active3, 0x4000c0L);
+      case 84:
+         if ((active1 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 93;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 161;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 181;
+            jjmatchedPos = 2;
+         }
+         else if ((active3 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 207;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x2000000400300440L, active2, 0x60c00820103L, active3, 0x100L);
+      case 85:
+         return jjMoveStringLiteralDfa3_0(active0, 0x30000000000000L, active1, 0L, active2, 0x1000000L, active3, 0x4000000L);
+      case 86:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x20000002000L, active2, 0L, active3, 0L);
+      case 87:
+         if ((active3 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 193;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000L, active2, 0L, active3, 0x1800L);
+      case 89:
+         if ((active2 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 146;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 164;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 90:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x100000000000L, active2, 0L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x480000000800L, active2, 0x1003000002000e00L, active3, 0x400100004L);
+      case 98:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x3808000000000L, active2, 0L, active3, 0L);
+      case 99:
+         if ((active0 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 45;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 147;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000000L, active1, 0x9000030L, active2, 0x80202004100000L, active3, 0x2008L);
+      case 100:
+         if ((active0 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 43;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 67;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 179;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80001004060000L, active2, 0L, active3, 0x100000200L);
+      case 101:
+         return jjMoveStringLiteralDfa3_0(active0, 0x808000000000000L, active1, 0x5e04002000004000L, active2, 0x6040000000000000L, active3, 0L);
+      case 102:
+         if ((active3 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 196;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 103:
+         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x10000000000000L, active3, 0x10000L);
+      case 104:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x60000000000000L, active2, 0x8000000000000004L, active3, 0L);
+      case 106:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
+      case 107:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x800000L, active2, 0L, active3, 0L);
+      case 108:
+         if ((active0 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 39;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 109;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0xc0000000000000L, active1, 0x100040080000000L, active2, 0x100080400000L, active3, 0L);
+      case 109:
+         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L, active1, 0L, active2, 0xc00000002000L, active3, 0x38e0000L);
+      case 110:
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0x2000200L, active2, 0x1400800c038L, active3, 0x800000001L);
+      case 111:
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x4010001102L, active2, 0x500010c0L, active3, 0x8000000L);
+      case 112:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x10000000000000L, active2, 0x200000000000000L, active3, 0x200000420L);
+      case 114:
+         if ((active1 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 71;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x8000000000000000L, active2, 0x100000020010000L, active3, 0xf0204000L);
+      case 115:
+         return jjMoveStringLiteralDfa3_0(active0, 0x8004000000000000L, active1, 0x10000080005L, active2, 0xc00008100000000L, active3, 0x4000c0L);
+      case 116:
+         if ((active1 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 93;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 161;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 181;
+            jjmatchedPos = 2;
+         }
+         else if ((active3 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 207;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x2000000400300440L, active2, 0x60c00820103L, active3, 0x100L);
+      case 117:
+         return jjMoveStringLiteralDfa3_0(active0, 0x30000000000000L, active1, 0L, active2, 0x1000000L, active3, 0x4000000L);
+      case 118:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x20000002000L, active2, 0L, active3, 0L);
+      case 119:
+         if ((active3 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 193;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000L, active2, 0L, active3, 0x1800L);
+      case 121:
+         if ((active2 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 146;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 164;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 122:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x100000000000L, active2, 0L, active3, 0L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 2);
+}
+private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 2);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 2);
+   }
+   switch(curChar)
+   {
+      case 39:
+         if ((active1 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 92;
+            jjmatchedPos = 3;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa4_0(active0, 0x4840000000000000L, active1, 0x8081000040000000L, active2, 0x110082018000038L, active3, 0L);
+      case 66:
+         if ((active2 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 134;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 140;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400043000000L, active3, 0L);
+      case 67:
+         if ((active0 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 63;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0x4000000240L, active2, 0x2000000020000000L, active3, 0x30000000L);
+      case 69:
+         if ((active0 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 50;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 66;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 87;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 108;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 116;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 136;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 145;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 216;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 227;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x410001e0010L, active2, 0x204800c04c00000L, active3, 0x2000000L);
+      case 71:
+         if ((active2 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 166;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0x1L);
+      case 72:
+         if ((active1 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 125;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x400002000L, active2, 0x800020080300000L, active3, 0x204800L);
+      case 75:
+         if ((active1 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 88;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
+      case 76:
+         if ((active1 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 95;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 194;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000000L, active1, 0x2008000000020L, active2, 0x8000000084L, active3, 0x100020L);
+      case 77:
+         if ((active1 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000002000L, active3, 0L);
+      case 78:
+         if ((active1 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 114;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 123;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x200000000000000L, active1, 0x4800L, active2, 0L, active3, 0x10000L);
+      case 79:
+         if ((active1 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 74;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 85;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20030008000000L, active2, 0x300000000002L, active3, 0x2008L);
+      case 80:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 65;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x100040000000000L, active1, 0L, active2, 0L, active3, 0x8e0000L);
+      case 81:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x40000000000000L, active2, 0L, active3, 0L);
+      case 82:
+         if ((active2 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 137;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 226;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1000482000000000L, active2, 0x43000000010c00L, active3, 0x40000000L);
+      case 83:
+         if ((active3 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 201;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 202;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 204;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 224;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 225;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x1430000000000000L, active1, 0x4000000000000000L, active2, 0x400000000000c000L, active3, 0x4000000L);
+      case 84:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000000001L, active2, 0x10100000000L, active3, 0x40L);
+      case 85:
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x100000002001000L, active2, 0x40000000000L, active3, 0x180L);
+      case 87:
+         if ((active1 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 121;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x400000000000000L, active2, 0L, active3, 0x8000000L);
+      case 89:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x80000000L);
+      case 95:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400000000000000L, active3, 0x400000L);
+      case 97:
+         return jjMoveStringLiteralDfa4_0(active0, 0x4840000000000000L, active1, 0x8081000040000000L, active2, 0x110082018000038L, active3, 0L);
+      case 98:
+         if ((active2 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 134;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 140;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400043000000L, active3, 0L);
+      case 99:
+         if ((active0 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 63;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0x4000000240L, active2, 0x2000000020000000L, active3, 0x30000000L);
+      case 101:
+         if ((active0 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 50;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 66;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 87;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 108;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 116;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 136;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 145;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 216;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 227;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x410001e0010L, active2, 0x204800c04c00000L, active3, 0x2000000L);
+      case 103:
+         if ((active2 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 166;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0x1L);
+      case 104:
+         if ((active1 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 125;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x400002000L, active2, 0x800020080300000L, active3, 0x204800L);
+      case 107:
+         if ((active1 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 88;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
+      case 108:
+         if ((active1 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 95;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 194;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000000L, active1, 0x2008000000020L, active2, 0x8000000084L, active3, 0x100020L);
+      case 109:
+         if ((active1 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000002000L, active3, 0L);
+      case 110:
+         if ((active1 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 114;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 123;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x200000000000000L, active1, 0x4800L, active2, 0L, active3, 0x10000L);
+      case 111:
+         if ((active1 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 74;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 85;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20030008000000L, active2, 0x300000000002L, active3, 0x2008L);
+      case 112:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 65;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x100040000000000L, active1, 0L, active2, 0L, active3, 0x8e0000L);
+      case 113:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x40000000000000L, active2, 0L, active3, 0L);
+      case 114:
+         if ((active2 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 137;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 226;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1000482000000000L, active2, 0x43000000010c00L, active3, 0x40000000L);
+      case 115:
+         if ((active3 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 201;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 202;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 204;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 224;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 225;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x1430000000000000L, active1, 0x4000000000000000L, active2, 0x400000000000c000L, active3, 0x4000000L);
+      case 116:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000000001L, active2, 0x10100000000L, active3, 0x40L);
+      case 117:
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x100000002001000L, active2, 0x40000000000L, active3, 0x180L);
+      case 119:
+         if ((active1 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 121;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x400000000000000L, active2, 0L, active3, 0x8000000L);
+      case 121:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x80000000L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 3);
+}
+private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 3);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 3);
+   }
+   switch(curChar)
+   {
+      case 39:
+         if ((active1 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 126;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa5_0(active0, 0x2000000000000000L, active1, 0L, active2, 0x8080008140000400L, active3, 0x40004020L);
+      case 66:
+         if ((active2 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 172;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 67:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000L, active2, 0x7000000000000L, active3, 0L);
+      case 68:
+         if ((active3 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 203;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 69:
+         if ((active0 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 42;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 107;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 113;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 124;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 130;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 157;
+            jjmatchedPos = 4;
+         }
+         else if ((active3 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 192;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x201000000000000L, active1, 0x100004000000000L, active2, 0x4000400000010080L, active3, 0L);
+      case 70:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
+      case 71:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x400000000L, active3, 0L);
+      case 72:
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 58;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 70;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 168;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x30000000L);
+      case 73:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8040000001L, active2, 0x2400000000002001L, active3, 0x88000000L);
+      case 75:
+         if ((active0 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 51;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 76:
+         if ((active2 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 155;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 165;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x22000000000L, active2, 0x300000003000000L, active3, 0x1e0080L);
+      case 77:
+         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x8000000L, active2, 0x1000000000100000L, active3, 0L);
+      case 78:
+         if ((active0 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 47;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 117;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000L, active2, 0x10000080200002L, active3, 0x202000L);
+      case 79:
+         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0x400000000L, active2, 0x20000000000L, active3, 0x800000L);
+      case 80:
+         if ((active1 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 76;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x10L, active2, 0x200004000000L, active3, 0L);
+      case 82:
+         if ((active0 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 40;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 100;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 171;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x180000L, active2, 0x840800800038L, active3, 0x400148L);
+      case 83:
+         if ((active1 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 89;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 122;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x800L, active3, 0x2000000L);
+      case 84:
+         if ((active1 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 75;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 110;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 156;
+            jjmatchedPos = 4;
+         }
+         else if ((active3 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 218;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x830020000000000L, active1, 0x80000000004200L, active2, 0x80000000040c000L, active3, 0x10000L);
+      case 85:
+         return jjMoveStringLiteralDfa5_0(active0, 0x4040000000000000L, active1, 0x41010000000020L, active2, 0L, active3, 0L);
+      case 88:
+         if ((active1 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 81;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000L, active2, 0L, active3, 0L);
+      case 89:
+         if ((active1 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 127;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa5_0(active0, 0x2000000000000000L, active1, 0L, active2, 0x8080008140000400L, active3, 0x40004020L);
+      case 98:
+         if ((active2 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 172;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 99:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000L, active2, 0x7000000000000L, active3, 0L);
+      case 100:
+         if ((active3 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 203;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 101:
+         if ((active0 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 42;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 107;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 113;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 124;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 130;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 157;
+            jjmatchedPos = 4;
+         }
+         else if ((active3 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 192;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x201000000000000L, active1, 0x100004000000000L, active2, 0x4000400000010080L, active3, 0L);
+      case 102:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
+      case 103:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x400000000L, active3, 0L);
+      case 104:
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 58;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 70;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 168;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x30000000L);
+      case 105:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8040000001L, active2, 0x2400000000002001L, active3, 0x88000000L);
+      case 107:
+         if ((active0 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 51;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 108:
+         if ((active2 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 155;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 165;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x22000000000L, active2, 0x300000003000000L, active3, 0x1e0080L);
+      case 109:
+         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x8000000L, active2, 0x1000000000100000L, active3, 0L);
+      case 110:
+         if ((active0 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 47;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 117;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000L, active2, 0x10000080200002L, active3, 0x202000L);
+      case 111:
+         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0x400000000L, active2, 0x20000000000L, active3, 0x800000L);
+      case 112:
+         if ((active1 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 76;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x10L, active2, 0x200004000000L, active3, 0L);
+      case 114:
+         if ((active0 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 40;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 100;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 171;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x180000L, active2, 0x840800800038L, active3, 0x400148L);
+      case 115:
+         if ((active1 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 89;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 122;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x800L, active3, 0x2000000L);
+      case 116:
+         if ((active1 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 75;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 110;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 156;
+            jjmatchedPos = 4;
+         }
+         else if ((active3 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 218;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x830020000000000L, active1, 0x80000000004200L, active2, 0x80000000040c000L, active3, 0x10000L);
+      case 117:
+         return jjMoveStringLiteralDfa5_0(active0, 0x4040000000000000L, active1, 0x41010000000020L, active2, 0L, active3, 0L);
+      case 120:
+         if ((active1 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 81;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000L, active2, 0L, active3, 0L);
+      case 121:
+         if ((active1 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 127;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 4);
+}
+private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 4);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 4);
+   }
+   switch(curChar)
+   {
+      case 65:
+         if ((active2 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 188;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000000L, active2, 0x40000104080L, active3, 0x30000000L);
+      case 66:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L);
+      case 67:
+         if ((active1 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000000L, active1, 0L, active2, 0x400L, active3, 0x20L);
+      case 68:
+         if ((active2 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 128;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 195;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 205;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 219;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
+      case 69:
+         if ((active0 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 59;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 105;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 118;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 119;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 150;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 152;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 153;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 159;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x131000000000000L, active1, 0x40000L, active2, 0x400200800L, active3, 0x4e0000L);
+      case 71:
+         if ((active1 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 77;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 213;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
+      case 72:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x3000000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4200L, active2, 0xa10800000000000L, active3, 0x100040L);
+      case 76:
+         if ((active2 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 158;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x140000000000000L, active3, 0x4000L);
+      case 77:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
+      case 78:
+         if ((active1 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 98;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 200;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x1L, active2, 0x400020100010000L, active3, 0x80000000L);
+      case 79:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
+      case 80:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800008000000L, active2, 0L, active3, 0L);
+      case 82:
+         if ((active0 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 60;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 174;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0x10000000000L, active2, 0xc000000000008000L, active3, 0x800000L);
+      case 83:
+         if ((active1 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 120;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x100020L, active2, 0x2000000000000000L, active3, 0L);
+      case 84:
+         if ((active1 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 83;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 94;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 106;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 141;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 178;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x40000000000000L, active1, 0x1000000000010L, active2, 0x4000000L, active3, 0x2000080L);
+      case 86:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
+      case 89:
+         if ((active2 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 173;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 222;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x10000L);
+      case 97:
+         if ((active2 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 188;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000000L, active2, 0x40000104080L, active3, 0x30000000L);
+      case 98:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L);
+      case 99:
+         if ((active1 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000000L, active1, 0L, active2, 0x400L, active3, 0x20L);
+      case 100:
+         if ((active2 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 128;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 195;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 205;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 219;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
+      case 101:
+         if ((active0 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 59;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 105;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 118;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 119;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 150;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 152;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 153;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 159;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x131000000000000L, active1, 0x40000L, active2, 0x400200800L, active3, 0x4e0000L);
+      case 103:
+         if ((active1 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 77;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 213;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0L);
+      case 104:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x3000000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4200L, active2, 0xa10800000000000L, active3, 0x100040L);
+      case 108:
+         if ((active2 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 158;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x140000000000000L, active3, 0x4000L);
+      case 109:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
+      case 110:
+         if ((active1 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 98;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 200;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x1L, active2, 0x400020100010000L, active3, 0x80000000L);
+      case 111:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
+      case 112:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800008000000L, active2, 0L, active3, 0L);
+      case 114:
+         if ((active0 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 60;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 174;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0x10000000000L, active2, 0xc000000000008000L, active3, 0x800000L);
+      case 115:
+         if ((active1 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 120;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x100020L, active2, 0x2000000000000000L, active3, 0L);
+      case 116:
+         if ((active1 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 83;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 94;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 106;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 141;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 178;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x40000000000000L, active1, 0x1000000000010L, active2, 0x4000000L, active3, 0x2000080L);
+      case 118:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
+      case 121:
+         if ((active2 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 173;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 222;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x10000L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 5);
+}
+private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 5);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 5);
+   }
+   switch(curChar)
+   {
+      case 65:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x3020800008000L, active3, 0x2800000L);
+      case 67:
+         if ((active2 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 175;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000001L, active2, 0L, active3, 0x40L);
+      case 69:
+         if ((active0 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 61;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 111;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 183;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 197;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x100000L, active2, 0x100008000000000L, active3, 0L);
+      case 70:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0x400000L);
+      case 71:
+         if ((active3 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 223;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 72:
+         if ((active0 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 54;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 112;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 73:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x30L, active2, 0x2000000004800000L, active3, 0L);
+      case 76:
+         if ((active2 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 148;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 170;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
+      case 77:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
+      case 78:
+         if ((active0 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 48;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 135;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x200000000004000L, active3, 0x100000L);
+      case 79:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x200L, active2, 0x40000000000000L, active3, 0L);
+      case 80:
+         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x2000000000L, active2, 0L, active3, 0x10000L);
+      case 82:
+         if ((active0 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 53;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 149;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 162;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 221;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000000L, active1, 0x8000000L, active2, 0L, active3, 0x10000000L);
+      case 83:
+         if ((active0 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 55;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 82;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x100000000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 84:
+         if ((active0 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 57;
+            jjmatchedPos = 6;
+         }
+         else if ((active0 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 139;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x400000100010400L, active3, 0L);
+      case 85:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
+      case 86:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x4800000000000000L, active3, 0L);
+      case 89:
+         if ((active2 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 191;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 90:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 95:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x38L, active3, 0xe0080L);
+      case 97:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x3020800008000L, active3, 0x2800000L);
+      case 99:
+         if ((active2 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 175;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000001L, active2, 0L, active3, 0x40L);
+      case 101:
+         if ((active0 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 61;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 111;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 183;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 197;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x100000L, active2, 0x100008000000000L, active3, 0L);
+      case 102:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000L, active2, 0L, active3, 0x400000L);
+      case 103:
+         if ((active3 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 223;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 104:
+         if ((active0 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 54;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 112;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 105:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x30L, active2, 0x2000000004800000L, active3, 0L);
+      case 108:
+         if ((active2 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 148;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 170;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
+      case 109:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
+      case 110:
+         if ((active0 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 48;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 135;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x200000000004000L, active3, 0x100000L);
+      case 111:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x200L, active2, 0x40000000000000L, active3, 0L);
+      case 112:
+         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x2000000000L, active2, 0L, active3, 0x10000L);
+      case 114:
+         if ((active0 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 53;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 149;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 162;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 221;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000000L, active1, 0x8000000L, active2, 0L, active3, 0x10000000L);
+      case 115:
+         if ((active0 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 55;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 82;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x100000000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 116:
+         if ((active0 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 57;
+            jjmatchedPos = 6;
+         }
+         else if ((active0 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 139;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x400000100010400L, active3, 0L);
+      case 117:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000000000L, active2, 0L, active3, 0L);
+      case 118:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x4800000000000000L, active3, 0L);
+      case 121:
+         if ((active2 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 191;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 122:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 6);
+}
+private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 6);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 6);
+   }
+   switch(curChar)
+   {
+      case 50:
+         if ((active3 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 220;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 67:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0x400080L);
+      case 68:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x20000L);
+      case 69:
+         if ((active0 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 41;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 104;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 187;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 190;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 208;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x8000000L, active2, 0x600000000000400L, active3, 0L);
+      case 70:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x40000L);
+      case 73:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000L, active2, 0x100008020L, active3, 0x80000L);
+      case 76:
+         if ((active2 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 163;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 167;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 169;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x100000000000000L, active3, 0L);
+      case 77:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000000L);
+      case 78:
+         if ((active1 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 73;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
+      case 79:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10L, active2, 0x2000000004000002L, active3, 0L);
+      case 82:
+         if ((active2 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 177;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000000000L, active2, 0x1000000000000L, active3, 0x800000L);
+      case 83:
+         if ((active0 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 52;
+            jjmatchedPos = 7;
+         }
+         else if ((active0 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 56;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 101;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 84:
+         if ((active1 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 64;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 142;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 212;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x40L);
+      case 86:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20L, active2, 0L, active3, 0L);
+      case 87:
+         if ((active2 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 182;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 89:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
+      case 95:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 99:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0x400080L);
+      case 100:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x20000L);
+      case 101:
+         if ((active0 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 41;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 104;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 187;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 190;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 208;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x8000000L, active2, 0x600000000000400L, active3, 0L);
+      case 102:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x40000L);
+      case 105:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000L, active2, 0x100008020L, active3, 0x80000L);
+      case 108:
+         if ((active2 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 163;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 167;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 169;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x100000000000000L, active3, 0L);
+      case 109:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000000L);
+      case 110:
+         if ((active1 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 73;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x800000L, active3, 0L);
+      case 111:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10L, active2, 0x2000000004000002L, active3, 0L);
+      case 114:
+         if ((active2 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 177;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4000000000L, active2, 0x1000000000000L, active3, 0x800000L);
+      case 115:
+         if ((active0 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 52;
+            jjmatchedPos = 7;
+         }
+         else if ((active0 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 56;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 101;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 116:
+         if ((active1 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 64;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 142;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 212;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x40L);
+      case 118:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20L, active2, 0L, active3, 0L);
+      case 119:
+         if ((active2 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 182;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 121:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 7);
+}
+private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 7);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 7);
+   }
+   switch(curChar)
+   {
+      case 50:
+         if ((active2 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 176;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x100000000L, active3, 0x80L);
+      case 68:
+         if ((active2 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 185;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 69:
+         if ((active1 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 69;
+            jjmatchedPos = 8;
+         }
+         else if ((active1 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 102;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active1, 0x4000L, active2, 0L, active3, 0L);
+      case 71:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x400000000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x800000L, active3, 0L);
+      case 76:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
+      case 78:
+         if ((active1 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 68;
+            jjmatchedPos = 8;
+         }
+         else if ((active2 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 189;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x4008020L, active3, 0x80000L);
+      case 79:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
+      case 80:
+         if ((active3 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 217;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 82:
+         if ((active2 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 138;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 83:
+         return jjMoveStringLiteralDfa9_0(active1, 0x8000000L, active2, 0L, active3, 0L);
+      case 84:
+         if ((active1 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 84;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 85:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10002L, active3, 0x400000L);
+      case 89:
+         if ((active3 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 215;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 95:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x100000000000000L, active3, 0x4040L);
+      case 97:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x100000000L, active3, 0x80L);
+      case 100:
+         if ((active2 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 185;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 101:
+         if ((active1 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 69;
+            jjmatchedPos = 8;
+         }
+         else if ((active1 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 102;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active1, 0x4000L, active2, 0L, active3, 0L);
+      case 103:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x400000000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x800000L, active3, 0L);
+      case 108:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
+      case 110:
+         if ((active1 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 68;
+            jjmatchedPos = 8;
+         }
+         else if ((active2 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 189;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x4008020L, active3, 0x80000L);
+      case 111:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
+      case 112:
+         if ((active3 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 217;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 114:
+         if ((active2 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 138;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 115:
+         return jjMoveStringLiteralDfa9_0(active1, 0x8000000L, active2, 0L, active3, 0L);
+      case 116:
+         if ((active1 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 84;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 117:
+         return jjMoveStringLiteralDfa9_0(active1, 0L, active2, 0x10002L, active3, 0x400000L);
+      case 121:
+         if ((active3 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 215;
+            jjmatchedPos = 8;
+         }
+         break;
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 8);
+}
+private int jjMoveStringLiteralDfa9_0(long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 8);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 8);
+   }
+   switch(curChar)
+   {
+      case 66:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x100000000L, active3, 0L);
+      case 67:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x80L);
+      case 68:
+         if ((active1 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 78;
+            jjmatchedPos = 9;
+         }
+         break;
+      case 69:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x500000000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 79:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
+      case 82:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x404040L);
+      case 83:
+         if ((active1 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 91;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x810002L, active3, 0L);
+      case 84:
+         if ((active2 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 143;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x20L, active3, 0x80000L);
+      case 85:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
+      case 95:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x4000000L, active3, 0L);
+      case 98:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x100000000L, active3, 0L);
+      case 99:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x80L);
+      case 100:
+         if ((active1 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 78;
+            jjmatchedPos = 9;
+         }
+         break;
+      case 101:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x500000000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 111:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x10L, active3, 0x40000L);
+      case 114:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0L, active3, 0x404040L);
+      case 115:
+         if ((active1 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 91;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x810002L, active3, 0L);
+      case 116:
+         if ((active2 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 143;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x20L, active3, 0x80000L);
+      case 117:
+         return jjMoveStringLiteralDfa10_0(active1, 0L, active2, 0x8L, active3, 0x20000L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 9);
+}
+private int jjMoveStringLiteralDfa10_0(long old1, long active1, long old2, long active2, long old3, long active3)
+{
+   if (((active1 &= old1) | (active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 9);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 9);
+   }
+   switch(curChar)
+   {
+      case 65:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10L, active3, 0x40000L);
+      case 66:
+         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x20000L);
+      case 69:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10020L, active3, 0x84040L);
+      case 72:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x80L);
+      case 73:
+         return jjMoveStringLiteralDfa11_0(active2, 0x4000000L, active3, 0L);
+      case 76:
+         return jjMoveStringLiteralDfa11_0(active2, 0x100000000L, active3, 0L);
+      case 78:
+         return jjMoveStringLiteralDfa11_0(active2, 0x100000000000000L, active3, 0L);
+      case 79:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
+      case 82:
+         if ((active2 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 186;
+            jjmatchedPos = 10;
+         }
+         break;
+      case 83:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x400000L);
+      case 84:
+         return jjMoveStringLiteralDfa11_0(active2, 0x800000L, active3, 0L);
+      case 95:
+         return jjMoveStringLiteralDfa11_0(active2, 0x2L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10L, active3, 0x40000L);
+      case 98:
+         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x20000L);
+      case 101:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10020L, active3, 0x84040L);
+      case 104:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x80L);
+      case 105:
+         return jjMoveStringLiteralDfa11_0(active2, 0x4000000L, active3, 0L);
+      case 108:
+         return jjMoveStringLiteralDfa11_0(active2, 0x100000000L, active3, 0L);
+      case 110:
+         return jjMoveStringLiteralDfa11_0(active2, 0x100000000000000L, active3, 0L);
+      case 111:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
+      case 114:
+         if ((active2 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 186;
+            jjmatchedPos = 10;
+         }
+         break;
+      case 115:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x400000L);
+      case 116:
+         return jjMoveStringLiteralDfa11_0(active2, 0x800000L, active3, 0L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 10);
+}
+private int jjMoveStringLiteralDfa11_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 10);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 10);
+   }
+   switch(curChar)
+   {
+      case 65:
+         return jjMoveStringLiteralDfa12_0(active2, 0x100000000000000L, active3, 0L);
+      case 69:
+         if ((active2 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 160;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 199;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 70:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x40L);
+      case 71:
+         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x80000L);
+      case 73:
+         return jjMoveStringLiteralDfa12_0(active2, 0x800000L, active3, 0L);
+      case 76:
+         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x20000L);
+      case 78:
+         if ((active2 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 180;
+            jjmatchedPos = 11;
+         }
+         return jjMoveStringLiteralDfa12_0(active2, 0x4000000L, active3, 0L);
+      case 79:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x400000L);
+      case 82:
+         if ((active2 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 144;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 84:
+         if ((active2 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 132;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 210;
+            jjmatchedPos = 11;
+         }
+         return jjMoveStringLiteralDfa12_0(active2, 0x2L, active3, 0L);
+      case 85:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x4000L);
+      case 97:
+         return jjMoveStringLiteralDfa12_0(active2, 0x100000000000000L, active3, 0L);
+      case 101:
+         if ((active2 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 160;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 199;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 102:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x40L);
+      case 103:
+         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x80000L);
+      case 105:
+         return jjMoveStringLiteralDfa12_0(active2, 0x800000L, active3, 0L);
+      case 108:
+         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x20000L);
+      case 110:
+         if ((active2 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 180;
+            jjmatchedPos = 11;
+         }
+         return jjMoveStringLiteralDfa12_0(active2, 0x4000000L, active3, 0L);
+      case 111:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x400000L);
+      case 114:
+         if ((active2 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 144;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 116:
+         if ((active2 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 132;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 210;
+            jjmatchedPos = 11;
+         }
+         return jjMoveStringLiteralDfa12_0(active2, 0x2L, active3, 0L);
+      case 117:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x4000L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 11);
+}
+private int jjMoveStringLiteralDfa12_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 11);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 11);
+   }
+   switch(curChar)
+   {
+      case 66:
+         return jjMoveStringLiteralDfa13_0(active2, 0x100000000000000L, active3, 0L);
+      case 67:
+         if ((active2 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 151;
+            jjmatchedPos = 12;
+         }
+         break;
+      case 69:
+         if ((active2 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 131;
+            jjmatchedPos = 12;
+         }
+         else if ((active3 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 209;
+            jjmatchedPos = 12;
+         }
+         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x80040L);
+      case 73:
+         return jjMoveStringLiteralDfa13_0(active2, 0x4000000L, active3, 0L);
+      case 82:
+         if ((active3 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 214;
+            jjmatchedPos = 12;
+         }
+         return jjMoveStringLiteralDfa13_0(active2, 0x2L, active3, 0L);
+      case 83:
+         return jjMoveStringLiteralDfa13_0(active2, 0L, active3, 0x4000L);
+      case 98:
+         return jjMoveStringLiteralDfa13_0(active2, 0x100000000000000L, active3, 0L);
+      case 99:
+         if ((active2 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 151;
+            jjmatchedPos = 12;
+         }
+         break;
+      case 101:
+         if ((active2 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 131;
+            jjmatchedPos = 12;
+         }
+         else if ((active3 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 209;
+            jjmatchedPos = 12;
+         }
+         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x80040L);
+      case 105:
+         return jjMoveStringLiteralDfa13_0(active2, 0x4000000L, active3, 0L);
+      case 114:
+         if ((active3 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 214;
+            jjmatchedPos = 12;
+         }
+         return jjMoveStringLiteralDfa13_0(active2, 0x2L, active3, 0L);
+      case 115:
+         return jjMoveStringLiteralDfa13_0(active2, 0L, active3, 0x4000L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 12);
+}
+private int jjMoveStringLiteralDfa13_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 12);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 12);
+   }
+   switch(curChar)
+   {
+      case 65:
+         return jjMoveStringLiteralDfa14_0(active2, 0x2L, active3, 0x4000L);
+      case 76:
+         return jjMoveStringLiteralDfa14_0(active2, 0x100000000000000L, active3, 0L);
+      case 82:
+         if ((active2 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 133;
+            jjmatchedPos = 13;
+         }
+         else if ((active3 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 211;
+            jjmatchedPos = 13;
+         }
+         return jjMoveStringLiteralDfa14_0(active2, 0L, active3, 0x40L);
+      case 84:
+         if ((active2 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 154;
+            jjmatchedPos = 13;
+         }
+         break;
+      case 97:
+         return jjMoveStringLiteralDfa14_0(active2, 0x2L, active3, 0x4000L);
+      case 108:
+         return jjMoveStringLiteralDfa14_0(active2, 0x100000000000000L, active3, 0L);
+      case 114:
+         if ((active2 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 133;
+            jjmatchedPos = 13;
+         }
+         else if ((active3 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 211;
+            jjmatchedPos = 13;
+         }
+         return jjMoveStringLiteralDfa14_0(active2, 0L, active3, 0x40L);
+      case 116:
+         if ((active2 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 154;
+            jjmatchedPos = 13;
+         }
+         break;
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 13);
+}
+private int jjMoveStringLiteralDfa14_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 13);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 13);
+   }
+   switch(curChar)
+   {
+      case 66:
+         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x4000L);
+      case 69:
+         if ((active2 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 184;
+            jjmatchedPos = 14;
+         }
+         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x40L);
+      case 78:
+         return jjMoveStringLiteralDfa15_0(active2, 0x2L, active3, 0L);
+      case 98:
+         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x4000L);
+      case 101:
+         if ((active2 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 184;
+            jjmatchedPos = 14;
+         }
+         return jjMoveStringLiteralDfa15_0(active2, 0L, active3, 0x40L);
+      case 110:
+         return jjMoveStringLiteralDfa15_0(active2, 0x2L, active3, 0L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 14);
+}
+private int jjMoveStringLiteralDfa15_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 14);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 14);
+   }
+   switch(curChar)
+   {
+      case 76:
+         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x4000L);
+      case 78:
+         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x40L);
+      case 83:
+         return jjMoveStringLiteralDfa16_0(active2, 0x2L, active3, 0L);
+      case 108:
+         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x4000L);
+      case 110:
+         return jjMoveStringLiteralDfa16_0(active2, 0L, active3, 0x40L);
+      case 115:
+         return jjMoveStringLiteralDfa16_0(active2, 0x2L, active3, 0L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 15);
+}
+private int jjMoveStringLiteralDfa16_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 15);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 15);
+   }
+   switch(curChar)
+   {
+      case 65:
+         return jjMoveStringLiteralDfa17_0(active2, 0x2L, active3, 0L);
+      case 67:
+         return jjMoveStringLiteralDfa17_0(active2, 0L, active3, 0x40L);
+      case 69:
+         if ((active3 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 206;
+            jjmatchedPos = 16;
+         }
+         break;
+      case 97:
+         return jjMoveStringLiteralDfa17_0(active2, 0x2L, active3, 0L);
+      case 99:
+         return jjMoveStringLiteralDfa17_0(active2, 0L, active3, 0x40L);
+      case 101:
+         if ((active3 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 206;
+            jjmatchedPos = 16;
+         }
+         break;
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 16);
+}
+private int jjMoveStringLiteralDfa17_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 16);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 16);
+   }
+   switch(curChar)
+   {
+      case 67:
+         return jjMoveStringLiteralDfa18_0(active2, 0x2L, active3, 0L);
+      case 69:
+         return jjMoveStringLiteralDfa18_0(active2, 0L, active3, 0x40L);
+      case 99:
+         return jjMoveStringLiteralDfa18_0(active2, 0x2L, active3, 0L);
+      case 101:
+         return jjMoveStringLiteralDfa18_0(active2, 0L, active3, 0x40L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 17);
+}
+private int jjMoveStringLiteralDfa18_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 17);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 17);
+   }
+   switch(curChar)
+   {
+      case 83:
+         if ((active3 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 198;
+            jjmatchedPos = 18;
+         }
+         break;
+      case 84:
+         return jjMoveStringLiteralDfa19_0(active2, 0x2L, active3, 0L);
+      case 115:
+         if ((active3 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 198;
+            jjmatchedPos = 18;
+         }
+         break;
+      case 116:
+         return jjMoveStringLiteralDfa19_0(active2, 0x2L, active3, 0L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 18);
+}
+private int jjMoveStringLiteralDfa19_0(long old2, long active2, long old3, long active3)
+{
+   if (((active2 &= old2) | (active3 &= old3)) == 0L)
+      return jjMoveNfa_0(5, 18);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 18);
+   }
+   switch(curChar)
+   {
+      case 73:
+         return jjMoveStringLiteralDfa20_0(active2, 0x2L);
+      case 105:
+         return jjMoveStringLiteralDfa20_0(active2, 0x2L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 19);
+}
+private int jjMoveStringLiteralDfa20_0(long old2, long active2)
+{
+   if (((active2 &= old2)) == 0L)
+      return jjMoveNfa_0(5, 19);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 19);
+   }
+   switch(curChar)
+   {
+      case 79:
+         return jjMoveStringLiteralDfa21_0(active2, 0x2L);
+      case 111:
+         return jjMoveStringLiteralDfa21_0(active2, 0x2L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 20);
+}
+private int jjMoveStringLiteralDfa21_0(long old2, long active2)
+{
+   if (((active2 &= old2)) == 0L)
+      return jjMoveNfa_0(5, 20);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 20);
+   }
+   switch(curChar)
+   {
+      case 78:
+         if ((active2 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 129;
+            jjmatchedPos = 21;
+         }
+         break;
+      case 110:
+         if ((active2 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 129;
+            jjmatchedPos = 21;
+         }
+         break;
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 21);
+}
 static final long[] jjbitVec0 = {
    0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
+};
 static final long[] jjbitVec2 = {
    0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private int jjMoveNfa_0(int startState, int curPos)
-{
-   int strKind = jjmatchedKind;
-   int strPos = jjmatchedPos;
-   int seenUpto;
-   input_stream.backup(seenUpto = curPos + 1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { throw new Error("Internal Error"); }
-   curPos = 0;
-   int startsAt = 0;
-   jjnewStateCnt = 71;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 5:
-                  if ((0x3ff000000000000L & l) != 0L)
-                  {
-                     if (kind > 35)
-                        kind = 35;
-                     jjCheckNAddStates(0, 6);
-                  }
-                  else if (curChar == 46)
-                     jjCheckNAddTwoStates(51, 61);
-                  else if (curChar == 34)
-                     jjCheckNAddTwoStates(48, 49);
-                  else if (curChar == 39)
-                     jjCheckNAddTwoStates(43, 44);
-                  else if (curChar == 58)
-                     jjAddStates(7, 9);
-                  else if (curChar == 47)
-                     jjstateSet[jjnewStateCnt++] = 6;
-                  else if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 0;
-                  break;
-               case 0:
-                  if (curChar == 45)
-                     jjCheckNAddStates(10, 12);
-                  break;
-               case 1:
-                  if ((0xffffffffffffdbffL & l) != 0L)
-                     jjCheckNAddStates(10, 12);
-                  break;
-               case 2:
-                  if ((0x2400L & l) != 0L && kind > 6)
-                     kind = 6;
-                  break;
-               case 3:
-                  if (curChar == 10 && kind > 6)
-                     kind = 6;
-                  break;
-               case 4:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 3;
-                  break;
-               case 6:
-                  if (curChar == 42)
-                     jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 7:
-                  if ((0xfffffbffffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 8:
-                  if (curChar == 42)
-                     jjCheckNAddStates(13, 15);
-                  break;
-               case 9:
-                  if ((0xffff7bffffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 10:
-                  if ((0xfffffbffffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 11:
-                  if (curChar == 47 && kind > 7)
-                     kind = 7;
-                  break;
-               case 12:
-                  if (curChar == 47)
-                     jjstateSet[jjnewStateCnt++] = 6;
-                  break;
-               case 14:
-                  if ((0x3ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 228)
-                     kind = 228;
-                  jjstateSet[jjnewStateCnt++] = 14;
-                  break;
-               case 15:
-                  if (curChar == 58)
-                     jjAddStates(7, 9);
-                  break;
-               case 17:
-                  if ((0x3ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjAddStates(16, 17);
-                  break;
-               case 18:
-                  if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 19;
-                  break;
-               case 20:
-                  if ((0x3ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjstateSet[jjnewStateCnt++] = 20;
-                  break;
-               case 21:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddStates(18, 24);
-                  break;
-               case 22:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAdd(22);
-                  break;
-               case 23:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddTwoStates(23, 24);
-                  break;
-               case 24:
-                  if (curChar == 46)
-                     jjCheckNAdd(25);
-                  break;
-               case 25:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAdd(25);
-                  break;
-               case 26:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddTwoStates(26, 27);
-                  break;
-               case 28:
-                  if ((0x280000000000L & l) != 0L)
-                     jjAddStates(25, 26);
-                  break;
-               case 29:
-                  if (curChar == 46)
-                     jjCheckNAdd(30);
-                  break;
-               case 30:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAdd(30);
-                  break;
-               case 31:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddStates(27, 29);
-                  break;
-               case 32:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAdd(32);
-                  break;
-               case 33:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddTwoStates(33, 34);
-                  break;
-               case 34:
-                  if (curChar == 46)
-                     jjCheckNAdd(35);
-                  break;
-               case 35:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAdd(35);
-                  break;
-               case 36:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddStates(30, 32);
-                  break;
-               case 37:
-                  if (curChar == 46)
-                     jjCheckNAdd(38);
-                  break;
-               case 38:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddTwoStates(38, 27);
-                  break;
-               case 39:
-                  if (curChar == 46)
-                     jjCheckNAddTwoStates(40, 41);
-                  break;
-               case 40:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAdd(40);
-                  break;
-               case 41:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddTwoStates(41, 27);
-                  break;
-               case 42:
-                  if (curChar == 39)
-                     jjCheckNAddTwoStates(43, 44);
-                  break;
-               case 43:
-                  if ((0xffffff7fffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(43, 44);
-                  break;
-               case 44:
-                  if (curChar != 39)
-                     break;
-                  if (kind > 232)
-                     kind = 232;
-                  jjstateSet[jjnewStateCnt++] = 45;
-                  break;
-               case 45:
-                  if (curChar == 39)
-                     jjCheckNAddTwoStates(46, 44);
-                  break;
-               case 46:
-                  if ((0xffffff7fffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(46, 44);
-                  break;
-               case 47:
-                  if (curChar == 34)
-                     jjCheckNAddTwoStates(48, 49);
-                  break;
-               case 48:
-                  if ((0xfffffffbffffdbffL & l) != 0L)
-                     jjCheckNAddTwoStates(48, 49);
-                  break;
-               case 49:
-                  if (curChar == 34 && kind > 233)
-                     kind = 233;
-                  break;
-               case 50:
-                  if (curChar == 46)
-                     jjCheckNAddTwoStates(51, 61);
-                  break;
-               case 51:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddTwoStates(51, 52);
-                  break;
-               case 53:
-                  if ((0x280000000000L & l) != 0L)
-                     jjAddStates(33, 34);
-                  break;
-               case 54:
-                  if (curChar == 46)
-                     jjCheckNAdd(55);
-                  break;
-               case 55:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAdd(55);
-                  break;
-               case 56:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 57:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAdd(57);
-                  break;
-               case 58:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddTwoStates(58, 59);
-                  break;
-               case 59:
-                  if (curChar == 46)
-                     jjCheckNAdd(60);
-                  break;
-               case 60:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAdd(60);
-                  break;
-               case 61:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAdd(61);
-                  break;
-               case 62:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddStates(0, 6);
-                  break;
-               case 63:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddTwoStates(63, 52);
-                  break;
-               case 64:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddStates(38, 40);
-                  break;
-               case 65:
-                  if (curChar == 46)
-                     jjCheckNAdd(66);
-                  break;
-               case 66:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddTwoStates(66, 52);
-                  break;
-               case 67:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAddTwoStates(67, 68);
-                  break;
-               case 68:
-                  if (curChar == 46)
-                     jjCheckNAdd(69);
-                  break;
-               case 69:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAdd(69);
-                  break;
-               case 70:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 35)
-                     kind = 35;
-                  jjCheckNAdd(70);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 5:
-               case 13:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 228)
-                     kind = 228;
-                  jjCheckNAddTwoStates(13, 14);
-                  break;
-               case 1:
-                  jjAddStates(10, 12);
-                  break;
-               case 7:
-                  jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-               case 10:
-                  jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 14:
-                  if ((0x7fffffe87ffffffL & l) == 0L)
-                     break;
-                  if (kind > 228)
-                     kind = 228;
-                  jjCheckNAdd(14);
-                  break;
-               case 16:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddStates(41, 43);
-                  break;
-               case 17:
-                  if ((0x7fffffe87ffffffL & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddTwoStates(17, 18);
-                  break;
-               case 19:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAddTwoStates(19, 20);
-                  break;
-               case 20:
-                  if ((0x7fffffe87ffffffL & l) == 0L)
-                     break;
-                  if (kind > 231)
-                     kind = 231;
-                  jjCheckNAdd(20);
-                  break;
-               case 27:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(44, 46);
-                  break;
-               case 43:
-                  jjCheckNAddTwoStates(43, 44);
-                  break;
-               case 46:
-                  jjCheckNAddTwoStates(46, 44);
-                  break;
-               case 48:
-                  jjAddStates(47, 48);
-                  break;
-               case 52:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(49, 51);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 1:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(10, 12);
-                  break;
-               case 7:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-               case 10:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 43:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(43, 44);
-                  break;
-               case 46:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(46, 44);
-                  break;
-               case 48:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(47, 48);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 71 - (jjnewStateCnt = startsAt)))
-         break;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { break; }
-   }
-   if (jjmatchedPos > strPos)
-      return curPos;
-
-   int toRet = Math.max(curPos, seenUpto);
-
-   if (curPos < toRet)
-      for (i = toRet - Math.min(curPos, seenUpto); i-- > 0; )
-         try { curChar = input_stream.readChar(); }
-         catch(java.io.IOException e) { throw new Error("Internal Error : Please send a bug report."); }
-
-   if (jjmatchedPos < strPos)
-   {
-      jjmatchedKind = strKind;
-      jjmatchedPos = strPos;
-   }
-   else if (jjmatchedPos == strPos && jjmatchedKind > strKind)
-      jjmatchedKind = strKind;
-
-   return toRet;
-}
+};
+private int jjMoveNfa_0(int startState, int curPos)
+{
+   int strKind = jjmatchedKind;
+   int strPos = jjmatchedPos;
+   int seenUpto;
+   input_stream.backup(seenUpto = curPos + 1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { throw new Error("Internal Error"); }
+   curPos = 0;
+   int startsAt = 0;
+   jjnewStateCnt = 71;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 5:
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 35)
+                        kind = 35;
+                     jjCheckNAddStates(0, 6);
+                  }
+                  else if (curChar == 46)
+                     jjCheckNAddTwoStates(51, 61);
+                  else if (curChar == 34)
+                     jjCheckNAddTwoStates(48, 49);
+                  else if (curChar == 39)
+                     jjCheckNAddTwoStates(43, 44);
+                  else if (curChar == 58)
+                     jjAddStates(7, 9);
+                  else if (curChar == 47)
+                     jjstateSet[jjnewStateCnt++] = 6;
+                  else if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 0;
+                  break;
+               case 0:
+                  if (curChar == 45)
+                     jjCheckNAddStates(10, 12);
+                  break;
+               case 1:
+                  if ((0xffffffffffffdbffL & l) != 0L)
+                     jjCheckNAddStates(10, 12);
+                  break;
+               case 2:
+                  if ((0x2400L & l) != 0L && kind > 6)
+                     kind = 6;
+                  break;
+               case 3:
+                  if (curChar == 10 && kind > 6)
+                     kind = 6;
+                  break;
+               case 4:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 3;
+                  break;
+               case 6:
+                  if (curChar == 42)
+                     jjCheckNAddTwoStates(7, 8);
+                  break;
+               case 7:
+                  if ((0xfffffbffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(7, 8);
+                  break;
+               case 8:
+                  if (curChar == 42)
+                     jjCheckNAddStates(13, 15);
+                  break;
+               case 9:
+                  if ((0xffff7bffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(10, 8);
+                  break;
+               case 10:
+                  if ((0xfffffbffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(10, 8);
+                  break;
+               case 11:
+                  if (curChar == 47 && kind > 7)
+                     kind = 7;
+                  break;
+               case 12:
+                  if (curChar == 47)
+                     jjstateSet[jjnewStateCnt++] = 6;
+                  break;
+               case 14:
+                  if ((0x3ff001800000000L & l) == 0L)
+                     break;
+                  if (kind > 228)
+                     kind = 228;
+                  jjstateSet[jjnewStateCnt++] = 14;
+                  break;
+               case 15:
+                  if (curChar == 58)
+                     jjAddStates(7, 9);
+                  break;
+               case 17:
+                  if ((0x3ff001800000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjAddStates(16, 17);
+                  break;
+               case 18:
+                  if (curChar == 46)
+                     jjstateSet[jjnewStateCnt++] = 19;
+                  break;
+               case 20:
+                  if ((0x3ff001800000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjstateSet[jjnewStateCnt++] = 20;
+                  break;
+               case 21:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddStates(18, 24);
+                  break;
+               case 22:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAdd(22);
+                  break;
+               case 23:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddTwoStates(23, 24);
+                  break;
+               case 24:
+                  if (curChar == 46)
+                     jjCheckNAdd(25);
+                  break;
+               case 25:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAdd(25);
+                  break;
+               case 26:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddTwoStates(26, 27);
+                  break;
+               case 28:
+                  if ((0x280000000000L & l) != 0L)
+                     jjAddStates(25, 26);
+                  break;
+               case 29:
+                  if (curChar == 46)
+                     jjCheckNAdd(30);
+                  break;
+               case 30:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAdd(30);
+                  break;
+               case 31:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddStates(27, 29);
+                  break;
+               case 32:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAdd(32);
+                  break;
+               case 33:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddTwoStates(33, 34);
+                  break;
+               case 34:
+                  if (curChar == 46)
+                     jjCheckNAdd(35);
+                  break;
+               case 35:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAdd(35);
+                  break;
+               case 36:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddStates(30, 32);
+                  break;
+               case 37:
+                  if (curChar == 46)
+                     jjCheckNAdd(38);
+                  break;
+               case 38:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddTwoStates(38, 27);
+                  break;
+               case 39:
+                  if (curChar == 46)
+                     jjCheckNAddTwoStates(40, 41);
+                  break;
+               case 40:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAdd(40);
+                  break;
+               case 41:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddTwoStates(41, 27);
+                  break;
+               case 42:
+                  if (curChar == 39)
+                     jjCheckNAddTwoStates(43, 44);
+                  break;
+               case 43:
+                  if ((0xffffff7fffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(43, 44);
+                  break;
+               case 44:
+                  if (curChar != 39)
+                     break;
+                  if (kind > 232)
+                     kind = 232;
+                  jjstateSet[jjnewStateCnt++] = 45;
+                  break;
+               case 45:
+                  if (curChar == 39)
+                     jjCheckNAddTwoStates(46, 44);
+                  break;
+               case 46:
+                  if ((0xffffff7fffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(46, 44);
+                  break;
+               case 47:
+                  if (curChar == 34)
+                     jjCheckNAddTwoStates(48, 49);
+                  break;
+               case 48:
+                  if ((0xfffffffbffffdbffL & l) != 0L)
+                     jjCheckNAddTwoStates(48, 49);
+                  break;
+               case 49:
+                  if (curChar == 34 && kind > 233)
+                     kind = 233;
+                  break;
+               case 50:
+                  if (curChar == 46)
+                     jjCheckNAddTwoStates(51, 61);
+                  break;
+               case 51:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddTwoStates(51, 52);
+                  break;
+               case 53:
+                  if ((0x280000000000L & l) != 0L)
+                     jjAddStates(33, 34);
+                  break;
+               case 54:
+                  if (curChar == 46)
+                     jjCheckNAdd(55);
+                  break;
+               case 55:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAdd(55);
+                  break;
+               case 56:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddStates(35, 37);
+                  break;
+               case 57:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAdd(57);
+                  break;
+               case 58:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddTwoStates(58, 59);
+                  break;
+               case 59:
+                  if (curChar == 46)
+                     jjCheckNAdd(60);
+                  break;
+               case 60:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAdd(60);
+                  break;
+               case 61:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAdd(61);
+                  break;
+               case 62:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddStates(0, 6);
+                  break;
+               case 63:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddTwoStates(63, 52);
+                  break;
+               case 64:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddStates(38, 40);
+                  break;
+               case 65:
+                  if (curChar == 46)
+                     jjCheckNAdd(66);
+                  break;
+               case 66:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddTwoStates(66, 52);
+                  break;
+               case 67:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAddTwoStates(67, 68);
+                  break;
+               case 68:
+                  if (curChar == 46)
+                     jjCheckNAdd(69);
+                  break;
+               case 69:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAdd(69);
+                  break;
+               case 70:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 35)
+                     kind = 35;
+                  jjCheckNAdd(70);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 5:
+               case 13:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 228)
+                     kind = 228;
+                  jjCheckNAddTwoStates(13, 14);
+                  break;
+               case 1:
+                  jjAddStates(10, 12);
+                  break;
+               case 7:
+                  jjCheckNAddTwoStates(7, 8);
+                  break;
+               case 9:
+               case 10:
+                  jjCheckNAddTwoStates(10, 8);
+                  break;
+               case 14:
+                  if ((0x7fffffe87ffffffL & l) == 0L)
+                     break;
+                  if (kind > 228)
+                     kind = 228;
+                  jjCheckNAdd(14);
+                  break;
+               case 16:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddStates(41, 43);
+                  break;
+               case 17:
+                  if ((0x7fffffe87ffffffL & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddTwoStates(17, 18);
+                  break;
+               case 19:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAddTwoStates(19, 20);
+                  break;
+               case 20:
+                  if ((0x7fffffe87ffffffL & l) == 0L)
+                     break;
+                  if (kind > 231)
+                     kind = 231;
+                  jjCheckNAdd(20);
+                  break;
+               case 27:
+                  if ((0x2000000020L & l) != 0L)
+                     jjAddStates(44, 46);
+                  break;
+               case 43:
+                  jjCheckNAddTwoStates(43, 44);
+                  break;
+               case 46:
+                  jjCheckNAddTwoStates(46, 44);
+                  break;
+               case 48:
+                  jjAddStates(47, 48);
+                  break;
+               case 52:
+                  if ((0x2000000020L & l) != 0L)
+                     jjAddStates(49, 51);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int hiByte = (int)(curChar >> 8);
+         int i1 = hiByte >> 6;
+         long l1 = 1L << (hiByte & 077);
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 1:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     jjAddStates(10, 12);
+                  break;
+               case 7:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     jjCheckNAddTwoStates(7, 8);
+                  break;
+               case 9:
+               case 10:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     jjCheckNAddTwoStates(10, 8);
+                  break;
+               case 43:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     jjCheckNAddTwoStates(43, 44);
+                  break;
+               case 46:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     jjCheckNAddTwoStates(46, 44);
+                  break;
+               case 48:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     jjAddStates(47, 48);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 71 - (jjnewStateCnt = startsAt)))
+         break;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { break; }
+   }
+   if (jjmatchedPos > strPos)
+      return curPos;
+
+   int toRet = Math.max(curPos, seenUpto);
+
+   if (curPos < toRet)
+      for (i = toRet - Math.min(curPos, seenUpto); i-- > 0; )
+         try { curChar = input_stream.readChar(); }
+         catch(java.io.IOException e) { throw new Error("Internal Error : Please send a bug report."); }
+
+   if (jjmatchedPos < strPos)
+   {
+      jjmatchedKind = strKind;
+      jjmatchedPos = strPos;
+   }
+   else if (jjmatchedPos == strPos && jjmatchedKind > strKind)
+      jjmatchedKind = strKind;
+
+   return toRet;
+}
 static final int[] jjnextStates = {
    63, 64, 65, 52, 67, 68, 70, 16, 21, 39, 1, 2, 4, 8, 9, 11, 
    17, 18, 22, 23, 24, 26, 36, 37, 27, 29, 31, 32, 33, 34, 36, 37, 
    27, 54, 56, 57, 58, 59, 64, 65, 52, 16, 17, 18, 28, 29, 31, 48, 
    49, 53, 54, 56, 
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec2[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec0[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-
-/** Token literal values. */
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, "\72\75", "\52", "\100", "\51", 
-"\174\174", "\72", "\54", "\56", "\56\56", "\44", "\45", "\75", "\76", "\76\75", 
-"\50\53\51", "\74", "\74\75", "\55", "\74\76", "\41\75", "\50", "\53", "\43", "\77", "\73", 
-"\57", "\176", null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, };
-
-/** Lexer state names. */
-public static final String[] lexStateNames = {
-   "DEFAULT",
-};
+};
+private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
+{
+   switch(hiByte)
+   {
+      case 0:
+         return ((jjbitVec2[i2] & l2) != 0L);
+      default :
+         if ((jjbitVec0[i1] & l1) != 0L)
+            return true;
+         return false;
+   }
+}
+
+/** Token literal values. */
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, "\72\75", "\52", "\100", "\51", 
+"\174\174", "\72", "\54", "\56", "\56\56", "\44", "\45", "\75", "\76", "\76\75", 
+"\50\53\51", "\74", "\74\75", "\55", "\74\76", "\41\75", "\50", "\53", "\43", "\77", "\73", 
+"\57", "\176", null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, };
+
+/** Lexer state names. */
+public static final String[] lexStateNames = {
+   "DEFAULT",
+};
 static final long[] jjtoToken = {
    0xffffff8fffffff01L, 0xffffffffffffffffL, 0xffffffffffffffffL, 0x39fffffffffL, 
-};
+};
 static final long[] jjtoSkip = {
    0xfeL, 0x0L, 0x0L, 0x0L, 
-};
-protected JavaCharStream input_stream;
-private final int[] jjrounds = new int[71];
-private final int[] jjstateSet = new int[142];
-protected char curChar;
-/** Constructor. */
-public DDLParserTokenManager(JavaCharStream stream){
-   if (JavaCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-
-/** Constructor. */
-public DDLParserTokenManager(JavaCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
-
-/** Reinitialise parser. */
-public void ReInit(JavaCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 71; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-
-/** Reinitialise parser. */
-public void ReInit(JavaCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-
-/** Switch to specified lex state. */
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 1 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   final Token t;
-   final String curTokenImage;
-   final int beginLine;
-   final int endLine;
-   final int beginColumn;
-   final int endColumn;
-   String im = jjstrLiteralImages[jjmatchedKind];
-   curTokenImage = (im == null) ? input_stream.GetImage() : im;
-   beginLine = input_stream.getBeginLine();
-   beginColumn = input_stream.getBeginColumn();
-   endLine = input_stream.getEndLine();
-   endColumn = input_stream.getEndColumn();
-   t = Token.newToken(jjmatchedKind, curTokenImage);
-
-   t.beginLine = beginLine;
-   t.endLine = endLine;
-   t.beginColumn = beginColumn;
-   t.endColumn = endColumn;
-
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-/** Get the next Token. */
-public Token getNextToken() 
-{
-  Token matchedToken;
-  int curPos = 0;
-
+};
+protected JavaCharStream input_stream;
+private final int[] jjrounds = new int[71];
+private final int[] jjstateSet = new int[142];
+protected char curChar;
+/** Constructor. */
+public DDLParserTokenManager(JavaCharStream stream){
+   if (JavaCharStream.staticFlag)
+      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+   input_stream = stream;
+}
+
+/** Constructor. */
+public DDLParserTokenManager(JavaCharStream stream, int lexState){
+   this(stream);
+   SwitchTo(lexState);
+}
+
+/** Reinitialise parser. */
+public void ReInit(JavaCharStream stream)
+{
+   jjmatchedPos = jjnewStateCnt = 0;
+   curLexState = defaultLexState;
+   input_stream = stream;
+   ReInitRounds();
+}
+private void ReInitRounds()
+{
+   int i;
+   jjround = 0x80000001;
+   for (i = 71; i-- > 0;)
+      jjrounds[i] = 0x80000000;
+}
+
+/** Reinitialise parser. */
+public void ReInit(JavaCharStream stream, int lexState)
+{
+   ReInit(stream);
+   SwitchTo(lexState);
+}
+
+/** Switch to specified lex state. */
+public void SwitchTo(int lexState)
+{
+   if (lexState >= 1 || lexState < 0)
+      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+   else
+      curLexState = lexState;
+}
+
+protected Token jjFillToken()
+{
+   final Token t;
+   final String curTokenImage;
+   final int beginLine;
+   final int endLine;
+   final int beginColumn;
+   final int endColumn;
+   String im = jjstrLiteralImages[jjmatchedKind];
+   curTokenImage = (im == null) ? input_stream.GetImage() : im;
+   beginLine = input_stream.getBeginLine();
+   beginColumn = input_stream.getBeginColumn();
+   endLine = input_stream.getEndLine();
+   endColumn = input_stream.getEndColumn();
+   t = Token.newToken(jjmatchedKind, curTokenImage);
+
+   t.beginLine = beginLine;
+   t.endLine = endLine;
+   t.beginColumn = beginColumn;
+   t.endColumn = endColumn;
+
+   return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+/** Get the next Token. */
+public Token getNextToken() 
+{
+  Token matchedToken;
+  int curPos = 0;
+
   EOFLoop :
-  for (;;)
-  {
-   try
-   {
-      curChar = input_stream.BeginToken();
-   }
-   catch(java.io.IOException e)
-   {
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      return matchedToken;
-   }
-
-   jjmatchedKind = 0x7fffffff;
-   jjmatchedPos = 0;
-   curPos = jjMoveStringLiteralDfa0_0();
-   if (jjmatchedKind != 0x7fffffff)
-   {
-      if (jjmatchedPos + 1 < curPos)
-         input_stream.backup(curPos - jjmatchedPos - 1);
-      if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-      {
-         matchedToken = jjFillToken();
-         return matchedToken;
-      }
-      else
-      {
-         continue EOFLoop;
-      }
-   }
-   int error_line = input_stream.getEndLine();
-   int error_column = input_stream.getEndColumn();
-   String error_after = null;
-   boolean EOFSeen = false;
-   try { input_stream.readChar(); input_stream.backup(1); }
-   catch (java.io.IOException e1) {
-      EOFSeen = true;
-      error_after = curPos <= 1 ? "" : input_stream.GetImage();
-      if (curChar == '\n' || curChar == '\r') {
-         error_line++;
-         error_column = 0;
-      }
-      else
-         error_column++;
-   }
-   if (!EOFSeen) {
-      input_stream.backup(1);
-      error_after = curPos <= 1 ? "" : input_stream.GetImage();
-   }
-   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-  }
-}
-
-private void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-
-private void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-
-}
+  for (;;)
+  {
+   try
+   {
+      curChar = input_stream.BeginToken();
+   }
+   catch(java.io.IOException e)
+   {
+      jjmatchedKind = 0;
+      matchedToken = jjFillToken();
+      return matchedToken;
+   }
+
+   jjmatchedKind = 0x7fffffff;
+   jjmatchedPos = 0;
+   curPos = jjMoveStringLiteralDfa0_0();
+   if (jjmatchedKind != 0x7fffffff)
+   {
+      if (jjmatchedPos + 1 < curPos)
+         input_stream.backup(curPos - jjmatchedPos - 1);
+      if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+      {
+         matchedToken = jjFillToken();
+         return matchedToken;
+      }
+      else
+      {
+         continue EOFLoop;
+      }
+   }
+   int error_line = input_stream.getEndLine();
+   int error_column = input_stream.getEndColumn();
+   String error_after = null;
+   boolean EOFSeen = false;
+   try { input_stream.readChar(); input_stream.backup(1); }
+   catch (java.io.IOException e1) {
+      EOFSeen = true;
+      error_after = curPos <= 1 ? "" : input_stream.GetImage();
+      if (curChar == '\n' || curChar == '\r') {
+         error_line++;
+         error_column = 0;
+      }
+      else
+         error_column++;
+   }
+   if (!EOFSeen) {
+      input_stream.backup(1);
+      error_after = curPos <= 1 ? "" : input_stream.GetImage();
+   }
+   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+  }
+}
+
+private void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+
+}
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTreeConstants.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTreeConstants.java
index 43fd5d0..a9d99e4 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTreeConstants.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTreeConstants.java
@@ -1,14 +1,14 @@
-/* Generated By:JavaCC: Do not edit this line. DDLParserTreeConstants.java Version 5.0 */
-package org.eclipse.persistence.tools.oracleddl.parser;
-
+/* Generated By:JavaCC: Do not edit this line. DDLParserTreeConstants.java Version 5.0 */
+package org.eclipse.persistence.tools.oracleddl.parser;
+
 @SuppressWarnings("all")
-public interface DDLParserTreeConstants
-{
-  public int JJTVOID = 0;
-
-
-  public String[] jjtNodeName = {
-    "void",
-  };
-}
-/* JavaCC - OriginalChecksum=ff721d13e20dfc97bde0c0e42bb97d94 (do not edit this line) */
+public interface DDLParserTreeConstants
+{
+  public int JJTVOID = 0;
+
+
+  public String[] jjtNodeName = {
+    "void",
+  };
+}
+/* JavaCC - OriginalChecksum=46585a43045182b363c9163878500a1a (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserVisitor.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserVisitor.java
index 3385cc7..0371c61 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserVisitor.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserVisitor.java
@@ -1,9 +1,9 @@
-/* Generated By:JavaCC: Do not edit this line. DDLParserVisitor.java Version 5.0 */
-package org.eclipse.persistence.tools.oracleddl.parser;
-
+/* Generated By:JavaCC: Do not edit this line. DDLParserVisitor.java Version 5.0 */
+package org.eclipse.persistence.tools.oracleddl.parser;
+
 @SuppressWarnings("all")
-public interface DDLParserVisitor
-{
-  public Object visit(SimpleNode node, Object data);
-}
-/* JavaCC - OriginalChecksum=0a5f7f17a0ed392fca069d04f2c11cb5 (do not edit this line) */
+public interface DDLParserVisitor
+{
+  public Object visit(SimpleNode node, Object data);
+}
+/* JavaCC - OriginalChecksum=1ef80f9e87a51db5c74f170fc3e9781d (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JJTDDLParserState.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JJTDDLParserState.java
index 720c2e1..ba336e5 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JJTDDLParserState.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JJTDDLParserState.java
@@ -1,124 +1,124 @@
-/* Generated By:JavaCC: Do not edit this line. JJTDDLParserState.java Version 5.0 */
-package org.eclipse.persistence.tools.oracleddl.parser;
-
+/* Generated By:JavaCC: Do not edit this line. JJTDDLParserState.java Version 5.0 */
+package org.eclipse.persistence.tools.oracleddl.parser;
+
 @SuppressWarnings("all")
-public class JJTDDLParserState {
-  private java.util.List<Node> nodes;
-  private java.util.List<Integer> marks;
-
-  private int sp;        // number of nodes on stack
-  private int mk;        // current mark
-  private boolean node_created;
-
-  public JJTDDLParserState() {
-    nodes = new java.util.ArrayList<Node>();
-    marks = new java.util.ArrayList<Integer>();
-    sp = 0;
-    mk = 0;
-  }
-
-  /* Determines whether the current node was actually closed and
-     pushed.  This should only be called in the final user action of a
-     node scope.  */
-  public boolean nodeCreated() {
-    return node_created;
-  }
-
-  /* Call this to reinitialize the node stack.  It is called
-     automatically by the parser's ReInit() method. */
-  public void reset() {
-    nodes.clear();
-    marks.clear();
-    sp = 0;
-    mk = 0;
-  }
-
-  /* Returns the root node of the AST.  It only makes sense to call
-     this after a successful parse. */
-  public Node rootNode() {
-    return nodes.get(0);
-  }
-
-  /* Pushes a node on to the stack. */
-  public void pushNode(Node n) {
-    nodes.add(n);
-    ++sp;
-  }
-
-  /* Returns the node on the top of the stack, and remove it from the
-     stack.  */
-  public Node popNode() {
-    if (--sp < mk) {
-      mk = marks.remove(marks.size()-1);
-    }
-    return nodes.remove(nodes.size()-1);
-  }
-
-  /* Returns the node currently on the top of the stack. */
-  public Node peekNode() {
-    return nodes.get(nodes.size()-1);
-  }
-
-  /* Returns the number of children on the stack in the current node
-     scope. */
-  public int nodeArity() {
-    return sp - mk;
-  }
-
-
-  public void clearNodeScope(Node n) {
-    while (sp > mk) {
-      popNode();
-    }
-    mk = marks.remove(marks.size()-1);
-  }
-
-
-  public void openNodeScope(Node n) {
-    marks.add(mk);
-    mk = sp;
-    n.jjtOpen();
-  }
-
-
-  /* A definite node is constructed from a specified number of
-     children.  That number of nodes are popped from the stack and
-     made the children of the definite node.  Then the definite node
-     is pushed on to the stack. */
-  public void closeNodeScope(Node n, int num) {
-    mk = marks.remove(marks.size()-1);
-    while (num-- > 0) {
-      Node c = popNode();
-      c.jjtSetParent(n);
-      n.jjtAddChild(c, num);
-    }
-    n.jjtClose();
-    pushNode(n);
-    node_created = true;
-  }
-
-
-  /* A conditional node is constructed if its condition is true.  All
-     the nodes that have been pushed since the node was opened are
-     made children of the conditional node, which is then pushed
-     on to the stack.  If the condition is false the node is not
-     constructed and they are left on the stack. */
-  public void closeNodeScope(Node n, boolean condition) {
-    if (condition) {
-      int a = nodeArity();
-      mk = marks.remove(marks.size()-1);
-      while (a-- > 0) {
-        Node c = popNode();
-        c.jjtSetParent(n);
-        n.jjtAddChild(c, a);
-      }
-      n.jjtClose();
-      pushNode(n);
-      node_created = true;
-    } else {
-      mk = marks.remove(marks.size()-1);
-      node_created = false;
-    }
-  }
-}
-/* JavaCC - OriginalChecksum=f016bbdc3ac5024ef62e899b27035ffd (do not edit this line) */
+public class JJTDDLParserState {
+  private java.util.List<Node> nodes;
+  private java.util.List<Integer> marks;
+
+  private int sp;        // number of nodes on stack
+  private int mk;        // current mark
+  private boolean node_created;
+
+  public JJTDDLParserState() {
+    nodes = new java.util.ArrayList<Node>();
+    marks = new java.util.ArrayList<Integer>();
+    sp = 0;
+    mk = 0;
+  }
+
+  /* Determines whether the current node was actually closed and
+     pushed.  This should only be called in the final user action of a
+     node scope.  */
+  public boolean nodeCreated() {
+    return node_created;
+  }
+
+  /* Call this to reinitialize the node stack.  It is called
+     automatically by the parser's ReInit() method. */
+  public void reset() {
+    nodes.clear();
+    marks.clear();
+    sp = 0;
+    mk = 0;
+  }
+
+  /* Returns the root node of the AST.  It only makes sense to call
+     this after a successful parse. */
+  public Node rootNode() {
+    return nodes.get(0);
+  }
+
+  /* Pushes a node on to the stack. */
+  public void pushNode(Node n) {
+    nodes.add(n);
+    ++sp;
+  }
+
+  /* Returns the node on the top of the stack, and remove it from the
+     stack.  */
+  public Node popNode() {
+    if (--sp < mk) {
+      mk = marks.remove(marks.size()-1);
+    }
+    return nodes.remove(nodes.size()-1);
+  }
+
+  /* Returns the node currently on the top of the stack. */
+  public Node peekNode() {
+    return nodes.get(nodes.size()-1);
+  }
+
+  /* Returns the number of children on the stack in the current node
+     scope. */
+  public int nodeArity() {
+    return sp - mk;
+  }
+
+
+  public void clearNodeScope(Node n) {
+    while (sp > mk) {
+      popNode();
+    }
+    mk = marks.remove(marks.size()-1);
+  }
+
+
+  public void openNodeScope(Node n) {
+    marks.add(mk);
+    mk = sp;
+    n.jjtOpen();
+  }
+
+
+  /* A definite node is constructed from a specified number of
+     children.  That number of nodes are popped from the stack and
+     made the children of the definite node.  Then the definite node
+     is pushed on to the stack. */
+  public void closeNodeScope(Node n, int num) {
+    mk = marks.remove(marks.size()-1);
+    while (num-- > 0) {
+      Node c = popNode();
+      c.jjtSetParent(n);
+      n.jjtAddChild(c, num);
+    }
+    n.jjtClose();
+    pushNode(n);
+    node_created = true;
+  }
+
+
+  /* A conditional node is constructed if its condition is true.  All
+     the nodes that have been pushed since the node was opened are
+     made children of the conditional node, which is then pushed
+     on to the stack.  If the condition is false the node is not
+     constructed and they are left on the stack. */
+  public void closeNodeScope(Node n, boolean condition) {
+    if (condition) {
+      int a = nodeArity();
+      mk = marks.remove(marks.size()-1);
+      while (a-- > 0) {
+        Node c = popNode();
+        c.jjtSetParent(n);
+        n.jjtAddChild(c, a);
+      }
+      n.jjtClose();
+      pushNode(n);
+      node_created = true;
+    } else {
+      mk = marks.remove(marks.size()-1);
+      node_created = false;
+    }
+  }
+}
+/* JavaCC - OriginalChecksum=1005ce0884103d1b3ff68989172ff4b0 (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JavaCharStream.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JavaCharStream.java
index 0f83421..e050e8c 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JavaCharStream.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JavaCharStream.java
@@ -1,5 +1,5 @@
-/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 5.0 */
-/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 5.0 */
+/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 /*******************************************************************************
  * Copyright (c) 2011 Oracle. All rights reserved.
  * This program and the accompanying materials are made available under the
@@ -11,620 +11,620 @@
  *
  * Contributors:
  *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (with java-like unicode escape processing).
- */
-
-public
+ ******************************************************************************/
+package org.eclipse.persistence.tools.oracleddl.parser;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (with java-like unicode escape processing).
+ */
+
+public
 @SuppressWarnings("all")
-class JavaCharStream
-{
-  /** Whether parser is static. */
-  public static final boolean staticFlag = false;
-
-  static final int hexval(char c) throws java.io.IOException {
-    switch(c)
-    {
-       case '0' :
-          return 0;
-       case '1' :
-          return 1;
-       case '2' :
-          return 2;
-       case '3' :
-          return 3;
-       case '4' :
-          return 4;
-       case '5' :
-          return 5;
-       case '6' :
-          return 6;
-       case '7' :
-          return 7;
-       case '8' :
-          return 8;
-       case '9' :
-          return 9;
-
-       case 'a' :
-       case 'A' :
-          return 10;
-       case 'b' :
-       case 'B' :
-          return 11;
-       case 'c' :
-       case 'C' :
-          return 12;
-       case 'd' :
-       case 'D' :
-          return 13;
-       case 'e' :
-       case 'E' :
-          return 14;
-       case 'f' :
-       case 'F' :
-          return 15;
-    }
-
-    throw new java.io.IOException(); // Should never come here
-  }
-
-/** Position in buffer. */
-  public int bufpos = -1;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] nextCharBuf;
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int nextCharInd = -1;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-    char[] newbuffer = new char[bufsize + 2048];
-    int newbufline[] = new int[bufsize + 2048];
-    int newbufcolumn[] = new int[bufsize + 2048];
-
-    try
-    {
-      if (wrapAround)
-      {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-        bufcolumn = newbufcolumn;
-
-        bufpos += (bufsize - tokenBegin);
-    }
-    else
-    {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-        bufcolumn = newbufcolumn;
-
-        bufpos -= tokenBegin;
-      }
-    }
-    catch (Throwable t)
-    {
-      throw new Error(t.getMessage());
-    }
-
-    available = (bufsize += 2048);
-    tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-    int i;
-    if (maxNextCharInd == 4096)
-      maxNextCharInd = nextCharInd = 0;
-
-    try {
-      if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
-                                          4096 - maxNextCharInd)) == -1)
-      {
-        inputStream.close();
-        throw new java.io.IOException();
-      }
-      else
-         maxNextCharInd += i;
-      return;
-    }
-    catch(java.io.IOException e) {
-      if (bufpos != 0)
-      {
-        --bufpos;
-        backup(0);
-      }
-      else
-      {
-        bufline[bufpos] = line;
-        bufcolumn[bufpos] = column;
-      }
-      throw e;
-    }
-  }
-
-  protected char ReadByte() throws java.io.IOException
-  {
-    if (++nextCharInd >= maxNextCharInd)
-      FillBuff();
-
-    return nextCharBuf[nextCharInd];
-  }
-
-/** @return starting character for token. */
-  public char BeginToken() throws java.io.IOException
-  {
-    if (inBuf > 0)
-    {
-      --inBuf;
-
-      if (++bufpos == bufsize)
-        bufpos = 0;
-
-      tokenBegin = bufpos;
-      return buffer[bufpos];
-    }
-
-    tokenBegin = 0;
-    bufpos = -1;
-
-    return readChar();
-  }
-
-  protected void AdjustBuffSize()
-  {
-    if (available == bufsize)
-    {
-      if (tokenBegin > 2048)
-      {
-        bufpos = 0;
-        available = tokenBegin;
-      }
-      else
-        ExpandBuff(false);
-    }
-    else if (available > tokenBegin)
-      available = bufsize;
-    else if ((tokenBegin - available) < 2048)
-      ExpandBuff(true);
-    else
-      available = tokenBegin;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-    column++;
-
-    if (prevCharIsLF)
-    {
-      prevCharIsLF = false;
-      line += (column = 1);
-    }
-    else if (prevCharIsCR)
-    {
-      prevCharIsCR = false;
-      if (c == '\n')
-      {
-        prevCharIsLF = true;
-      }
-      else
-        line += (column = 1);
-    }
-
-    switch (c)
-    {
-      case '\r' :
-        prevCharIsCR = true;
-        break;
-      case '\n' :
-        prevCharIsLF = true;
-        break;
-      case '\t' :
-        column--;
-        column += (tabSize - (column % tabSize));
-        break;
-      default :
-        break;
-    }
-
-    bufline[bufpos] = line;
-    bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-    if (inBuf > 0)
-    {
-      --inBuf;
-
-      if (++bufpos == bufsize)
-        bufpos = 0;
-
-      return buffer[bufpos];
-    }
-
-    char c;
-
-    if (++bufpos == available)
-      AdjustBuffSize();
-
-    if ((buffer[bufpos] = c = ReadByte()) == '\\')
-    {
-      UpdateLineColumn(c);
-
-      int backSlashCnt = 1;
-
-      for (;;) // Read all the backslashes
-      {
-        if (++bufpos == available)
-          AdjustBuffSize();
-
-        try
-        {
-          if ((buffer[bufpos] = c = ReadByte()) != '\\')
-          {
-            UpdateLineColumn(c);
-            // found a non-backslash char.
-            if ((c == 'u') && ((backSlashCnt & 1) == 1))
-            {
-              if (--bufpos < 0)
-                bufpos = bufsize - 1;
-
-              break;
-            }
-
-            backup(backSlashCnt);
-            return '\\';
-          }
-        }
-        catch(java.io.IOException e)
-        {
-	  // We are returning one backslash so we should only backup (count-1)
-          if (backSlashCnt > 1)
-            backup(backSlashCnt-1);
-
-          return '\\';
-        }
-
-        UpdateLineColumn(c);
-        backSlashCnt++;
-      }
-
-      // Here, we have seen an odd number of backslash's followed by a 'u'
-      try
-      {
-        while ((c = ReadByte()) == 'u')
-          ++column;
-
-        buffer[bufpos] = c = (char)(hexval(c) << 12 |
-                                    hexval(ReadByte()) << 8 |
-                                    hexval(ReadByte()) << 4 |
-                                    hexval(ReadByte()));
-
-        column += 4;
-      }
-      catch(java.io.IOException e)
-      {
-        throw new Error("Invalid escape character at line " + line +
-                                         " column " + column + ".");
-      }
-
-      if (backSlashCnt == 1)
-        return c;
-      else
-      {
-        backup(backSlashCnt - 1);
-        return '\\';
-      }
-    }
-    else
-    {
-      UpdateLineColumn(c);
-      return c;
-    }
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-  public int getColumn() {
-    return bufcolumn[bufpos];
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-  public int getLine() {
-    return bufline[bufpos];
-  }
-
-/** Get end column. */
-  public int getEndColumn() {
-    return bufcolumn[bufpos];
-  }
-
-/** Get end line. */
-  public int getEndLine() {
-    return bufline[bufpos];
-  }
-
-/** @return column of token start */
-  public int getBeginColumn() {
-    return bufcolumn[tokenBegin];
-  }
-
-/** @return line number of token start */
-  public int getBeginLine() {
-    return bufline[tokenBegin];
-  }
-
-/** Retreat. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-      bufpos += bufsize;
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-    nextCharBuf = new char[4096];
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-      nextCharBuf = new char[4096];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    nextCharInd = bufpos = -1;
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-                        int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-                        int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-
-  /** @return token image as String */
-  public String GetImage()
-  {
-    if (bufpos >= tokenBegin)
-      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-    else
-      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  /** @return suffix */
-  public char[] GetSuffix(int len)
-  {
-    char[] ret = new char[len];
-
-    if ((bufpos + 1) >= len)
-      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-    else
-    {
-      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                        len - bufpos - 1);
-      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-    }
-
-    return ret;
-  }
-
-  /** Set buffers back to null when finished. */
-  public void Done()
-  {
-    nextCharBuf = null;
-    buffer = null;
-    bufline = null;
-    bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-    int start = tokenBegin;
-    int len;
-
-    if (bufpos >= tokenBegin)
-    {
-      len = bufpos - tokenBegin + inBuf + 1;
-    }
-    else
-    {
-      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-    }
-
-    int i = 0, j = 0, k = 0;
-    int nextColDiff = 0, columnDiff = 0;
-
-    while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-    {
-      bufline[j] = newLine;
-      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-      bufcolumn[j] = newCol + columnDiff;
-      columnDiff = nextColDiff;
-      i++;
-    }
-
-    if (i < len)
-    {
-      bufline[j] = newLine++;
-      bufcolumn[j] = newCol + columnDiff;
-
-      while (i++ < len)
-      {
-        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-          bufline[j] = newLine++;
-        else
-          bufline[j] = newLine;
-      }
-    }
-
-    line = bufline[j];
-    column = bufcolumn[j];
-  }
-
-}
-/* JavaCC - OriginalChecksum=53254f6a9325378bb7ef0cee733f3fac (do not edit this line) */
+class JavaCharStream
+{
+  /** Whether parser is static. */
+  public static final boolean staticFlag = false;
+
+  static final int hexval(char c) throws java.io.IOException {
+    switch(c)
+    {
+       case '0' :
+          return 0;
+       case '1' :
+          return 1;
+       case '2' :
+          return 2;
+       case '3' :
+          return 3;
+       case '4' :
+          return 4;
+       case '5' :
+          return 5;
+       case '6' :
+          return 6;
+       case '7' :
+          return 7;
+       case '8' :
+          return 8;
+       case '9' :
+          return 9;
+
+       case 'a' :
+       case 'A' :
+          return 10;
+       case 'b' :
+       case 'B' :
+          return 11;
+       case 'c' :
+       case 'C' :
+          return 12;
+       case 'd' :
+       case 'D' :
+          return 13;
+       case 'e' :
+       case 'E' :
+          return 14;
+       case 'f' :
+       case 'F' :
+          return 15;
+    }
+
+    throw new java.io.IOException(); // Should never come here
+  }
+
+/** Position in buffer. */
+  public int bufpos = -1;
+  int bufsize;
+  int available;
+  int tokenBegin;
+  protected int bufline[];
+  protected int bufcolumn[];
+
+  protected int column = 0;
+  protected int line = 1;
+
+  protected boolean prevCharIsCR = false;
+  protected boolean prevCharIsLF = false;
+
+  protected java.io.Reader inputStream;
+
+  protected char[] nextCharBuf;
+  protected char[] buffer;
+  protected int maxNextCharInd = 0;
+  protected int nextCharInd = -1;
+  protected int inBuf = 0;
+  protected int tabSize = 8;
+
+  protected void setTabSize(int i) { tabSize = i; }
+  protected int getTabSize(int i) { return tabSize; }
+
+  protected void ExpandBuff(boolean wrapAround)
+  {
+    char[] newbuffer = new char[bufsize + 2048];
+    int newbufline[] = new int[bufsize + 2048];
+    int newbufcolumn[] = new int[bufsize + 2048];
+
+    try
+    {
+      if (wrapAround)
+      {
+        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
+        buffer = newbuffer;
+
+        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+        bufline = newbufline;
+
+        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+        bufcolumn = newbufcolumn;
+
+        bufpos += (bufsize - tokenBegin);
+    }
+    else
+    {
+        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+        buffer = newbuffer;
+
+        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+        bufline = newbufline;
+
+        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+        bufcolumn = newbufcolumn;
+
+        bufpos -= tokenBegin;
+      }
+    }
+    catch (Throwable t)
+    {
+      throw new Error(t.getMessage());
+    }
+
+    available = (bufsize += 2048);
+    tokenBegin = 0;
+  }
+
+  protected void FillBuff() throws java.io.IOException
+  {
+    int i;
+    if (maxNextCharInd == 4096)
+      maxNextCharInd = nextCharInd = 0;
+
+    try {
+      if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
+                                          4096 - maxNextCharInd)) == -1)
+      {
+        inputStream.close();
+        throw new java.io.IOException();
+      }
+      else
+         maxNextCharInd += i;
+      return;
+    }
+    catch(java.io.IOException e) {
+      if (bufpos != 0)
+      {
+        --bufpos;
+        backup(0);
+      }
+      else
+      {
+        bufline[bufpos] = line;
+        bufcolumn[bufpos] = column;
+      }
+      throw e;
+    }
+  }
+
+  protected char ReadByte() throws java.io.IOException
+  {
+    if (++nextCharInd >= maxNextCharInd)
+      FillBuff();
+
+    return nextCharBuf[nextCharInd];
+  }
+
+/** @return starting character for token. */
+  public char BeginToken() throws java.io.IOException
+  {
+    if (inBuf > 0)
+    {
+      --inBuf;
+
+      if (++bufpos == bufsize)
+        bufpos = 0;
+
+      tokenBegin = bufpos;
+      return buffer[bufpos];
+    }
+
+    tokenBegin = 0;
+    bufpos = -1;
+
+    return readChar();
+  }
+
+  protected void AdjustBuffSize()
+  {
+    if (available == bufsize)
+    {
+      if (tokenBegin > 2048)
+      {
+        bufpos = 0;
+        available = tokenBegin;
+      }
+      else
+        ExpandBuff(false);
+    }
+    else if (available > tokenBegin)
+      available = bufsize;
+    else if ((tokenBegin - available) < 2048)
+      ExpandBuff(true);
+    else
+      available = tokenBegin;
+  }
+
+  protected void UpdateLineColumn(char c)
+  {
+    column++;
+
+    if (prevCharIsLF)
+    {
+      prevCharIsLF = false;
+      line += (column = 1);
+    }
+    else if (prevCharIsCR)
+    {
+      prevCharIsCR = false;
+      if (c == '\n')
+      {
+        prevCharIsLF = true;
+      }
+      else
+        line += (column = 1);
+    }
+
+    switch (c)
+    {
+      case '\r' :
+        prevCharIsCR = true;
+        break;
+      case '\n' :
+        prevCharIsLF = true;
+        break;
+      case '\t' :
+        column--;
+        column += (tabSize - (column % tabSize));
+        break;
+      default :
+        break;
+    }
+
+    bufline[bufpos] = line;
+    bufcolumn[bufpos] = column;
+  }
+
+/** Read a character. */
+  public char readChar() throws java.io.IOException
+  {
+    if (inBuf > 0)
+    {
+      --inBuf;
+
+      if (++bufpos == bufsize)
+        bufpos = 0;
+
+      return buffer[bufpos];
+    }
+
+    char c;
+
+    if (++bufpos == available)
+      AdjustBuffSize();
+
+    if ((buffer[bufpos] = c = ReadByte()) == '\\')
+    {
+      UpdateLineColumn(c);
+
+      int backSlashCnt = 1;
+
+      for (;;) // Read all the backslashes
+      {
+        if (++bufpos == available)
+          AdjustBuffSize();
+
+        try
+        {
+          if ((buffer[bufpos] = c = ReadByte()) != '\\')
+          {
+            UpdateLineColumn(c);
+            // found a non-backslash char.
+            if ((c == 'u') && ((backSlashCnt & 1) == 1))
+            {
+              if (--bufpos < 0)
+                bufpos = bufsize - 1;
+
+              break;
+            }
+
+            backup(backSlashCnt);
+            return '\\';
+          }
+        }
+        catch(java.io.IOException e)
+        {
+	  // We are returning one backslash so we should only backup (count-1)
+          if (backSlashCnt > 1)
+            backup(backSlashCnt-1);
+
+          return '\\';
+        }
+
+        UpdateLineColumn(c);
+        backSlashCnt++;
+      }
+
+      // Here, we have seen an odd number of backslash's followed by a 'u'
+      try
+      {
+        while ((c = ReadByte()) == 'u')
+          ++column;
+
+        buffer[bufpos] = c = (char)(hexval(c) << 12 |
+                                    hexval(ReadByte()) << 8 |
+                                    hexval(ReadByte()) << 4 |
+                                    hexval(ReadByte()));
+
+        column += 4;
+      }
+      catch(java.io.IOException e)
+      {
+        throw new Error("Invalid escape character at line " + line +
+                                         " column " + column + ".");
+      }
+
+      if (backSlashCnt == 1)
+        return c;
+      else
+      {
+        backup(backSlashCnt - 1);
+        return '\\';
+      }
+    }
+    else
+    {
+      UpdateLineColumn(c);
+      return c;
+    }
+  }
+
+  @Deprecated
+  /**
+   * @deprecated
+   * @see #getEndColumn
+   */
+  public int getColumn() {
+    return bufcolumn[bufpos];
+  }
+
+  @Deprecated
+  /**
+   * @deprecated
+   * @see #getEndLine
+   */
+  public int getLine() {
+    return bufline[bufpos];
+  }
+
+/** Get end column. */
+  public int getEndColumn() {
+    return bufcolumn[bufpos];
+  }
+
+/** Get end line. */
+  public int getEndLine() {
+    return bufline[bufpos];
+  }
+
+/** @return column of token start */
+  public int getBeginColumn() {
+    return bufcolumn[tokenBegin];
+  }
+
+/** @return line number of token start */
+  public int getBeginLine() {
+    return bufline[tokenBegin];
+  }
+
+/** Retreat. */
+  public void backup(int amount) {
+
+    inBuf += amount;
+    if ((bufpos -= amount) < 0)
+      bufpos += bufsize;
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.Reader dstream,
+                 int startline, int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    available = bufsize = buffersize;
+    buffer = new char[buffersize];
+    bufline = new int[buffersize];
+    bufcolumn = new int[buffersize];
+    nextCharBuf = new char[4096];
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.Reader dstream,
+                                        int startline, int startcolumn)
+  {
+    this(dstream, startline, startcolumn, 4096);
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.Reader dstream)
+  {
+    this(dstream, 1, 1, 4096);
+  }
+/** Reinitialise. */
+  public void ReInit(java.io.Reader dstream,
+                 int startline, int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    if (buffer == null || buffersize != buffer.length)
+    {
+      available = bufsize = buffersize;
+      buffer = new char[buffersize];
+      bufline = new int[buffersize];
+      bufcolumn = new int[buffersize];
+      nextCharBuf = new char[4096];
+    }
+    prevCharIsLF = prevCharIsCR = false;
+    tokenBegin = inBuf = maxNextCharInd = 0;
+    nextCharInd = bufpos = -1;
+  }
+
+/** Reinitialise. */
+  public void ReInit(java.io.Reader dstream,
+                                        int startline, int startcolumn)
+  {
+    ReInit(dstream, startline, startcolumn, 4096);
+  }
+
+/** Reinitialise. */
+  public void ReInit(java.io.Reader dstream)
+  {
+    ReInit(dstream, 1, 1, 4096);
+  }
+/** Constructor. */
+  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
+  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.InputStream dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
+                        int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+    this(dstream, encoding, startline, startcolumn, 4096);
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.InputStream dstream, int startline,
+                        int startcolumn)
+  {
+    this(dstream, startline, startcolumn, 4096);
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+    this(dstream, encoding, 1, 1, 4096);
+  }
+
+/** Constructor. */
+  public JavaCharStream(java.io.InputStream dstream)
+  {
+    this(dstream, 1, 1, 4096);
+  }
+
+/** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+/** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+  }
+/** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                     int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+    ReInit(dstream, encoding, startline, startcolumn, 4096);
+  }
+/** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, int startline,
+                     int startcolumn)
+  {
+    ReInit(dstream, startline, startcolumn, 4096);
+  }
+/** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+    ReInit(dstream, encoding, 1, 1, 4096);
+  }
+
+/** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream)
+  {
+    ReInit(dstream, 1, 1, 4096);
+  }
+
+  /** @return token image as String */
+  public String GetImage()
+  {
+    if (bufpos >= tokenBegin)
+      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+    else
+      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                              new String(buffer, 0, bufpos + 1);
+  }
+
+  /** @return suffix */
+  public char[] GetSuffix(int len)
+  {
+    char[] ret = new char[len];
+
+    if ((bufpos + 1) >= len)
+      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+    else
+    {
+      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                                                        len - bufpos - 1);
+      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+    }
+
+    return ret;
+  }
+
+  /** Set buffers back to null when finished. */
+  public void Done()
+  {
+    nextCharBuf = null;
+    buffer = null;
+    bufline = null;
+    bufcolumn = null;
+  }
+
+  /**
+   * Method to adjust line and column numbers for the start of a token.
+   */
+  public void adjustBeginLineColumn(int newLine, int newCol)
+  {
+    int start = tokenBegin;
+    int len;
+
+    if (bufpos >= tokenBegin)
+    {
+      len = bufpos - tokenBegin + inBuf + 1;
+    }
+    else
+    {
+      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+    }
+
+    int i = 0, j = 0, k = 0;
+    int nextColDiff = 0, columnDiff = 0;
+
+    while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+    {
+      bufline[j] = newLine;
+      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+      bufcolumn[j] = newCol + columnDiff;
+      columnDiff = nextColDiff;
+      i++;
+    }
+
+    if (i < len)
+    {
+      bufline[j] = newLine++;
+      bufcolumn[j] = newCol + columnDiff;
+
+      while (i++ < len)
+      {
+        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+          bufline[j] = newLine++;
+        else
+          bufline[j] = newLine;
+      }
+    }
+
+    line = bufline[j];
+    column = bufcolumn[j];
+  }
+
+}
+/* JavaCC - OriginalChecksum=018a2af61cc16d6ef581c18a79828d27 (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/ParseException.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/ParseException.java
index b51da14..ac3d033 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/ParseException.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/ParseException.java
@@ -1,5 +1,5 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
+/* JavaCCOptions:KEEP_LINE_COL=null */
 /*******************************************************************************
  * Copyright (c) 2011 Oracle. All rights reserved.
  * This program and the accompanying materials are made available under the
@@ -11,190 +11,190 @@
  *
  * Contributors:
  *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
+ ******************************************************************************/
+package org.eclipse.persistence.tools.oracleddl.parser;
+
+/**
+ * This exception is thrown when parse errors are encountered.
+ * You can explicitly create objects of this exception type by
+ * calling the method generateParseException in the generated
+ * parser.
+ *
+ * You can modify this class to customize your error reporting
+ * mechanisms so long as you retain the public fields.
+ */
 @SuppressWarnings("all")
-public class ParseException extends Exception {
-
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-  }
-
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-  }
-
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser) the correct error message
-   * gets displayed.
-   */
-  private static String initialise(Token currentToken,
-                           int[][] expectedTokenSequences,
-                           String[] tokenImage) {
-    String eol = System.getProperty("line.separator", "\n");
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-    retval += expected.toString();
-    return retval;
-  }
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  static String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-}
-/* JavaCC - OriginalChecksum=81f4443085e467ef907deb9a67f74438 (do not edit this line) */
+public class ParseException extends Exception {
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * This constructor is used by the method "generateParseException"
+   * in the generated parser.  Calling this constructor generates
+   * a new object of this type with the fields "currentToken",
+   * "expectedTokenSequences", and "tokenImage" set.
+   */
+  public ParseException(Token currentTokenVal,
+                        int[][] expectedTokenSequencesVal,
+                        String[] tokenImageVal
+                       )
+  {
+    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
+    currentToken = currentTokenVal;
+    expectedTokenSequences = expectedTokenSequencesVal;
+    tokenImage = tokenImageVal;
+  }
+
+  /**
+   * The following constructors are for use by you for whatever
+   * purpose you can think of.  Constructing the exception in this
+   * manner makes the exception behave in the normal way - i.e., as
+   * documented in the class "Throwable".  The fields "errorToken",
+   * "expectedTokenSequences", and "tokenImage" do not contain
+   * relevant information.  The JavaCC generated code does not use
+   * these constructors.
+   */
+
+  public ParseException() {
+    super();
+  }
+
+  /** Constructor with message. */
+  public ParseException(String message) {
+    super(message);
+  }
+
+
+  /**
+   * This is the last token that has been consumed successfully.  If
+   * this object has been created due to a parse error, the token
+   * followng this token will (therefore) be the first error token.
+   */
+  public Token currentToken;
+
+  /**
+   * Each entry in this array is an array of integers.  Each array
+   * of integers represents a sequence of tokens (by their ordinal
+   * values) that is expected at this point of the parse.
+   */
+  public int[][] expectedTokenSequences;
+
+  /**
+   * This is a reference to the "tokenImage" array of the generated
+   * parser within which the parse error occurred.  This array is
+   * defined in the generated ...Constants interface.
+   */
+  public String[] tokenImage;
+
+  /**
+   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
+   * error message and returns it.  If this object has been created
+   * due to a parse error, and you do not catch it (it gets thrown
+   * from the parser) the correct error message
+   * gets displayed.
+   */
+  private static String initialise(Token currentToken,
+                           int[][] expectedTokenSequences,
+                           String[] tokenImage) {
+    String eol = System.getProperty("line.separator", "\n");
+    StringBuffer expected = new StringBuffer();
+    int maxSize = 0;
+    for (int i = 0; i < expectedTokenSequences.length; i++) {
+      if (maxSize < expectedTokenSequences[i].length) {
+        maxSize = expectedTokenSequences[i].length;
+      }
+      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
+      }
+      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+        expected.append("...");
+      }
+      expected.append(eol).append("    ");
+    }
+    String retval = "Encountered \"";
+    Token tok = currentToken.next;
+    for (int i = 0; i < maxSize; i++) {
+      if (i != 0) retval += " ";
+      if (tok.kind == 0) {
+        retval += tokenImage[0];
+        break;
+      }
+      retval += " " + tokenImage[tok.kind];
+      retval += " \"";
+      retval += add_escapes(tok.image);
+      retval += " \"";
+      tok = tok.next;
+    }
+    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
+    retval += "." + eol;
+    if (expectedTokenSequences.length == 1) {
+      retval += "Was expecting:" + eol + "    ";
+    } else {
+      retval += "Was expecting one of:" + eol + "    ";
+    }
+    retval += expected.toString();
+    return retval;
+  }
+
+  /**
+   * The end of line string for this machine.
+   */
+  protected String eol = System.getProperty("line.separator", "\n");
+
+  /**
+   * Used to convert raw characters to their escaped version
+   * when these raw version cannot be used as part of an ASCII
+   * string literal.
+   */
+  static String add_escapes(String str) {
+      StringBuffer retval = new StringBuffer();
+      char ch;
+      for (int i = 0; i < str.length(); i++) {
+        switch (str.charAt(i))
+        {
+           case 0 :
+              continue;
+           case '\b':
+              retval.append("\\b");
+              continue;
+           case '\t':
+              retval.append("\\t");
+              continue;
+           case '\n':
+              retval.append("\\n");
+              continue;
+           case '\f':
+              retval.append("\\f");
+              continue;
+           case '\r':
+              retval.append("\\r");
+              continue;
+           case '\"':
+              retval.append("\\\"");
+              continue;
+           case '\'':
+              retval.append("\\\'");
+              continue;
+           case '\\':
+              retval.append("\\\\");
+              continue;
+           default:
+              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                 String s = "0000" + Integer.toString(ch, 16);
+                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+              } else {
+                 retval.append(ch);
+              }
+              continue;
+        }
+      }
+      return retval.toString();
+   }
+
+}
+/* JavaCC - OriginalChecksum=fdd10d40daa9e0c0c6af8550169b3d38 (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/Token.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/Token.java
index a9723db..5121318 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/Token.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/Token.java
@@ -1,5 +1,5 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
-/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
+/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 /*******************************************************************************
  * Copyright (c) 2011 Oracle. All rights reserved.
  * This program and the accompanying materials are made available under the
@@ -11,134 +11,134 @@
  *
  * Contributors:
  *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/**
- * Describes the input token stream.
- */
-
+ ******************************************************************************/
+package org.eclipse.persistence.tools.oracleddl.parser;
+
+/**
+ * Describes the input token stream.
+ */
+
 @SuppressWarnings("all")
-public class Token implements java.io.Serializable {
-
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /** The line number of the first character of this Token. */
-  public int beginLine;
-  /** The column number of the first character of this Token. */
-  public int beginColumn;
-  /** The line number of the last character of this Token. */
-  public int endLine;
-  /** The column number of the last character of this Token. */
-  public int endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * An optional attribute value of the Token.
-   * Tokens which are not used as syntactic sugar will often contain
-   * meaningful values that will be used later on by the compiler or
-   * interpreter. This attribute value is often different from the image.
-   * Any subclass of Token that actually wants to return a non-null value can
-   * override this method as appropriate.
-   */
-  public Object getValue() {
-    return null;
-  }
-
-  /**
-   * No-argument constructor
-   */
-  public Token() {}
-
-  /**
-   * Constructs a new token for the specified Image.
-   */
-  public Token(int kind)
-  {
-    this(kind, null);
-  }
-
-  /**
-   * Constructs a new token for the specified Image and Kind.
-   */
-  public Token(int kind, String image)
-  {
-    this.kind = kind;
-    this.image = image;
-  }
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-    return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simply add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use sit in your lexical actions.
-   */
-  public static Token newToken(int ofKind, String image)
-  {
-    switch(ofKind)
-    {
-      default : return new Token(ofKind, image);
-    }
-  }
-
-  public static Token newToken(int ofKind)
-  {
-    return newToken(ofKind, null);
-  }
-
-}
-/* JavaCC - OriginalChecksum=6c9f79d78d53588eccf7c8f0bb40434a (do not edit this line) */
+public class Token implements java.io.Serializable {
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * An integer that describes the kind of this token.  This numbering
+   * system is determined by JavaCCParser, and a table of these numbers is
+   * stored in the file ...Constants.java.
+   */
+  public int kind;
+
+  /** The line number of the first character of this Token. */
+  public int beginLine;
+  /** The column number of the first character of this Token. */
+  public int beginColumn;
+  /** The line number of the last character of this Token. */
+  public int endLine;
+  /** The column number of the last character of this Token. */
+  public int endColumn;
+
+  /**
+   * The string image of the token.
+   */
+  public String image;
+
+  /**
+   * A reference to the next regular (non-special) token from the input
+   * stream.  If this is the last token from the input stream, or if the
+   * token manager has not read tokens beyond this one, this field is
+   * set to null.  This is true only if this token is also a regular
+   * token.  Otherwise, see below for a description of the contents of
+   * this field.
+   */
+  public Token next;
+
+  /**
+   * This field is used to access special tokens that occur prior to this
+   * token, but after the immediately preceding regular (non-special) token.
+   * If there are no such special tokens, this field is set to null.
+   * When there are more than one such special token, this field refers
+   * to the last of these special tokens, which in turn refers to the next
+   * previous special token through its specialToken field, and so on
+   * until the first special token (whose specialToken field is null).
+   * The next fields of special tokens refer to other special tokens that
+   * immediately follow it (without an intervening regular token).  If there
+   * is no such token, this field is null.
+   */
+  public Token specialToken;
+
+  /**
+   * An optional attribute value of the Token.
+   * Tokens which are not used as syntactic sugar will often contain
+   * meaningful values that will be used later on by the compiler or
+   * interpreter. This attribute value is often different from the image.
+   * Any subclass of Token that actually wants to return a non-null value can
+   * override this method as appropriate.
+   */
+  public Object getValue() {
+    return null;
+  }
+
+  /**
+   * No-argument constructor
+   */
+  public Token() {}
+
+  /**
+   * Constructs a new token for the specified Image.
+   */
+  public Token(int kind)
+  {
+    this(kind, null);
+  }
+
+  /**
+   * Constructs a new token for the specified Image and Kind.
+   */
+  public Token(int kind, String image)
+  {
+    this.kind = kind;
+    this.image = image;
+  }
+
+  /**
+   * Returns the image.
+   */
+  public String toString()
+  {
+    return image;
+  }
+
+  /**
+   * Returns a new Token object, by default. However, if you want, you
+   * can create and return subclass objects based on the value of ofKind.
+   * Simply add the cases to the switch for all those special cases.
+   * For example, if you have a subclass of Token called IDToken that
+   * you want to create if ofKind is ID, simply add something like :
+   *
+   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
+   *
+   * to the following switch statement. Then you can cast matchedToken
+   * variable to the appropriate type and use sit in your lexical actions.
+   */
+  public static Token newToken(int ofKind, String image)
+  {
+    switch(ofKind)
+    {
+      default : return new Token(ofKind, image);
+    }
+  }
+
+  public static Token newToken(int ofKind)
+  {
+    return newToken(ofKind, null);
+  }
+
+}
+/* JavaCC - OriginalChecksum=907f7ddac470ce3b8ed3883803785b5c (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/TokenMgrError.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/TokenMgrError.java
index 2e96615..ca32fbd 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/TokenMgrError.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/TokenMgrError.java
@@ -1,5 +1,5 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
-/* JavaCCOptions: */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
+/* JavaCCOptions: */
 /*******************************************************************************
  * Copyright (c) 2011 Oracle. All rights reserved.
  * This program and the accompanying materials are made available under the
@@ -11,150 +11,150 @@
  *
  * Contributors:
  *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/** Token Manager Error. */
+ ******************************************************************************/
+package org.eclipse.persistence.tools.oracleddl.parser;
+
+/** Token Manager Error. */
 @SuppressWarnings("all")
-public class TokenMgrError extends Error
-{
-
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /*
-   * Ordinals for various reasons why an Error of this type can be thrown.
-   */
-
-  /**
-   * Lexical error occurred.
-   */
-  static final int LEXICAL_ERROR = 0;
-
-  /**
-   * An attempt was made to create a second instance of a static token manager.
-   */
-  static final int STATIC_LEXER_ERROR = 1;
-
-  /**
-   * Tried to change to an invalid lexical state.
-   */
-  static final int INVALID_LEXICAL_STATE = 2;
-
-  /**
-   * Detected (and bailed out of) an infinite loop in the token manager.
-   */
-  static final int LOOP_DETECTED = 3;
-
-  /**
-   * Indicates the reason why the exception is thrown. It will have
-   * one of the above 4 values.
-   */
-  int errorCode;
-
-  /**
-   * Replaces unprintable characters by their escaped (or unicode escaped)
-   * equivalents in the given string
-   */
-  protected static final String addEscapes(String str) {
-    StringBuffer retval = new StringBuffer();
-    char ch;
-    for (int i = 0; i < str.length(); i++) {
-      switch (str.charAt(i))
-      {
-        case 0 :
-          continue;
-        case '\b':
-          retval.append("\\b");
-          continue;
-        case '\t':
-          retval.append("\\t");
-          continue;
-        case '\n':
-          retval.append("\\n");
-          continue;
-        case '\f':
-          retval.append("\\f");
-          continue;
-        case '\r':
-          retval.append("\\r");
-          continue;
-        case '\"':
-          retval.append("\\\"");
-          continue;
-        case '\'':
-          retval.append("\\\'");
-          continue;
-        case '\\':
-          retval.append("\\\\");
-          continue;
-        default:
-          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-            String s = "0000" + Integer.toString(ch, 16);
-            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-          } else {
-            retval.append(ch);
-          }
-          continue;
-      }
-    }
-    return retval.toString();
-  }
-
-  /**
-   * Returns a detailed message for the Error when it is thrown by the
-   * token manager to indicate a lexical error.
-   * Parameters :
-   *    EOFSeen     : indicates if EOF caused the lexical error
-   *    curLexState : lexical state in which this error occurred
-   *    errorLine   : line number when the error occurred
-   *    errorColumn : column number when the error occurred
-   *    errorAfter  : prefix that was seen before this error occurred
-   *    curchar     : the offending character
-   * Note: You can customize the lexical error message by modifying this method.
-   */
-  protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-    return("Lexical error at line " +
-          errorLine + ", column " +
-          errorColumn + ".  Encountered: " +
-          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-          "after : \"" + addEscapes(errorAfter) + "\"");
-  }
-
-  /**
-   * You can also modify the body of this method to customize your error messages.
-   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-   * of end-users concern, so you can return something like :
-   *
-   *     "Internal Error : Please file a bug report .... "
-   *
-   * from this method for such cases in the release version of your parser.
-   */
-  public String getMessage() {
-    return super.getMessage();
-  }
-
-  /*
-   * Constructors of various flavors follow.
-   */
-
-  /** No arg constructor. */
-  public TokenMgrError() {
-  }
-
-  /** Constructor with message and reason. */
-  public TokenMgrError(String message, int reason) {
-    super(message);
-    errorCode = reason;
-  }
-
-  /** Full Constructor. */
-  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-  }
-}
-/* JavaCC - OriginalChecksum=ce061a9b2d99fb99a53b7768a4a7762e (do not edit this line) */
+public class TokenMgrError extends Error
+{
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
+
+  /*
+   * Ordinals for various reasons why an Error of this type can be thrown.
+   */
+
+  /**
+   * Lexical error occurred.
+   */
+  static final int LEXICAL_ERROR = 0;
+
+  /**
+   * An attempt was made to create a second instance of a static token manager.
+   */
+  static final int STATIC_LEXER_ERROR = 1;
+
+  /**
+   * Tried to change to an invalid lexical state.
+   */
+  static final int INVALID_LEXICAL_STATE = 2;
+
+  /**
+   * Detected (and bailed out of) an infinite loop in the token manager.
+   */
+  static final int LOOP_DETECTED = 3;
+
+  /**
+   * Indicates the reason why the exception is thrown. It will have
+   * one of the above 4 values.
+   */
+  int errorCode;
+
+  /**
+   * Replaces unprintable characters by their escaped (or unicode escaped)
+   * equivalents in the given string
+   */
+  protected static final String addEscapes(String str) {
+    StringBuffer retval = new StringBuffer();
+    char ch;
+    for (int i = 0; i < str.length(); i++) {
+      switch (str.charAt(i))
+      {
+        case 0 :
+          continue;
+        case '\b':
+          retval.append("\\b");
+          continue;
+        case '\t':
+          retval.append("\\t");
+          continue;
+        case '\n':
+          retval.append("\\n");
+          continue;
+        case '\f':
+          retval.append("\\f");
+          continue;
+        case '\r':
+          retval.append("\\r");
+          continue;
+        case '\"':
+          retval.append("\\\"");
+          continue;
+        case '\'':
+          retval.append("\\\'");
+          continue;
+        case '\\':
+          retval.append("\\\\");
+          continue;
+        default:
+          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+            String s = "0000" + Integer.toString(ch, 16);
+            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+          } else {
+            retval.append(ch);
+          }
+          continue;
+      }
+    }
+    return retval.toString();
+  }
+
+  /**
+   * Returns a detailed message for the Error when it is thrown by the
+   * token manager to indicate a lexical error.
+   * Parameters :
+   *    EOFSeen     : indicates if EOF caused the lexical error
+   *    curLexState : lexical state in which this error occurred
+   *    errorLine   : line number when the error occurred
+   *    errorColumn : column number when the error occurred
+   *    errorAfter  : prefix that was seen before this error occurred
+   *    curchar     : the offending character
+   * Note: You can customize the lexical error message by modifying this method.
+   */
+  protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+    return("Lexical error at line " +
+          errorLine + ", column " +
+          errorColumn + ".  Encountered: " +
+          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+          "after : \"" + addEscapes(errorAfter) + "\"");
+  }
+
+  /**
+   * You can also modify the body of this method to customize your error messages.
+   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+   * of end-users concern, so you can return something like :
+   *
+   *     "Internal Error : Please file a bug report .... "
+   *
+   * from this method for such cases in the release version of your parser.
+   */
+  public String getMessage() {
+    return super.getMessage();
+  }
+
+  /*
+   * Constructors of various flavors follow.
+   */
+
+  /** No arg constructor. */
+  public TokenMgrError() {
+  }
+
+  /** Constructor with message and reason. */
+  public TokenMgrError(String message, int reason) {
+    super(message);
+    errorCode = reason;
+  }
+
+  /** Full Constructor. */
+  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+  }
+}
+/* JavaCC - OriginalChecksum=ce301da18940fd336199fa587904bb10 (do not edit this line) */
