diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLType.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLType.java
index 2f7d16d..122f924 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLType.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLType.java
@@ -14,7 +14,7 @@
 
 import org.eclipse.persistence.tools.oracleddl.metadata.visit.DatabaseTypeVisitor;
 
-public abstract class PLSQLType extends CompositeDatabaseTypeWithEnclosedType implements CompositeDatabaseType {
+public class PLSQLType extends CompositeDatabaseTypeWithEnclosedType implements CompositeDatabaseType {
 
     protected PLSQLPackageType parentType;
 
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/ROWTYPEType.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/ROWTYPEType.java
index e71b7e8..47430a6 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/ROWTYPEType.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/ROWTYPEType.java
@@ -18,6 +18,8 @@
 
 public class ROWTYPEType extends CompositeDatabaseTypeWithEnclosedType implements CompositeDatabaseType, DatabaseTypeVisitable {
 
+    protected PLSQLPackageType packageType;
+    
     public ROWTYPEType(String typeName) {
         super(typeName);
     }
@@ -28,6 +30,13 @@
         }
         return typeName;
     }
+    
+    public PLSQLPackageType getPackageType() {
+        return packageType;
+    }
+    public void setPackageType(PLSQLPackageType packageType) {
+        this.packageType = packageType;
+    }
 
     public boolean isResolved() {
         // if enclosedType is unresolved, then this argument is unresolved
@@ -65,7 +74,7 @@
         return sb.toString();
     }
 
-	public void accept(DatabaseTypeVisitor visitor) {
-		visitor.visit(this);
-	}
+    public void accept(DatabaseTypeVisitor visitor) {
+        visitor.visit(this);
+    }
 }
\ No newline at end of file
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 0175904..2f36bc5 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,4456 +10,4616 @@
  *
  * 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);
-    }
-
-  final public String keywords() throws ParseException {
- Token t = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_ARRAY:
-      t = jj_consume_token(K_ARRAY);
-      break;
-    case K_AUTHID:
-      t = jj_consume_token(K_AUTHID);
-      break;
-    case K_BFILE:
-      t = jj_consume_token(K_BFILE);
-      break;
-    case K_BINARY_DOUBLE:
-      t = jj_consume_token(K_BINARY_DOUBLE);
-      break;
-    case K_BINARY_FLOAT:
-      t = jj_consume_token(K_BINARY_FLOAT);
-      break;
-    case K_BINARY_INTEGER:
-      t = jj_consume_token(K_BINARY_INTEGER);
-      break;
-    case K_BLOB:
-      t = jj_consume_token(K_BLOB);
-      break;
-    case K_BOOLEAN:
-      t = jj_consume_token(K_BOOLEAN);
-      break;
-    case K_BYTE:
-      t = jj_consume_token(K_BYTE);
-      break;
-    case K_CHAR:
-      t = jj_consume_token(K_CHAR);
-      break;
-    case K_CHARACTER:
-      t = jj_consume_token(K_CHARACTER);
-      break;
-    case K_CLOB:
-      t = jj_consume_token(K_CLOB);
-      break;
-    case K_COMMIT:
-      t = jj_consume_token(K_COMMIT);
-      break;
-    case K_CONSTANT:
-      t = jj_consume_token(K_CONSTANT);
-      break;
-    case K_CURRENT_USER:
-      t = jj_consume_token(K_CURRENT_USER);
-      break;
-    case K_DATE:
-      t = jj_consume_token(K_DATE);
-      break;
-    case K_DAY:
-      t = jj_consume_token(K_DAY);
-      break;
-    case K_DEC:
-      t = jj_consume_token(K_DEC);
-      break;
-    case K_DECIMAL:
-      t = jj_consume_token(K_DECIMAL);
-      break;
-    case K_DEFINER:
-      t = jj_consume_token(K_DEFINER);
-      break;
-    case K_DELETE:
-      t = jj_consume_token(K_DELETE);
-      break;
-    case K_DETERMINISTIC:
-      t = jj_consume_token(K_DETERMINISTIC);
-      break;
-    case K_DOUBLE:
-      t = jj_consume_token(K_DOUBLE);
-      break;
-    case K_ENABLE:
-      t = jj_consume_token(K_ENABLE);
-      break;
-    case K_FINAL:
-      t = jj_consume_token(K_FINAL);
-      break;
-    case K_FLOAT:
-      t = jj_consume_token(K_FLOAT);
-      break;
-    case K_FORCE:
-      t = jj_consume_token(K_FORCE);
-      break;
-    case K_GLOBAL:
-      t = jj_consume_token(K_GLOBAL);
-      break;
-    case K_INSTANTIABLE:
-      t = jj_consume_token(K_INSTANTIABLE);
-      break;
-    case K_INT:
-      t = jj_consume_token(K_INT);
-      break;
-    case K_INTEGER:
-      t = jj_consume_token(K_INTEGER);
-      break;
-    case K_INTERVAL:
-      t = jj_consume_token(K_INTERVAL);
-      break;
-    case K_KEY:
-      t = jj_consume_token(K_KEY);
-      break;
-    case K_LOCAL:
-      t = jj_consume_token(K_LOCAL);
-      break;
-    case K_LONG:
-      t = jj_consume_token(K_LONG);
-      break;
-    case K_MLSLABEL:
-      t = jj_consume_token(K_MLSLABEL);
-      break;
-    case K_MONTH:
-      t = jj_consume_token(K_MONTH);
-      break;
-    case K_NATIONAL:
-      t = jj_consume_token(K_NATIONAL);
-      break;
-    case K_NATURAL:
-      t = jj_consume_token(K_NATURAL);
-      break;
-    case K_NCHAR:
-      t = jj_consume_token(K_NCHAR);
-      break;
-    case K_NCLOB:
-      t = jj_consume_token(K_NCLOB);
-      break;
-    case K_NOCOPY:
-      t = jj_consume_token(K_NOCOPY);
-      break;
-    case K_NUMBER:
-      t = jj_consume_token(K_NUMBER);
-      break;
-    case K_NUMERIC:
-      t = jj_consume_token(K_NUMERIC);
-      break;
-    case K_NVARCHAR2:
-      t = jj_consume_token(K_NVARCHAR2);
-      break;
-    case K_NVARCHAR:
-      t = jj_consume_token(K_NVARCHAR);
-      break;
-    case K_OBJECT:
-      t = jj_consume_token(K_OBJECT);
-      break;
-    case K_OID:
-      t = jj_consume_token(K_OID);
-      break;
-    case K_ORGANIZATION:
-      t = jj_consume_token(K_ORGANIZATION);
-      break;
-    case K_OUT:
-      t = jj_consume_token(K_OUT);
-      break;
-    case K_OVERFLOW:
-      t = jj_consume_token(K_OVERFLOW);
-      break;
-    case K_PACKAGE:
-      t = jj_consume_token(K_PACKAGE);
-      break;
-    case K_PARALLEL_ENABLE:
-      t = jj_consume_token(K_PARALLEL_ENABLE);
-      break;
-    case K_PIPELINED:
-      t = jj_consume_token(K_PIPELINED);
-      break;
-    case K_PLS_INTEGER:
-      t = jj_consume_token(K_PLS_INTEGER);
-      break;
-    case K_POSITIVE:
-      t = jj_consume_token(K_POSITIVE);
-      break;
-    case K_PRAGMA:
-      t = jj_consume_token(K_PRAGMA);
-      break;
-    case K_PRECISION:
-      t = jj_consume_token(K_PRECISION);
-      break;
-    case K_PRESERVE:
-      t = jj_consume_token(K_PRESERVE);
-      break;
-    case K_RANGE:
-      t = jj_consume_token(K_RANGE);
-      break;
-    case K_RAW:
-      t = jj_consume_token(K_RAW);
-      break;
-    case K_REAL:
-      t = jj_consume_token(K_REAL);
-      break;
-    case K_RECORD:
-      t = jj_consume_token(K_RECORD);
-      break;
-    case K_REF:
-      t = jj_consume_token(K_REF);
-      break;
-    case K_REPLACE:
-      t = jj_consume_token(K_REPLACE);
-      break;
-    case K_RESULT_CACHE:
-      t = jj_consume_token(K_RESULT_CACHE);
-      break;
-    case K_RETURN:
-      t = jj_consume_token(K_RETURN);
-      break;
-    case K_ROWID:
-      t = jj_consume_token(K_ROWID);
-      break;
-    case K_ROWS:
-      t = jj_consume_token(K_ROWS);
-      break;
-    case K_SECOND:
-      t = jj_consume_token(K_SECOND);
-      break;
-    case K_SET:
-      t = jj_consume_token(K_SET);
-      break;
-    case K_SIGNTYPE:
-      t = jj_consume_token(K_SIGNTYPE);
-      break;
-    case K_SIMPLE_DOUBLE:
-      t = jj_consume_token(K_SIMPLE_DOUBLE);
-      break;
-    case K_SIMPLE_FLOAT:
-      t = jj_consume_token(K_SIMPLE_FLOAT);
-      break;
-    case K_SIMPLE_INTEGER:
-      t = jj_consume_token(K_SIMPLE_INTEGER);
-      break;
-    case K_SMALLINT:
-      t = jj_consume_token(K_SMALLINT);
-      break;
-    case K_STRING:
-      t = jj_consume_token(K_STRING);
-      break;
-    case K_SYS_REFCURSOR:
-      t = jj_consume_token(K_SYS_REFCURSOR);
-      break;
-    case K_TEMPORARY:
-      t = jj_consume_token(K_TEMPORARY);
-      break;
-    case K_TIME:
-      t = jj_consume_token(K_TIME);
-      break;
-    case K_TIMESTAMP:
-      t = jj_consume_token(K_TIMESTAMP);
-      break;
-    case K_UROWID:
-      t = jj_consume_token(K_UROWID);
-      break;
-    case K_VARCHAR2:
-      t = jj_consume_token(K_VARCHAR2);
-      break;
-    case K_VARCHAR:
-      t = jj_consume_token(K_VARCHAR);
-      break;
-    case K_VARRAY:
-      t = jj_consume_token(K_VARRAY);
-      break;
-    case K_VARYING:
-      t = jj_consume_token(K_VARYING);
-      break;
-    case K_YEAR:
-      t = jj_consume_token(K_YEAR);
-      break;
-    case K_ZONE:
-      t = jj_consume_token(K_ZONE);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-      {if (true) return t.image;}
-    throw new Error("Missing return statement in function");
-  }
-
+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);
+    }
+
+  final public String keywords() throws ParseException {
+ Token t = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_ARRAY:
+      t = jj_consume_token(K_ARRAY);
+      break;
+    case K_AUTHID:
+      t = jj_consume_token(K_AUTHID);
+      break;
+    case K_BFILE:
+      t = jj_consume_token(K_BFILE);
+      break;
+    case K_BINARY_DOUBLE:
+      t = jj_consume_token(K_BINARY_DOUBLE);
+      break;
+    case K_BINARY_FLOAT:
+      t = jj_consume_token(K_BINARY_FLOAT);
+      break;
+    case K_BINARY_INTEGER:
+      t = jj_consume_token(K_BINARY_INTEGER);
+      break;
+    case K_BLOB:
+      t = jj_consume_token(K_BLOB);
+      break;
+    case K_BOOLEAN:
+      t = jj_consume_token(K_BOOLEAN);
+      break;
+    case K_BYTE:
+      t = jj_consume_token(K_BYTE);
+      break;
+    case K_CHAR:
+      t = jj_consume_token(K_CHAR);
+      break;
+    case K_CHARACTER:
+      t = jj_consume_token(K_CHARACTER);
+      break;
+    case K_CLOB:
+      t = jj_consume_token(K_CLOB);
+      break;
+    case K_COMMIT:
+      t = jj_consume_token(K_COMMIT);
+      break;
+    case K_CONSTANT:
+      t = jj_consume_token(K_CONSTANT);
+      break;
+    case K_CURRENT_USER:
+      t = jj_consume_token(K_CURRENT_USER);
+      break;
+    case K_DATE:
+      t = jj_consume_token(K_DATE);
+      break;
+    case K_DAY:
+      t = jj_consume_token(K_DAY);
+      break;
+    case K_DEC:
+      t = jj_consume_token(K_DEC);
+      break;
+    case K_DECIMAL:
+      t = jj_consume_token(K_DECIMAL);
+      break;
+    case K_DEFINER:
+      t = jj_consume_token(K_DEFINER);
+      break;
+    case K_DELETE:
+      t = jj_consume_token(K_DELETE);
+      break;
+    case K_DETERMINISTIC:
+      t = jj_consume_token(K_DETERMINISTIC);
+      break;
+    case K_DOUBLE:
+      t = jj_consume_token(K_DOUBLE);
+      break;
+    case K_ENABLE:
+      t = jj_consume_token(K_ENABLE);
+      break;
+    case K_FINAL:
+      t = jj_consume_token(K_FINAL);
+      break;
+    case K_FLOAT:
+      t = jj_consume_token(K_FLOAT);
+      break;
+    case K_FORCE:
+      t = jj_consume_token(K_FORCE);
+      break;
+    case K_GLOBAL:
+      t = jj_consume_token(K_GLOBAL);
+      break;
+    case K_INSTANTIABLE:
+      t = jj_consume_token(K_INSTANTIABLE);
+      break;
+    case K_INT:
+      t = jj_consume_token(K_INT);
+      break;
+    case K_INTEGER:
+      t = jj_consume_token(K_INTEGER);
+      break;
+    case K_INTERVAL:
+      t = jj_consume_token(K_INTERVAL);
+      break;
+    case K_KEY:
+      t = jj_consume_token(K_KEY);
+      break;
+    case K_LOCAL:
+      t = jj_consume_token(K_LOCAL);
+      break;
+    case K_LONG:
+      t = jj_consume_token(K_LONG);
+      break;
+    case K_MLSLABEL:
+      t = jj_consume_token(K_MLSLABEL);
+      break;
+    case K_MONTH:
+      t = jj_consume_token(K_MONTH);
+      break;
+    case K_NATIONAL:
+      t = jj_consume_token(K_NATIONAL);
+      break;
+    case K_NATURAL:
+      t = jj_consume_token(K_NATURAL);
+      break;
+    case K_NCHAR:
+      t = jj_consume_token(K_NCHAR);
+      break;
+    case K_NCLOB:
+      t = jj_consume_token(K_NCLOB);
+      break;
+    case K_NOCOPY:
+      t = jj_consume_token(K_NOCOPY);
+      break;
+    case K_NUMBER:
+      t = jj_consume_token(K_NUMBER);
+      break;
+    case K_NUMERIC:
+      t = jj_consume_token(K_NUMERIC);
+      break;
+    case K_NVARCHAR2:
+      t = jj_consume_token(K_NVARCHAR2);
+      break;
+    case K_NVARCHAR:
+      t = jj_consume_token(K_NVARCHAR);
+      break;
+    case K_OBJECT:
+      t = jj_consume_token(K_OBJECT);
+      break;
+    case K_OID:
+      t = jj_consume_token(K_OID);
+      break;
+    case K_ORGANIZATION:
+      t = jj_consume_token(K_ORGANIZATION);
+      break;
+    case K_OUT:
+      t = jj_consume_token(K_OUT);
+      break;
+    case K_OVERFLOW:
+      t = jj_consume_token(K_OVERFLOW);
+      break;
+    case K_PACKAGE:
+      t = jj_consume_token(K_PACKAGE);
+      break;
+    case K_PARALLEL_ENABLE:
+      t = jj_consume_token(K_PARALLEL_ENABLE);
+      break;
+    case K_PIPELINED:
+      t = jj_consume_token(K_PIPELINED);
+      break;
+    case K_PLS_INTEGER:
+      t = jj_consume_token(K_PLS_INTEGER);
+      break;
+    case K_POSITIVE:
+      t = jj_consume_token(K_POSITIVE);
+      break;
+    case K_PRAGMA:
+      t = jj_consume_token(K_PRAGMA);
+      break;
+    case K_PRECISION:
+      t = jj_consume_token(K_PRECISION);
+      break;
+    case K_PRESERVE:
+      t = jj_consume_token(K_PRESERVE);
+      break;
+    case K_RANGE:
+      t = jj_consume_token(K_RANGE);
+      break;
+    case K_RAW:
+      t = jj_consume_token(K_RAW);
+      break;
+    case K_REAL:
+      t = jj_consume_token(K_REAL);
+      break;
+    case K_RECORD:
+      t = jj_consume_token(K_RECORD);
+      break;
+    case K_REF:
+      t = jj_consume_token(K_REF);
+      break;
+    case K_REPLACE:
+      t = jj_consume_token(K_REPLACE);
+      break;
+    case K_RESULT_CACHE:
+      t = jj_consume_token(K_RESULT_CACHE);
+      break;
+    case K_RETURN:
+      t = jj_consume_token(K_RETURN);
+      break;
+    case K_ROWID:
+      t = jj_consume_token(K_ROWID);
+      break;
+    case K_ROWS:
+      t = jj_consume_token(K_ROWS);
+      break;
+    case K_SECOND:
+      t = jj_consume_token(K_SECOND);
+      break;
+    case K_SET:
+      t = jj_consume_token(K_SET);
+      break;
+    case K_SIGNTYPE:
+      t = jj_consume_token(K_SIGNTYPE);
+      break;
+    case K_SIMPLE_DOUBLE:
+      t = jj_consume_token(K_SIMPLE_DOUBLE);
+      break;
+    case K_SIMPLE_FLOAT:
+      t = jj_consume_token(K_SIMPLE_FLOAT);
+      break;
+    case K_SIMPLE_INTEGER:
+      t = jj_consume_token(K_SIMPLE_INTEGER);
+      break;
+    case K_SMALLINT:
+      t = jj_consume_token(K_SMALLINT);
+      break;
+    case K_STRING:
+      t = jj_consume_token(K_STRING);
+      break;
+    case K_SYS_REFCURSOR:
+      t = jj_consume_token(K_SYS_REFCURSOR);
+      break;
+    case K_TEMPORARY:
+      t = jj_consume_token(K_TEMPORARY);
+      break;
+    case K_TIME:
+      t = jj_consume_token(K_TIME);
+      break;
+    case K_TIMESTAMP:
+      t = jj_consume_token(K_TIMESTAMP);
+      break;
+    case K_UROWID:
+      t = jj_consume_token(K_UROWID);
+      break;
+    case K_VARCHAR2:
+      t = jj_consume_token(K_VARCHAR2);
+      break;
+    case K_VARCHAR:
+      t = jj_consume_token(K_VARCHAR);
+      break;
+    case K_VARRAY:
+      t = jj_consume_token(K_VARRAY);
+      break;
+    case K_VARYING:
+      t = jj_consume_token(K_VARYING);
+      break;
+    case K_YEAR:
+      t = jj_consume_token(K_YEAR);
+      break;
+    case K_ZONE:
+      t = jj_consume_token(K_ZONE);
+      break;
+    default:
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+      {if (true) return t.image;}
+    throw new Error("Missing return statement in function");
+  }
+
 // 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 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_ARRAY:
-      case K_AUTHID:
-      case K_BFILE:
-      case K_BINARY_DOUBLE:
-      case K_BINARY_FLOAT:
-      case K_BINARY_INTEGER:
-      case K_BLOB:
-      case K_BOOLEAN:
-      case K_BYTE:
-      case K_CHAR:
-      case K_CHARACTER:
-      case K_CLOB:
-      case K_COMMIT:
-      case K_CONSTANT:
-      case K_CURRENT_USER:
-      case K_DATE:
-      case K_DAY:
-      case K_DEC:
-      case K_DECIMAL:
-      case K_DEFINER:
-      case K_DELETE:
-      case K_DETERMINISTIC:
-      case K_DOUBLE:
-      case K_ENABLE:
-      case K_FINAL:
-      case K_FLOAT:
-      case K_FORCE:
-      case K_GLOBAL:
-      case K_INSTANTIABLE:
-      case K_INT:
-      case K_INTEGER:
-      case K_INTERVAL:
-      case K_KEY:
-      case K_LOCAL:
-      case K_LONG:
-      case K_MLSLABEL:
-      case K_MONTH:
-      case K_NATIONAL:
-      case K_NATURAL:
-      case K_NCHAR:
-      case K_NCLOB:
-      case K_NOCOPY:
-      case K_NUMBER:
-      case K_NUMERIC:
-      case K_NVARCHAR2:
-      case K_NVARCHAR:
-      case K_OBJECT:
-      case K_OID:
-      case K_ORGANIZATION:
-      case K_OUT:
-      case K_OVERFLOW:
-      case K_PACKAGE:
-      case K_PARALLEL_ENABLE:
-      case K_PIPELINED:
-      case K_PLS_INTEGER:
-      case K_POSITIVE:
-      case K_PRAGMA:
-      case K_PRECISION:
-      case K_PRESERVE:
-      case K_RANGE:
-      case K_RAW:
-      case K_REAL:
-      case K_RECORD:
-      case K_REF:
-      case K_REPLACE:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SET:
-      case K_SIGNTYPE:
-      case K_SIMPLE_DOUBLE:
-      case K_SIMPLE_FLOAT:
-      case K_SIMPLE_INTEGER:
-      case K_SMALLINT:
-      case K_STRING:
-      case K_SYS_REFCURSOR:
-      case K_TEMPORARY:
-      case K_TIME:
-      case K_TIMESTAMP:
-      case K_UROWID:
-      case K_VARCHAR2:
-      case K_VARCHAR:
-      case K_VARRAY:
-      case K_VARYING:
-      case K_YEAR:
-      case K_ZONE:
-      case S_IDENTIFIER:
-      case S_QUOTED_IDENTIFIER:
-        ;
-        break;
-      default:
-        break label_1;
-      }
-      packageDeclaration(packageType);
-    }
-    jj_consume_token(R_END);
-    skipToEnd();
-      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_ARRAY:
+      case K_AUTHID:
+      case K_BFILE:
+      case K_BINARY_DOUBLE:
+      case K_BINARY_FLOAT:
+      case K_BINARY_INTEGER:
+      case K_BLOB:
+      case K_BOOLEAN:
+      case K_BYTE:
+      case K_CHAR:
+      case K_CHARACTER:
+      case K_CLOB:
+      case K_COMMIT:
+      case K_CONSTANT:
+      case K_CURRENT_USER:
+      case K_DATE:
+      case K_DAY:
+      case K_DEC:
+      case K_DECIMAL:
+      case K_DEFINER:
+      case K_DELETE:
+      case K_DETERMINISTIC:
+      case K_DOUBLE:
+      case K_ENABLE:
+      case K_FINAL:
+      case K_FLOAT:
+      case K_FORCE:
+      case K_GLOBAL:
+      case K_INSTANTIABLE:
+      case K_INT:
+      case K_INTEGER:
+      case K_INTERVAL:
+      case K_KEY:
+      case K_LOCAL:
+      case K_LONG:
+      case K_MLSLABEL:
+      case K_MONTH:
+      case K_NATIONAL:
+      case K_NATURAL:
+      case K_NCHAR:
+      case K_NCLOB:
+      case K_NOCOPY:
+      case K_NUMBER:
+      case K_NUMERIC:
+      case K_NVARCHAR2:
+      case K_NVARCHAR:
+      case K_OBJECT:
+      case K_OID:
+      case K_ORGANIZATION:
+      case K_OUT:
+      case K_OVERFLOW:
+      case K_PACKAGE:
+      case K_PARALLEL_ENABLE:
+      case K_PIPELINED:
+      case K_PLS_INTEGER:
+      case K_POSITIVE:
+      case K_PRAGMA:
+      case K_PRECISION:
+      case K_PRESERVE:
+      case K_RANGE:
+      case K_RAW:
+      case K_REAL:
+      case K_RECORD:
+      case K_REF:
+      case K_REPLACE:
+      case K_RESULT_CACHE:
+      case K_RETURN:
+      case K_ROWID:
+      case K_ROWS:
+      case K_SECOND:
+      case K_SET:
+      case K_SIGNTYPE:
+      case K_SIMPLE_DOUBLE:
+      case K_SIMPLE_FLOAT:
+      case K_SIMPLE_INTEGER:
+      case K_SMALLINT:
+      case K_STRING:
+      case K_SYS_REFCURSOR:
+      case K_TEMPORARY:
+      case K_TIME:
+      case K_TIMESTAMP:
+      case K_UROWID:
+      case K_VARCHAR2:
+      case K_VARCHAR:
+      case K_VARRAY:
+      case K_VARYING:
+      case K_YEAR:
+      case K_ZONE:
+      case S_IDENTIFIER:
+      case S_QUOTED_IDENTIFIER:
+        ;
+        break;
+      default:
+        break label_1;
+      }
+      packageDeclaration(packageType);
+    }
+    jj_consume_token(R_END);
+    skipToEnd();
+      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 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");
-  }
-
+  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 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");
-  }
-
+  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 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");
-  }
-
+  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 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 {
-    if (jj_2_1(2)) {
-      columnDeclaration(enclosingType);
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case R_CHECK:
-      case R_CONSTRAINT:
-      case R_PRIMARY:
-      case R_UNIQUE:
-      case K_ARRAY:
-      case K_AUTHID:
-      case K_BFILE:
-      case K_BINARY_DOUBLE:
-      case K_BINARY_FLOAT:
-      case K_BINARY_INTEGER:
-      case K_BLOB:
-      case K_BOOLEAN:
-      case K_BYTE:
-      case K_CHAR:
-      case K_CHARACTER:
-      case K_CLOB:
-      case K_COMMIT:
-      case K_CONSTANT:
-      case K_CURRENT_USER:
-      case K_DATE:
-      case K_DAY:
-      case K_DEC:
-      case K_DECIMAL:
-      case K_DEFINER:
-      case K_DELETE:
-      case K_DETERMINISTIC:
-      case K_DOUBLE:
-      case K_ENABLE:
-      case K_FINAL:
-      case K_FLOAT:
-      case K_FORCE:
-      case K_GLOBAL:
-      case K_INSTANTIABLE:
-      case K_INT:
-      case K_INTEGER:
-      case K_INTERVAL:
-      case K_KEY:
-      case K_LOCAL:
-      case K_LONG:
-      case K_MLSLABEL:
-      case K_MONTH:
-      case K_NATIONAL:
-      case K_NATURAL:
-      case K_NCHAR:
-      case K_NCLOB:
-      case K_NOCOPY:
-      case K_NUMBER:
-      case K_NUMERIC:
-      case K_NVARCHAR2:
-      case K_NVARCHAR:
-      case K_OBJECT:
-      case K_OID:
-      case K_ORGANIZATION:
-      case K_OUT:
-      case K_OVERFLOW:
-      case K_PACKAGE:
-      case K_PARALLEL_ENABLE:
-      case K_PIPELINED:
-      case K_PLS_INTEGER:
-      case K_POSITIVE:
-      case K_PRAGMA:
-      case K_PRECISION:
-      case K_PRESERVE:
-      case K_RANGE:
-      case K_RAW:
-      case K_REAL:
-      case K_RECORD:
-      case K_REF:
-      case K_REPLACE:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SET:
-      case K_SIGNTYPE:
-      case K_SIMPLE_DOUBLE:
-      case K_SIMPLE_FLOAT:
-      case K_SIMPLE_INTEGER:
-      case K_SMALLINT:
-      case K_STRING:
-      case K_SYS_REFCURSOR:
-      case K_TEMPORARY:
-      case K_TIME:
-      case K_TIMESTAMP:
-      case K_UROWID:
-      case K_VARCHAR2:
-      case K_VARCHAR:
-      case K_VARRAY:
-      case K_VARYING:
-      case K_YEAR:
-      case K_ZONE:
-      case S_IDENTIFIER:
-      case S_QUOTED_IDENTIFIER:
-        constraintDeclaration(enclosingType);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    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;
-    s = OracleObjectName();
-    columnType = columnTypeSpec(enclosingType);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_NOT:
-      notNull = notNull();
-      break;
-    default:
-      ;
-    }
-          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);
-              }
-          }
-          column.setEnclosedType(columnType);
-          if (columnType instanceof UnresolvedType) {
-              ((UnresolvedType)columnType).setOwningType(column);
-          }
-          if (notNull) {
-              column.setNotNull();
-          }
-  }
-
-  final public void constraintDeclaration(CompositeDatabaseType enclosingType) throws ParseException {
- String s = null;
- String pk = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_CONSTRAINT:
-      jj_consume_token(R_CONSTRAINT);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_ARRAY:
-    case K_AUTHID:
-    case K_BFILE:
-    case K_BINARY_DOUBLE:
-    case K_BINARY_FLOAT:
-    case K_BINARY_INTEGER:
-    case K_BLOB:
-    case K_BOOLEAN:
-    case K_BYTE:
-    case K_CHAR:
-    case K_CHARACTER:
-    case K_CLOB:
-    case K_COMMIT:
-    case K_CONSTANT:
-    case K_CURRENT_USER:
-    case K_DATE:
-    case K_DAY:
-    case K_DEC:
-    case K_DECIMAL:
-    case K_DEFINER:
-    case K_DELETE:
-    case K_DETERMINISTIC:
-    case K_DOUBLE:
-    case K_ENABLE:
-    case K_FINAL:
-    case K_FLOAT:
-    case K_FORCE:
-    case K_GLOBAL:
-    case K_INSTANTIABLE:
-    case K_INT:
-    case K_INTEGER:
-    case K_INTERVAL:
-    case K_KEY:
-    case K_LOCAL:
-    case K_LONG:
-    case K_MLSLABEL:
-    case K_MONTH:
-    case K_NATIONAL:
-    case K_NATURAL:
-    case K_NCHAR:
-    case K_NCLOB:
-    case K_NOCOPY:
-    case K_NUMBER:
-    case K_NUMERIC:
-    case K_NVARCHAR2:
-    case K_NVARCHAR:
-    case K_OBJECT:
-    case K_OID:
-    case K_ORGANIZATION:
-    case K_OUT:
-    case K_OVERFLOW:
-    case K_PACKAGE:
-    case K_PARALLEL_ENABLE:
-    case K_PIPELINED:
-    case K_PLS_INTEGER:
-    case K_POSITIVE:
-    case K_PRAGMA:
-    case K_PRECISION:
-    case K_PRESERVE:
-    case K_RANGE:
-    case K_RAW:
-    case K_REAL:
-    case K_RECORD:
-    case K_REF:
-    case K_REPLACE:
-    case K_RESULT_CACHE:
-    case K_RETURN:
-    case K_ROWID:
-    case K_ROWS:
-    case K_SECOND:
-    case K_SET:
-    case K_SIGNTYPE:
-    case K_SIMPLE_DOUBLE:
-    case K_SIMPLE_FLOAT:
-    case K_SIMPLE_INTEGER:
-    case K_SMALLINT:
-    case K_STRING:
-    case K_SYS_REFCURSOR:
-    case K_TEMPORARY:
-    case K_TIME:
-    case K_TIMESTAMP:
-    case K_UROWID:
-    case K_VARCHAR2:
-    case K_VARCHAR:
-    case K_VARRAY:
-    case K_VARYING:
-    case K_YEAR:
-    case K_ZONE:
-    case S_IDENTIFIER:
-    case S_QUOTED_IDENTIFIER:
-      OracleObjectName();
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case R_PRIMARY:
-      jj_consume_token(R_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();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_ENABLE:
-      jj_consume_token(K_ENABLE);
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public DatabaseType columnTypeSpec(CompositeDatabaseType enclosingType) throws ParseException {
- String s = null;
- Token t = null;
- DatabaseType dt = null;
-    if (jj_2_2(2)) {
-      dt = datatype();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_ARRAY:
-      case K_AUTHID:
-      case K_BFILE:
-      case K_BINARY_DOUBLE:
-      case K_BINARY_FLOAT:
-      case K_BINARY_INTEGER:
-      case K_BLOB:
-      case K_BOOLEAN:
-      case K_BYTE:
-      case K_CHAR:
-      case K_CHARACTER:
-      case K_CLOB:
-      case K_COMMIT:
-      case K_CONSTANT:
-      case K_CURRENT_USER:
-      case K_DATE:
-      case K_DAY:
-      case K_DEC:
-      case K_DECIMAL:
-      case K_DEFINER:
-      case K_DELETE:
-      case K_DETERMINISTIC:
-      case K_DOUBLE:
-      case K_ENABLE:
-      case K_FINAL:
-      case K_FLOAT:
-      case K_FORCE:
-      case K_GLOBAL:
-      case K_INSTANTIABLE:
-      case K_INT:
-      case K_INTEGER:
-      case K_INTERVAL:
-      case K_KEY:
-      case K_LOCAL:
-      case K_LONG:
-      case K_MLSLABEL:
-      case K_MONTH:
-      case K_NATIONAL:
-      case K_NATURAL:
-      case K_NCHAR:
-      case K_NCLOB:
-      case K_NOCOPY:
-      case K_NUMBER:
-      case K_NUMERIC:
-      case K_NVARCHAR2:
-      case K_NVARCHAR:
-      case K_OBJECT:
-      case K_OID:
-      case K_ORGANIZATION:
-      case K_OUT:
-      case K_OVERFLOW:
-      case K_PACKAGE:
-      case K_PARALLEL_ENABLE:
-      case K_PIPELINED:
-      case K_PLS_INTEGER:
-      case K_POSITIVE:
-      case K_PRAGMA:
-      case K_PRECISION:
-      case K_PRESERVE:
-      case K_RANGE:
-      case K_RAW:
-      case K_REAL:
-      case K_RECORD:
-      case K_REF:
-      case K_REPLACE:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SET:
-      case K_SIGNTYPE:
-      case K_SIMPLE_DOUBLE:
-      case K_SIMPLE_FLOAT:
-      case K_SIMPLE_INTEGER:
-      case K_SMALLINT:
-      case K_STRING:
-      case K_SYS_REFCURSOR:
-      case K_TEMPORARY:
-      case K_TIME:
-      case K_TIMESTAMP:
-      case K_UROWID:
-      case K_VARCHAR2:
-      case K_VARCHAR:
-      case K_VARRAY:
-      case K_VARYING:
-      case K_YEAR:
-      case K_ZONE:
-      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 R_CONSTRAINT:
-      jj_consume_token(R_CONSTRAINT);
-      jj_consume_token(S_QUOTED_IDENTIFIER);
-      break;
-    default:
-      ;
-    }
-      if (s != null) {
-          if (s.contains(".")) {
-              int dotIdx = s.indexOf(".");
-              String namePart1 = s.substring(0, dotIdx);
-              String namePart2 = s.substring(dotIdx+1, s.length());
-              if (enclosingType.isTableType()) {
-                 if (((TableType)enclosingType).getSchema().equals(namePart1)) {
-                     s = namePart2;
-                 }
-              }
-          }
-          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 {
-    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;
-    default:
-      if (jj_2_3(2)) {
-        variableDeclaration(packageType);
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case K_PRAGMA:
-          pragmaDeclaration();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    }
-  }
-
-  final public void variableDeclaration(PLSQLPackageType packageType) throws ParseException {
- String varName = null;
- DatabaseType varType=null;
-    varName = OracleObjectName();
-    if (jj_2_5(2)) {
-      jj_consume_token(R_EXCEPTION);
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_ARRAY:
-      case K_AUTHID:
-      case K_BFILE:
-      case K_BINARY_DOUBLE:
-      case K_BINARY_FLOAT:
-      case K_BINARY_INTEGER:
-      case K_BLOB:
-      case K_BOOLEAN:
-      case K_BYTE:
-      case K_CHAR:
-      case K_CHARACTER:
-      case K_CLOB:
-      case K_COMMIT:
-      case K_CONSTANT:
-      case K_CURRENT_USER:
-      case K_DATE:
-      case K_DAY:
-      case K_DEC:
-      case K_DECIMAL:
-      case K_DEFINER:
-      case K_DELETE:
-      case K_DETERMINISTIC:
-      case K_DOUBLE:
-      case K_ENABLE:
-      case K_FINAL:
-      case K_FLOAT:
-      case K_FORCE:
-      case K_GLOBAL:
-      case K_INSTANTIABLE:
-      case K_INT:
-      case K_INTEGER:
-      case K_INTERVAL:
-      case K_KEY:
-      case K_LOCAL:
-      case K_LONG:
-      case K_MLSLABEL:
-      case K_MONTH:
-      case K_NATIONAL:
-      case K_NATURAL:
-      case K_NCHAR:
-      case K_NCLOB:
-      case K_NOCOPY:
-      case K_NUMBER:
-      case K_NUMERIC:
-      case K_NVARCHAR2:
-      case K_NVARCHAR:
-      case K_OBJECT:
-      case K_OID:
-      case K_ORGANIZATION:
-      case K_OUT:
-      case K_OVERFLOW:
-      case K_PACKAGE:
-      case K_PARALLEL_ENABLE:
-      case K_PIPELINED:
-      case K_PLS_INTEGER:
-      case K_POSITIVE:
-      case K_PRAGMA:
-      case K_PRECISION:
-      case K_PRESERVE:
-      case K_RANGE:
-      case K_RAW:
-      case K_REAL:
-      case K_RECORD:
-      case K_REF:
-      case K_REPLACE:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SET:
-      case K_SIGNTYPE:
-      case K_SIMPLE_DOUBLE:
-      case K_SIMPLE_FLOAT:
-      case K_SIMPLE_INTEGER:
-      case K_SMALLINT:
-      case K_STRING:
-      case K_SYS_REFCURSOR:
-      case K_TEMPORARY:
-      case K_TIME:
-      case K_TIMESTAMP:
-      case K_UROWID:
-      case K_VARCHAR2:
-      case K_VARCHAR:
-      case K_VARRAY:
-      case K_VARYING:
-      case K_YEAR:
-      case K_ZONE:
-      case S_IDENTIFIER:
-      case S_QUOTED_IDENTIFIER:
-        if (jj_2_4(2)) {
-          jj_consume_token(K_CONSTANT);
-        } else {
-          ;
-        }
-        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:
-          ;
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    jj_consume_token(O_SEMICOLON);
-        FieldType variable = new FieldType(varName);
-        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 R_CHARSET:
-          jj_consume_token(R_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 R_CHARSET:
-          jj_consume_token(R_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 R_CHARSET:
-          jj_consume_token(R_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 R_CHARSET:
-          jj_consume_token(R_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;
-    if (jj_2_6(3)) {
-      dataType = datatype();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case K_ARRAY:
-      case K_AUTHID:
-      case K_BFILE:
-      case K_BINARY_DOUBLE:
-      case K_BINARY_FLOAT:
-      case K_BINARY_INTEGER:
-      case K_BLOB:
-      case K_BOOLEAN:
-      case K_BYTE:
-      case K_CHAR:
-      case K_CHARACTER:
-      case K_CLOB:
-      case K_COMMIT:
-      case K_CONSTANT:
-      case K_CURRENT_USER:
-      case K_DATE:
-      case K_DAY:
-      case K_DEC:
-      case K_DECIMAL:
-      case K_DEFINER:
-      case K_DELETE:
-      case K_DETERMINISTIC:
-      case K_DOUBLE:
-      case K_ENABLE:
-      case K_FINAL:
-      case K_FLOAT:
-      case K_FORCE:
-      case K_GLOBAL:
-      case K_INSTANTIABLE:
-      case K_INT:
-      case K_INTEGER:
-      case K_INTERVAL:
-      case K_KEY:
-      case K_LOCAL:
-      case K_LONG:
-      case K_MLSLABEL:
-      case K_MONTH:
-      case K_NATIONAL:
-      case K_NATURAL:
-      case K_NCHAR:
-      case K_NCLOB:
-      case K_NOCOPY:
-      case K_NUMBER:
-      case K_NUMERIC:
-      case K_NVARCHAR2:
-      case K_NVARCHAR:
-      case K_OBJECT:
-      case K_OID:
-      case K_ORGANIZATION:
-      case K_OUT:
-      case K_OVERFLOW:
-      case K_PACKAGE:
-      case K_PARALLEL_ENABLE:
-      case K_PIPELINED:
-      case K_PLS_INTEGER:
-      case K_POSITIVE:
-      case K_PRAGMA:
-      case K_PRECISION:
-      case K_PRESERVE:
-      case K_RANGE:
-      case K_RAW:
-      case K_REAL:
-      case K_RECORD:
-      case K_REF:
-      case K_REPLACE:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SET:
-      case K_SIGNTYPE:
-      case K_SIMPLE_DOUBLE:
-      case K_SIMPLE_FLOAT:
-      case K_SIMPLE_INTEGER:
-      case K_SMALLINT:
-      case K_STRING:
-      case K_SYS_REFCURSOR:
-      case K_TEMPORARY:
-      case K_TIME:
-      case K_TIMESTAMP:
-      case K_UROWID:
-      case K_VARCHAR2:
-      case K_VARCHAR:
-      case K_VARRAY:
-      case K_VARYING:
-      case K_YEAR:
-      case K_ZONE:
-      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);
-    spec = OracleObjectName();
-    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 + 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:
-      ;
-    }
-      //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);
-    skipToSemiColon();
-  }
-
+  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 {
+    if (jj_2_1(2)) {
+      columnDeclaration(enclosingType);
+    } else {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_CHECK:
+      case R_CONSTRAINT:
+      case R_PRIMARY:
+      case R_UNIQUE:
+      case K_ARRAY:
+      case K_AUTHID:
+      case K_BFILE:
+      case K_BINARY_DOUBLE:
+      case K_BINARY_FLOAT:
+      case K_BINARY_INTEGER:
+      case K_BLOB:
+      case K_BOOLEAN:
+      case K_BYTE:
+      case K_CHAR:
+      case K_CHARACTER:
+      case K_CLOB:
+      case K_COMMIT:
+      case K_CONSTANT:
+      case K_CURRENT_USER:
+      case K_DATE:
+      case K_DAY:
+      case K_DEC:
+      case K_DECIMAL:
+      case K_DEFINER:
+      case K_DELETE:
+      case K_DETERMINISTIC:
+      case K_DOUBLE:
+      case K_ENABLE:
+      case K_FINAL:
+      case K_FLOAT:
+      case K_FORCE:
+      case K_GLOBAL:
+      case K_INSTANTIABLE:
+      case K_INT:
+      case K_INTEGER:
+      case K_INTERVAL:
+      case K_KEY:
+      case K_LOCAL:
+      case K_LONG:
+      case K_MLSLABEL:
+      case K_MONTH:
+      case K_NATIONAL:
+      case K_NATURAL:
+      case K_NCHAR:
+      case K_NCLOB:
+      case K_NOCOPY:
+      case K_NUMBER:
+      case K_NUMERIC:
+      case K_NVARCHAR2:
+      case K_NVARCHAR:
+      case K_OBJECT:
+      case K_OID:
+      case K_ORGANIZATION:
+      case K_OUT:
+      case K_OVERFLOW:
+      case K_PACKAGE:
+      case K_PARALLEL_ENABLE:
+      case K_PIPELINED:
+      case K_PLS_INTEGER:
+      case K_POSITIVE:
+      case K_PRAGMA:
+      case K_PRECISION:
+      case K_PRESERVE:
+      case K_RANGE:
+      case K_RAW:
+      case K_REAL:
+      case K_RECORD:
+      case K_REF:
+      case K_REPLACE:
+      case K_RESULT_CACHE:
+      case K_RETURN:
+      case K_ROWID:
+      case K_ROWS:
+      case K_SECOND:
+      case K_SET:
+      case K_SIGNTYPE:
+      case K_SIMPLE_DOUBLE:
+      case K_SIMPLE_FLOAT:
+      case K_SIMPLE_INTEGER:
+      case K_SMALLINT:
+      case K_STRING:
+      case K_SYS_REFCURSOR:
+      case K_TEMPORARY:
+      case K_TIME:
+      case K_TIMESTAMP:
+      case K_UROWID:
+      case K_VARCHAR2:
+      case K_VARCHAR:
+      case K_VARRAY:
+      case K_VARYING:
+      case K_YEAR:
+      case K_ZONE:
+      case S_IDENTIFIER:
+      case S_QUOTED_IDENTIFIER:
+        constraintDeclaration(enclosingType);
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+    }
+    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;
+    s = OracleObjectName();
+    columnType = columnTypeSpec(enclosingType);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_NOT:
+      notNull = notNull();
+      break;
+    default:
+      ;
+    }
+          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);
+              }
+          }
+          column.setEnclosedType(columnType);
+          if (columnType instanceof UnresolvedType) {
+              ((UnresolvedType)columnType).setOwningType(column);
+          }
+          if (notNull) {
+              column.setNotNull();
+          }
+  }
+
+  final public void constraintDeclaration(CompositeDatabaseType enclosingType) throws ParseException {
+ String s = null;
+ String pk = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_CONSTRAINT:
+      jj_consume_token(R_CONSTRAINT);
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_ARRAY:
+    case K_AUTHID:
+    case K_BFILE:
+    case K_BINARY_DOUBLE:
+    case K_BINARY_FLOAT:
+    case K_BINARY_INTEGER:
+    case K_BLOB:
+    case K_BOOLEAN:
+    case K_BYTE:
+    case K_CHAR:
+    case K_CHARACTER:
+    case K_CLOB:
+    case K_COMMIT:
+    case K_CONSTANT:
+    case K_CURRENT_USER:
+    case K_DATE:
+    case K_DAY:
+    case K_DEC:
+    case K_DECIMAL:
+    case K_DEFINER:
+    case K_DELETE:
+    case K_DETERMINISTIC:
+    case K_DOUBLE:
+    case K_ENABLE:
+    case K_FINAL:
+    case K_FLOAT:
+    case K_FORCE:
+    case K_GLOBAL:
+    case K_INSTANTIABLE:
+    case K_INT:
+    case K_INTEGER:
+    case K_INTERVAL:
+    case K_KEY:
+    case K_LOCAL:
+    case K_LONG:
+    case K_MLSLABEL:
+    case K_MONTH:
+    case K_NATIONAL:
+    case K_NATURAL:
+    case K_NCHAR:
+    case K_NCLOB:
+    case K_NOCOPY:
+    case K_NUMBER:
+    case K_NUMERIC:
+    case K_NVARCHAR2:
+    case K_NVARCHAR:
+    case K_OBJECT:
+    case K_OID:
+    case K_ORGANIZATION:
+    case K_OUT:
+    case K_OVERFLOW:
+    case K_PACKAGE:
+    case K_PARALLEL_ENABLE:
+    case K_PIPELINED:
+    case K_PLS_INTEGER:
+    case K_POSITIVE:
+    case K_PRAGMA:
+    case K_PRECISION:
+    case K_PRESERVE:
+    case K_RANGE:
+    case K_RAW:
+    case K_REAL:
+    case K_RECORD:
+    case K_REF:
+    case K_REPLACE:
+    case K_RESULT_CACHE:
+    case K_RETURN:
+    case K_ROWID:
+    case K_ROWS:
+    case K_SECOND:
+    case K_SET:
+    case K_SIGNTYPE:
+    case K_SIMPLE_DOUBLE:
+    case K_SIMPLE_FLOAT:
+    case K_SIMPLE_INTEGER:
+    case K_SMALLINT:
+    case K_STRING:
+    case K_SYS_REFCURSOR:
+    case K_TEMPORARY:
+    case K_TIME:
+    case K_TIMESTAMP:
+    case K_UROWID:
+    case K_VARCHAR2:
+    case K_VARCHAR:
+    case K_VARRAY:
+    case K_VARYING:
+    case K_YEAR:
+    case K_ZONE:
+    case S_IDENTIFIER:
+    case S_QUOTED_IDENTIFIER:
+      OracleObjectName();
+      break;
+    default:
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case R_PRIMARY:
+      jj_consume_token(R_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();
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case K_ENABLE:
+      jj_consume_token(K_ENABLE);
+      break;
+    default:
+      ;
+    }
+  }
+
+  final public DatabaseType columnTypeSpec(CompositeDatabaseType enclosingType) throws ParseException {
+ String s = null;
+ Token t = null;
+ DatabaseType dt = null;
+    if (jj_2_2(2)) {
+      dt = datatype();
+    } else {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_ARRAY:
+      case K_AUTHID:
+      case K_BFILE:
+      case K_BINARY_DOUBLE:
+      case K_BINARY_FLOAT:
+      case K_BINARY_INTEGER:
+      case K_BLOB:
+      case K_BOOLEAN:
+      case K_BYTE:
+      case K_CHAR:
+      case K_CHARACTER:
+      case K_CLOB:
+      case K_COMMIT:
+      case K_CONSTANT:
+      case K_CURRENT_USER:
+      case K_DATE:
+      case K_DAY:
+      case K_DEC:
+      case K_DECIMAL:
+      case K_DEFINER:
+      case K_DELETE:
+      case K_DETERMINISTIC:
+      case K_DOUBLE:
+      case K_ENABLE:
+      case K_FINAL:
+      case K_FLOAT:
+      case K_FORCE:
+      case K_GLOBAL:
+      case K_INSTANTIABLE:
+      case K_INT:
+      case K_INTEGER:
+      case K_INTERVAL:
+      case K_KEY:
+      case K_LOCAL:
+      case K_LONG:
+      case K_MLSLABEL:
+      case K_MONTH:
+      case K_NATIONAL:
+      case K_NATURAL:
+      case K_NCHAR:
+      case K_NCLOB:
+      case K_NOCOPY:
+      case K_NUMBER:
+      case K_NUMERIC:
+      case K_NVARCHAR2:
+      case K_NVARCHAR:
+      case K_OBJECT:
+      case K_OID:
+      case K_ORGANIZATION:
+      case K_OUT:
+      case K_OVERFLOW:
+      case K_PACKAGE:
+      case K_PARALLEL_ENABLE:
+      case K_PIPELINED:
+      case K_PLS_INTEGER:
+      case K_POSITIVE:
+      case K_PRAGMA:
+      case K_PRECISION:
+      case K_PRESERVE:
+      case K_RANGE:
+      case K_RAW:
+      case K_REAL:
+      case K_RECORD:
+      case K_REF:
+      case K_REPLACE:
+      case K_RESULT_CACHE:
+      case K_RETURN:
+      case K_ROWID:
+      case K_ROWS:
+      case K_SECOND:
+      case K_SET:
+      case K_SIGNTYPE:
+      case K_SIMPLE_DOUBLE:
+      case K_SIMPLE_FLOAT:
+      case K_SIMPLE_INTEGER:
+      case K_SMALLINT:
+      case K_STRING:
+      case K_SYS_REFCURSOR:
+      case K_TEMPORARY:
+      case K_TIME:
+      case K_TIMESTAMP:
+      case K_UROWID:
+      case K_VARCHAR2:
+      case K_VARCHAR:
+      case K_VARRAY:
+      case K_VARYING:
+      case K_YEAR:
+      case K_ZONE:
+      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 R_CONSTRAINT:
+      jj_consume_token(R_CONSTRAINT);
+      jj_consume_token(S_QUOTED_IDENTIFIER);
+      break;
+    default:
+      ;
+    }
+      if (s != null) {
+          if (s.contains(".")) {
+              int dotIdx = s.indexOf(".");
+              String namePart1 = s.substring(0, dotIdx);
+              String namePart2 = s.substring(dotIdx+1, s.length());
+              if (enclosingType.isTableType()) {
+                 if (((TableType)enclosingType).getSchema().equals(namePart1)) {
+                     s = namePart2;
+                 }
+              }
+          }
+          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 {
+    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;
+    default:
+      if (jj_2_3(2)) {
+        variableDeclaration(packageType);
+      } else {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case K_PRAGMA:
+          pragmaDeclaration();
+          break;
+        default:
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+    }
+  }
+
+  final public void variableDeclaration(PLSQLPackageType packageType) throws ParseException {
+ String varName = null;
+ DatabaseType varType=null;
+    varName = OracleObjectName();
+    if (jj_2_5(2)) {
+      jj_consume_token(R_EXCEPTION);
+    } else {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_ARRAY:
+      case K_AUTHID:
+      case K_BFILE:
+      case K_BINARY_DOUBLE:
+      case K_BINARY_FLOAT:
+      case K_BINARY_INTEGER:
+      case K_BLOB:
+      case K_BOOLEAN:
+      case K_BYTE:
+      case K_CHAR:
+      case K_CHARACTER:
+      case K_CLOB:
+      case K_COMMIT:
+      case K_CONSTANT:
+      case K_CURRENT_USER:
+      case K_DATE:
+      case K_DAY:
+      case K_DEC:
+      case K_DECIMAL:
+      case K_DEFINER:
+      case K_DELETE:
+      case K_DETERMINISTIC:
+      case K_DOUBLE:
+      case K_ENABLE:
+      case K_FINAL:
+      case K_FLOAT:
+      case K_FORCE:
+      case K_GLOBAL:
+      case K_INSTANTIABLE:
+      case K_INT:
+      case K_INTEGER:
+      case K_INTERVAL:
+      case K_KEY:
+      case K_LOCAL:
+      case K_LONG:
+      case K_MLSLABEL:
+      case K_MONTH:
+      case K_NATIONAL:
+      case K_NATURAL:
+      case K_NCHAR:
+      case K_NCLOB:
+      case K_NOCOPY:
+      case K_NUMBER:
+      case K_NUMERIC:
+      case K_NVARCHAR2:
+      case K_NVARCHAR:
+      case K_OBJECT:
+      case K_OID:
+      case K_ORGANIZATION:
+      case K_OUT:
+      case K_OVERFLOW:
+      case K_PACKAGE:
+      case K_PARALLEL_ENABLE:
+      case K_PIPELINED:
+      case K_PLS_INTEGER:
+      case K_POSITIVE:
+      case K_PRAGMA:
+      case K_PRECISION:
+      case K_PRESERVE:
+      case K_RANGE:
+      case K_RAW:
+      case K_REAL:
+      case K_RECORD:
+      case K_REF:
+      case K_REPLACE:
+      case K_RESULT_CACHE:
+      case K_RETURN:
+      case K_ROWID:
+      case K_ROWS:
+      case K_SECOND:
+      case K_SET:
+      case K_SIGNTYPE:
+      case K_SIMPLE_DOUBLE:
+      case K_SIMPLE_FLOAT:
+      case K_SIMPLE_INTEGER:
+      case K_SMALLINT:
+      case K_STRING:
+      case K_SYS_REFCURSOR:
+      case K_TEMPORARY:
+      case K_TIME:
+      case K_TIMESTAMP:
+      case K_UROWID:
+      case K_VARCHAR2:
+      case K_VARCHAR:
+      case K_VARRAY:
+      case K_VARYING:
+      case K_YEAR:
+      case K_ZONE:
+      case S_IDENTIFIER:
+      case S_QUOTED_IDENTIFIER:
+        if (jj_2_4(2)) {
+          jj_consume_token(K_CONSTANT);
+        } else {
+          ;
+        }
+        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:
+          ;
+        }
+        break;
+      default:
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+    }
+    jj_consume_token(O_SEMICOLON);
+        FieldType variable = new FieldType(varName);
+        variable.setEnclosedType(varType);
+        packageType.addLocalVariable(variable);
+        if (varType.isROWTYPEType()) {
+            ((ROWTYPEType)varType).setPackageType(packageType);
+        }
+  }
+
+  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 R_CHARSET:
+          jj_consume_token(R_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 R_CHARSET:
+          jj_consume_token(R_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 R_CHARSET:
+          jj_consume_token(R_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 R_CHARSET:
+          jj_consume_token(R_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;
+    if (jj_2_6(3)) {
+      dataType = datatype();
+    } else {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case K_ARRAY:
+      case K_AUTHID:
+      case K_BFILE:
+      case K_BINARY_DOUBLE:
+      case K_BINARY_FLOAT:
+      case K_BINARY_INTEGER:
+      case K_BLOB:
+      case K_BOOLEAN:
+      case K_BYTE:
+      case K_CHAR:
+      case K_CHARACTER:
+      case K_CLOB:
+      case K_COMMIT:
+      case K_CONSTANT:
+      case K_CURRENT_USER:
+      case K_DATE:
+      case K_DAY:
+      case K_DEC:
+      case K_DECIMAL:
+      case K_DEFINER:
+      case K_DELETE:
+      case K_DETERMINISTIC:
+      case K_DOUBLE:
+      case K_ENABLE:
+      case K_FINAL:
+      case K_FLOAT:
+      case K_FORCE:
+      case K_GLOBAL:
+      case K_INSTANTIABLE:
+      case K_INT:
+      case K_INTEGER:
+      case K_INTERVAL:
+      case K_KEY:
+      case K_LOCAL:
+      case K_LONG:
+      case K_MLSLABEL:
+      case K_MONTH:
+      case K_NATIONAL:
+      case K_NATURAL:
+      case K_NCHAR:
+      case K_NCLOB:
+      case K_NOCOPY:
+      case K_NUMBER:
+      case K_NUMERIC:
+      case K_NVARCHAR2:
+      case K_NVARCHAR:
+      case K_OBJECT:
+      case K_OID:
+      case K_ORGANIZATION:
+      case K_OUT:
+      case K_OVERFLOW:
+      case K_PACKAGE:
+      case K_PARALLEL_ENABLE:
+      case K_PIPELINED:
+      case K_PLS_INTEGER:
+      case K_POSITIVE:
+      case K_PRAGMA:
+      case K_PRECISION:
+      case K_PRESERVE:
+      case K_RANGE:
+      case K_RAW:
+      case K_REAL:
+      case K_RECORD:
+      case K_REF:
+      case K_REPLACE:
+      case K_RESULT_CACHE:
+      case K_RETURN:
+      case K_ROWID:
+      case K_ROWS:
+      case K_SECOND:
+      case K_SET:
+      case K_SIGNTYPE:
+      case K_SIMPLE_DOUBLE:
+      case K_SIMPLE_FLOAT:
+      case K_SIMPLE_INTEGER:
+      case K_SMALLINT:
+      case K_STRING:
+      case K_SYS_REFCURSOR:
+      case K_TEMPORARY:
+      case K_TIME:
+      case K_TIMESTAMP:
+      case K_UROWID:
+      case K_VARCHAR2:
+      case K_VARCHAR:
+      case K_VARRAY:
+      case K_VARYING:
+      case K_YEAR:
+      case K_ZONE:
+      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 {
+ String spec = null;
+ String anchoredTypeName = null;
+ boolean isTYPEType = false;
+ boolean isROWTYPEType = false;
+    if (jj_2_7(2)) {
+      recordDeclaration(packageType, typeName);
+    } else {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case R_TABLE:
+        plsqlTableDeclaration(packageType, typeName);
+        break;
+      default:
+        if (jj_2_8(2)) {
+          varrayDeclaration(packageType);
+        } else if (jj_2_9(2)) {
+          refCursorDeclaration(packageType, typeName);
+        } else if (jj_2_10(2)) {
+          spec = columnSpec();
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case R_ANCHORED_TYPE:
+            jj_consume_token(R_ANCHORED_TYPE);
+            isTYPEType=true;
+            anchoredTypeName = spec + removeQuotes(tokenImage[R_ANCHORED_TYPE]);
+            break;
+          case R_ANCHORED_ROWTYPE:
+            jj_consume_token(R_ANCHORED_ROWTYPE);
+            isROWTYPEType =true;
+            anchoredTypeName = spec + removeQuotes(tokenImage[R_ANCHORED_ROWTYPE]);
+            break;
+          default:
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+         DatabaseType dataType = null;
+         UnresolvedType uType = new UnresolvedType(anchoredTypeName);
+         if (isTYPEType) {
+             TYPEType tType = new TYPEType(anchoredTypeName);
+             tType.setEnclosedType(uType);
+             uType.setOwningType(tType);
+             dataType = tType;
+         }
+         else if (isROWTYPEType) {
+             ROWTYPEType rType = new ROWTYPEType(anchoredTypeName);
+             rType.setEnclosedType(uType);
+             rType.setPackageType(packageType);
+             uType.setOwningType(rType);
+             dataType = rType;
+         }
+         PLSQLType newType = new PLSQLType(typeName);
+         newType.setEnclosedType(dataType);
+         packageType.addType(newType);
+         localTypes.put(typeName, newType);
+        } else {
+          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);
+      }
+      if (subtype.isROWTYPEType()) {
+         ((ROWTYPEType)subtype).setPackageType(packageType);
+      }
+      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);
+    spec = OracleObjectName();
+    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 + 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:
+      ;
+    }
+      //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);
+                      rType.setPackageType(packageType);
+                      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);
+                  rType.setPackageType(packageType);
+                  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);
+    skipToSemiColon();
+  }
+
 // Procedure Specification
-  final public void procedureSpec(PLSQLPackageType packageType) throws ParseException {
- String procedureName= null;
- ProcedureType procedureType = null;
-    jj_consume_token(R_PROCEDURE);
-    procedureName = OracleObjectName();
-            procedureType = new ProcedureType(procedureName);
-            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 {
+ String procedureName= null;
+ ProcedureType procedureType = null;
+    jj_consume_token(R_PROCEDURE);
+    procedureName = OracleObjectName();
+            procedureType = new ProcedureType(procedureName);
+            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);
+      for (ArgumentType argumentType : procedureType.getArguments()) {
+          DatabaseType databaseType = argumentType.getEnclosedType();
+          if (databaseType.isROWTYPEType()) {
+              ((ROWTYPEType)databaseType).setPackageType(packageType);
+          }
+      }
+  }
+
+  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 {
- String functionName= null;
- FunctionType functionType = null;
- ArgumentType returnDataType = null;
-    jj_consume_token(R_FUNCTION);
-    functionName = OracleObjectName();
-            functionType = new FunctionType(functionName);
-            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 {
- String s = null;
- ArgumentType argumentType = null;
- DatabaseType argumentDataType = null;
+  final public void functionSpec(PLSQLPackageType packageType) throws ParseException {
+ String functionName= null;
+ FunctionType functionType = null;
+ ArgumentType returnDataType = null;
+    jj_consume_token(R_FUNCTION);
+    functionName = OracleObjectName();
+            functionType = new FunctionType(functionName);
+            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);
+      for (ArgumentType argumentType : functionType.getArguments()) {
+          DatabaseType databaseType = argumentType.getEnclosedType();
+          if (databaseType.isROWTYPEType()) {
+              ((ROWTYPEType)databaseType).setPackageType(packageType);
+          }
+      }
+      if (returnDataType.getEnclosedType().isROWTYPEType()) {
+          ((ROWTYPEType)returnDataType.getEnclosedType()).setPackageType(packageType);
+      }
+  }
+
+  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 {
+ String s = null;
+ ArgumentType argumentType = null;
+ DatabaseType argumentDataType = null;
  ArgumentTypeDirection argDirection = ArgumentTypeDirection.IN; // by default, arguments are IN
- String direction = null;
- boolean defaultAssignment = false;
-    s = OracleObjectName();
-    if (jj_2_7(2)) {
-      direction = direction();
-    } else {
-      ;
-    }
-    if (jj_2_8(2)) {
-      jj_consume_token(K_NOCOPY);
-    } else {
-      ;
-    }
-    argumentDataType = typeSpec();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_ASSIGN:
-    case R_DEFAULT:
-      defaultAssignment = argumentDefaultAssignment();
-      break;
-    default:
-      ;
-    }
-      argumentType = new ArgumentType(s);
-      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);
-    skipToSemiColon();
-  }
-
-  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 boolean notNull() throws ParseException {
-    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:
-      ;
-    }
-      {if (true) return true;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public String direction() throws ParseException {
- String dir = "";
-    if (jj_2_10(2)) {
-      jj_consume_token(R_IN);
-                dir = "IN";
-      if (jj_2_9(2)) {
-        jj_consume_token(K_OUT);
-                                                     dir += " OUT";
-      } else {
-        ;
-      }
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      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 {
- String keyword=null;
-    if (jj_2_11(2)) {
-      keyword = keywords();
-                          {if (true) return keyword;}
-    } else {
-      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_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_3R_51() {
-    if (jj_scan_token(K_NATIONAL)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(138)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(137)) return true;
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(213)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_79()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_24() {
-    if (jj_scan_token(K_INTERVAL)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_61()) {
-    jj_scanpos = xsp;
-    if (jj_3R_62()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_75() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) 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_60() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_50() {
-    if (jj_scan_token(K_NVARCHAR2)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_76()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_74() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_9() {
-    if (jj_scan_token(K_OUT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_57() {
-    if (jj_3R_80()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_59() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    if (jj_3R_7()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_83() {
-    if (jj_scan_token(O_COMMA)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_21() {
-    if (jj_scan_token(K_RAW)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_60()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_49() {
-    if (jj_scan_token(K_NVARCHAR)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_75()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_12() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_2()) {
-    jj_scanpos = xsp;
-    if (jj_3R_57()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_56() {
-    if (jj_scan_token(S_QUOTED_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_55() {
-    if (jj_scan_token(S_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_11() {
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_11() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_11()) {
-    jj_scanpos = xsp;
-    if (jj_3R_55()) {
-    jj_scanpos = xsp;
-    if (jj_3R_56()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_73() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_54() {
-    if (jj_scan_token(K_OUT)) return true;
-    return false;
-  }
-
-  private boolean jj_3_10() {
-    if (jj_scan_token(R_IN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_9()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_20() {
-    if (jj_scan_token(K_LONG)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(188)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_59()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_9() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_10()) {
-    jj_scanpos = xsp;
-    if (jj_3R_54()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_48() {
-    if (jj_scan_token(K_NCHAR)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(213)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_74()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_71() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_69() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_6() {
-    if (jj_3R_11()) return true;
-    if (jj_3R_12()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_47() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(213)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_73()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_82() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(9)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(35)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_72() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_1() {
-    if (jj_3R_6()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_46() {
-    if (jj_scan_token(K_VARCHAR2)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(213)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_71()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_72()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_67() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_70() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_58() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_82()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_83()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(O_CLOSEPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_45() {
-    if (jj_scan_token(K_VARCHAR)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(213)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_69()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_70()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_19() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(170)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(171)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(146)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(145)) return true;
-    }
-    }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_58()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_18() {
-    if (jj_scan_token(K_SIGNTYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_17() {
-    if (jj_scan_token(K_POSITIVE)) return true;
-    return false;
-  }
-
-  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_13() {
-    if (jj_scan_token(K_BINARY_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_7() {
-    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_80() {
-    if (jj_3R_11()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_68() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_7() {
-    if (jj_3R_9()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_66() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_44() {
-    if (jj_scan_token(K_CHAR)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(213)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_67()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_68()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_43() {
-    if (jj_scan_token(K_DOUBLE)) return true;
-    if (jj_scan_token(K_PRECISION)) return true;
-    return false;
-  }
-
-  private boolean jj_3_4() {
-    if (jj_scan_token(K_CONSTANT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_42() {
-    if (jj_scan_token(K_UROWID)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_66()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_8() {
-    if (jj_scan_token(K_NOCOPY)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_53() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_4()) jj_scanpos = xsp;
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_41() {
-    if (jj_scan_token(K_ROWID)) return true;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_scan_token(R_EXCEPTION)) 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_34() {
-    if (jj_scan_token(K_SIMPLE_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_79() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_33() {
-    if (jj_scan_token(K_PLS_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_8() {
-    if (jj_3R_11()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_5()) {
-    jj_scanpos = xsp;
-    if (jj_3R_53()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_32() {
-    if (jj_scan_token(K_MLSLABEL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_65() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_31() {
-    if (jj_scan_token(K_REAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3_3() {
-    if (jj_3R_8()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_30() {
-    if (jj_scan_token(K_FLOAT)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_65()) jj_scanpos = xsp;
-    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_63() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_81() {
-    if (jj_3R_80()) return true;
-    return false;
-  }
-
-  private boolean jj_3_6() {
-    if (jj_3R_7()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_85() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_77() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_64() {
-    if (jj_scan_token(R_WITH)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(161)) jj_scanpos = xsp;
-    if (jj_scan_token(K_TIME)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_78() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_6()) {
-    jj_scanpos = xsp;
-    if (jj_3R_81()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_26() {
-    if (jj_scan_token(K_TIMESTAMP)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_63()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_64()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_25() {
-    if (jj_scan_token(K_TIME)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_62() {
-    if (jj_scan_token(K_YEAR)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_85()) jj_scanpos = xsp;
-    if (jj_scan_token(R_TO)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_52() {
-    if (jj_scan_token(K_CLOB)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_77()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_84() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_10() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(128)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(129)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(130)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(131)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(132)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(133)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(134)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(135)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(136)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(137)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(138)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(139)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(140)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(141)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(142)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(143)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(144)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(145)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(146)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(147)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(148)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(149)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(150)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(151)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(152)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(153)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(154)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(155)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(156)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(157)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(158)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(159)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(160)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(161)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(162)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(163)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(164)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(165)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(166)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(167)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(168)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(169)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(170)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(171)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(172)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(173)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(174)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(175)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(176)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(177)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(178)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(179)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(180)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(181)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(182)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(183)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(184)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(185)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(186)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(187)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(188)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(189)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(190)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(191)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(192)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(193)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(194)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(195)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(196)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(197)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(198)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(199)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(200)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(201)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(202)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(203)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(204)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(205)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(206)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(207)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(208)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(209)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(210)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(211)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(212)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(213)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(214)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(215)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_76() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_61() {
-    if (jj_scan_token(K_DAY)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_84()) jj_scanpos = xsp;
-    if (jj_scan_token(R_TO)) 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;
+    s = OracleObjectName();
+    if (jj_2_11(2)) {
+      direction = direction();
+    } else {
+      ;
+    }
+    if (jj_2_12(2)) {
+      jj_consume_token(K_NOCOPY);
+    } else {
+      ;
+    }
+    argumentDataType = typeSpec();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case O_ASSIGN:
+    case R_DEFAULT:
+      defaultAssignment = argumentDefaultAssignment();
+      break;
+    default:
+      ;
+    }
+      argumentType = new ArgumentType(s);
+      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);
+    skipToSemiColon();
+  }
+
+  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 boolean notNull() throws ParseException {
+    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:
+      ;
+    }
+      {if (true) return true;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String direction() throws ParseException {
+ String dir = "";
+    if (jj_2_14(2)) {
+      jj_consume_token(R_IN);
+                dir = "IN";
+      if (jj_2_13(2)) {
+        jj_consume_token(K_OUT);
+                                                     dir += " OUT";
+      } else {
+        ;
+      }
+    } else {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      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 {
+ String keyword=null;
+    if (jj_2_15(2)) {
+      keyword = keywords();
+                          {if (true) return keyword;}
+    } else {
+      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_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_3R_57() {
+    if (jj_scan_token(K_NATIONAL)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(138)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(137)) return true;
+    }
+    xsp = jj_scanpos;
+    if (jj_scan_token(213)) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_87()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_30() {
+    if (jj_scan_token(K_INTERVAL)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_69()) {
+    jj_scanpos = xsp;
+    if (jj_3R_70()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_83() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_29() {
+    if (jj_scan_token(K_DATE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_28() {
+    if (jj_scan_token(K_BOOLEAN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_9() {
+    if (jj_scan_token(K_RECORD)) return true;
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_68() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_56() {
+    if (jj_scan_token(K_NVARCHAR2)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_84()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_82() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_67() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_90() {
+    if (jj_scan_token(O_COMMA)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_65() {
+    if (jj_3R_12()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_27() {
+    if (jj_scan_token(K_RAW)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_68()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3_2() {
+    if (jj_3R_7()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_55() {
+    if (jj_scan_token(K_NVARCHAR)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_83()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_18() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_2()) {
+    jj_scanpos = xsp;
+    if (jj_3R_65()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_81() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_14() {
+    if (jj_scan_token(R_ANCHORED_ROWTYPE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_26() {
+    if (jj_scan_token(K_LONG)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(188)) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_67()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_54() {
+    if (jj_scan_token(K_NCHAR)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(213)) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_82()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_13() {
+    if (jj_scan_token(R_ANCHORED_TYPE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_79() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3_11() {
+    if (jj_3R_15()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_60() {
+    if (jj_scan_token(K_VARYING)) return true;
+    if (jj_scan_token(K_ARRAY)) return true;
+    return false;
+  }
+
+  private boolean jj_3_10() {
+    if (jj_3R_12()) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_13()) {
+    jj_scanpos = xsp;
+    if (jj_3R_14()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3_9() {
+    if (jj_3R_11()) return true;
+    return false;
+  }
+
+  private boolean jj_3_8() {
+    if (jj_3R_10()) return true;
+    return false;
+  }
+
+  private boolean jj_3_7() {
+    if (jj_3R_9()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_11() {
+    if (jj_scan_token(K_REF)) return true;
+    if (jj_scan_token(R_CURSOR)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_77() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3_12() {
+    if (jj_scan_token(K_NOCOPY)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_10() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(212)) {
+    jj_scanpos = xsp;
+    if (jj_3R_60()) return true;
+    }
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_53() {
+    if (jj_scan_token(K_CHARACTER)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(213)) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_81()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_6() {
+    if (jj_3R_17()) return true;
+    if (jj_3R_18()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_89() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(9)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(35)) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_80() {
+    if (jj_scan_token(K_CHARACTER)) return true;
+    if (jj_scan_token(K_SET)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_52() {
+    if (jj_scan_token(K_VARCHAR2)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(213)) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_79()) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_80()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3_1() {
+    if (jj_3R_6()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_75() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_61() {
+    if (jj_scan_token(O_DOT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_78() {
+    if (jj_scan_token(K_CHARACTER)) return true;
+    if (jj_scan_token(K_SET)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_66() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_89()) jj_scanpos = xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_90()) { jj_scanpos = xsp; break; }
+    }
+    if (jj_scan_token(O_CLOSEPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_51() {
+    if (jj_scan_token(K_VARCHAR)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(213)) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_77()) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_78()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_25() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(170)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(171)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(146)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(145)) return true;
+    }
+    }
+    }
+    xsp = jj_scanpos;
+    if (jj_3R_66()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_24() {
+    if (jj_scan_token(K_SIGNTYPE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_23() {
+    if (jj_scan_token(K_POSITIVE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_22() {
+    if (jj_scan_token(K_NATURAL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_21() {
+    if (jj_scan_token(K_BINARY_DOUBLE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_20() {
+    if (jj_scan_token(K_BINARY_FLOAT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_19() {
+    if (jj_scan_token(K_BINARY_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_7() {
+    Token xsp;
+    xsp = jj_scanpos;
+    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()) {
+    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()) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_76() {
+    if (jj_scan_token(K_CHARACTER)) return true;
+    if (jj_scan_token(K_SET)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_12() {
+    if (jj_3R_17()) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_61()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_74() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_50() {
+    if (jj_scan_token(K_CHAR)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(213)) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_75()) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_76()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_49() {
+    if (jj_scan_token(K_DOUBLE)) return true;
+    if (jj_scan_token(K_PRECISION)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_48() {
+    if (jj_scan_token(K_UROWID)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_74()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_47() {
+    if (jj_scan_token(K_ROWID)) return true;
+    return false;
+  }
+
+  private boolean jj_3_4() {
+    if (jj_scan_token(K_CONSTANT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_46() {
+    if (jj_scan_token(K_BFILE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_45() {
+    if (jj_scan_token(K_NCLOB)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_59() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_4()) jj_scanpos = xsp;
+    if (jj_3R_86()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_44() {
+    if (jj_scan_token(K_BLOB)) return true;
+    return false;
+  }
+
+  private boolean jj_3_5() {
+    if (jj_scan_token(R_EXCEPTION)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_43() {
+    if (jj_scan_token(K_SYS_REFCURSOR)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_42() {
+    if (jj_scan_token(K_SIMPLE_DOUBLE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_41() {
+    if (jj_scan_token(K_SIMPLE_FLOAT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_40() {
+    if (jj_scan_token(K_SIMPLE_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_87() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_39() {
+    if (jj_scan_token(K_PLS_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_73() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_38() {
+    if (jj_scan_token(K_MLSLABEL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_37() {
+    if (jj_scan_token(K_REAL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_8() {
+    if (jj_3R_17()) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_5()) {
+    jj_scanpos = xsp;
+    if (jj_3R_59()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3_3() {
+    if (jj_3R_8()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_36() {
+    if (jj_scan_token(K_FLOAT)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_73()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3_13() {
+    if (jj_scan_token(K_OUT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_35() {
+    if (jj_scan_token(K_SMALLINT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_34() {
+    if (jj_scan_token(K_INT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_33() {
+    if (jj_scan_token(K_INTEGER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_71() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_64() {
+    if (jj_scan_token(S_QUOTED_IDENTIFIER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_63() {
+    if (jj_scan_token(S_IDENTIFIER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_88() {
+    if (jj_3R_12()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_17() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_15()) {
+    jj_scanpos = xsp;
+    if (jj_3R_63()) {
+    jj_scanpos = xsp;
+    if (jj_3R_64()) return true;
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3_15() {
+    if (jj_3R_16()) return true;
+    return false;
+  }
+
+  private boolean jj_3_6() {
+    if (jj_3R_7()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_92() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_85() {
+    if (jj_scan_token(K_CHARACTER)) return true;
+    if (jj_scan_token(K_SET)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_72() {
+    if (jj_scan_token(R_WITH)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(161)) jj_scanpos = xsp;
+    if (jj_scan_token(K_TIME)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_86() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_6()) {
+    jj_scanpos = xsp;
+    if (jj_3R_88()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_32() {
+    if (jj_scan_token(K_TIMESTAMP)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_71()) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_72()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_62() {
+    if (jj_scan_token(K_OUT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_31() {
+    if (jj_scan_token(K_TIME)) return true;
+    return false;
+  }
+
+  private boolean jj_3_14() {
+    if (jj_scan_token(R_IN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_13()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_70() {
+    if (jj_scan_token(K_YEAR)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_92()) jj_scanpos = xsp;
+    if (jj_scan_token(R_TO)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_58() {
+    if (jj_scan_token(K_CLOB)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_85()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_15() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_14()) {
+    jj_scanpos = xsp;
+    if (jj_3R_62()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_91() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_84() {
+    if (jj_scan_token(O_OPENPAREN)) return true;
+    if (jj_scan_token(S_NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_16() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(128)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(129)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(130)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(131)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(132)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(133)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(134)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(135)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(136)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(137)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(138)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(139)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(140)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(141)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(142)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(143)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(144)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(145)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(146)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(147)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(148)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(149)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(150)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(151)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(152)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(153)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(154)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(155)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(156)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(157)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(158)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(159)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(160)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(161)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(162)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(163)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(164)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(165)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(166)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(167)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(168)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(169)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(170)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(171)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(172)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(173)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(174)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(175)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(176)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(177)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(178)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(179)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(180)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(181)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(182)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(183)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(184)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(185)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(186)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(187)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(188)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(189)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(190)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(191)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(192)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(193)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(194)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(195)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(196)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(197)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(198)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(199)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(200)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(201)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(202)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(203)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(204)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(205)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(206)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(207)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(208)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(209)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(210)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(211)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(212)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(213)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(214)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(215)) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_69() {
+    if (jj_scan_token(K_DAY)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_91()) jj_scanpos = xsp;
+    if (jj_scan_token(R_TO)) 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 f2c81e2..7e072ec 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 d1155ab..fe19e8e 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 e927d03..4100455 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,679 +10,679 @@
  *
  * 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_CHARSET = 51;
-  /** RegularExpression Id. */
-  int R_CHECK = 52;
-  /** RegularExpression Id. */
-  int R_CLUSTERS = 53;
-  /** RegularExpression Id. */
-  int R_CLUSTER = 54;
-  /** RegularExpression Id. */
-  int R_COLAUTH = 55;
-  /** RegularExpression Id. */
-  int R_COLUMNS = 56;
-  /** RegularExpression Id. */
-  int R_COMPRESS = 57;
-  /** RegularExpression Id. */
-  int R_CONNECT = 58;
-  /** RegularExpression Id. */
-  int R_CONSTRAINT = 59;
-  /** RegularExpression Id. */
-  int R_CRASH = 60;
-  /** RegularExpression Id. */
-  int R_CREATE = 61;
-  /** RegularExpression Id. */
-  int R_CURSOR = 62;
-  /** RegularExpression Id. */
-  int R_DECLARE = 63;
-  /** RegularExpression Id. */
-  int R_DEFAULT = 64;
-  /** RegularExpression Id. */
-  int R_DESC = 65;
-  /** RegularExpression Id. */
-  int R_DISTINCT = 66;
-  /** RegularExpression Id. */
-  int R_DROP = 67;
-  /** RegularExpression Id. */
-  int R_ELSE = 68;
-  /** RegularExpression Id. */
-  int R_END = 69;
-  /** RegularExpression Id. */
-  int R_EXCEPTION = 70;
-  /** RegularExpression Id. */
-  int R_EXCLUSIVE = 71;
-  /** RegularExpression Id. */
-  int R_FETCH = 72;
-  /** RegularExpression Id. */
-  int R_FOR = 73;
-  /** RegularExpression Id. */
-  int R_FROM = 74;
-  /** RegularExpression Id. */
-  int R_FUNCTION = 75;
-  /** RegularExpression Id. */
-  int R_GOTO = 76;
-  /** RegularExpression Id. */
-  int R_GRANT = 77;
-  /** RegularExpression Id. */
-  int R_GROUP = 78;
-  /** RegularExpression Id. */
-  int R_HAVING = 79;
-  /** RegularExpression Id. */
-  int R_IDENTIFIED = 80;
-  /** RegularExpression Id. */
-  int R_IF = 81;
-  /** RegularExpression Id. */
-  int R_IN = 82;
-  /** RegularExpression Id. */
-  int R_INDEX = 83;
-  /** RegularExpression Id. */
-  int R_INDEXES = 84;
-  /** RegularExpression Id. */
-  int R_INSERT = 85;
-  /** RegularExpression Id. */
-  int R_INTERSECT = 86;
-  /** RegularExpression Id. */
-  int R_INTO = 87;
-  /** RegularExpression Id. */
-  int R_IS = 88;
-  /** RegularExpression Id. */
-  int R_LIKE = 89;
-  /** RegularExpression Id. */
-  int R_LOCK = 90;
-  /** RegularExpression Id. */
-  int R_MINUS = 91;
-  /** RegularExpression Id. */
-  int R_MODE = 92;
-  /** RegularExpression Id. */
-  int R_NOCOMPRESS = 93;
-  /** RegularExpression Id. */
-  int R_NOT = 94;
-  /** RegularExpression Id. */
-  int R_NOWAIT = 95;
-  /** RegularExpression Id. */
-  int R_NULL = 96;
-  /** RegularExpression Id. */
-  int R_OF = 97;
-  /** RegularExpression Id. */
-  int R_ON = 98;
-  /** RegularExpression Id. */
-  int R_OPTION = 99;
-  /** RegularExpression Id. */
-  int R_OR = 100;
-  /** RegularExpression Id. */
-  int R_ORDER = 101;
-  /** RegularExpression Id. */
-  int R_OVERLAPS = 102;
-  /** RegularExpression Id. */
-  int R_PRIMARY = 103;
-  /** RegularExpression Id. */
-  int R_PROCEDURE = 104;
-  /** RegularExpression Id. */
-  int R_PUBLIC = 105;
-  /** RegularExpression Id. */
-  int R_RESOURCE = 106;
-  /** RegularExpression Id. */
-  int R_REVOKE = 107;
-  /** RegularExpression Id. */
-  int R_SELECT = 108;
-  /** RegularExpression Id. */
-  int R_SHARE = 109;
-  /** RegularExpression Id. */
-  int R_SIZE = 110;
-  /** RegularExpression Id. */
-  int R_SQL = 111;
-  /** RegularExpression Id. */
-  int R_START = 112;
-  /** RegularExpression Id. */
-  int R_SUBTYPE = 113;
-  /** RegularExpression Id. */
-  int R_TABAUTH = 114;
-  /** RegularExpression Id. */
-  int R_TABLE = 115;
-  /** RegularExpression Id. */
-  int R_THEN = 116;
-  /** RegularExpression Id. */
-  int R_TO = 117;
-  /** RegularExpression Id. */
-  int R_TYPE = 118;
-  /** RegularExpression Id. */
-  int R_UNION = 119;
-  /** RegularExpression Id. */
-  int R_UNIQUE = 120;
-  /** RegularExpression Id. */
-  int R_UPDATE = 121;
-  /** RegularExpression Id. */
-  int R_VALUES = 122;
-  /** RegularExpression Id. */
-  int R_VIEW = 123;
-  /** RegularExpression Id. */
-  int R_VIEWS = 124;
-  /** RegularExpression Id. */
-  int R_WHEN = 125;
-  /** RegularExpression Id. */
-  int R_WHERE = 126;
-  /** RegularExpression Id. */
-  int R_WITH = 127;
-  /** RegularExpression Id. */
-  int K_ARRAY = 128;
-  /** RegularExpression Id. */
-  int K_AUTHID = 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_CLOB = 139;
-  /** RegularExpression Id. */
-  int K_COMMIT = 140;
-  /** RegularExpression Id. */
-  int K_CONSTANT = 141;
-  /** RegularExpression Id. */
-  int K_CURRENT_USER = 142;
-  /** RegularExpression Id. */
-  int K_DATE = 143;
-  /** RegularExpression Id. */
-  int K_DAY = 144;
-  /** RegularExpression Id. */
-  int K_DEC = 145;
-  /** RegularExpression Id. */
-  int K_DECIMAL = 146;
-  /** RegularExpression Id. */
-  int K_DEFINER = 147;
-  /** RegularExpression Id. */
-  int K_DELETE = 148;
-  /** RegularExpression Id. */
-  int K_DETERMINISTIC = 149;
-  /** RegularExpression Id. */
-  int K_DOUBLE = 150;
-  /** RegularExpression Id. */
-  int K_ENABLE = 151;
-  /** RegularExpression Id. */
-  int K_FINAL = 152;
-  /** RegularExpression Id. */
-  int K_FLOAT = 153;
-  /** RegularExpression Id. */
-  int K_FORCE = 154;
-  /** RegularExpression Id. */
-  int K_GLOBAL = 155;
-  /** RegularExpression Id. */
-  int K_INSTANTIABLE = 156;
-  /** RegularExpression Id. */
-  int K_INT = 157;
-  /** RegularExpression Id. */
-  int K_INTEGER = 158;
-  /** RegularExpression Id. */
-  int K_INTERVAL = 159;
-  /** RegularExpression Id. */
-  int K_KEY = 160;
-  /** RegularExpression Id. */
-  int K_LOCAL = 161;
-  /** RegularExpression Id. */
-  int K_LONG = 162;
-  /** RegularExpression Id. */
-  int K_MLSLABEL = 163;
-  /** RegularExpression Id. */
-  int K_MONTH = 164;
-  /** RegularExpression Id. */
-  int K_NATIONAL = 165;
-  /** RegularExpression Id. */
-  int K_NATURAL = 166;
-  /** RegularExpression Id. */
-  int K_NCHAR = 167;
-  /** RegularExpression Id. */
-  int K_NCLOB = 168;
-  /** RegularExpression Id. */
-  int K_NOCOPY = 169;
-  /** RegularExpression Id. */
-  int K_NUMBER = 170;
-  /** RegularExpression Id. */
-  int K_NUMERIC = 171;
-  /** RegularExpression Id. */
-  int K_NVARCHAR2 = 172;
-  /** RegularExpression Id. */
-  int K_NVARCHAR = 173;
-  /** RegularExpression Id. */
-  int K_OBJECT = 174;
-  /** RegularExpression Id. */
-  int K_OID = 175;
-  /** RegularExpression Id. */
-  int K_ORGANIZATION = 176;
-  /** RegularExpression Id. */
-  int K_OUT = 177;
-  /** RegularExpression Id. */
-  int K_OVERFLOW = 178;
-  /** RegularExpression Id. */
-  int K_PACKAGE = 179;
-  /** RegularExpression Id. */
-  int K_PARALLEL_ENABLE = 180;
-  /** RegularExpression Id. */
-  int K_PIPELINED = 181;
-  /** RegularExpression Id. */
-  int K_PLS_INTEGER = 182;
-  /** RegularExpression Id. */
-  int K_POSITIVE = 183;
-  /** RegularExpression Id. */
-  int K_PRAGMA = 184;
-  /** RegularExpression Id. */
-  int K_PRECISION = 185;
-  /** RegularExpression Id. */
-  int K_PRESERVE = 186;
-  /** RegularExpression Id. */
-  int K_RANGE = 187;
-  /** RegularExpression Id. */
-  int K_RAW = 188;
-  /** RegularExpression Id. */
-  int K_REAL = 189;
-  /** RegularExpression Id. */
-  int K_RECORD = 190;
-  /** RegularExpression Id. */
-  int K_REF = 191;
-  /** RegularExpression Id. */
-  int K_REPLACE = 192;
-  /** RegularExpression Id. */
-  int K_RESULT_CACHE = 193;
-  /** RegularExpression Id. */
-  int K_RETURN = 194;
-  /** RegularExpression Id. */
-  int K_ROWID = 195;
-  /** RegularExpression Id. */
-  int K_ROWS = 196;
-  /** RegularExpression Id. */
-  int K_SECOND = 197;
-  /** RegularExpression Id. */
-  int K_SET = 198;
-  /** RegularExpression Id. */
-  int K_SIGNTYPE = 199;
-  /** RegularExpression Id. */
-  int K_SIMPLE_DOUBLE = 200;
-  /** RegularExpression Id. */
-  int K_SIMPLE_FLOAT = 201;
-  /** RegularExpression Id. */
-  int K_SIMPLE_INTEGER = 202;
-  /** RegularExpression Id. */
-  int K_SMALLINT = 203;
-  /** RegularExpression Id. */
-  int K_STRING = 204;
-  /** RegularExpression Id. */
-  int K_SYS_REFCURSOR = 205;
-  /** RegularExpression Id. */
-  int K_TEMPORARY = 206;
-  /** RegularExpression Id. */
-  int K_TIME = 207;
-  /** RegularExpression Id. */
-  int K_TIMESTAMP = 208;
-  /** RegularExpression Id. */
-  int K_UROWID = 209;
-  /** RegularExpression Id. */
-  int K_VARCHAR2 = 210;
-  /** RegularExpression Id. */
-  int K_VARCHAR = 211;
-  /** RegularExpression Id. */
-  int K_VARRAY = 212;
-  /** RegularExpression Id. */
-  int K_VARYING = 213;
-  /** RegularExpression Id. */
-  int K_YEAR = 214;
-  /** RegularExpression Id. */
-  int K_ZONE = 215;
-  /** RegularExpression Id. */
-  int S_IDENTIFIER = 216;
-  /** RegularExpression Id. */
-  int LETTER = 217;
-  /** RegularExpression Id. */
-  int SPECIAL_CHARS = 218;
-  /** RegularExpression Id. */
-  int S_BIND = 219;
-  /** RegularExpression Id. */
-  int S_CHAR_LITERAL = 220;
-  /** RegularExpression Id. */
-  int S_QUOTED_IDENTIFIER = 221;
-
-  /** 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\"",
-    "\"%CHARSET\"",
-    "\"CHECK\"",
-    "\"CLUSTERS\"",
-    "\"CLUSTER\"",
-    "\"COLAUTH\"",
-    "\"COLUMNS\"",
-    "\"COMPRESS\"",
-    "\"CONNECT\"",
-    "\"CONSTRAINT\"",
-    "\"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\"",
-    "\"NOT\"",
-    "\"NOWAIT\"",
-    "\"NULL\"",
-    "\"OF\"",
-    "\"ON\"",
-    "\"OPTION\"",
-    "\"OR\"",
-    "\"ORDER\"",
-    "\"OVERLAPS\"",
-    "\"PRIMARY\"",
-    "\"PROCEDURE\"",
-    "\"PUBLIC\"",
-    "\"RESOURCE\"",
-    "\"REVOLE\"",
-    "\"SELECT\"",
-    "\"SHARE\"",
-    "\"SIZE\"",
-    "\"SQL\"",
-    "\"START\"",
-    "\"SUBTYPE\"",
-    "\"TABAUTH\"",
-    "\"TABLE\"",
-    "\"THEN\"",
-    "\"TO\"",
-    "\"TYPE\"",
-    "\"UNION\"",
-    "\"UNIQUE\"",
-    "\"UPDATE\"",
-    "\"VALUES\"",
-    "\"VIEW\"",
-    "\"VIEWS\"",
-    "\"WHEN\"",
-    "\"WHERE\"",
-    "\"WITH\"",
-    "\"ARRAY\"",
-    "\"AUTHID\"",
-    "\"BFILE\"",
-    "\"BINARY_DOUBLE\"",
-    "\"BINARY_FLOAT\"",
-    "\"BINARY_INTEGER\"",
-    "\"BLOB\"",
-    "\"BOOLEAN\"",
-    "\"BYTE\"",
-    "\"CHAR\"",
-    "\"CHARACTER\"",
-    "\"CLOB\"",
-    "\"COMMIT\"",
-    "\"CONSTANT\"",
-    "\"CURRENT_USER\"",
-    "\"DATE\"",
-    "\"DAY\"",
-    "\"DEC\"",
-    "\"DECIMAL\"",
-    "\"DEFINER\"",
-    "\"DELETE\"",
-    "\"DETERMINISTIC\"",
-    "\"DOUBLE\"",
-    "\"ENABLE\"",
-    "\"FINAL\"",
-    "\"FLOAT\"",
-    "\"FORCE\"",
-    "\"GLOBAL\"",
-    "\"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\"",
-    "\"RANGE\"",
-    "\"RAW\"",
-    "\"REAL\"",
-    "\"RECORD\"",
-    "\"REF\"",
-    "\"REPLACE\"",
-    "\"RESULT_CACHE\"",
-    "\"RETURN\"",
-    "\"ROWID\"",
-    "\"ROWS\"",
-    "\"SECOND\"",
-    "\"SET\"",
-    "\"SIGNTYPE\"",
-    "\"SIMPLE_DOUBLE\"",
-    "\"SIMPLE_FLOAT\"",
-    "\"SIMPLE_INTEGER\"",
-    "\"SMALLINT\"",
-    "\"STRING\"",
-    "\"SYS_REFCURSOR\"",
-    "\"TEMPORARY\"",
-    "\"TIME\"",
-    "\"TIMESTAMP\"",
-    "\"UROWID\"",
-    "\"VARCHAR2\"",
-    "\"VARCHAR\"",
-    "\"VARRAY\"",
-    "\"VARYING\"",
-    "\"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_CHARSET = 51;
+  /** RegularExpression Id. */
+  int R_CHECK = 52;
+  /** RegularExpression Id. */
+  int R_CLUSTERS = 53;
+  /** RegularExpression Id. */
+  int R_CLUSTER = 54;
+  /** RegularExpression Id. */
+  int R_COLAUTH = 55;
+  /** RegularExpression Id. */
+  int R_COLUMNS = 56;
+  /** RegularExpression Id. */
+  int R_COMPRESS = 57;
+  /** RegularExpression Id. */
+  int R_CONNECT = 58;
+  /** RegularExpression Id. */
+  int R_CONSTRAINT = 59;
+  /** RegularExpression Id. */
+  int R_CRASH = 60;
+  /** RegularExpression Id. */
+  int R_CREATE = 61;
+  /** RegularExpression Id. */
+  int R_CURSOR = 62;
+  /** RegularExpression Id. */
+  int R_DECLARE = 63;
+  /** RegularExpression Id. */
+  int R_DEFAULT = 64;
+  /** RegularExpression Id. */
+  int R_DESC = 65;
+  /** RegularExpression Id. */
+  int R_DISTINCT = 66;
+  /** RegularExpression Id. */
+  int R_DROP = 67;
+  /** RegularExpression Id. */
+  int R_ELSE = 68;
+  /** RegularExpression Id. */
+  int R_END = 69;
+  /** RegularExpression Id. */
+  int R_EXCEPTION = 70;
+  /** RegularExpression Id. */
+  int R_EXCLUSIVE = 71;
+  /** RegularExpression Id. */
+  int R_FETCH = 72;
+  /** RegularExpression Id. */
+  int R_FOR = 73;
+  /** RegularExpression Id. */
+  int R_FROM = 74;
+  /** RegularExpression Id. */
+  int R_FUNCTION = 75;
+  /** RegularExpression Id. */
+  int R_GOTO = 76;
+  /** RegularExpression Id. */
+  int R_GRANT = 77;
+  /** RegularExpression Id. */
+  int R_GROUP = 78;
+  /** RegularExpression Id. */
+  int R_HAVING = 79;
+  /** RegularExpression Id. */
+  int R_IDENTIFIED = 80;
+  /** RegularExpression Id. */
+  int R_IF = 81;
+  /** RegularExpression Id. */
+  int R_IN = 82;
+  /** RegularExpression Id. */
+  int R_INDEX = 83;
+  /** RegularExpression Id. */
+  int R_INDEXES = 84;
+  /** RegularExpression Id. */
+  int R_INSERT = 85;
+  /** RegularExpression Id. */
+  int R_INTERSECT = 86;
+  /** RegularExpression Id. */
+  int R_INTO = 87;
+  /** RegularExpression Id. */
+  int R_IS = 88;
+  /** RegularExpression Id. */
+  int R_LIKE = 89;
+  /** RegularExpression Id. */
+  int R_LOCK = 90;
+  /** RegularExpression Id. */
+  int R_MINUS = 91;
+  /** RegularExpression Id. */
+  int R_MODE = 92;
+  /** RegularExpression Id. */
+  int R_NOCOMPRESS = 93;
+  /** RegularExpression Id. */
+  int R_NOT = 94;
+  /** RegularExpression Id. */
+  int R_NOWAIT = 95;
+  /** RegularExpression Id. */
+  int R_NULL = 96;
+  /** RegularExpression Id. */
+  int R_OF = 97;
+  /** RegularExpression Id. */
+  int R_ON = 98;
+  /** RegularExpression Id. */
+  int R_OPTION = 99;
+  /** RegularExpression Id. */
+  int R_OR = 100;
+  /** RegularExpression Id. */
+  int R_ORDER = 101;
+  /** RegularExpression Id. */
+  int R_OVERLAPS = 102;
+  /** RegularExpression Id. */
+  int R_PRIMARY = 103;
+  /** RegularExpression Id. */
+  int R_PROCEDURE = 104;
+  /** RegularExpression Id. */
+  int R_PUBLIC = 105;
+  /** RegularExpression Id. */
+  int R_RESOURCE = 106;
+  /** RegularExpression Id. */
+  int R_REVOKE = 107;
+  /** RegularExpression Id. */
+  int R_SELECT = 108;
+  /** RegularExpression Id. */
+  int R_SHARE = 109;
+  /** RegularExpression Id. */
+  int R_SIZE = 110;
+  /** RegularExpression Id. */
+  int R_SQL = 111;
+  /** RegularExpression Id. */
+  int R_START = 112;
+  /** RegularExpression Id. */
+  int R_SUBTYPE = 113;
+  /** RegularExpression Id. */
+  int R_TABAUTH = 114;
+  /** RegularExpression Id. */
+  int R_TABLE = 115;
+  /** RegularExpression Id. */
+  int R_THEN = 116;
+  /** RegularExpression Id. */
+  int R_TO = 117;
+  /** RegularExpression Id. */
+  int R_TYPE = 118;
+  /** RegularExpression Id. */
+  int R_UNION = 119;
+  /** RegularExpression Id. */
+  int R_UNIQUE = 120;
+  /** RegularExpression Id. */
+  int R_UPDATE = 121;
+  /** RegularExpression Id. */
+  int R_VALUES = 122;
+  /** RegularExpression Id. */
+  int R_VIEW = 123;
+  /** RegularExpression Id. */
+  int R_VIEWS = 124;
+  /** RegularExpression Id. */
+  int R_WHEN = 125;
+  /** RegularExpression Id. */
+  int R_WHERE = 126;
+  /** RegularExpression Id. */
+  int R_WITH = 127;
+  /** RegularExpression Id. */
+  int K_ARRAY = 128;
+  /** RegularExpression Id. */
+  int K_AUTHID = 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_CLOB = 139;
+  /** RegularExpression Id. */
+  int K_COMMIT = 140;
+  /** RegularExpression Id. */
+  int K_CONSTANT = 141;
+  /** RegularExpression Id. */
+  int K_CURRENT_USER = 142;
+  /** RegularExpression Id. */
+  int K_DATE = 143;
+  /** RegularExpression Id. */
+  int K_DAY = 144;
+  /** RegularExpression Id. */
+  int K_DEC = 145;
+  /** RegularExpression Id. */
+  int K_DECIMAL = 146;
+  /** RegularExpression Id. */
+  int K_DEFINER = 147;
+  /** RegularExpression Id. */
+  int K_DELETE = 148;
+  /** RegularExpression Id. */
+  int K_DETERMINISTIC = 149;
+  /** RegularExpression Id. */
+  int K_DOUBLE = 150;
+  /** RegularExpression Id. */
+  int K_ENABLE = 151;
+  /** RegularExpression Id. */
+  int K_FINAL = 152;
+  /** RegularExpression Id. */
+  int K_FLOAT = 153;
+  /** RegularExpression Id. */
+  int K_FORCE = 154;
+  /** RegularExpression Id. */
+  int K_GLOBAL = 155;
+  /** RegularExpression Id. */
+  int K_INSTANTIABLE = 156;
+  /** RegularExpression Id. */
+  int K_INT = 157;
+  /** RegularExpression Id. */
+  int K_INTEGER = 158;
+  /** RegularExpression Id. */
+  int K_INTERVAL = 159;
+  /** RegularExpression Id. */
+  int K_KEY = 160;
+  /** RegularExpression Id. */
+  int K_LOCAL = 161;
+  /** RegularExpression Id. */
+  int K_LONG = 162;
+  /** RegularExpression Id. */
+  int K_MLSLABEL = 163;
+  /** RegularExpression Id. */
+  int K_MONTH = 164;
+  /** RegularExpression Id. */
+  int K_NATIONAL = 165;
+  /** RegularExpression Id. */
+  int K_NATURAL = 166;
+  /** RegularExpression Id. */
+  int K_NCHAR = 167;
+  /** RegularExpression Id. */
+  int K_NCLOB = 168;
+  /** RegularExpression Id. */
+  int K_NOCOPY = 169;
+  /** RegularExpression Id. */
+  int K_NUMBER = 170;
+  /** RegularExpression Id. */
+  int K_NUMERIC = 171;
+  /** RegularExpression Id. */
+  int K_NVARCHAR2 = 172;
+  /** RegularExpression Id. */
+  int K_NVARCHAR = 173;
+  /** RegularExpression Id. */
+  int K_OBJECT = 174;
+  /** RegularExpression Id. */
+  int K_OID = 175;
+  /** RegularExpression Id. */
+  int K_ORGANIZATION = 176;
+  /** RegularExpression Id. */
+  int K_OUT = 177;
+  /** RegularExpression Id. */
+  int K_OVERFLOW = 178;
+  /** RegularExpression Id. */
+  int K_PACKAGE = 179;
+  /** RegularExpression Id. */
+  int K_PARALLEL_ENABLE = 180;
+  /** RegularExpression Id. */
+  int K_PIPELINED = 181;
+  /** RegularExpression Id. */
+  int K_PLS_INTEGER = 182;
+  /** RegularExpression Id. */
+  int K_POSITIVE = 183;
+  /** RegularExpression Id. */
+  int K_PRAGMA = 184;
+  /** RegularExpression Id. */
+  int K_PRECISION = 185;
+  /** RegularExpression Id. */
+  int K_PRESERVE = 186;
+  /** RegularExpression Id. */
+  int K_RANGE = 187;
+  /** RegularExpression Id. */
+  int K_RAW = 188;
+  /** RegularExpression Id. */
+  int K_REAL = 189;
+  /** RegularExpression Id. */
+  int K_RECORD = 190;
+  /** RegularExpression Id. */
+  int K_REF = 191;
+  /** RegularExpression Id. */
+  int K_REPLACE = 192;
+  /** RegularExpression Id. */
+  int K_RESULT_CACHE = 193;
+  /** RegularExpression Id. */
+  int K_RETURN = 194;
+  /** RegularExpression Id. */
+  int K_ROWID = 195;
+  /** RegularExpression Id. */
+  int K_ROWS = 196;
+  /** RegularExpression Id. */
+  int K_SECOND = 197;
+  /** RegularExpression Id. */
+  int K_SET = 198;
+  /** RegularExpression Id. */
+  int K_SIGNTYPE = 199;
+  /** RegularExpression Id. */
+  int K_SIMPLE_DOUBLE = 200;
+  /** RegularExpression Id. */
+  int K_SIMPLE_FLOAT = 201;
+  /** RegularExpression Id. */
+  int K_SIMPLE_INTEGER = 202;
+  /** RegularExpression Id. */
+  int K_SMALLINT = 203;
+  /** RegularExpression Id. */
+  int K_STRING = 204;
+  /** RegularExpression Id. */
+  int K_SYS_REFCURSOR = 205;
+  /** RegularExpression Id. */
+  int K_TEMPORARY = 206;
+  /** RegularExpression Id. */
+  int K_TIME = 207;
+  /** RegularExpression Id. */
+  int K_TIMESTAMP = 208;
+  /** RegularExpression Id. */
+  int K_UROWID = 209;
+  /** RegularExpression Id. */
+  int K_VARCHAR2 = 210;
+  /** RegularExpression Id. */
+  int K_VARCHAR = 211;
+  /** RegularExpression Id. */
+  int K_VARRAY = 212;
+  /** RegularExpression Id. */
+  int K_VARYING = 213;
+  /** RegularExpression Id. */
+  int K_YEAR = 214;
+  /** RegularExpression Id. */
+  int K_ZONE = 215;
+  /** RegularExpression Id. */
+  int S_IDENTIFIER = 216;
+  /** RegularExpression Id. */
+  int LETTER = 217;
+  /** RegularExpression Id. */
+  int SPECIAL_CHARS = 218;
+  /** RegularExpression Id. */
+  int S_BIND = 219;
+  /** RegularExpression Id. */
+  int S_CHAR_LITERAL = 220;
+  /** RegularExpression Id. */
+  int S_QUOTED_IDENTIFIER = 221;
+
+  /** 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\"",
+    "\"%CHARSET\"",
+    "\"CHECK\"",
+    "\"CLUSTERS\"",
+    "\"CLUSTER\"",
+    "\"COLAUTH\"",
+    "\"COLUMNS\"",
+    "\"COMPRESS\"",
+    "\"CONNECT\"",
+    "\"CONSTRAINT\"",
+    "\"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\"",
+    "\"NOT\"",
+    "\"NOWAIT\"",
+    "\"NULL\"",
+    "\"OF\"",
+    "\"ON\"",
+    "\"OPTION\"",
+    "\"OR\"",
+    "\"ORDER\"",
+    "\"OVERLAPS\"",
+    "\"PRIMARY\"",
+    "\"PROCEDURE\"",
+    "\"PUBLIC\"",
+    "\"RESOURCE\"",
+    "\"REVOLE\"",
+    "\"SELECT\"",
+    "\"SHARE\"",
+    "\"SIZE\"",
+    "\"SQL\"",
+    "\"START\"",
+    "\"SUBTYPE\"",
+    "\"TABAUTH\"",
+    "\"TABLE\"",
+    "\"THEN\"",
+    "\"TO\"",
+    "\"TYPE\"",
+    "\"UNION\"",
+    "\"UNIQUE\"",
+    "\"UPDATE\"",
+    "\"VALUES\"",
+    "\"VIEW\"",
+    "\"VIEWS\"",
+    "\"WHEN\"",
+    "\"WHERE\"",
+    "\"WITH\"",
+    "\"ARRAY\"",
+    "\"AUTHID\"",
+    "\"BFILE\"",
+    "\"BINARY_DOUBLE\"",
+    "\"BINARY_FLOAT\"",
+    "\"BINARY_INTEGER\"",
+    "\"BLOB\"",
+    "\"BOOLEAN\"",
+    "\"BYTE\"",
+    "\"CHAR\"",
+    "\"CHARACTER\"",
+    "\"CLOB\"",
+    "\"COMMIT\"",
+    "\"CONSTANT\"",
+    "\"CURRENT_USER\"",
+    "\"DATE\"",
+    "\"DAY\"",
+    "\"DEC\"",
+    "\"DECIMAL\"",
+    "\"DEFINER\"",
+    "\"DELETE\"",
+    "\"DETERMINISTIC\"",
+    "\"DOUBLE\"",
+    "\"ENABLE\"",
+    "\"FINAL\"",
+    "\"FLOAT\"",
+    "\"FORCE\"",
+    "\"GLOBAL\"",
+    "\"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\"",
+    "\"RANGE\"",
+    "\"RAW\"",
+    "\"REAL\"",
+    "\"RECORD\"",
+    "\"REF\"",
+    "\"REPLACE\"",
+    "\"RESULT_CACHE\"",
+    "\"RETURN\"",
+    "\"ROWID\"",
+    "\"ROWS\"",
+    "\"SECOND\"",
+    "\"SET\"",
+    "\"SIGNTYPE\"",
+    "\"SIMPLE_DOUBLE\"",
+    "\"SIMPLE_FLOAT\"",
+    "\"SIMPLE_INTEGER\"",
+    "\"SMALLINT\"",
+    "\"STRING\"",
+    "\"SYS_REFCURSOR\"",
+    "\"TEMPORARY\"",
+    "\"TIME\"",
+    "\"TIMESTAMP\"",
+    "\"UROWID\"",
+    "\"VARCHAR2\"",
+    "\"VARCHAR\"",
+    "\"VARRAY\"",
+    "\"VARYING\"",
+    "\"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 d172194..cb1ceaf 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,3821 +10,3821 @@
  *
  * 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(0x8060000000000L, 0x0L, 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, 0x0L, 0x3L, 0x0L);
-      case 66:
-         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
-      case 67:
-         return jjMoveStringLiteralDfa1_0(0x7ff4000000000000L, 0x0L, 0x7e00L, 0x0L);
-      case 68:
-         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0xfL, 0x7f8000L, 0x0L);
-      case 69:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf0L, 0x800000L, 0x0L);
-      case 70:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf00L, 0x7000000L, 0x0L);
-      case 71:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7000L, 0x8000000L, 0x0L);
-      case 72:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000L, 0x0L, 0x0L);
-      case 73:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1ff0000L, 0xf0000000L, 0x0L);
-      case 75:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x100000000L, 0x0L);
-      case 76:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x600000000L, 0x0L);
-      case 77:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x18000000L, 0x1800000000L, 0x0L);
-      case 78:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1e0000000L, 0x3fe000000000L, 0x0L);
-      case 79:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7e00000000L, 0x7c00000000000L, 0x0L);
-      case 80:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x38000000000L, 0x7f8000000000000L, 0x0L);
-      case 82:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xc0000000000L, 0xf800000000000000L, 0x1fL);
-      case 83:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000000L, 0x0L, 0x3fe0L);
-      case 84:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7c000000000000L, 0x0L, 0x1c000L);
-      case 85:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x380000000000000L, 0x0L, 0x20000L);
-      case 86:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00000000000000L, 0x0L, 0x3c0000L);
-      case 87:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe000000000000000L, 0x0L, 0x0L);
-      case 89:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000L);
-      case 90:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x798000000000L, 0x0L, 0x3L, 0x0L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0x7ff4000000000000L, 0x0L, 0x7e00L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0xfL, 0x7f8000L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf0L, 0x800000L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf00L, 0x7000000L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7000L, 0x8000000L, 0x0L);
-      case 104:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000L, 0x0L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1ff0000L, 0xf0000000L, 0x0L);
-      case 107:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x100000000L, 0x0L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x600000000L, 0x0L);
-      case 109:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x18000000L, 0x1800000000L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1e0000000L, 0x3fe000000000L, 0x0L);
-      case 111:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7e00000000L, 0x7c00000000000L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x38000000000L, 0x7f8000000000000L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xc0000000000L, 0xf800000000000000L, 0x1fL);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000000L, 0x0L, 0x3fe0L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7c000000000000L, 0x0L, 0x1c000L);
-      case 117:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x380000000000000L, 0x0L, 0x20000L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00000000000000L, 0x0L, 0x3c0000L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe000000000000000L, 0x0L, 0x0L);
-      case 121:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000L);
-      case 122:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000L);
-      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, 0x40c000000008000L, active2, 0x1818006000018000L, active3, 0x3c0000L);
-      case 66:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0L, active2, 0x18000000000L, active3, 0L);
-      case 68:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
-      case 69:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8001800000000000L, active1, 0x1c0000000103L, active2, 0xe0000001003e0000L, active3, 0x404067L);
-      case 70:
-         if ((active1 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 81;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 97;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
-      case 72:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000L, active1, 0x6010200000000000L, active2, 0x600L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x980040000a000004L, active2, 0x20800001000038L, active3, 0x18780L);
-      case 76:
-         return jjMoveStringLiteralDfa2_0(active0, 0x60018000000000L, active1, 0x10L, active2, 0x4000080a000840L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x800L);
-      case 78:
-         if ((active1 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 82;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 98;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x180000000f80020L, active2, 0xf0800000L, active3, 0L);
-      case 79:
-         if ((active1 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 117;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xf80000000000000L, active1, 0xf4001200L, active2, 0x80021604403080L, active3, 0x800018L);
-      case 80:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000800000000L, active2, 0L, active3, 0L);
-      case 81:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
-      case 82:
-         if ((active1 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 100;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x3000020000000000L, active1, 0x1a000006408L, active2, 0x701000000000001L, active3, 0x20000L);
-      case 83:
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 44;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 88;
-            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, 0x1000000000000L, active2, 0L, active3, 0x1000L);
-      case 85:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000000L, active1, 0x2020100000800L, active2, 0x20c0000004002L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000000000L, active2, 0x4300000000000L, active3, 0L);
-      case 88:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0xc0L, active2, 0L, active3, 0L);
-      case 89:
-         if ((active0 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 49;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000000L, active2, 0x100L, active3, 0x2000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0x40c000000008000L, active2, 0x1818006000018000L, active3, 0x3c0000L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0L, active2, 0x18000000000L, active3, 0L);
-      case 100:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8001800000000000L, active1, 0x1c0000000103L, active2, 0xe0000001003e0000L, active3, 0x404067L);
-      case 102:
-         if ((active1 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 81;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 97;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000L, active1, 0x6010200000000000L, active2, 0x600L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x980040000a000004L, active2, 0x20800001000038L, active3, 0x18780L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x60018000000000L, active1, 0x10L, active2, 0x4000080a000840L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x800L);
-      case 110:
-         if ((active1 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 82;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 98;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x180000000f80020L, active2, 0xf0800000L, active3, 0L);
-      case 111:
-         if ((active1 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 117;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xf80000000000000L, active1, 0xf4001200L, active2, 0x80021604403080L, active3, 0x800018L);
-      case 112:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000800000000L, active2, 0L, active3, 0L);
-      case 113:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
-      case 114:
-         if ((active1 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 100;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x3000020000000000L, active1, 0x1a000006408L, active2, 0x701000000000001L, active3, 0x20000L);
-      case 115:
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 44;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 88;
-            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, 0x1000000000000L, active2, 0L, active3, 0x1000L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000000L, active1, 0x2020100000800L, active2, 0x20c0000004002L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000000000L, active2, 0x4300000000000L, active3, 0L);
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0xc0L, active2, 0L, active3, 0L);
-      case 121:
-         if ((active0 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 49;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000000L, active2, 0x100L, active3, 0x2000L);
-      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, 0x1000000000000000L, active1, 0x1200000002000L, active2, 0x2100300000800600L, active3, 0x400800L);
-      case 66:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0xe020000000000L, active2, 0L, active3, 0L);
-      case 67:
-         if ((active0 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 45;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 145;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0x240000c0L, active2, 0x4008020200040000L, active3, 0x20L);
-      case 68:
-         if ((active0 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 43;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 69;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 175;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200002010180000L, active2, 0L, active3, 0L);
-      case 69:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2010000000000000L, active1, 0x7810004000010000L, active2, 0x604000000000000L, active3, 0L);
-      case 70:
-         if ((active2 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 191;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L, active2, 0x80000L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x1000000000000L, active3, 0x80L);
-      case 72:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L, active1, 0L, active2, 0x8000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x180008000000000L, active2, 0x4L, active3, 0L);
-      case 74:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
-      case 75:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x2000000L, active2, 0L, active3, 0L);
-      case 76:
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 39;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 111;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x180000000000000L, active1, 0x400100100000000L, active2, 0x10000100000L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0xc0000001000L, active3, 0x1c700L);
-      case 78:
-         return jjMoveStringLiteralDfa3_0(active0, 0xc00000000000000L, active1, 0x8000800L, active2, 0x800001401002038L, active3, 0x800000L);
-      case 79:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x10000004408L, active2, 0xa0008c0L, active3, 0x20000L);
-      case 80:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000000000L, active2, 0x20000000000000L, active3, 0x1L);
-      case 82:
-         if ((active1 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 73;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x10000004004001L, active3, 0x3c1000L);
-      case 83:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40000200016L, active2, 0xc0000810000000L, active3, 0x2002L);
-      case 84:
-         if ((active1 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 94;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 157;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 177;
-            jjmatchedPos = 2;
-         }
-         else if ((active3 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 198;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x8000000800c01100L, active2, 0x60c0208102L, active3, 0x4L);
-      case 85:
-         return jjMoveStringLiteralDfa3_0(active0, 0x60000000000000L, active1, 0L, active2, 0x400000L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000008000L, active2, 0L, active3, 0L);
-      case 87:
-         if ((active2 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 188;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000000L, active2, 0L, active3, 0x18L);
-      case 89:
-         if ((active2 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 144;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 160;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 90:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000000L, active2, 0L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x1200000002000L, active2, 0x2100300000800600L, active3, 0x400800L);
-      case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0xe020000000000L, active2, 0L, active3, 0L);
-      case 99:
-         if ((active0 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 45;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 145;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0x240000c0L, active2, 0x4008020200040000L, active3, 0x20L);
-      case 100:
-         if ((active0 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 43;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 69;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 175;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200002010180000L, active2, 0L, active3, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2010000000000000L, active1, 0x7810004000010000L, active2, 0x604000000000000L, active3, 0L);
-      case 102:
-         if ((active2 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 191;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L, active2, 0x80000L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x1000000000000L, active3, 0x80L);
-      case 104:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L, active1, 0L, active2, 0x8000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x180008000000000L, active2, 0x4L, active3, 0L);
-      case 106:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
-      case 107:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x2000000L, active2, 0L, active3, 0L);
-      case 108:
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 39;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 111;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x180000000000000L, active1, 0x400100100000000L, active2, 0x10000100000L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0xc0000001000L, active3, 0x1c700L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0xc00000000000000L, active1, 0x8000800L, active2, 0x800001401002038L, active3, 0x800000L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x10000004408L, active2, 0xa0008c0L, active3, 0x20000L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000000000L, active2, 0x20000000000000L, active3, 0x1L);
-      case 114:
-         if ((active1 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 73;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x10000004004001L, active3, 0x3c1000L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40000200016L, active2, 0xc0000810000000L, active3, 0x2002L);
-      case 116:
-         if ((active1 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 94;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 157;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 177;
-            jjmatchedPos = 2;
-         }
-         else if ((active3 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 198;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x8000000800c01100L, active2, 0x60c0208102L, active3, 0x4L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x60000000000000L, active1, 0L, active2, 0x400000L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000008000L, active2, 0L, active3, 0L);
-      case 119:
-         if ((active2 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 188;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000000L, active2, 0L, active3, 0x18L);
-      case 121:
-         if ((active2 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 144;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 160;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 122:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000000L, 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 65:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2088000000000000L, active1, 0x204000080000001L, active2, 0x11008203000039L, active3, 0L);
-      case 66:
-         if ((active2 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 134;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 139;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x40008c00000L, active3, 0L);
-      case 67:
-         if ((active1 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 65;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000000L, active1, 0x10000000900L, active2, 0x200000004000000L, active3, 0xc0000L);
-      case 69:
-         if ((active0 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 50;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 68;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 89;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 92;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 110;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 118;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 136;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 143;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 207;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 215;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x102000780040L, active2, 0x204800c0300000L, active3, 0x10000L);
-      case 71:
-         if ((active2 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 162;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x900000000000000L, active3, 0L);
-      case 72:
-         if ((active1 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 127;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x800008000L, active2, 0x800020000c0000L, active3, 0x1008L);
-      case 75:
-         if ((active1 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 90;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
-      case 76:
-         if ((active1 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 96;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 189;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0x8020000000080L, active2, 0x800000084L, active3, 0x801L);
-      case 77:
-         if ((active1 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x8000000000L, active2, 0x1000L, active3, 0L);
-      case 78:
-         if ((active1 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 116;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 125;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x12000L, active2, 0L, active3, 0x80L);
-      case 79:
-         if ((active1 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 87;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800c0020000000L, active2, 0x4000030000000000L, active3, 0x20L);
-      case 80:
-         if ((active1 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 67;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x200040000000000L, active1, 0L, active2, 0L, active3, 0x4700L);
-      case 81:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x100000000000000L, active2, 0L, active3, 0L);
-      case 82:
-         if ((active2 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 137;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 214;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x4001204000000000L, active2, 0x4300000004400L, active3, 0x100000L);
-      case 83:
-         if ((active3 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 196;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x5860000000000000L, active1, 0L, active2, 0x400000000002000L, active3, 0L);
-      case 84:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x2000000000004L, active2, 0x1010000000L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x400000008004000L, active2, 0x4000000000L, active3, 0x6L);
-      case 87:
-         if ((active1 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 123;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x1000000000000000L, active2, 0L, active3, 0x20000L);
-      case 89:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x200000L);
-      case 95:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0x2000L);
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2088000000000000L, active1, 0x204000080000001L, active2, 0x11008203000039L, active3, 0L);
-      case 98:
-         if ((active2 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 134;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 139;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x40008c00000L, active3, 0L);
-      case 99:
-         if ((active1 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 65;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000000L, active1, 0x10000000900L, active2, 0x200000004000000L, active3, 0xc0000L);
-      case 101:
-         if ((active0 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 50;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 68;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 89;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 92;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 110;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 118;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 136;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 143;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 207;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 215;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x102000780040L, active2, 0x204800c0300000L, active3, 0x10000L);
-      case 103:
-         if ((active2 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 162;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x900000000000000L, active3, 0L);
-      case 104:
-         if ((active1 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 127;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x800008000L, active2, 0x800020000c0000L, active3, 0x1008L);
-      case 107:
-         if ((active1 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 90;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
-      case 108:
-         if ((active1 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 96;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 189;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0x8020000000080L, active2, 0x800000084L, active3, 0x801L);
-      case 109:
-         if ((active1 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x8000000000L, active2, 0x1000L, active3, 0L);
-      case 110:
-         if ((active1 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 116;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 125;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x12000L, active2, 0L, active3, 0x80L);
-      case 111:
-         if ((active1 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 3;
-         }
-         else if ((active1 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 87;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800c0020000000L, active2, 0x4000030000000000L, active3, 0x20L);
-      case 112:
-         if ((active1 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 67;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x200040000000000L, active1, 0L, active2, 0L, active3, 0x4700L);
-      case 113:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x100000000000000L, active2, 0L, active3, 0L);
-      case 114:
-         if ((active2 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 137;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 214;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x4001204000000000L, active2, 0x4300000004400L, active3, 0x100000L);
-      case 115:
-         if ((active3 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 196;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x5860000000000000L, active1, 0L, active2, 0x400000000002000L, active3, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x2000000000004L, active2, 0x1010000000L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x400000008004000L, active2, 0x4000000000L, active3, 0x6L);
-      case 119:
-         if ((active1 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 123;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x1000000000000000L, active2, 0L, active3, 0x20000L);
-      case 121:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x200000L);
-      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 65:
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0x8000000000L, active2, 0x8000818000400L, active3, 0x100001L);
-      case 66:
-         if ((active2 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 168;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 67:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000000000L, active2, 0x700000000000L, active3, 0L);
-      case 68:
-         if ((active3 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 195;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 69:
-         if ((active0 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 42;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 109;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 115;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 126;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 130;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 154;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 187;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x401000000000000L, active1, 0x400010000000000L, active2, 0x400040000004080L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000L, active3, 0L);
-      case 72:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 60;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 72;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 164;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0xc0000L);
-      case 73:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x20080000004L, active2, 0x240000000001002L, active3, 0x220000L);
-      case 75:
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 52;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 76:
-         if ((active2 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 152;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 161;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x84000000000L, active2, 0x30000000c00000L, active3, 0xf02L);
-      case 77:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x20000000L, active2, 0x100000000040000L, active3, 0L);
-      case 78:
-         if ((active0 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 47;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 119;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000L, active2, 0x1000000080000L, active3, 0x1020L);
-      case 79:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000000L, active1, 0x800000000L, active2, 0x2000000000L, active3, 0x4000L);
-      case 80:
-         if ((active1 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40L, active2, 0x20000000000L, active3, 0L);
-      case 82:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 167;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x208000000000000L, active1, 0x600000L, active2, 0x4000084080200038L, active3, 0x2004L);
-      case 83:
-         if ((active1 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 91;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 124;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
-      case 84:
-         if ((active1 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 77;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 112;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 153;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x2860020000000000L, active1, 0x200000000010800L, active2, 0x80000000102000L, active3, 0x80L);
-      case 85:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x104040000000081L, active2, 0L, active3, 0L);
-      case 88:
-         if ((active1 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 83;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0L);
-      case 89:
-         if ((active2 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 128;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, active2, 0L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0x8000000000L, active2, 0x8000818000400L, active3, 0x100001L);
-      case 98:
-         if ((active2 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 168;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000000000L, active2, 0x700000000000L, active3, 0L);
-      case 100:
-         if ((active3 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 195;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 101:
-         if ((active0 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 42;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 109;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 115;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 126;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 130;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 154;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 187;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x401000000000000L, active1, 0x400010000000000L, active2, 0x400040000004080L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000L, active3, 0L);
-      case 104:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 60;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 72;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 164;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0xc0000L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x20080000004L, active2, 0x240000000001002L, active3, 0x220000L);
-      case 107:
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 52;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 108:
-         if ((active2 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 152;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 161;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x84000000000L, active2, 0x30000000c00000L, active3, 0xf02L);
-      case 109:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x20000000L, active2, 0x100000000040000L, active3, 0L);
-      case 110:
-         if ((active0 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 47;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 119;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000L, active2, 0x1000000080000L, active3, 0x1020L);
-      case 111:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000000L, active1, 0x800000000L, active2, 0x2000000000L, active3, 0x4000L);
-      case 112:
-         if ((active1 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40L, active2, 0x20000000000L, active3, 0L);
-      case 114:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 167;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x208000000000000L, active1, 0x600000L, active2, 0x4000084080200038L, active3, 0x2004L);
-      case 115:
-         if ((active1 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 91;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 124;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
-      case 116:
-         if ((active1 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 77;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 112;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 153;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x2860020000000000L, active1, 0x200000000010800L, active2, 0x80000000102000L, active3, 0x80L);
-      case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x104040000000081L, active2, 0L, active3, 0L);
-      case 120:
-         if ((active1 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 83;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0L);
-      case 121:
-         if ((active2 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 128;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, 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 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 184;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0x4000042080L, active3, 0xc0000L);
-      case 66:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
-      case 67:
-         if ((active1 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 105;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0L, active2, 0x400L, active3, 0x1L);
-      case 68:
-         if ((active2 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 129;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 190;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 197;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 209;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
-      case 69:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 61;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 107;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 120;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 121;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 148;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 150;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 151;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x261000000000000L, active1, 0x100000L, active2, 0x40080000L, active3, 0x2700L);
-      case 71:
-         if ((active1 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 79;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 204;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
-      case 72:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x300000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10800L, active2, 0xa1080000000000L, active3, 0x800L);
-      case 76:
-         if ((active2 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 155;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L, active2, 0x14000000000000L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 78:
-         if ((active1 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 99;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 194;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x4L, active2, 0x40002010004000L, active3, 0x200000L);
-      case 80:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000020000000L, active2, 0L, active3, 0L);
-      case 82:
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 62;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 170;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L, active1, 0x48000000000L, active2, 0x400000000000000L, active3, 0x4000L);
-      case 83:
-         if ((active1 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 122;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000000L, active1, 0x400080L, active2, 0x200000000000000L, active3, 0L);
-      case 84:
-         if ((active1 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 85;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 95;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 108;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 140;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 174;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x4000000000040L, active2, 0L, active3, 0x10002L);
-      case 86:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000L, active3, 0L);
-      case 89:
-         if ((active2 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 169;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 212;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x80L);
-      case 97:
-         if ((active2 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 184;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0x4000042080L, active3, 0xc0000L);
-      case 98:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
-      case 99:
-         if ((active1 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 105;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0L, active2, 0x400L, active3, 0x1L);
-      case 100:
-         if ((active2 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 129;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 190;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 197;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 209;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
-      case 101:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 61;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 107;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 120;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 121;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 148;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 150;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 151;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x261000000000000L, active1, 0x100000L, active2, 0x40080000L, active3, 0x2700L);
-      case 103:
-         if ((active1 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 79;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 204;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
-      case 104:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x300000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10800L, active2, 0xa1080000000000L, active3, 0x800L);
-      case 108:
-         if ((active2 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 155;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L, active2, 0x14000000000000L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 110:
-         if ((active1 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 99;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 194;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x4L, active2, 0x40002010004000L, active3, 0x200000L);
-      case 112:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000020000000L, active2, 0L, active3, 0L);
-      case 114:
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 62;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 170;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L, active1, 0x48000000000L, active2, 0x400000000000000L, active3, 0x4000L);
-      case 115:
-         if ((active1 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 122;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000000L, active1, 0x400080L, active2, 0x200000000000000L, active3, 0L);
-      case 116:
-         if ((active1 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 85;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 95;
-            jjmatchedPos = 5;
-         }
-         else if ((active1 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 108;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 140;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 174;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x4000000000040L, active2, 0L, active3, 0x10002L);
-      case 118:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000L, active3, 0L);
-      case 121:
-         if ((active2 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 169;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 212;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x80L);
-      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, 0x800000000000000L, active1, 0L, active2, 0x302080000000L, active3, 0x14000L);
-      case 67:
-         if ((active2 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 171;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x40000000004L, active2, 0L, active3, 0L);
-      case 69:
-         if ((active0 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 63;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 113;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 179;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 192;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000L, active1, 0x400000L, active2, 0x10000800000000L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0x2000L);
-      case 71:
-         if ((active3 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 213;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 72:
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 55;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 114;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 73:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc0L, active2, 0x200000000200000L, active3, 0L);
-      case 76:
-         if ((active2 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 146;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 166;
-            jjmatchedPos = 6;
-         }
-         break;
-      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, 0x20000000002000L, active3, 0x800L);
-      case 79:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800L, active2, 0x4000000000000L, active3, 0L);
-      case 80:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x4000000000L, active2, 0L, active3, 0x80L);
-      case 82:
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 54;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 147;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 158;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 211;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0x20000000L, active2, 0L, active3, 0x40000L);
-      case 83:
-         if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 56;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 84;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x200000000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 84:
-         if ((active0 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 58;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 64;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x40000010004400L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x480000000000000L, active3, 0L);
-      case 89:
-         if ((active1 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 103;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 90:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
-      case 95:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x38L, active3, 0x702L);
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0x800000000000000L, active1, 0L, active2, 0x302080000000L, active3, 0x14000L);
-      case 99:
-         if ((active2 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 171;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x40000000004L, active2, 0L, active3, 0L);
-      case 101:
-         if ((active0 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 63;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 113;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 179;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 192;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000L, active1, 0x400000L, active2, 0x10000800000000L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0x2000L);
-      case 103:
-         if ((active3 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 213;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 104:
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 55;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 114;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc0L, active2, 0x200000000200000L, active3, 0L);
-      case 108:
-         if ((active2 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 146;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 166;
-            jjmatchedPos = 6;
-         }
-         break;
-      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, 0x20000000002000L, active3, 0x800L);
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800L, active2, 0x4000000000000L, active3, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x4000000000L, active2, 0L, active3, 0x80L);
-      case 114:
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 54;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 147;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 158;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 211;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0x20000000L, active2, 0L, active3, 0x40000L);
-      case 115:
-         if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 56;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 84;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x200000000000000L, active1, 0L, active2, 0L, active3, 0L);
-      case 116:
-         if ((active0 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 58;
-            jjmatchedPos = 6;
-         }
-         else if ((active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 64;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x40000010004400L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x480000000000000L, active3, 0L);
-      case 121:
-         if ((active1 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 103;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, 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 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 210;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x400000L, active2, 0L, active3, 0x2002L);
-      case 68:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
-      case 69:
-         if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 106;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 183;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 186;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 199;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000L, active2, 0x60000000000400L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
-      case 73:
-         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L, active1, 0x10000L, active2, 0x10000020L, active3, 0x400L);
-      case 76:
-         if ((active2 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 159;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 163;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 165;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
-      case 78:
-         if ((active1 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 75;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40L, active2, 0x200000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 173;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10000000000L, active2, 0x100000000000L, active3, 0x4000L);
-      case 83:
-         if ((active0 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 53;
-            jjmatchedPos = 7;
-         }
-         else if ((active0 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 57;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 84:
-         if ((active0 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 51;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 66;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 141;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 203;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 86:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x80L, active2, 0L, active3, 0L);
-      case 87:
-         if ((active2 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 178;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 95:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x4000L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x400000L, active2, 0L, active3, 0x2002L);
-      case 100:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
-      case 101:
-         if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 106;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 183;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 186;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 199;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000L, active2, 0x60000000000400L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
-      case 105:
-         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L, active1, 0x10000L, active2, 0x10000020L, active3, 0x400L);
-      case 108:
-         if ((active2 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 159;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 163;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 165;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
-      case 110:
-         if ((active1 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 75;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40L, active2, 0x200000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 173;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10000000000L, active2, 0x100000000000L, active3, 0x4000L);
-      case 115:
-         if ((active0 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 53;
-            jjmatchedPos = 7;
-         }
-         else if ((active0 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 57;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 116:
-         if ((active0 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 51;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 66;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 141;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 203;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 118:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x80L, active2, 0L, active3, 0L);
-      case 119:
-         if ((active2 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 178;
-            jjmatchedPos = 7;
-         }
-         break;
-      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 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 172;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0x2L);
-      case 68:
-         if ((active2 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 181;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 69:
-         if ((active1 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 71;
-            jjmatchedPos = 8;
-         }
-         else if ((active1 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 104;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 76:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
-      case 78:
-         if ((active1 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 70;
-            jjmatchedPos = 8;
-         }
-         else if ((active2 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 185;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0x800000000000000L, active1, 0L, active2, 0x20L, active3, 0x400L);
-      case 79:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
-      case 80:
-         if ((active3 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 208;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 82:
-         if ((active2 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 138;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 83:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x20000000L, active2, 0L, active3, 0L);
-      case 84:
-         if ((active1 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 86;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x4000L, active3, 0x2000L);
-      case 89:
-         if ((active3 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 206;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 95:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0x2L);
-      case 100:
-         if ((active2 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 181;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 101:
-         if ((active1 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 71;
-            jjmatchedPos = 8;
-         }
-         else if ((active1 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 104;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
-      case 110:
-         if ((active1 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 70;
-            jjmatchedPos = 8;
-         }
-         else if ((active2 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 185;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0x800000000000000L, active1, 0L, active2, 0x20L, active3, 0x400L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
-      case 112:
-         if ((active3 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 208;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 114:
-         if ((active2 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 138;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 115:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x20000000L, active2, 0L, active3, 0L);
-      case 116:
-         if ((active1 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 86;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x4000L, active3, 0x2000L);
-      case 121:
-         if ((active3 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 206;
-            jjmatchedPos = 8;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 8);
-}
-private int jjMoveStringLiteralDfa9_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, 8);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 8);
-   }
-   switch(curChar)
-   {
-      case 66:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2L);
-      case 68:
-         if ((active1 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 80;
-            jjmatchedPos = 9;
-         }
-         break;
-      case 69:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x50000000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
-      case 82:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000L);
-      case 83:
-         if ((active1 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 93;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x204000L, active3, 0L);
-      case 84:
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 59;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x20L, active3, 0x400L);
-      case 85:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
-      case 98:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2L);
-      case 100:
-         if ((active1 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 80;
-            jjmatchedPos = 9;
-         }
-         break;
-      case 101:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x50000000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
-      case 114:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000L);
-      case 115:
-         if ((active1 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 93;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x204000L, active3, 0L);
-      case 116:
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 59;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x20L, active3, 0x400L);
-      case 117:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 9);
-}
-private int jjMoveStringLiteralDfa10_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, 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, 0x200L);
-      case 66:
-         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x100L);
-      case 69:
-         return jjMoveStringLiteralDfa11_0(active2, 0x4020L, active3, 0x400L);
-      case 72:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2L);
-      case 76:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10000000L, active3, 0L);
-      case 78:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa11_0(active2, 0x1000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 182;
-            jjmatchedPos = 10;
-         }
-         break;
-      case 83:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2000L);
-      case 84:
-         return jjMoveStringLiteralDfa11_0(active2, 0x200000L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10L, active3, 0x200L);
-      case 98:
-         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x100L);
-      case 101:
-         return jjMoveStringLiteralDfa11_0(active2, 0x4020L, active3, 0x400L);
-      case 104:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2L);
-      case 108:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10000000L, active3, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa11_0(active2, 0x1000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 182;
-            jjmatchedPos = 10;
-         }
-         break;
-      case 115:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2000L);
-      case 116:
-         return jjMoveStringLiteralDfa11_0(active2, 0x200000L, 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, 0x10000000000000L, active3, 0L);
-      case 69:
-         if ((active2 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 156;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 193;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 71:
-         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x400L);
-      case 73:
-         return jjMoveStringLiteralDfa12_0(active2, 0x200000L, active3, 0L);
-      case 76:
-         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x100L);
-      case 78:
-         if ((active2 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 176;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 79:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x2000L);
-      case 82:
-         if ((active2 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 142;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 84:
-         if ((active2 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 132;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 201;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa12_0(active2, 0x10000000000000L, active3, 0L);
-      case 101:
-         if ((active2 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 156;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 193;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 103:
-         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x400L);
-      case 105:
-         return jjMoveStringLiteralDfa12_0(active2, 0x200000L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x100L);
-      case 110:
-         if ((active2 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 176;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 111:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x2000L);
-      case 114:
-         if ((active2 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 142;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 116:
-         if ((active2 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 132;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 201;
-            jjmatchedPos = 11;
-         }
-         break;
-      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, 0x10000000000000L, active3, 0L);
-      case 67:
-         if ((active2 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 149;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 69:
-         if ((active2 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 131;
-            jjmatchedPos = 12;
-         }
-         else if ((active3 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 200;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x400L);
-      case 82:
-         if ((active3 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 205;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 98:
-         return jjMoveStringLiteralDfa13_0(active2, 0x10000000000000L, active3, 0L);
-      case 99:
-         if ((active2 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 149;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 101:
-         if ((active2 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 131;
-            jjmatchedPos = 12;
-         }
-         else if ((active3 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 200;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x400L);
-      case 114:
-         if ((active3 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 205;
-            jjmatchedPos = 12;
-         }
-         break;
-      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 76:
-         return jjMoveStringLiteralDfa14_0(active2, 0x10000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 133;
-            jjmatchedPos = 13;
-         }
-         else if ((active3 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 202;
-            jjmatchedPos = 13;
-         }
-         break;
-      case 108:
-         return jjMoveStringLiteralDfa14_0(active2, 0x10000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 133;
-            jjmatchedPos = 13;
-         }
-         else if ((active3 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 202;
-            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 69:
-         if ((active2 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 180;
-            jjmatchedPos = 14;
-         }
-         break;
-      case 101:
-         if ((active2 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 180;
-            jjmatchedPos = 14;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 14);
-}
+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(0x8060000000000L, 0x0L, 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, 0x0L, 0x3L, 0x0L);
+      case 66:
+         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
+      case 67:
+         return jjMoveStringLiteralDfa1_0(0x7ff4000000000000L, 0x0L, 0x7e00L, 0x0L);
+      case 68:
+         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0xfL, 0x7f8000L, 0x0L);
+      case 69:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xf0L, 0x800000L, 0x0L);
+      case 70:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xf00L, 0x7000000L, 0x0L);
+      case 71:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7000L, 0x8000000L, 0x0L);
+      case 72:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000L, 0x0L, 0x0L);
+      case 73:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1ff0000L, 0xf0000000L, 0x0L);
+      case 75:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x100000000L, 0x0L);
+      case 76:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x600000000L, 0x0L);
+      case 77:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x18000000L, 0x1800000000L, 0x0L);
+      case 78:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1e0000000L, 0x3fe000000000L, 0x0L);
+      case 79:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7e00000000L, 0x7c00000000000L, 0x0L);
+      case 80:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x38000000000L, 0x7f8000000000000L, 0x0L);
+      case 82:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xc0000000000L, 0xf800000000000000L, 0x1fL);
+      case 83:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000000L, 0x0L, 0x3fe0L);
+      case 84:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7c000000000000L, 0x0L, 0x1c000L);
+      case 85:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x380000000000000L, 0x0L, 0x20000L);
+      case 86:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00000000000000L, 0x0L, 0x3c0000L);
+      case 87:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xe000000000000000L, 0x0L, 0x0L);
+      case 89:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000L);
+      case 90:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000L);
+      case 97:
+         return jjMoveStringLiteralDfa1_0(0x798000000000L, 0x0L, 0x3L, 0x0L);
+      case 98:
+         return jjMoveStringLiteralDfa1_0(0x3800000000000L, 0x0L, 0x1fcL, 0x0L);
+      case 99:
+         return jjMoveStringLiteralDfa1_0(0x7ff4000000000000L, 0x0L, 0x7e00L, 0x0L);
+      case 100:
+         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0xfL, 0x7f8000L, 0x0L);
+      case 101:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xf0L, 0x800000L, 0x0L);
+      case 102:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xf00L, 0x7000000L, 0x0L);
+      case 103:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7000L, 0x8000000L, 0x0L);
+      case 104:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000L, 0x0L, 0x0L);
+      case 105:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1ff0000L, 0xf0000000L, 0x0L);
+      case 107:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x100000000L, 0x0L);
+      case 108:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0x600000000L, 0x0L);
+      case 109:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x18000000L, 0x1800000000L, 0x0L);
+      case 110:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1e0000000L, 0x3fe000000000L, 0x0L);
+      case 111:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7e00000000L, 0x7c00000000000L, 0x0L);
+      case 112:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x38000000000L, 0x7f8000000000000L, 0x0L);
+      case 114:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xc0000000000L, 0xf800000000000000L, 0x1fL);
+      case 115:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000000L, 0x0L, 0x3fe0L);
+      case 116:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x7c000000000000L, 0x0L, 0x1c000L);
+      case 117:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x380000000000000L, 0x0L, 0x20000L);
+      case 118:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00000000000000L, 0x0L, 0x3c0000L);
+      case 119:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0xe000000000000000L, 0x0L, 0x0L);
+      case 121:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000L);
+      case 122:
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800000L);
+      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, 0x40c000000008000L, active2, 0x1818006000018000L, active3, 0x3c0000L);
+      case 66:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
+      case 67:
+         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0L, active2, 0x18000000000L, active3, 0L);
+      case 68:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
+      case 69:
+         return jjMoveStringLiteralDfa2_0(active0, 0x8001800000000000L, active1, 0x1c0000000103L, active2, 0xe0000001003e0000L, active3, 0x404067L);
+      case 70:
+         if ((active1 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 81;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 97;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
+      case 72:
+         return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000L, active1, 0x6010200000000000L, active2, 0x600L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x980040000a000004L, active2, 0x20800001000038L, active3, 0x18780L);
+      case 76:
+         return jjMoveStringLiteralDfa2_0(active0, 0x60018000000000L, active1, 0x10L, active2, 0x4000080a000840L, active3, 0L);
+      case 77:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x800L);
+      case 78:
+         if ((active1 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 82;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 98;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x180000000f80020L, active2, 0xf0800000L, active3, 0L);
+      case 79:
+         if ((active1 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 117;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0xf80000000000000L, active1, 0xf4001200L, active2, 0x80021604403080L, active3, 0x800018L);
+      case 80:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000800000000L, active2, 0L, active3, 0L);
+      case 81:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
+      case 82:
+         if ((active1 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 100;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x3000020000000000L, active1, 0x1a000006408L, active2, 0x701000000000001L, active3, 0x20000L);
+      case 83:
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 44;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 88;
+            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, 0x1000000000000L, active2, 0L, active3, 0x1000L);
+      case 85:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000000L, active1, 0x2020100000800L, active2, 0x20c0000004002L, active3, 0L);
+      case 86:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000000000L, active2, 0x4300000000000L, active3, 0L);
+      case 88:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0xc0L, active2, 0L, active3, 0L);
+      case 89:
+         if ((active0 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 49;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000000L, active2, 0x100L, active3, 0x2000L);
+      case 97:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0x40c000000008000L, active2, 0x1818006000018000L, active3, 0x3c0000L);
+      case 98:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
+      case 99:
+         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0L, active2, 0x18000000000L, active3, 0L);
+      case 100:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
+      case 101:
+         return jjMoveStringLiteralDfa2_0(active0, 0x8001800000000000L, active1, 0x1c0000000103L, active2, 0xe0000001003e0000L, active3, 0x404067L);
+      case 102:
+         if ((active1 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 81;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 97;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L);
+      case 104:
+         return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000L, active1, 0x6010200000000000L, active2, 0x600L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x980040000a000004L, active2, 0x20800001000038L, active3, 0x18780L);
+      case 108:
+         return jjMoveStringLiteralDfa2_0(active0, 0x60018000000000L, active1, 0x10L, active2, 0x4000080a000840L, active3, 0L);
+      case 109:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x800L);
+      case 110:
+         if ((active1 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 82;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 98;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000L, active1, 0x180000000f80020L, active2, 0xf0800000L, active3, 0L);
+      case 111:
+         if ((active1 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 117;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0xf80000000000000L, active1, 0xf4001200L, active2, 0x80021604403080L, active3, 0x800018L);
+      case 112:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x200000800000000L, active2, 0L, active3, 0L);
+      case 113:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000L, active2, 0L, active3, 0L);
+      case 114:
+         if ((active1 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 100;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0x3000020000000000L, active1, 0x1a000006408L, active2, 0x701000000000001L, active3, 0x20000L);
+      case 115:
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 44;
+            jjmatchedPos = 1;
+         }
+         else if ((active1 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 88;
+            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, 0x1000000000000L, active2, 0L, active3, 0x1000L);
+      case 117:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000000L, active1, 0x2020100000800L, active2, 0x20c0000004002L, active3, 0L);
+      case 118:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000000000L, active2, 0x4300000000000L, active3, 0L);
+      case 120:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0xc0L, active2, 0L, active3, 0L);
+      case 121:
+         if ((active0 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 49;
+            jjmatchedPos = 1;
+         }
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000000L, active2, 0x100L, active3, 0x2000L);
+      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, 0x1000000000000000L, active1, 0x1200000002000L, active2, 0x2100300000800600L, active3, 0x400800L);
+      case 66:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0xe020000000000L, active2, 0L, active3, 0L);
+      case 67:
+         if ((active0 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 45;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 145;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0x240000c0L, active2, 0x4008020200040000L, active3, 0x20L);
+      case 68:
+         if ((active0 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 43;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 69;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 175;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200002010180000L, active2, 0L, active3, 0L);
+      case 69:
+         return jjMoveStringLiteralDfa3_0(active0, 0x2010000000000000L, active1, 0x7810004000010000L, active2, 0x604000000000000L, active3, 0L);
+      case 70:
+         if ((active2 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 191;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L, active2, 0x80000L, active3, 0L);
+      case 71:
+         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x1000000000000L, active3, 0x80L);
+      case 72:
+         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L, active1, 0L, active2, 0x8000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x180008000000000L, active2, 0x4L, active3, 0L);
+      case 74:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
+      case 75:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x2000000L, active2, 0L, active3, 0L);
+      case 76:
+         if ((active0 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 39;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 111;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x180000000000000L, active1, 0x400100100000000L, active2, 0x10000100000L, active3, 0L);
+      case 77:
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0xc0000001000L, active3, 0x1c700L);
+      case 78:
+         return jjMoveStringLiteralDfa3_0(active0, 0xc00000000000000L, active1, 0x8000800L, active2, 0x800001401002038L, active3, 0x800000L);
+      case 79:
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x10000004408L, active2, 0xa0008c0L, active3, 0x20000L);
+      case 80:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000000000L, active2, 0x20000000000000L, active3, 0x1L);
+      case 82:
+         if ((active1 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 73;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x10000004004001L, active3, 0x3c1000L);
+      case 83:
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40000200016L, active2, 0xc0000810000000L, active3, 0x2002L);
+      case 84:
+         if ((active1 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 94;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 157;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 177;
+            jjmatchedPos = 2;
+         }
+         else if ((active3 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 198;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x8000000800c01100L, active2, 0x60c0208102L, active3, 0x4L);
+      case 85:
+         return jjMoveStringLiteralDfa3_0(active0, 0x60000000000000L, active1, 0L, active2, 0x400000L, active3, 0L);
+      case 86:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000008000L, active2, 0L, active3, 0L);
+      case 87:
+         if ((active2 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 188;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000000L, active2, 0L, active3, 0x18L);
+      case 89:
+         if ((active2 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 144;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 160;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 90:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000000L, active2, 0L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x1200000002000L, active2, 0x2100300000800600L, active3, 0x400800L);
+      case 98:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0xe020000000000L, active2, 0L, active3, 0L);
+      case 99:
+         if ((active0 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 45;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 145;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0x240000c0L, active2, 0x4008020200040000L, active3, 0x20L);
+      case 100:
+         if ((active0 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 43;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 69;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 175;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200002010180000L, active2, 0L, active3, 0L);
+      case 101:
+         return jjMoveStringLiteralDfa3_0(active0, 0x2010000000000000L, active1, 0x7810004000010000L, active2, 0x604000000000000L, active3, 0L);
+      case 102:
+         if ((active2 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 191;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L, active2, 0x80000L, active3, 0L);
+      case 103:
+         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x1000000000000L, active3, 0x80L);
+      case 104:
+         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L, active1, 0L, active2, 0x8000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x180008000000000L, active2, 0x4L, active3, 0L);
+      case 106:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L);
+      case 107:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x2000000L, active2, 0L, active3, 0L);
+      case 108:
+         if ((active0 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 39;
+            jjmatchedPos = 2;
+         }
+         else if ((active1 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 111;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x180000000000000L, active1, 0x400100100000000L, active2, 0x10000100000L, active3, 0L);
+      case 109:
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0xc0000001000L, active3, 0x1c700L);
+      case 110:
+         return jjMoveStringLiteralDfa3_0(active0, 0xc00000000000000L, active1, 0x8000800L, active2, 0x800001401002038L, active3, 0x800000L);
+      case 111:
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x10000004408L, active2, 0xa0008c0L, active3, 0x20000L);
+      case 112:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000000000L, active2, 0x20000000000000L, active3, 0x1L);
+      case 114:
+         if ((active1 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 73;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x10000004004001L, active3, 0x3c1000L);
+      case 115:
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40000200016L, active2, 0xc0000810000000L, active3, 0x2002L);
+      case 116:
+         if ((active1 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 94;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 157;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 177;
+            jjmatchedPos = 2;
+         }
+         else if ((active3 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 198;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x8000000800c01100L, active2, 0x60c0208102L, active3, 0x4L);
+      case 117:
+         return jjMoveStringLiteralDfa3_0(active0, 0x60000000000000L, active1, 0L, active2, 0x400000L, active3, 0L);
+      case 118:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000008000L, active2, 0L, active3, 0L);
+      case 119:
+         if ((active2 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 188;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000000L, active2, 0L, active3, 0x18L);
+      case 121:
+         if ((active2 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 144;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 160;
+            jjmatchedPos = 2;
+         }
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 122:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000000L, 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 65:
+         return jjMoveStringLiteralDfa4_0(active0, 0x2088000000000000L, active1, 0x204000080000001L, active2, 0x11008203000039L, active3, 0L);
+      case 66:
+         if ((active2 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 134;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 139;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x40008c00000L, active3, 0L);
+      case 67:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 65;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000000L, active1, 0x10000000900L, active2, 0x200000004000000L, active3, 0xc0000L);
+      case 69:
+         if ((active0 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 50;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 68;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 89;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 92;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 110;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 118;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 136;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 143;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 207;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 215;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x102000780040L, active2, 0x204800c0300000L, active3, 0x10000L);
+      case 71:
+         if ((active2 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 162;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x900000000000000L, active3, 0L);
+      case 72:
+         if ((active1 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 127;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x800008000L, active2, 0x800020000c0000L, active3, 0x1008L);
+      case 75:
+         if ((active1 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
+      case 76:
+         if ((active1 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 96;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 189;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0x8020000000080L, active2, 0x800000084L, active3, 0x801L);
+      case 77:
+         if ((active1 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 74;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x8000000000L, active2, 0x1000L, active3, 0L);
+      case 78:
+         if ((active1 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 116;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 125;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x12000L, active2, 0L, active3, 0x80L);
+      case 79:
+         if ((active1 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 76;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 87;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800c0020000000L, active2, 0x4000030000000000L, active3, 0x20L);
+      case 80:
+         if ((active1 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 67;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x200040000000000L, active1, 0L, active2, 0L, active3, 0x4700L);
+      case 81:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x100000000000000L, active2, 0L, active3, 0L);
+      case 82:
+         if ((active2 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 137;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 214;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x4001204000000000L, active2, 0x4300000004400L, active3, 0x100000L);
+      case 83:
+         if ((active3 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 196;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x5860000000000000L, active1, 0L, active2, 0x400000000002000L, active3, 0L);
+      case 84:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x2000000000004L, active2, 0x1010000000L, active3, 0L);
+      case 85:
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x400000008004000L, active2, 0x4000000000L, active3, 0x6L);
+      case 87:
+         if ((active1 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 123;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x1000000000000000L, active2, 0L, active3, 0x20000L);
+      case 89:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x200000L);
+      case 95:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0x2000L);
+      case 97:
+         return jjMoveStringLiteralDfa4_0(active0, 0x2088000000000000L, active1, 0x204000080000001L, active2, 0x11008203000039L, active3, 0L);
+      case 98:
+         if ((active2 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 134;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 139;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x40008c00000L, active3, 0L);
+      case 99:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 65;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000000L, active1, 0x10000000900L, active2, 0x200000004000000L, active3, 0xc0000L);
+      case 101:
+         if ((active0 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 50;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 68;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 89;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 92;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 110;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 118;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 136;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 143;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 207;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 215;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x102000780040L, active2, 0x204800c0300000L, active3, 0x10000L);
+      case 103:
+         if ((active2 & 0x400000000L) != 0L)
+         {
+            jjmatchedKind = 162;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x900000000000000L, active3, 0L);
+      case 104:
+         if ((active1 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 127;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0x800008000L, active2, 0x800020000c0000L, active3, 0x1008L);
+      case 107:
+         if ((active1 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
+      case 108:
+         if ((active1 & 0x100000000L) != 0L)
+         {
+            jjmatchedKind = 96;
+            jjmatchedPos = 3;
+         }
+         else if ((active2 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 189;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0x8020000000080L, active2, 0x800000084L, active3, 0x801L);
+      case 109:
+         if ((active1 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 74;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x8000000000L, active2, 0x1000L, active3, 0L);
+      case 110:
+         if ((active1 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 116;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 125;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x12000L, active2, 0L, active3, 0x80L);
+      case 111:
+         if ((active1 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 76;
+            jjmatchedPos = 3;
+         }
+         else if ((active1 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 87;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800c0020000000L, active2, 0x4000030000000000L, active3, 0x20L);
+      case 112:
+         if ((active1 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 67;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x200040000000000L, active1, 0L, active2, 0L, active3, 0x4700L);
+      case 113:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x100000000000000L, active2, 0L, active3, 0L);
+      case 114:
+         if ((active2 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 137;
+            jjmatchedPos = 3;
+         }
+         else if ((active3 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 214;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x4001204000000000L, active2, 0x4300000004400L, active3, 0x100000L);
+      case 115:
+         if ((active3 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 196;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x5860000000000000L, active1, 0L, active2, 0x400000000002000L, active3, 0L);
+      case 116:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x2000000000004L, active2, 0x1010000000L, active3, 0L);
+      case 117:
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x400000008004000L, active2, 0x4000000000L, active3, 0x6L);
+      case 119:
+         if ((active1 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 123;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x1000000000000000L, active2, 0L, active3, 0x20000L);
+      case 121:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x200000L);
+      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 65:
+         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0x8000000000L, active2, 0x8000818000400L, active3, 0x100001L);
+      case 66:
+         if ((active2 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 168;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 67:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000000000L, active2, 0x700000000000L, active3, 0L);
+      case 68:
+         if ((active3 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 195;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 69:
+         if ((active0 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 42;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 109;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 115;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 126;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 130;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 154;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 187;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x401000000000000L, active1, 0x400010000000000L, active2, 0x400040000004080L, active3, 0L);
+      case 70:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
+      case 71:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000L, active3, 0L);
+      case 72:
+         if ((active0 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 60;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 164;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0xc0000L);
+      case 73:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x20080000004L, active2, 0x240000000001002L, active3, 0x220000L);
+      case 75:
+         if ((active0 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 52;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 76:
+         if ((active2 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 152;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 161;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x84000000000L, active2, 0x30000000c00000L, active3, 0xf02L);
+      case 77:
+         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x20000000L, active2, 0x100000000040000L, active3, 0L);
+      case 78:
+         if ((active0 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 47;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 119;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000L, active2, 0x1000000080000L, active3, 0x1020L);
+      case 79:
+         return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000000L, active1, 0x800000000L, active2, 0x2000000000L, active3, 0x4000L);
+      case 80:
+         if ((active1 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 78;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40L, active2, 0x20000000000L, active3, 0L);
+      case 82:
+         if ((active0 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 40;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 101;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 167;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x208000000000000L, active1, 0x600000L, active2, 0x4000084080200038L, active3, 0x2004L);
+      case 83:
+         if ((active1 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 91;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 124;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
+      case 84:
+         if ((active1 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 77;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 112;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 153;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x2860020000000000L, active1, 0x200000000010800L, active2, 0x80000000102000L, active3, 0x80L);
+      case 85:
+         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x104040000000081L, active2, 0L, active3, 0L);
+      case 88:
+         if ((active1 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 83;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0L);
+      case 89:
+         if ((active2 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 128;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, active2, 0L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0x8000000000L, active2, 0x8000818000400L, active3, 0x100001L);
+      case 98:
+         if ((active2 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 168;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 99:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000000000L, active2, 0x700000000000L, active3, 0L);
+      case 100:
+         if ((active3 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 195;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 101:
+         if ((active0 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 42;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 109;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 115;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 126;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 130;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 154;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 187;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x401000000000000L, active1, 0x400010000000000L, active2, 0x400040000004080L, active3, 0L);
+      case 102:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0L);
+      case 103:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40000000L, active3, 0L);
+      case 104:
+         if ((active0 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 60;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x1000000000L) != 0L)
+         {
+            jjmatchedKind = 164;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0xc0000L);
+      case 105:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x20080000004L, active2, 0x240000000001002L, active3, 0x220000L);
+      case 107:
+         if ((active0 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 52;
+            jjmatchedPos = 4;
+         }
+         break;
+      case 108:
+         if ((active2 & 0x1000000L) != 0L)
+         {
+            jjmatchedKind = 152;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x200000000L) != 0L)
+         {
+            jjmatchedKind = 161;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x84000000000L, active2, 0x30000000c00000L, active3, 0xf02L);
+      case 109:
+         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x20000000L, active2, 0x100000000040000L, active3, 0L);
+      case 110:
+         if ((active0 & 0x800000000000L) != 0L)
+         {
+            jjmatchedKind = 47;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 119;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000L, active2, 0x1000000080000L, active3, 0x1020L);
+      case 111:
+         return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000000L, active1, 0x800000000L, active2, 0x2000000000L, active3, 0x4000L);
+      case 112:
+         if ((active1 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 78;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40L, active2, 0x20000000000L, active3, 0L);
+      case 114:
+         if ((active0 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 40;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 101;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 167;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x208000000000000L, active1, 0x600000L, active2, 0x4000084080200038L, active3, 0x2004L);
+      case 115:
+         if ((active1 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 91;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000000000L) != 0L)
+         {
+            jjmatchedKind = 124;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
+      case 116:
+         if ((active1 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 77;
+            jjmatchedPos = 4;
+         }
+         else if ((active1 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 112;
+            jjmatchedPos = 4;
+         }
+         else if ((active2 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 153;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x2860020000000000L, active1, 0x200000000010800L, active2, 0x80000000102000L, active3, 0x80L);
+      case 117:
+         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0x104040000000081L, active2, 0L, active3, 0L);
+      case 120:
+         if ((active1 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 83;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000L, active2, 0L, active3, 0L);
+      case 121:
+         if ((active2 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 128;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, 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 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 184;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0x4000042080L, active3, 0xc0000L);
+      case 66:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
+      case 67:
+         if ((active1 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 105;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0L, active2, 0x400L, active3, 0x1L);
+      case 68:
+         if ((active2 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 129;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 190;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 197;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 209;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
+      case 69:
+         if ((active0 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 61;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 107;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 120;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 121;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 148;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 150;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 151;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x261000000000000L, active1, 0x100000L, active2, 0x40080000L, active3, 0x2700L);
+      case 71:
+         if ((active1 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 79;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 204;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
+      case 72:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x300000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10800L, active2, 0xa1080000000000L, active3, 0x800L);
+      case 76:
+         if ((active2 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 155;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L, active2, 0x14000000000000L, active3, 0L);
+      case 77:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 78:
+         if ((active1 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 99;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 194;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x4L, active2, 0x40002010004000L, active3, 0x200000L);
+      case 80:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000020000000L, active2, 0L, active3, 0L);
+      case 82:
+         if ((active0 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 170;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L, active1, 0x48000000000L, active2, 0x400000000000000L, active3, 0x4000L);
+      case 83:
+         if ((active1 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 122;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000000L, active1, 0x400080L, active2, 0x200000000000000L, active3, 0L);
+      case 84:
+         if ((active1 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 85;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 95;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 108;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 140;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 174;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x4000000000040L, active2, 0L, active3, 0x10002L);
+      case 86:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000L, active3, 0L);
+      case 89:
+         if ((active2 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 169;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 212;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x80L);
+      case 97:
+         if ((active2 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 184;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0x4000042080L, active3, 0xc0000L);
+      case 98:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x800000000L, active3, 0L);
+      case 99:
+         if ((active1 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 105;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0L, active2, 0x400L, active3, 0x1L);
+      case 100:
+         if ((active2 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 129;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 190;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 197;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x20000L) != 0L)
+         {
+            jjmatchedKind = 209;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
+      case 101:
+         if ((active0 & 0x2000000000000000L) != 0L)
+         {
+            jjmatchedKind = 61;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 107;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 120;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 121;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 148;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 150;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x800000L) != 0L)
+         {
+            jjmatchedKind = 151;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x261000000000000L, active1, 0x100000L, active2, 0x40080000L, active3, 0x2700L);
+      case 103:
+         if ((active1 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 79;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 204;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
+      case 104:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x300000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10800L, active2, 0xa1080000000000L, active3, 0x800L);
+      case 108:
+         if ((active2 & 0x8000000L) != 0L)
+         {
+            jjmatchedKind = 155;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L, active2, 0x14000000000000L, active3, 0L);
+      case 109:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 110:
+         if ((active1 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 99;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 194;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x4L, active2, 0x40002010004000L, active3, 0x200000L);
+      case 112:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000020000000L, active2, 0L, active3, 0L);
+      case 114:
+         if ((active0 & 0x4000000000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 170;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L, active1, 0x48000000000L, active2, 0x400000000000000L, active3, 0x4000L);
+      case 115:
+         if ((active1 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 122;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000000L, active1, 0x400080L, active2, 0x200000000000000L, active3, 0L);
+      case 116:
+         if ((active1 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 85;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 95;
+            jjmatchedPos = 5;
+         }
+         else if ((active1 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 108;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x1000L) != 0L)
+         {
+            jjmatchedKind = 140;
+            jjmatchedPos = 5;
+         }
+         else if ((active2 & 0x400000000000L) != 0L)
+         {
+            jjmatchedKind = 174;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x4000000000040L, active2, 0L, active3, 0x10002L);
+      case 118:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x80000000L, active3, 0L);
+      case 121:
+         if ((active2 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 169;
+            jjmatchedPos = 5;
+         }
+         else if ((active3 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 212;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x80L);
+      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, 0x800000000000000L, active1, 0L, active2, 0x302080000000L, active3, 0x14000L);
+      case 67:
+         if ((active2 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 171;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x40000000004L, active2, 0L, active3, 0L);
+      case 69:
+         if ((active0 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 63;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 113;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 179;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 192;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000L, active1, 0x400000L, active2, 0x10000800000000L, active3, 0L);
+      case 70:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0x2000L);
+      case 71:
+         if ((active3 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 213;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 72:
+         if ((active0 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 55;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 114;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 73:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc0L, active2, 0x200000000200000L, active3, 0L);
+      case 76:
+         if ((active2 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 146;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 166;
+            jjmatchedPos = 6;
+         }
+         break;
+      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, 0x20000000002000L, active3, 0x800L);
+      case 79:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800L, active2, 0x4000000000000L, active3, 0L);
+      case 80:
+         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x4000000000L, active2, 0L, active3, 0x80L);
+      case 82:
+         if ((active0 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 54;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 147;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 158;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 211;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0x20000000L, active2, 0L, active3, 0x40000L);
+      case 83:
+         if ((active0 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 56;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 84;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x200000000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 84:
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 58;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 64;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x40000010004400L, active3, 0L);
+      case 85:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
+      case 86:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x480000000000000L, active3, 0L);
+      case 89:
+         if ((active1 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 90:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
+      case 95:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x38L, active3, 0x702L);
+      case 97:
+         return jjMoveStringLiteralDfa7_0(active0, 0x800000000000000L, active1, 0L, active2, 0x302080000000L, active3, 0x14000L);
+      case 99:
+         if ((active2 & 0x80000000000L) != 0L)
+         {
+            jjmatchedKind = 171;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x40000000004L, active2, 0L, active3, 0L);
+      case 101:
+         if ((active0 & 0x8000000000000000L) != 0L)
+         {
+            jjmatchedKind = 63;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x2000000000000L) != 0L)
+         {
+            jjmatchedKind = 113;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 179;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 192;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000L, active1, 0x400000L, active2, 0x10000800000000L, active3, 0L);
+      case 102:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0x2000L);
+      case 103:
+         if ((active3 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 213;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 104:
+         if ((active0 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 55;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 114;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 105:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc0L, active2, 0x200000000200000L, active3, 0L);
+      case 108:
+         if ((active2 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 146;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 166;
+            jjmatchedPos = 6;
+         }
+         break;
+      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, 0x20000000002000L, active3, 0x800L);
+      case 111:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800L, active2, 0x4000000000000L, active3, 0L);
+      case 112:
+         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x4000000000L, active2, 0L, active3, 0x80L);
+      case 114:
+         if ((active0 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 54;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 147;
+            jjmatchedPos = 6;
+         }
+         else if ((active2 & 0x40000000L) != 0L)
+         {
+            jjmatchedKind = 158;
+            jjmatchedPos = 6;
+         }
+         else if ((active3 & 0x80000L) != 0L)
+         {
+            jjmatchedKind = 211;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0x20000000L, active2, 0L, active3, 0x40000L);
+      case 115:
+         if ((active0 & 0x100000000000000L) != 0L)
+         {
+            jjmatchedKind = 56;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 84;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0x200000000000000L, active1, 0L, active2, 0L, active3, 0L);
+      case 116:
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 58;
+            jjmatchedPos = 6;
+         }
+         else if ((active1 & 0x1L) != 0L)
+         {
+            jjmatchedKind = 64;
+            jjmatchedPos = 6;
+         }
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x40000010004400L, active3, 0L);
+      case 117:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000L, active2, 0L, active3, 0L);
+      case 118:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x480000000000000L, active3, 0L);
+      case 121:
+         if ((active1 & 0x8000000000L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 6;
+         }
+         break;
+      case 122:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, 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 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 210;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
+      case 67:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x400000L, active2, 0L, active3, 0x2002L);
+      case 68:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
+      case 69:
+         if ((active0 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 41;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 106;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 183;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 186;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 199;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000L, active2, 0x60000000000400L, active3, 0L);
+      case 70:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
+      case 73:
+         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L, active1, 0x10000L, active2, 0x10000020L, active3, 0x400L);
+      case 76:
+         if ((active2 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 159;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 163;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 165;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 77:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
+      case 78:
+         if ((active1 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 75;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 79:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40L, active2, 0x200000000000000L, active3, 0L);
+      case 82:
+         if ((active2 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 173;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10000000000L, active2, 0x100000000000L, active3, 0x4000L);
+      case 83:
+         if ((active0 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 53;
+            jjmatchedPos = 7;
+         }
+         else if ((active0 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 57;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 102;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 84:
+         if ((active0 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 51;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 66;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 141;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 203;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 86:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x80L, active2, 0L, active3, 0L);
+      case 87:
+         if ((active2 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 178;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 95:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x4000L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
+      case 99:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x400000L, active2, 0L, active3, 0x2002L);
+      case 100:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
+      case 101:
+         if ((active0 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 41;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 106;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x80000000000000L) != 0L)
+         {
+            jjmatchedKind = 183;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 186;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 199;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000L, active2, 0x60000000000400L, active3, 0L);
+      case 102:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
+      case 105:
+         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L, active1, 0x10000L, active2, 0x10000020L, active3, 0x400L);
+      case 108:
+         if ((active2 & 0x80000000L) != 0L)
+         {
+            jjmatchedKind = 159;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x800000000L) != 0L)
+         {
+            jjmatchedKind = 163;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x2000000000L) != 0L)
+         {
+            jjmatchedKind = 165;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 109:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
+      case 110:
+         if ((active1 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 75;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 111:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40L, active2, 0x200000000000000L, active3, 0L);
+      case 114:
+         if ((active2 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 173;
+            jjmatchedPos = 7;
+         }
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10000000000L, active2, 0x100000000000L, active3, 0x4000L);
+      case 115:
+         if ((active0 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 53;
+            jjmatchedPos = 7;
+         }
+         else if ((active0 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 57;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x4000000000L) != 0L)
+         {
+            jjmatchedKind = 102;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 116:
+         if ((active0 & 0x8000000000000L) != 0L)
+         {
+            jjmatchedKind = 51;
+            jjmatchedPos = 7;
+         }
+         else if ((active1 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 66;
+            jjmatchedPos = 7;
+         }
+         else if ((active2 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 141;
+            jjmatchedPos = 7;
+         }
+         else if ((active3 & 0x800L) != 0L)
+         {
+            jjmatchedKind = 203;
+            jjmatchedPos = 7;
+         }
+         break;
+      case 118:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x80L, active2, 0L, active3, 0L);
+      case 119:
+         if ((active2 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 178;
+            jjmatchedPos = 7;
+         }
+         break;
+      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 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 172;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 65:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0x2L);
+      case 68:
+         if ((active2 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 181;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 69:
+         if ((active1 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 71;
+            jjmatchedPos = 8;
+         }
+         else if ((active1 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 104;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
+      case 71:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 76:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
+      case 78:
+         if ((active1 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 70;
+            jjmatchedPos = 8;
+         }
+         else if ((active2 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 185;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active0, 0x800000000000000L, active1, 0L, active2, 0x20L, active3, 0x400L);
+      case 79:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
+      case 80:
+         if ((active3 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 208;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 82:
+         if ((active2 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 138;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 83:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x20000000L, active2, 0L, active3, 0L);
+      case 84:
+         if ((active1 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 86;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
+      case 85:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x4000L, active3, 0x2000L);
+      case 89:
+         if ((active3 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 206;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 95:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0x2L);
+      case 100:
+         if ((active2 & 0x20000000000000L) != 0L)
+         {
+            jjmatchedKind = 181;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 101:
+         if ((active1 & 0x80L) != 0L)
+         {
+            jjmatchedKind = 71;
+            jjmatchedPos = 8;
+         }
+         else if ((active1 & 0x10000000000L) != 0L)
+         {
+            jjmatchedKind = 104;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0L);
+      case 103:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x40000000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x200000L, active3, 0L);
+      case 108:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
+      case 110:
+         if ((active1 & 0x40L) != 0L)
+         {
+            jjmatchedKind = 70;
+            jjmatchedPos = 8;
+         }
+         else if ((active2 & 0x200000000000000L) != 0L)
+         {
+            jjmatchedKind = 185;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active0, 0x800000000000000L, active1, 0L, active2, 0x20L, active3, 0x400L);
+      case 111:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
+      case 112:
+         if ((active3 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 208;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 114:
+         if ((active2 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 138;
+            jjmatchedPos = 8;
+         }
+         break;
+      case 115:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x20000000L, active2, 0L, active3, 0L);
+      case 116:
+         if ((active1 & 0x400000L) != 0L)
+         {
+            jjmatchedKind = 86;
+            jjmatchedPos = 8;
+         }
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
+      case 117:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x4000L, active3, 0x2000L);
+      case 121:
+         if ((active3 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 206;
+            jjmatchedPos = 8;
+         }
+         break;
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 8);
+}
+private int jjMoveStringLiteralDfa9_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, 8);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+   return jjMoveNfa_0(5, 8);
+   }
+   switch(curChar)
+   {
+      case 66:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0L);
+      case 67:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2L);
+      case 68:
+         if ((active1 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 80;
+            jjmatchedPos = 9;
+         }
+         break;
+      case 69:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x50000000000000L, active3, 0L);
+      case 73:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
+      case 79:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
+      case 82:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000L);
+      case 83:
+         if ((active1 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 93;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x204000L, active3, 0L);
+      case 84:
+         if ((active0 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 59;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x20L, active3, 0x400L);
+      case 85:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
+      case 98:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10000000L, active3, 0L);
+      case 99:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2L);
+      case 100:
+         if ((active1 & 0x10000L) != 0L)
+         {
+            jjmatchedKind = 80;
+            jjmatchedPos = 9;
+         }
+         break;
+      case 101:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x50000000000000L, active3, 0L);
+      case 105:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x1000000000000L, active3, 0L);
+      case 111:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x200L);
+      case 114:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2000L);
+      case 115:
+         if ((active1 & 0x20000000L) != 0L)
+         {
+            jjmatchedKind = 93;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x204000L, active3, 0L);
+      case 116:
+         if ((active0 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 59;
+            jjmatchedPos = 9;
+         }
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x20L, active3, 0x400L);
+      case 117:
+         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x100L);
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 9);
+}
+private int jjMoveStringLiteralDfa10_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, 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, 0x200L);
+      case 66:
+         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x100L);
+      case 69:
+         return jjMoveStringLiteralDfa11_0(active2, 0x4020L, active3, 0x400L);
+      case 72:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2L);
+      case 76:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10000000L, active3, 0L);
+      case 78:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
+      case 79:
+         return jjMoveStringLiteralDfa11_0(active2, 0x1000000000000L, active3, 0L);
+      case 82:
+         if ((active2 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 182;
+            jjmatchedPos = 10;
+         }
+         break;
+      case 83:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2000L);
+      case 84:
+         return jjMoveStringLiteralDfa11_0(active2, 0x200000L, active3, 0L);
+      case 97:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10L, active3, 0x200L);
+      case 98:
+         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x100L);
+      case 101:
+         return jjMoveStringLiteralDfa11_0(active2, 0x4020L, active3, 0x400L);
+      case 104:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2L);
+      case 108:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10000000L, active3, 0L);
+      case 110:
+         return jjMoveStringLiteralDfa11_0(active2, 0x10000000000000L, active3, 0L);
+      case 111:
+         return jjMoveStringLiteralDfa11_0(active2, 0x1000000000000L, active3, 0L);
+      case 114:
+         if ((active2 & 0x40000000000000L) != 0L)
+         {
+            jjmatchedKind = 182;
+            jjmatchedPos = 10;
+         }
+         break;
+      case 115:
+         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x2000L);
+      case 116:
+         return jjMoveStringLiteralDfa11_0(active2, 0x200000L, 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, 0x10000000000000L, active3, 0L);
+      case 69:
+         if ((active2 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 156;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 193;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 71:
+         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x400L);
+      case 73:
+         return jjMoveStringLiteralDfa12_0(active2, 0x200000L, active3, 0L);
+      case 76:
+         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x100L);
+      case 78:
+         if ((active2 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 176;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 79:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x2000L);
+      case 82:
+         if ((active2 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 142;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 84:
+         if ((active2 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 132;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 201;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 97:
+         return jjMoveStringLiteralDfa12_0(active2, 0x10000000000000L, active3, 0L);
+      case 101:
+         if ((active2 & 0x10000000L) != 0L)
+         {
+            jjmatchedKind = 156;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 193;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 103:
+         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x400L);
+      case 105:
+         return jjMoveStringLiteralDfa12_0(active2, 0x200000L, active3, 0L);
+      case 108:
+         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x100L);
+      case 110:
+         if ((active2 & 0x1000000000000L) != 0L)
+         {
+            jjmatchedKind = 176;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 111:
+         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x2000L);
+      case 114:
+         if ((active2 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 142;
+            jjmatchedPos = 11;
+         }
+         break;
+      case 116:
+         if ((active2 & 0x10L) != 0L)
+         {
+            jjmatchedKind = 132;
+            jjmatchedPos = 11;
+         }
+         else if ((active3 & 0x200L) != 0L)
+         {
+            jjmatchedKind = 201;
+            jjmatchedPos = 11;
+         }
+         break;
+      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, 0x10000000000000L, active3, 0L);
+      case 67:
+         if ((active2 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 149;
+            jjmatchedPos = 12;
+         }
+         break;
+      case 69:
+         if ((active2 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 131;
+            jjmatchedPos = 12;
+         }
+         else if ((active3 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 200;
+            jjmatchedPos = 12;
+         }
+         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x400L);
+      case 82:
+         if ((active3 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 205;
+            jjmatchedPos = 12;
+         }
+         break;
+      case 98:
+         return jjMoveStringLiteralDfa13_0(active2, 0x10000000000000L, active3, 0L);
+      case 99:
+         if ((active2 & 0x200000L) != 0L)
+         {
+            jjmatchedKind = 149;
+            jjmatchedPos = 12;
+         }
+         break;
+      case 101:
+         if ((active2 & 0x8L) != 0L)
+         {
+            jjmatchedKind = 131;
+            jjmatchedPos = 12;
+         }
+         else if ((active3 & 0x100L) != 0L)
+         {
+            jjmatchedKind = 200;
+            jjmatchedPos = 12;
+         }
+         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x400L);
+      case 114:
+         if ((active3 & 0x2000L) != 0L)
+         {
+            jjmatchedKind = 205;
+            jjmatchedPos = 12;
+         }
+         break;
+      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 76:
+         return jjMoveStringLiteralDfa14_0(active2, 0x10000000000000L, active3, 0L);
+      case 82:
+         if ((active2 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 133;
+            jjmatchedPos = 13;
+         }
+         else if ((active3 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 202;
+            jjmatchedPos = 13;
+         }
+         break;
+      case 108:
+         return jjMoveStringLiteralDfa14_0(active2, 0x10000000000000L, active3, 0L);
+      case 114:
+         if ((active2 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 133;
+            jjmatchedPos = 13;
+         }
+         else if ((active3 & 0x400L) != 0L)
+         {
+            jjmatchedKind = 202;
+            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 69:
+         if ((active2 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 180;
+            jjmatchedPos = 14;
+         }
+         break;
+      case 101:
+         if ((active2 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 180;
+            jjmatchedPos = 14;
+         }
+         break;
+      default :
+         break;
+   }
+   return jjMoveNfa_0(5, 14);
+}
 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 > 216)
-                     kind = 216;
-                  jjstateSet[jjnewStateCnt++] = 14;
-                  break;
-               case 15:
-                  if (curChar == 58)
-                     jjAddStates(7, 9);
-                  break;
-               case 17:
-                  if ((0x3ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjAddStates(16, 17);
-                  break;
-               case 18:
-                  if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 19;
-                  break;
-               case 20:
-                  if ((0x3ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjstateSet[jjnewStateCnt++] = 20;
-                  break;
-               case 21:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddStates(18, 24);
-                  break;
-               case 22:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAdd(22);
-                  break;
-               case 23:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddTwoStates(23, 24);
-                  break;
-               case 24:
-                  if (curChar == 46)
-                     jjCheckNAdd(25);
-                  break;
-               case 25:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAdd(25);
-                  break;
-               case 26:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  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 > 219)
-                     kind = 219;
-                  jjCheckNAdd(30);
-                  break;
-               case 31:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddStates(27, 29);
-                  break;
-               case 32:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAdd(32);
-                  break;
-               case 33:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddTwoStates(33, 34);
-                  break;
-               case 34:
-                  if (curChar == 46)
-                     jjCheckNAdd(35);
-                  break;
-               case 35:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAdd(35);
-                  break;
-               case 36:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddStates(30, 32);
-                  break;
-               case 37:
-                  if (curChar == 46)
-                     jjCheckNAdd(38);
-                  break;
-               case 38:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddTwoStates(38, 27);
-                  break;
-               case 39:
-                  if (curChar == 46)
-                     jjCheckNAddTwoStates(40, 41);
-                  break;
-               case 40:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAdd(40);
-                  break;
-               case 41:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  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 > 220)
-                     kind = 220;
-                  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 > 221)
-                     kind = 221;
-                  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 > 216)
-                     kind = 216;
-                  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 > 216)
-                     kind = 216;
-                  jjCheckNAdd(14);
-                  break;
-               case 16:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddStates(41, 43);
-                  break;
-               case 17:
-                  if ((0x7fffffe87ffffffL & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddTwoStates(17, 18);
-                  break;
-               case 19:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  jjCheckNAddTwoStates(19, 20);
-                  break;
-               case 20:
-                  if ((0x7fffffe87ffffffL & l) == 0L)
-                     break;
-                  if (kind > 219)
-                     kind = 219;
-                  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 > 216)
+                     kind = 216;
+                  jjstateSet[jjnewStateCnt++] = 14;
+                  break;
+               case 15:
+                  if (curChar == 58)
+                     jjAddStates(7, 9);
+                  break;
+               case 17:
+                  if ((0x3ff001800000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjAddStates(16, 17);
+                  break;
+               case 18:
+                  if (curChar == 46)
+                     jjstateSet[jjnewStateCnt++] = 19;
+                  break;
+               case 20:
+                  if ((0x3ff001800000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjstateSet[jjnewStateCnt++] = 20;
+                  break;
+               case 21:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddStates(18, 24);
+                  break;
+               case 22:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAdd(22);
+                  break;
+               case 23:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddTwoStates(23, 24);
+                  break;
+               case 24:
+                  if (curChar == 46)
+                     jjCheckNAdd(25);
+                  break;
+               case 25:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAdd(25);
+                  break;
+               case 26:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  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 > 219)
+                     kind = 219;
+                  jjCheckNAdd(30);
+                  break;
+               case 31:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddStates(27, 29);
+                  break;
+               case 32:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAdd(32);
+                  break;
+               case 33:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddTwoStates(33, 34);
+                  break;
+               case 34:
+                  if (curChar == 46)
+                     jjCheckNAdd(35);
+                  break;
+               case 35:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAdd(35);
+                  break;
+               case 36:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddStates(30, 32);
+                  break;
+               case 37:
+                  if (curChar == 46)
+                     jjCheckNAdd(38);
+                  break;
+               case 38:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddTwoStates(38, 27);
+                  break;
+               case 39:
+                  if (curChar == 46)
+                     jjCheckNAddTwoStates(40, 41);
+                  break;
+               case 40:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAdd(40);
+                  break;
+               case 41:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  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 > 220)
+                     kind = 220;
+                  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 > 221)
+                     kind = 221;
+                  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 > 216)
+                     kind = 216;
+                  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 > 216)
+                     kind = 216;
+                  jjCheckNAdd(14);
+                  break;
+               case 16:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddStates(41, 43);
+                  break;
+               case 17:
+                  if ((0x7fffffe87ffffffL & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddTwoStates(17, 18);
+                  break;
+               case 19:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  jjCheckNAddTwoStates(19, 20);
+                  break;
+               case 20:
+                  if ((0x7fffffe87ffffffL & l) == 0L)
+                     break;
+                  if (kind > 219)
+                     kind = 219;
+                  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, };
-
-/** 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, };
+
+/** Lexer state names. */
+public static final String[] lexStateNames = {
+   "DEFAULT",
+};
 static final long[] jjtoToken = {
    0xffffff8fffffff01L, 0xffffffffffffffffL, 0xffffffffffffffffL, 0x39ffffffL, 
-};
+};
 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) */
