diff --git a/oracleddl.parent/pom.xml b/oracleddl.parent/pom.xml
index a43c9c6..57a9084 100644
--- a/oracleddl.parent/pom.xml
+++ b/oracleddl.parent/pom.xml
@@ -18,14 +18,13 @@
     <properties>
         <!-- TOOL Properties -->
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <tycho.version>0.15.0</tycho.version>
-        <junit4-version>4.8.1</junit4-version>
+        <tycho.version>0.21.0</tycho.version>
+        <junit4-version>4.8.2</junit4-version>
         <!-- PROJECT Properties -->
         <release.version>1.0.0</release.version>
         <!-- maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format> Seems it must be in settings.xml -->
         <build.qualifier>v${maven.build.timestamp}</build.qualifier>
         <forceContextQualifier>${build.qualifier}</forceContextQualifier>
-        <src>./src/main/java,./src/test/java</src>
     </properties>
 
     <organization>
@@ -38,6 +37,12 @@
         <plugins>
             <plugin>
                 <groupId>org.eclipse.tycho</groupId>
+                <artifactId>tycho-maven-plugin</artifactId>
+                <version>${tycho.version}</version>
+                <extensions>true</extensions>
+            </plugin>
+            <plugin>
+                <groupId>org.eclipse.tycho</groupId>
                 <artifactId>tycho-compiler-plugin</artifactId>
                 <version>${tycho.version}</version>
                 <configuration>
@@ -53,15 +58,6 @@
             </plugin>
             <plugin>
                 <groupId>org.eclipse.tycho</groupId>
-                <artifactId>tycho-maven-plugin</artifactId>
-                <version>${tycho.version}</version>
-                <extensions>true</extensions>
-                <configuration>
-                    <resolver>p2</resolver>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
                 <artifactId>target-platform-configuration</artifactId>
                 <version>${tycho.version}</version>
                 <configuration>
@@ -119,23 +115,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.eclipse.tycho</groupId>
+                <artifactId>tycho-p2-plugin</artifactId>
+                <version>${tycho.version}</version>
+                <executions>
+                    <execution>
+                        <id>attach-p2-metadata</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>p2-metadata</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
         <finalName>${project.artifactId}_${release.version}.${build.qualifier}</finalName>
     </build>
-
-    <pluginRepositories>
-        <pluginRepository>
-            <id>tycho-0.15.0-staged</id>
-            <url>https://oss.sonatype.org/content/repositories/orgeclipsetycho-255/</url>
-        </pluginRepository>
-        <!-- pluginRepository>
-            <id>tycho-public</id>
-            <url>https://oss.sonatype.org/content/groups/public/</url>
-        </pluginRepository -->
-        <pluginRepository>
-            <id>maven-eclipse</id>
-            <url>http://repo1.maven.org</url>
-        </pluginRepository>
-    </pluginRepositories>
-
 </project>
diff --git "a/oracleddlparser/\050maven\051Oracle DDL Parser tests.launch" "b/oracleddlparser/\050maven\051Oracle DDL Parser tests.launch"
index 5ad2e19..06ee922 100644
--- "a/oracleddlparser/\050maven\051Oracle DDL Parser tests.launch"
+++ "b/oracleddlparser/\050maven\051Oracle DDL Parser tests.launch"
@@ -7,7 +7,6 @@
 <stringAttribute key="M2_PROFILES" value=""/>
 <listAttribute key="M2_PROPERTIES">
 <listEntry value="db.oracle.driver=${db.oracle.driver}"/>
-<listEntry value="db.oracle.platform=${db.oracle.platform}"/>
 <listEntry value="db.oracle.pwd=${db.oracle.pwd}"/>
 <listEntry value="db.oracle.url=${db.oracle.url}"/>
 <listEntry value="db.oracle.user=${db.oracle.user}"/>
diff --git a/oracleddlparser/.classpath b/oracleddlparser/.classpath
index ddd8f96..5664297 100644
--- a/oracleddlparser/.classpath
+++ b/oracleddlparser/.classpath
@@ -1,9 +1,11 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry kind="src" path="src/test/java"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" path="src/main/jjtree"/>
+	<classpathentry kind="src" path="target/generated-sources/javacc"/>
+	<classpathentry kind="src" path="target/generated-sources/jjtree"/>
+	<classpathentry kind="src" path="src/main/resources"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/oracleddlparser/.settings/org.eclipse.core.resources.prefs b/oracleddlparser/.settings/org.eclipse.core.resources.prefs
index c26d42d..30b8b67 100644
--- a/oracleddlparser/.settings/org.eclipse.core.resources.prefs
+++ b/oracleddlparser/.settings/org.eclipse.core.resources.prefs
@@ -1,3 +1,4 @@
-#Mon Jan 09 20:25:20 EST 2012
 eclipse.preferences.version=1
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
 encoding/<project>=UTF-8
diff --git "a/oracleddlparser/Oracle DDL Parser \050All\051 tests.launch" "b/oracleddlparser/Oracle DDL Parser \050All\051 tests.launch"
index dedb85d..b3c7e08 100644
--- "a/oracleddlparser/Oracle DDL Parser \050All\051 tests.launch"
+++ "b/oracleddlparser/Oracle DDL Parser \050All\051 tests.launch"
@@ -21,5 +21,5 @@
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.persistence.tools.oracleddl.test.AllTests"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.persistence.oracleddlparser"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.platform=${db.oracle.platform} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
 </launchConfiguration>
diff --git "a/oracleddlparser/Oracle DDL Parser \050just DatabaseTypeBuilder\051 tests.launch" "b/oracleddlparser/Oracle DDL Parser \050just DatabaseTypeBuilder\051 tests.launch"
index 8b97ac3..219511c 100644
--- "a/oracleddlparser/Oracle DDL Parser \050just DatabaseTypeBuilder\051 tests.launch"
+++ "b/oracleddlparser/Oracle DDL Parser \050just DatabaseTypeBuilder\051 tests.launch"
@@ -21,5 +21,5 @@
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.persistence.tools.oracleddl.test.databasetypebuilder.DatabaseTypeBuilderTestSuite"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.persistence.oracleddlparser"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.platform=${db.oracle.platform} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
 </launchConfiguration>
diff --git "a/oracleddlparser/Oracle DDL Parser \050just Parser\051 tests.launch" "b/oracleddlparser/Oracle DDL Parser \050just Parser\051 tests.launch"
index c2adc92..095dadb 100644
--- "a/oracleddlparser/Oracle DDL Parser \050just Parser\051 tests.launch"
+++ "b/oracleddlparser/Oracle DDL Parser \050just Parser\051 tests.launch"
@@ -14,5 +14,5 @@
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.persistence.tools.oracleddl.test.ddlparser.DDLParserTestSuite"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.persistence.oracleddlparser"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.platform=${db.oracle.platform} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
 </launchConfiguration>
\ No newline at end of file
diff --git "a/oracleddlparser/Oracle DDL Parser \050just Visitors\051 tests.launch" "b/oracleddlparser/Oracle DDL Parser \050just Visitors\051 tests.launch"
index 3a09b6c..bf59577 100644
--- "a/oracleddlparser/Oracle DDL Parser \050just Visitors\051 tests.launch"
+++ "b/oracleddlparser/Oracle DDL Parser \050just Visitors\051 tests.launch"
@@ -14,5 +14,5 @@
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.persistence.tools.oracleddl.test.visit.VisitorsTestSuite"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.persistence.oracleddlparser"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.platform=${db.oracle.platform} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Ddb.user=${db.oracle.user} -Ddb.pwd=${db.oracle.pwd} -Ddb.url=${db.oracle.url} -Ddb.driver=${db.oracle.driver} -Ddb.ddl.create=${db.ddl.create} -Ddb.ddl.drop=${db.ddl.drop} -Ddb.ddl.debug=${db.ddl.debug}"/>
 </launchConfiguration>
\ No newline at end of file
diff --git a/oracleddlparser/build.properties b/oracleddlparser/build.properties
index 58edf37..494fefd 100644
--- a/oracleddlparser/build.properties
+++ b/oracleddlparser/build.properties
@@ -1,5 +1,9 @@
 bin.includes = .,\
                META-INF/
 jars.compile.order = .
-source.. = src/main/java/
+source.. = src/main/java/,\
+           src/main/jjtree/,\
+           src/main/resources/,\
+           target/generated-sources/javacc,\
+           target/generated-sources/jjtree
 output.. = ./target/classes
diff --git a/oracleddlparser/pom.xml b/oracleddlparser/pom.xml
index a1037b7..304c7dd 100644
--- a/oracleddlparser/pom.xml
+++ b/oracleddlparser/pom.xml
@@ -19,19 +19,23 @@
       <maven-surefire-plugin.version>2.11</maven-surefire-plugin.version>
       <maven-surefire-report-plugin.version>2.11</maven-surefire-report-plugin.version>
       <jxr-maven-plugin.version>2.3</jxr-maven-plugin.version>
+      <!-- tests related properties -->
+      <db.oracle.url>jdbc:oracle:thin:@localhost:1521:ORCL</db.oracle.url>
+      <db.oracle.user>scott</db.oracle.user>
+      <db.oracle.pwd>tiger</db.oracle.pwd>
+      <db.oracle.driver>oracle.jdbc.OracleDriver</db.oracle.driver>
+      <db.ddl.create>false</db.ddl.create>
+      <db.ddl.drop>false</db.ddl.drop>
+      <db.ddl.debug>false</db.ddl.debug>
+      <!-- enable debugger on port 5005 -->
+      <test.debug>false</test.debug>
     </properties>
 
     <dependencies>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>4.8.2</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>com.oracle</groupId>
-        <artifactId>ojdbc6</artifactId>
-        <version>11.2.0</version>
+        <version>${junit4-version}</version>
         <scope>test</scope>
       </dependency>
     </dependencies>
@@ -39,6 +43,19 @@
     <build>
       <plugins>
         <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>javacc-maven-plugin</artifactId>
+          <version>2.6</version>
+          <executions>
+            <execution>
+              <id>jjtree-javacc</id>
+              <goals>
+                <goal>jjtree-javacc</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+        <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-project-info-reports-plugin</artifactId>
           <version>${maven-project-info-reports-plugin.version}</version>
@@ -53,13 +70,13 @@
           <artifactId>maven-compiler-plugin</artifactId>
           <version>2.5.1</version>
           <executions>
-            <execution>
-			  <id>test</id>
-			  <phase>test</phase>
-			  <goals>
-				<goal>testCompile</goal>
-			  </goals>
-            </execution>
+              <execution>
+                  <id>test</id>
+                  <phase>test</phase>
+                  <goals>
+                      <goal>testCompile</goal>
+                  </goals>
+              </execution>
           </executions>
         </plugin>
         <plugin>
@@ -75,7 +92,6 @@
                    <db.user>${db.oracle.user}</db.user>
                    <db.pwd>${db.oracle.pwd}</db.pwd>
                    <db.url>${db.oracle.url}</db.url>
-                   <db.platform>${db.oracle.platform}</db.platform>
                    <db.driver>${db.oracle.driver}</db.driver>
                    <db.ddl.create>${db.ddl.create}</db.ddl.create>
                    <db.ddl.drop>${db.ddl.drop}</db.ddl.drop>
@@ -86,6 +102,7 @@
                   <includes>
                       <include>**/AllTests.java</include>
                   </includes>
+                  <debugForkedProcess>${test.debug}</debugForkedProcess>
               </configuration>
               <goals>
                 <goal>test</goal>
@@ -107,35 +124,12 @@
             </execution>
           </executions>
         </plugin>
-        <plugin>
-          <artifactId>maven-antrun-plugin</artifactId>
-          <version>1.6</version>
-          <executions>
-            <execution>
-              <id>inject-resources-into-src-bundles</id>
-              <phase>package</phase>
-              <configuration>
-                <target>
-                  <zip file="target/${project.artifactId}.source_${release.version}.${build.qualifier}.jar" duplicate="preserve">
-                    <zipgroupfileset dir="target">
-                      <include name="${project.artifactId}_${release.version}.${build.qualifier}-sources.jar"/>
-                    </zipgroupfileset>
-                    <fileset dir="src/main/resources" includes="**"/>
-                  </zip>
-                </target>
-              </configuration>
-              <goals>
-                <goal>run</goal>
-              </goals>
-            </execution>
-          </executions>
-        </plugin>
       </plugins>
     </build>
 
     <reporting>
       <plugins>
-	    <plugin>
+        <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-jxr-plugin</artifactId>
           <version>${jxr-maven-plugin.version}</version>
@@ -155,4 +149,39 @@
       </plugins>
     </reporting>
 
+    <profiles>
+        <profile>
+            <id>system-jdbc-driver</id>
+            <activation>
+                <file>
+                    <exists>${basedir}/../../extension.lib.external/ojdbc6.jar</exists>
+                </file>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>com.oracle</groupId>
+                    <artifactId>ojdbc6</artifactId>
+                    <version>11.2.0</version>
+                    <scope>system</scope>
+                    <systemPath>${basedir}/../../extension.lib.external/ojdbc6.jar</systemPath>
+                </dependency>
+            </dependencies>
+        </profile>
+        <profile>
+            <id>repo-jdbc-driver</id>
+            <activation>
+                <file>
+                    <missing>${basedir}/../../extension.lib.external/ojdbc6.jar</missing>
+                </file>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>com.oracle</groupId>
+                    <artifactId>ojdbc6</artifactId>
+                    <version>11.2.0</version>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
\ 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
deleted file mode 100644
index 8339187..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java
+++ /dev/null
@@ -1,4794 +0,0 @@
-/* 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
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-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.util.StringTokenizer;
-
-//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 static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.XMLTYPE_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 List<String> schemaPatterns = null;
-
-    protected DatabaseTypesRepository typesRepository = new DatabaseTypesRepository();
-
-    public DDLParser() {
-        super();
-    }
-
-    public void setTypesRepository(DatabaseTypesRepository typesRepository) {
-        this.typesRepository = typesRepository;
-    }
-    public DatabaseTypesRepository getTypesRepository() {
-        return typesRepository;
-    }
-
-    public void setSchemaPatterns(List<String> schemaPatterns) {
-        this.schemaPatterns = schemaPatterns;
-    }
-
-    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_CONSTRUCTOR:
-      t = jj_consume_token(K_CONSTRUCTOR);
-      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:
-      t = jj_consume_token(K_RESULT);
-      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_SELF:
-      t = jj_consume_token(K_SELF);
-      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_XMLTYPE:
-      t = jj_consume_token(K_XMLTYPE);
-      break;
-    case K_SYSXMLTYPE:
-      t = jj_consume_token(K_SYSXMLTYPE);
-      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_CONSTRUCTOR:
-      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:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SELF:
-      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_XMLTYPE:
-      case K_SYSXMLTYPE:
-      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");
-  }
-
-// 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(functionType);
-    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");
-  }
-
-// 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);
-        constructorDeclaration();
-        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)) {
-      constructor();
-    } 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_CONSTRUCTOR:
-      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:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SELF:
-      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_XMLTYPE:
-      case K_SYSXMLTYPE:
-      case K_YEAR:
-      case K_ZONE:
-      case S_IDENTIFIER:
-      case S_QUOTED_IDENTIFIER:
-        columnDeclaration(enclosingType);
-        break;
-      case R_CHECK:
-      case R_CONSTRAINT:
-      case R_PRIMARY:
-      case R_UNIQUE:
-        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_CONSTRUCTOR:
-    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:
-    case K_RESULT_CACHE:
-    case K_RETURN:
-    case K_ROWID:
-    case K_ROWS:
-    case K_SECOND:
-    case K_SELF:
-    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_XMLTYPE:
-    case K_SYSXMLTYPE:
-    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_CONSTRUCTOR:
-      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:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SELF:
-      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_XMLTYPE:
-      case K_SYSXMLTYPE:
-      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());
-              String schemaName = null;
-              if (enclosingType.isTableType()) {
-                 schemaName = ((TableType)enclosingType).getSchema();
-              } else if (enclosingType.isObjectTableType()) {
-                 schemaName = ((ObjectTableType)enclosingType).getSchema();
-              } else if (enclosingType.isObjectType()) {
-                 schemaName = ((ObjectType)enclosingType).getSchema();
-              } else if (enclosingType.isPLSQLType()) {
-                 schemaName = ((PLSQLType)enclosingType).getParentType().getSchema();
-              } else if (enclosingType.isVArrayType()) {
-                 schemaName = ((VArrayType)enclosingType).getSchema();
-              }
-              if (schemaName != null && schemaName.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 constructorDeclaration() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case K_CONSTRUCTOR:
-      jj_consume_token(K_CONSTRUCTOR);
-      skipToReturn();
-      jj_consume_token(K_SELF);
-      jj_consume_token(R_AS);
-      jj_consume_token(K_RESULT);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case O_COMMA:
-      jj_consume_token(O_COMMA);
-      constructorDeclaration();
-      break;
-    default:
-      ;
-    }
-  }
-
-  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_CONSTRUCTOR:
-      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:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SELF:
-      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_XMLTYPE:
-      case K_SYSXMLTYPE:
-      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_XMLTYPE:
-      jj_consume_token(K_XMLTYPE);
-                    {if (true) return XMLTYPE_TYPE;}
-      break;
-    case K_SYSXMLTYPE:
-      jj_consume_token(K_SYSXMLTYPE);
-                       {if (true) return XMLTYPE_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_CONSTRUCTOR:
-      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:
-      case K_RESULT_CACHE:
-      case K_RETURN:
-      case K_ROWID:
-      case K_ROWS:
-      case K_SECOND:
-      case K_SELF:
-      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_XMLTYPE:
-      case K_SYSXMLTYPE:
-      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) {
-          // spec may need schema/catalog stripped off
-          String tName = spec;
-          StringTokenizer stok = new StringTokenizer(spec, ".");
-          while (stok.hasMoreTokens()) {
-              tName = stok.nextToken();
-          }
-          for (String typeName : localTypes.keySet()) {
-              if (typeName.equals(spec)) {
-                  dataType = localTypes.get(spec);
-                  break;
-              } else if (typeName.equals(tName)) {
-                  dataType = localTypes.get(tName);
-                  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);
-        cursorType.setParentType(packageType);
-        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());
-            procedureType.setParentType(packageType);
-    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());
-            functionType.setParentType(packageType);
-    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(functionType);
-    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(FunctionType functionType) throws ParseException {
- DatabaseType dataType = null;
-    jj_consume_token(K_RETURN);
-    dataType = typeSpec();
-      ArgumentType returnType = new ArgumentType(null);
-      returnType.setDirection(ArgumentTypeDirection.RETURN);
-      // may need to strip off schema/catalog name
-      if (dataType.getTypeName().contains(".")) {
-          String dataTypeName = dataType.getTypeName();
-          int dotIdx = dataTypeName.indexOf(".");
-          String namePart1 = dataTypeName.substring(0, dotIdx);
-          String namePart2 = dataTypeName.substring(dotIdx+1, dataTypeName.length());
-          if (namePart1.equals(functionType.getCatalogName()) || namePart1.equals(functionType.getSchema())) {
-              dataType.setTypeName(namePart2);
-          } else if (schemaPatterns != null) {
-              for (String possibleSchemaName : schemaPatterns) {
-                  if (namePart1.equals(possibleSchemaName)) {
-                      dataType.setTypeName(namePart2);
-                      break;
-                  }
-              }
-          }
-      }
-      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_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:
-      ;
-    }
-      // may need to strip off schema/catalog name
-      if (argumentDataType.getTypeName().contains(".")) {
-          String argumentDataTypeName = argumentDataType.getTypeName();
-          int dotIdx = argumentDataTypeName.indexOf(".");
-          String namePart1 = argumentDataTypeName.substring(0, dotIdx);
-          String namePart2 = argumentDataTypeName.substring(dotIdx+1, argumentDataTypeName.length());
-          if (namePart1.equals(procedureType.getCatalogName()) || namePart1.equals(procedureType.getSchema())) {
-              argumentDataType.setTypeName(namePart2);
-          } else if (schemaPatterns != null) {
-              for (String possibleSchemaName : schemaPatterns) {
-                  if (namePart1.equals(possibleSchemaName)) {
-                      argumentDataType.setTypeName(namePart2);
-                      break;
-                  }
-              }
-          }
-      }
-      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();
-      }
-  }
-
-  final public void skipToReturn() throws ParseException {
-        Token t = getNextToken();
-        while (t.kind != K_RETURN) {
-                t = getNextToken();
-        }
-  }
-
-  final public void constructor() throws ParseException {
-     Token t = token;
-    jj_consume_token(K_CONSTRUCTOR);
-    token = t;
-  }
-
-  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_61() {
-    if (jj_scan_token(K_VARYING)) return true;
-    if (jj_scan_token(K_ARRAY)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    if (jj_3R_7()) 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_3R_24() {
-    if (jj_scan_token(K_LONG)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(189)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_65()) 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(216)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_80()) jj_scanpos = xsp;
-    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_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_10() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(215)) {
-    jj_scanpos = xsp;
-    if (jj_3R_61()) return true;
-    }
-    if (jj_scan_token(O_OPENPAREN)) 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_53() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(216)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_79()) jj_scanpos = xsp;
-    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_78() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_62() {
-    if (jj_scan_token(O_DOT)) 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(216)) 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_73() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) 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_64() {
-    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(216)) 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_23() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(171)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(172)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(147)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(146)) return true;
-    }
-    }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_64()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_22() {
-    if (jj_scan_token(K_SIGNTYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_12() {
-    if (jj_3R_59()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_62()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_1() {
-    if (jj_3R_6()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_21() {
-    if (jj_scan_token(K_POSITIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_13() {
-    if (jj_scan_token(K_OUT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_20() {
-    if (jj_scan_token(K_NATURAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_19() {
-    if (jj_scan_token(K_BINARY_DOUBLE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_18() {
-    if (jj_scan_token(K_BINARY_FLOAT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_17() {
-    if (jj_scan_token(K_BINARY_INTEGER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_7() {
-    Token xsp;
-    xsp = jj_scanpos;
-    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()) {
-    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_74() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_85() {
-    if (jj_scan_token(S_QUOTED_IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_72() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_84() {
-    if (jj_scan_token(S_IDENTIFIER)) 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(216)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_73()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_74()) 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_3_15() {
-    if (jj_3R_16()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_59() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_15()) {
-    jj_scanpos = xsp;
-    if (jj_3R_84()) {
-    jj_scanpos = xsp;
-    if (jj_3R_85()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_63() {
-    if (jj_scan_token(K_OUT)) 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_72()) jj_scanpos = xsp;
-    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_47() {
-    if (jj_scan_token(K_ROWID)) 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_3_4() {
-    if (jj_scan_token(K_CONSTANT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_44() {
-    if (jj_scan_token(K_BLOB)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_43() {
-    if (jj_scan_token(K_SYS_REFCURSOR)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_15() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_14()) {
-    jj_scanpos = xsp;
-    if (jj_3R_63()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_60() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_4()) jj_scanpos = xsp;
-    if (jj_3R_86()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_42() {
-    if (jj_scan_token(K_SIMPLE_DOUBLE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_scan_token(R_EXCEPTION)) 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_71() {
-    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_59()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_5()) {
-    jj_scanpos = xsp;
-    if (jj_3R_60()) 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_71()) jj_scanpos = xsp;
-    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_69() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    if (jj_scan_token(S_NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_88() {
-    if (jj_3R_12()) 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_83() {
-    if (jj_scan_token(K_CHARACTER)) return true;
-    if (jj_scan_token(K_SET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_70() {
-    if (jj_scan_token(R_WITH)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(162)) 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_69()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_70()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_31() {
-    if (jj_scan_token(K_TIME)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_68() {
-    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_83()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_91() {
-    if (jj_scan_token(O_OPENPAREN)) return true;
-    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(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;
-  }
-
-  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_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(216)) 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_67()) {
-    jj_scanpos = xsp;
-    if (jj_3R_68()) 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_29() {
-    if (jj_scan_token(K_DATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_28() {
-    if (jj_scan_token(K_SYSXMLTYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_27() {
-    if (jj_scan_token(K_XMLTYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_26() {
-    if (jj_scan_token(K_BOOLEAN)) 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_56() {
-    if (jj_scan_token(K_NVARCHAR2)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_82()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_80() {
-    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_65() {
-    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)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(216)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(217)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(218)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(219)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(220)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_90() {
-    if (jj_scan_token(O_COMMA)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_25() {
-    if (jj_scan_token(K_RAW)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_66()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_55() {
-    if (jj_scan_token(K_NVARCHAR)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_81()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_14() {
-    if (jj_scan_token(R_ANCHORED_ROWTYPE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_6() {
-    if (jj_scan_token(K_CONSTRUCTOR)) 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_12() {
-    if (jj_scan_token(K_NOCOPY)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_13() {
-    if (jj_scan_token(R_ANCHORED_TYPE)) 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
deleted file mode 100644
index 82d39c7..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj
+++ /dev/null
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
deleted file mode 100644
index f35a0b4..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
+++ /dev/null
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
deleted file mode 100644
index b6c355a..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserConstants.java
+++ /dev/null
@@ -1,703 +0,0 @@
-/* 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
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * 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()
- */
-@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_CONSTRUCTOR = 142;
-  /** RegularExpression Id. */
-  int K_CURRENT_USER = 143;
-  /** RegularExpression Id. */
-  int K_DATE = 144;
-  /** RegularExpression Id. */
-  int K_DAY = 145;
-  /** RegularExpression Id. */
-  int K_DEC = 146;
-  /** RegularExpression Id. */
-  int K_DECIMAL = 147;
-  /** RegularExpression Id. */
-  int K_DEFINER = 148;
-  /** RegularExpression Id. */
-  int K_DELETE = 149;
-  /** RegularExpression Id. */
-  int K_DETERMINISTIC = 150;
-  /** RegularExpression Id. */
-  int K_DOUBLE = 151;
-  /** RegularExpression Id. */
-  int K_ENABLE = 152;
-  /** RegularExpression Id. */
-  int K_FINAL = 153;
-  /** RegularExpression Id. */
-  int K_FLOAT = 154;
-  /** RegularExpression Id. */
-  int K_FORCE = 155;
-  /** RegularExpression Id. */
-  int K_GLOBAL = 156;
-  /** RegularExpression Id. */
-  int K_INSTANTIABLE = 157;
-  /** RegularExpression Id. */
-  int K_INT = 158;
-  /** RegularExpression Id. */
-  int K_INTEGER = 159;
-  /** RegularExpression Id. */
-  int K_INTERVAL = 160;
-  /** RegularExpression Id. */
-  int K_KEY = 161;
-  /** RegularExpression Id. */
-  int K_LOCAL = 162;
-  /** RegularExpression Id. */
-  int K_LONG = 163;
-  /** RegularExpression Id. */
-  int K_MLSLABEL = 164;
-  /** RegularExpression Id. */
-  int K_MONTH = 165;
-  /** RegularExpression Id. */
-  int K_NATIONAL = 166;
-  /** RegularExpression Id. */
-  int K_NATURAL = 167;
-  /** RegularExpression Id. */
-  int K_NCHAR = 168;
-  /** RegularExpression Id. */
-  int K_NCLOB = 169;
-  /** RegularExpression Id. */
-  int K_NOCOPY = 170;
-  /** RegularExpression Id. */
-  int K_NUMBER = 171;
-  /** RegularExpression Id. */
-  int K_NUMERIC = 172;
-  /** RegularExpression Id. */
-  int K_NVARCHAR2 = 173;
-  /** RegularExpression Id. */
-  int K_NVARCHAR = 174;
-  /** RegularExpression Id. */
-  int K_OBJECT = 175;
-  /** RegularExpression Id. */
-  int K_OID = 176;
-  /** RegularExpression Id. */
-  int K_ORGANIZATION = 177;
-  /** RegularExpression Id. */
-  int K_OUT = 178;
-  /** RegularExpression Id. */
-  int K_OVERFLOW = 179;
-  /** RegularExpression Id. */
-  int K_PACKAGE = 180;
-  /** RegularExpression Id. */
-  int K_PARALLEL_ENABLE = 181;
-  /** RegularExpression Id. */
-  int K_PIPELINED = 182;
-  /** RegularExpression Id. */
-  int K_PLS_INTEGER = 183;
-  /** RegularExpression Id. */
-  int K_POSITIVE = 184;
-  /** RegularExpression Id. */
-  int K_PRAGMA = 185;
-  /** RegularExpression Id. */
-  int K_PRECISION = 186;
-  /** RegularExpression Id. */
-  int K_PRESERVE = 187;
-  /** RegularExpression Id. */
-  int K_RANGE = 188;
-  /** RegularExpression Id. */
-  int K_RAW = 189;
-  /** RegularExpression Id. */
-  int K_REAL = 190;
-  /** RegularExpression Id. */
-  int K_RECORD = 191;
-  /** RegularExpression Id. */
-  int K_REF = 192;
-  /** RegularExpression Id. */
-  int K_REPLACE = 193;
-  /** RegularExpression Id. */
-  int K_RESULT = 194;
-  /** RegularExpression Id. */
-  int K_RESULT_CACHE = 195;
-  /** RegularExpression Id. */
-  int K_RETURN = 196;
-  /** RegularExpression Id. */
-  int K_ROWID = 197;
-  /** RegularExpression Id. */
-  int K_ROWS = 198;
-  /** RegularExpression Id. */
-  int K_SECOND = 199;
-  /** RegularExpression Id. */
-  int K_SELF = 200;
-  /** RegularExpression Id. */
-  int K_SET = 201;
-  /** RegularExpression Id. */
-  int K_SIGNTYPE = 202;
-  /** RegularExpression Id. */
-  int K_SIMPLE_DOUBLE = 203;
-  /** RegularExpression Id. */
-  int K_SIMPLE_FLOAT = 204;
-  /** RegularExpression Id. */
-  int K_SIMPLE_INTEGER = 205;
-  /** RegularExpression Id. */
-  int K_SMALLINT = 206;
-  /** RegularExpression Id. */
-  int K_STRING = 207;
-  /** RegularExpression Id. */
-  int K_SYS_REFCURSOR = 208;
-  /** RegularExpression Id. */
-  int K_TEMPORARY = 209;
-  /** RegularExpression Id. */
-  int K_TIME = 210;
-  /** RegularExpression Id. */
-  int K_TIMESTAMP = 211;
-  /** RegularExpression Id. */
-  int K_UROWID = 212;
-  /** RegularExpression Id. */
-  int K_VARCHAR2 = 213;
-  /** RegularExpression Id. */
-  int K_VARCHAR = 214;
-  /** RegularExpression Id. */
-  int K_VARRAY = 215;
-  /** RegularExpression Id. */
-  int K_VARYING = 216;
-  /** RegularExpression Id. */
-  int K_XMLTYPE = 217;
-  /** RegularExpression Id. */
-  int K_SYSXMLTYPE = 218;
-  /** RegularExpression Id. */
-  int K_YEAR = 219;
-  /** RegularExpression Id. */
-  int K_ZONE = 220;
-  /** RegularExpression Id. */
-  int S_IDENTIFIER = 221;
-  /** RegularExpression Id. */
-  int LETTER = 222;
-  /** RegularExpression Id. */
-  int SPECIAL_CHARS = 223;
-  /** RegularExpression Id. */
-  int S_BIND = 224;
-  /** RegularExpression Id. */
-  int S_CHAR_LITERAL = 225;
-  /** RegularExpression Id. */
-  int S_QUOTED_IDENTIFIER = 226;
-
-  /** 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\"",
-    "\"CONSTRUCTOR\"",
-    "\"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\"",
-    "\"RESULT_CACHE\"",
-    "\"RETURN\"",
-    "\"ROWID\"",
-    "\"ROWS\"",
-    "\"SECOND\"",
-    "\"SELF\"",
-    "\"SET\"",
-    "\"SIGNTYPE\"",
-    "\"SIMPLE_DOUBLE\"",
-    "\"SIMPLE_FLOAT\"",
-    "\"SIMPLE_INTEGER\"",
-    "\"SMALLINT\"",
-    "\"STRING\"",
-    "\"SYS_REFCURSOR\"",
-    "\"TEMPORARY\"",
-    "\"TIME\"",
-    "\"TIMESTAMP\"",
-    "\"UROWID\"",
-    "\"VARCHAR2\"",
-    "\"VARCHAR\"",
-    "\"VARRAY\"",
-    "\"VARYING\"",
-    "\"XMLTYPE\"",
-    "\"SYS.XMLTYPE\"",
-    "\"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
deleted file mode 100644
index 927299f..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTokenManager.java
+++ /dev/null
@@ -1,3896 +0,0 @@
-/* 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
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-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.util.StringTokenizer;
-//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 static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.XMLTYPE_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, 0xfe00L, 0x0L);
-      case 68:
-         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0xfL, 0xff0000L, 0x0L);
-      case 69:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf0L, 0x1000000L, 0x0L);
-      case 70:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf00L, 0xe000000L, 0x0L);
-      case 71:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7000L, 0x10000000L, 0x0L);
-      case 72:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000L, 0x0L, 0x0L);
-      case 73:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1ff0000L, 0x1e0000000L, 0x0L);
-      case 75:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x200000000L, 0x0L);
-      case 76:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0xc00000000L, 0x0L);
-      case 77:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x18000000L, 0x3000000000L, 0x0L);
-      case 78:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1e0000000L, 0x7fc000000000L, 0x0L);
-      case 79:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7e00000000L, 0xf800000000000L, 0x0L);
-      case 80:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x38000000000L, 0xff0000000000000L, 0x0L);
-      case 82:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xc0000000000L, 0xf000000000000000L, 0x7fL);
-      case 83:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000000L, 0x0L, 0x401ff80L);
-      case 84:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7c000000000000L, 0x0L, 0xe0000L);
-      case 85:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x380000000000000L, 0x0L, 0x100000L);
-      case 86:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00000000000000L, 0x0L, 0x1e00000L);
-      case 87:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe000000000000000L, 0x0L, 0x0L);
-      case 88:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x2000000L);
-      case 89:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x8000000L);
-      case 90:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x10000000L);
-      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, 0xfe00L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0xfL, 0xff0000L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf0L, 0x1000000L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xf00L, 0xe000000L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7000L, 0x10000000L, 0x0L);
-      case 104:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000L, 0x0L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1ff0000L, 0x1e0000000L, 0x0L);
-      case 107:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x200000000L, 0x0L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x6000000L, 0xc00000000L, 0x0L);
-      case 109:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x18000000L, 0x3000000000L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1e0000000L, 0x7fc000000000L, 0x0L);
-      case 111:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7e00000000L, 0xf800000000000L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x38000000000L, 0xff0000000000000L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xc0000000000L, 0xf000000000000000L, 0x7fL);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3f00000000000L, 0x0L, 0x401ff80L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x7c000000000000L, 0x0L, 0xe0000L);
-      case 117:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x380000000000000L, 0x0L, 0x100000L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1c00000000000000L, 0x0L, 0x1e00000L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0xe000000000000000L, 0x0L, 0x0L);
-      case 120:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x2000000L);
-      case 121:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x8000000L);
-      case 122:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x10000000L);
-      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, 0x303000c000030000L, active3, 0x1e00000L);
-      case 66:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x800000000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0L, active2, 0x30000000000L, 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, 0xc0000002007c0000L, active3, 0x802039fL);
-      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, 0x41000002000038L, active3, 0xc3c00L);
-      case 76:
-         return jjMoveStringLiteralDfa2_0(active0, 0x60018000000000L, active1, 0x10L, active2, 0x80001014000840L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2004000L);
-      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, 0x1e1000000L, active3, 0L);
-      case 79:
-         if ((active1 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 117;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xf80000000000000L, active1, 0xf4001200L, active2, 0x100042c08807080L, active3, 0x10000060L);
-      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, 0xe02000000000001L, active3, 0x100000L);
-      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, 0x8000L);
-      case 85:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000000L, active1, 0x2020100000800L, active2, 0x4180000008002L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000000000L, active2, 0x8600000000000L, 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, 0x4010000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0x40c000000008000L, active2, 0x303000c000030000L, active3, 0x1e00000L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x800000000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0L, active2, 0x30000000000L, 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, 0xc0000002007c0000L, active3, 0x802039fL);
-      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, 0x41000002000038L, active3, 0xc3c00L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x60018000000000L, active1, 0x10L, active2, 0x80001014000840L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x2004000L);
-      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, 0x1e1000000L, active3, 0L);
-      case 111:
-         if ((active1 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 117;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xf80000000000000L, active1, 0xf4001200L, active2, 0x100042c08807080L, active3, 0x10000060L);
-      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, 0xe02000000000001L, active3, 0x100000L);
-      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, 0x8000L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000000L, active1, 0x2020100000800L, active2, 0x4180000008002L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4000000000L, active2, 0x8600000000000L, 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, 0x4010000L);
-      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, 0x4200600001000600L, active3, 0x8004000L);
-      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 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 146;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0x240000c0L, active2, 0x8010040400080000L, active3, 0x80L);
-      case 68:
-         if ((active0 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 43;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 69;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 176;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200002010180000L, active2, 0L, active3, 0L);
-      case 69:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2010000000000000L, active1, 0x7810004000010000L, active2, 0xc08000000000000L, active3, 0L);
-      case 70:
-         if ((active3 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 192;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L, active2, 0x100000L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x2000000000000L, active3, 0x400L);
-      case 72:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L, active1, 0L, active2, 0x10000000000L, 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, 0x800000000000L, 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, 0x20000200000L, active3, 0x2000100L);
-      case 77:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0x180000001000L, active3, 0xe3800L);
-      case 78:
-         return jjMoveStringLiteralDfa3_0(active0, 0xc00000000000000L, active1, 0x8000800L, active2, 0x1000002802006038L, active3, 0x10000000L);
-      case 79:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x10000004408L, active2, 0x140008c0L, active3, 0x100000L);
-      case 80:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000000000L, active2, 0x40000000000000L, active3, 0x2L);
-      case 82:
-         if ((active1 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 73;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x20000008008001L, active3, 0x1e08000L);
-      case 83:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40000200016L, active2, 0x180001020000000L, active3, 0x401000cL);
-      case 84:
-         if ((active1 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 94;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 158;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 178;
-            jjmatchedPos = 2;
-         }
-         else if ((active3 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 201;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x8000000800c01100L, active2, 0xc180410102L, active3, 0x10L);
-      case 85:
-         return jjMoveStringLiteralDfa3_0(active0, 0x60000000000000L, active1, 0L, active2, 0x800000L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000008000L, active2, 0L, active3, 0L);
-      case 87:
-         if ((active2 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 189;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000000L, active2, 0L, active3, 0x60L);
-      case 89:
-         if ((active2 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 145;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 161;
-            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, 0x4200600001000600L, active3, 0x8004000L);
-      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 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 146;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0x240000c0L, active2, 0x8010040400080000L, active3, 0x80L);
-      case 100:
-         if ((active0 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 43;
-            jjmatchedPos = 2;
-         }
-         else if ((active1 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 69;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 176;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200002010180000L, active2, 0L, active3, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2010000000000000L, active1, 0x7810004000010000L, active2, 0xc08000000000000L, active3, 0L);
-      case 102:
-         if ((active3 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 192;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L, active2, 0x100000L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L, active2, 0x2000000000000L, active3, 0x400L);
-      case 104:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L, active1, 0L, active2, 0x10000000000L, 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, 0x800000000000L, 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, 0x20000200000L, active3, 0x2000100L);
-      case 109:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0x180000001000L, active3, 0xe3800L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0xc00000000000000L, active1, 0x8000800L, active2, 0x1000002802006038L, active3, 0x10000000L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x10000004408L, active2, 0x140008c0L, active3, 0x100000L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x40000000000000L, active2, 0x40000000000000L, active3, 0x2L);
-      case 114:
-         if ((active1 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 73;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000000L, active1, 0L, active2, 0x20000008008001L, active3, 0x1e08000L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40000200016L, active2, 0x180001020000000L, active3, 0x401000cL);
-      case 116:
-         if ((active1 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 94;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 158;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x4000000000000L) != 0L)
-         {
-            jjmatchedKind = 178;
-            jjmatchedPos = 2;
-         }
-         else if ((active3 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 201;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000000L, active1, 0x8000000800c01100L, active2, 0xc180410102L, active3, 0x10L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x60000000000000L, active1, 0L, active2, 0x800000L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000008000L, active2, 0L, active3, 0L);
-      case 119:
-         if ((active2 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 189;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x80000000L, active2, 0L, active3, 0x60L);
-      case 121:
-         if ((active2 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 145;
-            jjmatchedPos = 2;
-         }
-         else if ((active2 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 161;
-            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 46:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      case 65:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2088000000000000L, active1, 0x204000080000001L, active2, 0x22010406000039L, 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, 0x80011800000L, active3, 0L);
-      case 67:
-         if ((active1 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 65;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000000L, active1, 0x10000000900L, active2, 0x400000008000000L, active3, 0x600000L);
-      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 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 144;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 210;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 220;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x102000780040L, active2, 0x40900180600000L, active3, 0x80000L);
-      case 70:
-         if ((active3 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 200;
-            jjmatchedPos = 3;
-         }
-         break;
-      case 71:
-         if ((active2 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 163;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1200000000000000L, 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, 0x100004000180000L, active3, 0x8020L);
-      case 75:
-         if ((active1 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 90;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 76:
-         if ((active1 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 96;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 190;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0x8020000000080L, active2, 0x1000000084L, active3, 0x4002L);
-      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, 0x400L);
-      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, 0x8000060000000000L, active3, 0x80L);
-      case 80:
-         if ((active1 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 67;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x200040000000000L, active1, 0L, active2, 0L, active3, 0x23800L);
-      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 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 219;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x4001204000000000L, active2, 0x8600000008400L, active3, 0x800000L);
-      case 83:
-         if ((active3 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 198;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x5860000000000000L, active1, 0L, active2, 0x800000000006000L, active3, 0L);
-      case 84:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x2000000000004L, active2, 0x2020000000L, active3, 0x2000000L);
-      case 85:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x400000008004000L, active2, 0x8000000000L, active3, 0x1cL);
-      case 87:
-         if ((active1 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 123;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x1000000000000000L, active2, 0L, active3, 0x100000L);
-      case 89:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x1000000L);
-      case 95:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80000000000000L, active3, 0x10000L);
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2088000000000000L, active1, 0x204000080000001L, active2, 0x22010406000039L, 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, 0x80011800000L, active3, 0L);
-      case 99:
-         if ((active1 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 65;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000000L, active1, 0x10000000900L, active2, 0x400000008000000L, active3, 0x600000L);
-      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 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 144;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 210;
-            jjmatchedPos = 3;
-         }
-         else if ((active3 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 220;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0x102000780040L, active2, 0x40900180600000L, active3, 0x80000L);
-      case 102:
-         if ((active3 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 200;
-            jjmatchedPos = 3;
-         }
-         break;
-      case 103:
-         if ((active2 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 163;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x1200000000000000L, 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, 0x100004000180000L, active3, 0x8020L);
-      case 107:
-         if ((active1 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 90;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 108:
-         if ((active1 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 96;
-            jjmatchedPos = 3;
-         }
-         else if ((active2 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 190;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0x8020000000080L, active2, 0x1000000084L, active3, 0x4002L);
-      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, 0x400L);
-      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, 0x8000060000000000L, active3, 0x80L);
-      case 112:
-         if ((active1 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 67;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x200040000000000L, active1, 0L, active2, 0L, active3, 0x23800L);
-      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 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 219;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x4001204000000000L, active2, 0x8600000008400L, active3, 0x800000L);
-      case 115:
-         if ((active3 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 198;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x5860000000000000L, active1, 0L, active2, 0x800000000006000L, active3, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x2000000000004L, active2, 0x2020000000L, active3, 0x2000000L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x400000008004000L, active2, 0x8000000000L, active3, 0x1cL);
-      case 119:
-         if ((active1 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 123;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x1000000000000000L, active2, 0L, active3, 0x100000L);
-      case 121:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x1000000L);
-      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, 0x10001030000400L, active3, 0x800002L);
-      case 66:
-         if ((active2 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 169;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 67:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000000000L, active2, 0xe00000000000L, active3, 0L);
-      case 68:
-         if ((active3 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 197;
-            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 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 155;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 188;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x401000000000000L, active1, 0x400010000000000L, active2, 0x800080000008080L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
-      case 71:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x80000000L, active3, 0L);
-      case 72:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 60;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 72;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 165;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x600000L);
-      case 73:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x20080000004L, active2, 0x480000000001002L, active3, 0x1100000L);
-      case 75:
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 52;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 76:
-         if ((active2 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 153;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 162;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x84000000000L, active2, 0x60000001800000L, active3, 0x780cL);
-      case 77:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x20000000L, active2, 0x200000000080000L, 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, 0x2000000100000L, active3, 0x8080L);
-      case 79:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000000L, active1, 0x800000000L, active2, 0x4000000000L, active3, 0x20000L);
-      case 80:
-         if ((active1 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40L, active2, 0x40000000000L, active3, 0L);
-      case 82:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 168;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x208000000000000L, active1, 0x600000L, active2, 0x8000108100400038L, active3, 0x10010L);
-      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, 0x80000L);
-      case 84:
-         if ((active1 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 77;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 112;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 154;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x2860020000000000L, active1, 0x200000000010800L, active2, 0x100000000206000L, active3, 0x400L);
-      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, 0x4000000L);
-      case 89:
-         if ((active2 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 128;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, active2, 0L, active3, 0x2000000L);
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0x8000000000L, active2, 0x10001030000400L, active3, 0x800002L);
-      case 98:
-         if ((active2 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 169;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x100000000000L, active2, 0xe00000000000L, active3, 0L);
-      case 100:
-         if ((active3 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 197;
-            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 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 155;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 188;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x401000000000000L, active1, 0x400010000000000L, active2, 0x800080000008080L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x8000000000000L, active3, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x80000000L, active3, 0L);
-      case 104:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 60;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 72;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 165;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x600000L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x20080000004L, active2, 0x480000000001002L, active3, 0x1100000L);
-      case 107:
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 52;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 108:
-         if ((active2 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 153;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x400000000L) != 0L)
-         {
-            jjmatchedKind = 162;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x84000000000L, active2, 0x60000001800000L, active3, 0x780cL);
-      case 109:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0x20000000L, active2, 0x200000000080000L, 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, 0x2000000100000L, active3, 0x8080L);
-      case 111:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000000L, active1, 0x800000000L, active2, 0x4000000000L, active3, 0x20000L);
-      case 112:
-         if ((active1 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40L, active2, 0x40000000000L, active3, 0L);
-      case 114:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x2000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 168;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x208000000000000L, active1, 0x600000L, active2, 0x8000108100400038L, active3, 0x10010L);
-      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, 0x80000L);
-      case 116:
-         if ((active1 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 77;
-            jjmatchedPos = 4;
-         }
-         else if ((active1 & 0x1000000000000L) != 0L)
-         {
-            jjmatchedKind = 112;
-            jjmatchedPos = 4;
-         }
-         else if ((active2 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 154;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x2860020000000000L, active1, 0x200000000010800L, active2, 0x100000000206000L, active3, 0x400L);
-      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, 0x4000000L);
-      case 121:
-         if ((active2 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 128;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, active2, 0L, active3, 0x2000000L);
-      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 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 185;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0x8000082080L, active3, 0x600000L);
-      case 66:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x1000000000L, active3, 0L);
-      case 67:
-         if ((active1 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 105;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0L, active2, 0x400L, active3, 0x2L);
-      case 68:
-         if ((active2 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 129;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 191;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 199;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 212;
-            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 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 149;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 151;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 152;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x261000000000000L, active1, 0x100000L, active2, 0x80100000L, active3, 0x13800L);
-      case 71:
-         if ((active1 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 79;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 207;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 72:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x600000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10800L, active2, 0x142100000000000L, active3, 0x4000L);
-      case 76:
-         if ((active2 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 156;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L, active2, 0x28000000000000L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x400000L, active3, 0x4000000L);
-      case 78:
-         if ((active1 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 99;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 196;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x4L, active2, 0x80004020008000L, active3, 0x1000000L);
-      case 80:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000020000000L, active2, 0L, active3, 0x2000000L);
-      case 82:
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 62;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 171;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L, active1, 0x48000000000L, active2, 0x800000000004000L, active3, 0x20000L);
-      case 83:
-         if ((active1 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 122;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000000L, active1, 0x400080L, active2, 0x400000000000000L, 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 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 175;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 194;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x4000000000040L, active2, 0L, active3, 0x80008L);
-      case 86:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x100000000L, active3, 0L);
-      case 89:
-         if ((active2 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 170;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 215;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x400L);
-      case 97:
-         if ((active2 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 185;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4000000000L, active2, 0x8000082080L, active3, 0x600000L);
-      case 98:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x1000000000L, active3, 0L);
-      case 99:
-         if ((active1 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 105;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0L, active2, 0x400L, active3, 0x2L);
-      case 100:
-         if ((active2 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 129;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x8000000000000000L) != 0L)
-         {
-            jjmatchedKind = 191;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 199;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 212;
-            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 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 149;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 151;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 152;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x261000000000000L, active1, 0x100000L, active2, 0x80100000L, active3, 0x13800L);
-      case 103:
-         if ((active1 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 79;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 207;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x10000000000000L, active3, 0L);
-      case 104:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x600000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10800L, active2, 0x142100000000000L, active3, 0x4000L);
-      case 108:
-         if ((active2 & 0x10000000L) != 0L)
-         {
-            jjmatchedKind = 156;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L, active2, 0x28000000000000L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x400000L, active3, 0x4000000L);
-      case 110:
-         if ((active1 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 99;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 196;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x4L, active2, 0x80004020008000L, active3, 0x1000000L);
-      case 112:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000020000000L, active2, 0L, active3, 0x2000000L);
-      case 114:
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            jjmatchedKind = 62;
-            jjmatchedPos = 5;
-         }
-         else if ((active2 & 0x80000000000L) != 0L)
-         {
-            jjmatchedKind = 171;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L, active1, 0x48000000000L, active2, 0x800000000004000L, active3, 0x20000L);
-      case 115:
-         if ((active1 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 122;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000000L, active1, 0x400080L, active2, 0x400000000000000L, 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 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 175;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x4L) != 0L)
-         {
-            jjmatchedKind = 194;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0x4000000000040L, active2, 0L, active3, 0x80008L);
-      case 118:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x100000000L, active3, 0L);
-      case 121:
-         if ((active2 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 170;
-            jjmatchedPos = 5;
-         }
-         else if ((active3 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 215;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L, active2, 0x38L, active3, 0x400L);
-      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, 0x604100000000L, active3, 0xa0000L);
-      case 67:
-         if ((active2 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 172;
-            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 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 180;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 193;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 217;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000L, active1, 0x400000L, active2, 0x20001000000000L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0x10000L);
-      case 71:
-         if ((active3 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 216;
-            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, 0x400000000400000L, active3, 0L);
-      case 76:
-         if ((active2 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 147;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 167;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      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, 0x40000000002000L, active3, 0x4000L);
-      case 79:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800L, active2, 0x8000000000000L, active3, 0L);
-      case 80:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x4000000000L, active2, 0L, active3, 0x400L);
-      case 82:
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 54;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 148;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 159;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 214;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0x20000000L, active2, 0L, active3, 0x200000L);
-      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, 0x80000020008400L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000L, active2, 0x4000L, active3, 0L);
-      case 86:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x900000000000000L, active3, 0L);
-      case 89:
-         if ((active1 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 103;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 90:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x2000000000000L, active3, 0L);
-      case 95:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x38L, active3, 0x3808L);
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0x800000000000000L, active1, 0L, active2, 0x604100000000L, active3, 0xa0000L);
-      case 99:
-         if ((active2 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 172;
-            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 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 180;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x2L) != 0L)
-         {
-            jjmatchedKind = 193;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 217;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000L, active1, 0x400000L, active2, 0x20001000000000L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000L, active2, 0L, active3, 0x10000L);
-      case 103:
-         if ((active3 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 216;
-            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, 0x400000000400000L, active3, 0L);
-      case 108:
-         if ((active2 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 147;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 167;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      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, 0x40000000002000L, active3, 0x4000L);
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800L, active2, 0x8000000000000L, active3, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x4000000000L, active2, 0L, active3, 0x400L);
-      case 114:
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 54;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 148;
-            jjmatchedPos = 6;
-         }
-         else if ((active2 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 159;
-            jjmatchedPos = 6;
-         }
-         else if ((active3 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 214;
-            jjmatchedPos = 6;
-         }
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0x20000000L, active2, 0L, active3, 0x200000L);
-      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, 0x80000020008400L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000L, active2, 0x4000L, active3, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x900000000000000L, active3, 0L);
-      case 121:
-         if ((active1 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 103;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x2000000000000L, 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 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 213;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x2000000000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x400000L, active2, 0x4000L, active3, 0x10008L);
-      case 68:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x800L);
-      case 69:
-         if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 106;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 184;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 187;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 202;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000L, active2, 0xc0000000000400L, active3, 0L);
-      case 70:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x1000L);
-      case 73:
-         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L, active1, 0x10000L, active2, 0x20000020L, active3, 0x2000L);
-      case 76:
-         if ((active2 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 160;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 164;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 166;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x20000000000000L, active3, 0L);
-      case 77:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x80000L);
-      case 78:
-         if ((active1 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 75;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x400000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40L, active2, 0x400000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 174;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10000000000L, active2, 0x200000000000L, active3, 0x20000L);
-      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 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 206;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      case 86:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x80L, active2, 0L, active3, 0L);
-      case 87:
-         if ((active2 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 179;
-            jjmatchedPos = 7;
-         }
-         break;
-      case 95:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8000L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x2000000000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x400000L, active2, 0x4000L, active3, 0x10008L);
-      case 100:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x800L);
-      case 101:
-         if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 7;
-         }
-         else if ((active1 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 106;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 184;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 187;
-            jjmatchedPos = 7;
-         }
-         else if ((active3 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 202;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000L, active2, 0xc0000000000400L, active3, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x1000L);
-      case 105:
-         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L, active1, 0x10000L, active2, 0x20000020L, active3, 0x2000L);
-      case 108:
-         if ((active2 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 160;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x1000000000L) != 0L)
-         {
-            jjmatchedKind = 164;
-            jjmatchedPos = 7;
-         }
-         else if ((active2 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 166;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x20000000000000L, active3, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x80000L);
-      case 110:
-         if ((active1 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 75;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x400000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40L, active2, 0x400000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 174;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x10000000000L, active2, 0x200000000000L, active3, 0x20000L);
-      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 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 206;
-            jjmatchedPos = 7;
-         }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      case 118:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x80L, active2, 0L, active3, 0L);
-      case 119:
-         if ((active2 & 0x8000000000000L) != 0L)
-         {
-            jjmatchedKind = 179;
-            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 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 173;
-            jjmatchedPos = 8;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x20000000L, active3, 0x8L);
-      case 68:
-         if ((active2 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 182;
-            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, 0x80000000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x400000L, active3, 0L);
-      case 76:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x1000L);
-      case 78:
-         if ((active1 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 70;
-            jjmatchedPos = 8;
-         }
-         else if ((active2 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 186;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0x800000000000000L, active1, 0L, active2, 0x20L, active3, 0x2000L);
-      case 79:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x800L);
-      case 80:
-         if ((active3 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 211;
-            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, 0x2000000004000L, active3, 0L);
-      case 85:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8000L, active3, 0x10000L);
-      case 89:
-         if ((active3 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 209;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      case 95:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x20000000000000L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x20000000L, active3, 0x8L);
-      case 100:
-         if ((active2 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 182;
-            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, 0x80000000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x400000L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x10L, active3, 0x1000L);
-      case 110:
-         if ((active1 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 70;
-            jjmatchedPos = 8;
-         }
-         else if ((active2 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 186;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0x800000000000000L, active1, 0L, active2, 0x20L, active3, 0x2000L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x800L);
-      case 112:
-         if ((active3 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 211;
-            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, 0x2000000004000L, active3, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x8000L, active3, 0x10000L);
-      case 121:
-         if ((active3 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 209;
-            jjmatchedPos = 8;
-         }
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      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, 0x20000000L, active3, 0L);
-      case 67:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x8L);
-      case 68:
-         if ((active1 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 80;
-            jjmatchedPos = 9;
-         }
-         break;
-      case 69:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0xa0000000000000L, active3, 0L);
-      case 73:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x2000000000000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x4010L, active3, 0x1000L);
-      case 80:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      case 82:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
-      case 83:
-         if ((active1 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 93;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x408000L, active3, 0L);
-      case 84:
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 59;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x20L, active3, 0x2000L);
-      case 85:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x800L);
-      case 98:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x20000000L, active3, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x8L);
-      case 100:
-         if ((active1 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 80;
-            jjmatchedPos = 9;
-         }
-         break;
-      case 101:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0xa0000000000000L, active3, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x2000000000000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x4010L, active3, 0x1000L);
-      case 112:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000L);
-      case 114:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x10000L);
-      case 115:
-         if ((active1 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 93;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x408000L, active3, 0L);
-      case 116:
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            jjmatchedKind = 59;
-            jjmatchedPos = 9;
-         }
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x20L, active3, 0x2000L);
-      case 117:
-         return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0x8L, active3, 0x800L);
-      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, 0x1000L);
-      case 66:
-         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x800L);
-      case 69:
-         if ((active3 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 218;
-            jjmatchedPos = 10;
-         }
-         return jjMoveStringLiteralDfa11_0(active2, 0x8020L, active3, 0x2000L);
-      case 72:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x8L);
-      case 76:
-         return jjMoveStringLiteralDfa11_0(active2, 0x20000000L, active3, 0L);
-      case 78:
-         return jjMoveStringLiteralDfa11_0(active2, 0x20000000000000L, active3, 0L);
-      case 79:
-         return jjMoveStringLiteralDfa11_0(active2, 0x2000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 142;
-            jjmatchedPos = 10;
-         }
-         else if ((active2 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 183;
-            jjmatchedPos = 10;
-         }
-         break;
-      case 83:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x10000L);
-      case 84:
-         return jjMoveStringLiteralDfa11_0(active2, 0x400000L, active3, 0L);
-      case 97:
-         return jjMoveStringLiteralDfa11_0(active2, 0x10L, active3, 0x1000L);
-      case 98:
-         return jjMoveStringLiteralDfa11_0(active2, 0x8L, active3, 0x800L);
-      case 101:
-         if ((active3 & 0x4000000L) != 0L)
-         {
-            jjmatchedKind = 218;
-            jjmatchedPos = 10;
-         }
-         return jjMoveStringLiteralDfa11_0(active2, 0x8020L, active3, 0x2000L);
-      case 104:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x8L);
-      case 108:
-         return jjMoveStringLiteralDfa11_0(active2, 0x20000000L, active3, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa11_0(active2, 0x20000000000000L, active3, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa11_0(active2, 0x2000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 142;
-            jjmatchedPos = 10;
-         }
-         else if ((active2 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 183;
-            jjmatchedPos = 10;
-         }
-         break;
-      case 115:
-         return jjMoveStringLiteralDfa11_0(active2, 0L, active3, 0x10000L);
-      case 116:
-         return jjMoveStringLiteralDfa11_0(active2, 0x400000L, 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, 0x20000000000000L, active3, 0L);
-      case 69:
-         if ((active2 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 157;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 195;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 71:
-         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x2000L);
-      case 73:
-         return jjMoveStringLiteralDfa12_0(active2, 0x400000L, active3, 0L);
-      case 76:
-         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x800L);
-      case 78:
-         if ((active2 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 177;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 79:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x10000L);
-      case 82:
-         if ((active2 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 143;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 84:
-         if ((active2 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 132;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 204;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa12_0(active2, 0x20000000000000L, active3, 0L);
-      case 101:
-         if ((active2 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 157;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 195;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 103:
-         return jjMoveStringLiteralDfa12_0(active2, 0x20L, active3, 0x2000L);
-      case 105:
-         return jjMoveStringLiteralDfa12_0(active2, 0x400000L, active3, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa12_0(active2, 0x8L, active3, 0x800L);
-      case 110:
-         if ((active2 & 0x2000000000000L) != 0L)
-         {
-            jjmatchedKind = 177;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 111:
-         return jjMoveStringLiteralDfa12_0(active2, 0L, active3, 0x10000L);
-      case 114:
-         if ((active2 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 143;
-            jjmatchedPos = 11;
-         }
-         break;
-      case 116:
-         if ((active2 & 0x10L) != 0L)
-         {
-            jjmatchedKind = 132;
-            jjmatchedPos = 11;
-         }
-         else if ((active3 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 204;
-            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, 0x20000000000000L, active3, 0L);
-      case 67:
-         if ((active2 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 150;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 69:
-         if ((active2 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 131;
-            jjmatchedPos = 12;
-         }
-         else if ((active3 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 203;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x2000L);
-      case 82:
-         if ((active3 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 208;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 98:
-         return jjMoveStringLiteralDfa13_0(active2, 0x20000000000000L, active3, 0L);
-      case 99:
-         if ((active2 & 0x400000L) != 0L)
-         {
-            jjmatchedKind = 150;
-            jjmatchedPos = 12;
-         }
-         break;
-      case 101:
-         if ((active2 & 0x8L) != 0L)
-         {
-            jjmatchedKind = 131;
-            jjmatchedPos = 12;
-         }
-         else if ((active3 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 203;
-            jjmatchedPos = 12;
-         }
-         return jjMoveStringLiteralDfa13_0(active2, 0x20L, active3, 0x2000L);
-      case 114:
-         if ((active3 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 208;
-            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, 0x20000000000000L, active3, 0L);
-      case 82:
-         if ((active2 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 133;
-            jjmatchedPos = 13;
-         }
-         else if ((active3 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 205;
-            jjmatchedPos = 13;
-         }
-         break;
-      case 108:
-         return jjMoveStringLiteralDfa14_0(active2, 0x20000000000000L, active3, 0L);
-      case 114:
-         if ((active2 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 133;
-            jjmatchedPos = 13;
-         }
-         else if ((active3 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 205;
-            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 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 181;
-            jjmatchedPos = 14;
-         }
-         break;
-      case 101:
-         if ((active2 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 181;
-            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 > 221)
-                     kind = 221;
-                  jjstateSet[jjnewStateCnt++] = 14;
-                  break;
-               case 15:
-                  if (curChar == 58)
-                     jjAddStates(7, 9);
-                  break;
-               case 17:
-                  if ((0x3ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjAddStates(16, 17);
-                  break;
-               case 18:
-                  if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 19;
-                  break;
-               case 20:
-                  if ((0x3ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjstateSet[jjnewStateCnt++] = 20;
-                  break;
-               case 21:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddStates(18, 24);
-                  break;
-               case 22:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAdd(22);
-                  break;
-               case 23:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddTwoStates(23, 24);
-                  break;
-               case 24:
-                  if (curChar == 46)
-                     jjCheckNAdd(25);
-                  break;
-               case 25:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAdd(25);
-                  break;
-               case 26:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  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 > 224)
-                     kind = 224;
-                  jjCheckNAdd(30);
-                  break;
-               case 31:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddStates(27, 29);
-                  break;
-               case 32:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAdd(32);
-                  break;
-               case 33:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddTwoStates(33, 34);
-                  break;
-               case 34:
-                  if (curChar == 46)
-                     jjCheckNAdd(35);
-                  break;
-               case 35:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAdd(35);
-                  break;
-               case 36:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddStates(30, 32);
-                  break;
-               case 37:
-                  if (curChar == 46)
-                     jjCheckNAdd(38);
-                  break;
-               case 38:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddTwoStates(38, 27);
-                  break;
-               case 39:
-                  if (curChar == 46)
-                     jjCheckNAddTwoStates(40, 41);
-                  break;
-               case 40:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAdd(40);
-                  break;
-               case 41:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  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 > 225)
-                     kind = 225;
-                  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 > 226)
-                     kind = 226;
-                  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 > 221)
-                     kind = 221;
-                  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 > 221)
-                     kind = 221;
-                  jjCheckNAdd(14);
-                  break;
-               case 16:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddStates(41, 43);
-                  break;
-               case 17:
-                  if ((0x7fffffe87ffffffL & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddTwoStates(17, 18);
-                  break;
-               case 19:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAddTwoStates(19, 20);
-                  break;
-               case 20:
-                  if ((0x7fffffe87ffffffL & l) == 0L)
-                     break;
-                  if (kind > 224)
-                     kind = 224;
-                  jjCheckNAdd(20);
-                  break;
-               case 27:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(44, 46);
-                  break;
-               case 43:
-                  jjCheckNAddTwoStates(43, 44);
-                  break;
-               case 46:
-                  jjCheckNAddTwoStates(46, 44);
-                  break;
-               case 48:
-                  jjAddStates(47, 48);
-                  break;
-               case 52:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(49, 51);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 1:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(10, 12);
-                  break;
-               case 7:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-               case 10:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 43:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(43, 44);
-                  break;
-               case 46:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(46, 44);
-                  break;
-               case 48:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(47, 48);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 71 - (jjnewStateCnt = startsAt)))
-         break;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { break; }
-   }
-   if (jjmatchedPos > strPos)
-      return curPos;
-
-   int toRet = Math.max(curPos, seenUpto);
-
-   if (curPos < toRet)
-      for (i = toRet - Math.min(curPos, seenUpto); i-- > 0; )
-         try { curChar = input_stream.readChar(); }
-         catch(java.io.IOException e) { throw new Error("Internal Error : Please send a bug report."); }
-
-   if (jjmatchedPos < strPos)
-   {
-      jjmatchedKind = strKind;
-      jjmatchedPos = strPos;
-   }
-   else if (jjmatchedPos == strPos && jjmatchedKind > strKind)
-      jjmatchedKind = strKind;
-
-   return toRet;
-}
-static final int[] jjnextStates = {
-   63, 64, 65, 52, 67, 68, 70, 16, 21, 39, 1, 2, 4, 8, 9, 11, 
-   17, 18, 22, 23, 24, 26, 36, 37, 27, 29, 31, 32, 33, 34, 36, 37, 
-   27, 54, 56, 57, 58, 59, 64, 65, 52, 16, 17, 18, 28, 29, 31, 48, 
-   49, 53, 54, 56, 
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec2[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec0[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-
-/** Token literal values. */
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, "\72\75", "\52", "\100", "\51", 
-"\174\174", "\72", "\54", "\56", "\56\56", "\44", "\45", "\75", "\76", "\76\75", 
-"\50\53\51", "\74", "\74\75", "\55", "\74\76", "\41\75", "\50", "\53", "\43", "\77", "\73", 
-"\57", "\176", null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, };
-
-/** Lexer state names. */
-public static final String[] lexStateNames = {
-   "DEFAULT",
-};
-static final long[] jjtoToken = {
-   0xffffff8fffffff01L, 0xffffffffffffffffL, 0xffffffffffffffffL, 0x73fffffffL, 
-};
-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;
-
-  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);
-}
-
-}
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
deleted file mode 100644
index 43fd5d0..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserTreeConstants.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/* 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) */
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
deleted file mode 100644
index 3385cc7..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParserVisitor.java
+++ /dev/null
@@ -1,9 +0,0 @@
-/* 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) */
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
deleted file mode 100644
index 720c2e1..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JJTDDLParserState.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* 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) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JavaCharStream.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JavaCharStream.java
deleted file mode 100644
index 0f83421..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/JavaCharStream.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 5.0 */
-/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (with java-like unicode escape processing).
- */
-
-public
-@SuppressWarnings("all")
-class JavaCharStream
-{
-  /** Whether parser is static. */
-  public static final boolean staticFlag = false;
-
-  static final int hexval(char c) throws java.io.IOException {
-    switch(c)
-    {
-       case '0' :
-          return 0;
-       case '1' :
-          return 1;
-       case '2' :
-          return 2;
-       case '3' :
-          return 3;
-       case '4' :
-          return 4;
-       case '5' :
-          return 5;
-       case '6' :
-          return 6;
-       case '7' :
-          return 7;
-       case '8' :
-          return 8;
-       case '9' :
-          return 9;
-
-       case 'a' :
-       case 'A' :
-          return 10;
-       case 'b' :
-       case 'B' :
-          return 11;
-       case 'c' :
-       case 'C' :
-          return 12;
-       case 'd' :
-       case 'D' :
-          return 13;
-       case 'e' :
-       case 'E' :
-          return 14;
-       case 'f' :
-       case 'F' :
-          return 15;
-    }
-
-    throw new java.io.IOException(); // Should never come here
-  }
-
-/** Position in buffer. */
-  public int bufpos = -1;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] nextCharBuf;
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int nextCharInd = -1;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-    char[] newbuffer = new char[bufsize + 2048];
-    int newbufline[] = new int[bufsize + 2048];
-    int newbufcolumn[] = new int[bufsize + 2048];
-
-    try
-    {
-      if (wrapAround)
-      {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-        bufcolumn = newbufcolumn;
-
-        bufpos += (bufsize - tokenBegin);
-    }
-    else
-    {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-        bufcolumn = newbufcolumn;
-
-        bufpos -= tokenBegin;
-      }
-    }
-    catch (Throwable t)
-    {
-      throw new Error(t.getMessage());
-    }
-
-    available = (bufsize += 2048);
-    tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-    int i;
-    if (maxNextCharInd == 4096)
-      maxNextCharInd = nextCharInd = 0;
-
-    try {
-      if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
-                                          4096 - maxNextCharInd)) == -1)
-      {
-        inputStream.close();
-        throw new java.io.IOException();
-      }
-      else
-         maxNextCharInd += i;
-      return;
-    }
-    catch(java.io.IOException e) {
-      if (bufpos != 0)
-      {
-        --bufpos;
-        backup(0);
-      }
-      else
-      {
-        bufline[bufpos] = line;
-        bufcolumn[bufpos] = column;
-      }
-      throw e;
-    }
-  }
-
-  protected char ReadByte() throws java.io.IOException
-  {
-    if (++nextCharInd >= maxNextCharInd)
-      FillBuff();
-
-    return nextCharBuf[nextCharInd];
-  }
-
-/** @return starting character for token. */
-  public char BeginToken() throws java.io.IOException
-  {
-    if (inBuf > 0)
-    {
-      --inBuf;
-
-      if (++bufpos == bufsize)
-        bufpos = 0;
-
-      tokenBegin = bufpos;
-      return buffer[bufpos];
-    }
-
-    tokenBegin = 0;
-    bufpos = -1;
-
-    return readChar();
-  }
-
-  protected void AdjustBuffSize()
-  {
-    if (available == bufsize)
-    {
-      if (tokenBegin > 2048)
-      {
-        bufpos = 0;
-        available = tokenBegin;
-      }
-      else
-        ExpandBuff(false);
-    }
-    else if (available > tokenBegin)
-      available = bufsize;
-    else if ((tokenBegin - available) < 2048)
-      ExpandBuff(true);
-    else
-      available = tokenBegin;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-    column++;
-
-    if (prevCharIsLF)
-    {
-      prevCharIsLF = false;
-      line += (column = 1);
-    }
-    else if (prevCharIsCR)
-    {
-      prevCharIsCR = false;
-      if (c == '\n')
-      {
-        prevCharIsLF = true;
-      }
-      else
-        line += (column = 1);
-    }
-
-    switch (c)
-    {
-      case '\r' :
-        prevCharIsCR = true;
-        break;
-      case '\n' :
-        prevCharIsLF = true;
-        break;
-      case '\t' :
-        column--;
-        column += (tabSize - (column % tabSize));
-        break;
-      default :
-        break;
-    }
-
-    bufline[bufpos] = line;
-    bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-    if (inBuf > 0)
-    {
-      --inBuf;
-
-      if (++bufpos == bufsize)
-        bufpos = 0;
-
-      return buffer[bufpos];
-    }
-
-    char c;
-
-    if (++bufpos == available)
-      AdjustBuffSize();
-
-    if ((buffer[bufpos] = c = ReadByte()) == '\\')
-    {
-      UpdateLineColumn(c);
-
-      int backSlashCnt = 1;
-
-      for (;;) // Read all the backslashes
-      {
-        if (++bufpos == available)
-          AdjustBuffSize();
-
-        try
-        {
-          if ((buffer[bufpos] = c = ReadByte()) != '\\')
-          {
-            UpdateLineColumn(c);
-            // found a non-backslash char.
-            if ((c == 'u') && ((backSlashCnt & 1) == 1))
-            {
-              if (--bufpos < 0)
-                bufpos = bufsize - 1;
-
-              break;
-            }
-
-            backup(backSlashCnt);
-            return '\\';
-          }
-        }
-        catch(java.io.IOException e)
-        {
-	  // We are returning one backslash so we should only backup (count-1)
-          if (backSlashCnt > 1)
-            backup(backSlashCnt-1);
-
-          return '\\';
-        }
-
-        UpdateLineColumn(c);
-        backSlashCnt++;
-      }
-
-      // Here, we have seen an odd number of backslash's followed by a 'u'
-      try
-      {
-        while ((c = ReadByte()) == 'u')
-          ++column;
-
-        buffer[bufpos] = c = (char)(hexval(c) << 12 |
-                                    hexval(ReadByte()) << 8 |
-                                    hexval(ReadByte()) << 4 |
-                                    hexval(ReadByte()));
-
-        column += 4;
-      }
-      catch(java.io.IOException e)
-      {
-        throw new Error("Invalid escape character at line " + line +
-                                         " column " + column + ".");
-      }
-
-      if (backSlashCnt == 1)
-        return c;
-      else
-      {
-        backup(backSlashCnt - 1);
-        return '\\';
-      }
-    }
-    else
-    {
-      UpdateLineColumn(c);
-      return c;
-    }
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-  public int getColumn() {
-    return bufcolumn[bufpos];
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-  public int getLine() {
-    return bufline[bufpos];
-  }
-
-/** Get end column. */
-  public int getEndColumn() {
-    return bufcolumn[bufpos];
-  }
-
-/** Get end line. */
-  public int getEndLine() {
-    return bufline[bufpos];
-  }
-
-/** @return column of token start */
-  public int getBeginColumn() {
-    return bufcolumn[tokenBegin];
-  }
-
-/** @return line number of token start */
-  public int getBeginLine() {
-    return bufline[tokenBegin];
-  }
-
-/** Retreat. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-      bufpos += bufsize;
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-    nextCharBuf = new char[4096];
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-      nextCharBuf = new char[4096];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    nextCharInd = bufpos = -1;
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-                        int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-                        int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-
-  /** @return token image as String */
-  public String GetImage()
-  {
-    if (bufpos >= tokenBegin)
-      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-    else
-      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  /** @return suffix */
-  public char[] GetSuffix(int len)
-  {
-    char[] ret = new char[len];
-
-    if ((bufpos + 1) >= len)
-      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-    else
-    {
-      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                        len - bufpos - 1);
-      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-    }
-
-    return ret;
-  }
-
-  /** Set buffers back to null when finished. */
-  public void Done()
-  {
-    nextCharBuf = null;
-    buffer = null;
-    bufline = null;
-    bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-    int start = tokenBegin;
-    int len;
-
-    if (bufpos >= tokenBegin)
-    {
-      len = bufpos - tokenBegin + inBuf + 1;
-    }
-    else
-    {
-      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-    }
-
-    int i = 0, j = 0, k = 0;
-    int nextColDiff = 0, columnDiff = 0;
-
-    while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-    {
-      bufline[j] = newLine;
-      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-      bufcolumn[j] = newCol + columnDiff;
-      columnDiff = nextColDiff;
-      i++;
-    }
-
-    if (i < len)
-    {
-      bufline[j] = newLine++;
-      bufcolumn[j] = newCol + columnDiff;
-
-      while (i++ < len)
-      {
-        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-          bufline[j] = newLine++;
-        else
-          bufline[j] = newLine;
-      }
-    }
-
-    line = bufline[j];
-    column = bufcolumn[j];
-  }
-
-}
-/* JavaCC - OriginalChecksum=53254f6a9325378bb7ef0cee733f3fac (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/ParseException.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/ParseException.java
deleted file mode 100644
index b51da14..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/ParseException.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-@SuppressWarnings("all")
-public class ParseException extends Exception {
-
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-  }
-
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-  }
-
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser) the correct error message
-   * gets displayed.
-   */
-  private static String initialise(Token currentToken,
-                           int[][] expectedTokenSequences,
-                           String[] tokenImage) {
-    String eol = System.getProperty("line.separator", "\n");
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-    retval += expected.toString();
-    return retval;
-  }
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  static String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-}
-/* JavaCC - OriginalChecksum=81f4443085e467ef907deb9a67f74438 (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/Token.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/Token.java
deleted file mode 100644
index a9723db..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/Token.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
-/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/**
- * Describes the input token stream.
- */
-
-@SuppressWarnings("all")
-public class Token implements java.io.Serializable {
-
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /** The line number of the first character of this Token. */
-  public int beginLine;
-  /** The column number of the first character of this Token. */
-  public int beginColumn;
-  /** The line number of the last character of this Token. */
-  public int endLine;
-  /** The column number of the last character of this Token. */
-  public int endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * An optional attribute value of the Token.
-   * Tokens which are not used as syntactic sugar will often contain
-   * meaningful values that will be used later on by the compiler or
-   * interpreter. This attribute value is often different from the image.
-   * Any subclass of Token that actually wants to return a non-null value can
-   * override this method as appropriate.
-   */
-  public Object getValue() {
-    return null;
-  }
-
-  /**
-   * No-argument constructor
-   */
-  public Token() {}
-
-  /**
-   * Constructs a new token for the specified Image.
-   */
-  public Token(int kind)
-  {
-    this(kind, null);
-  }
-
-  /**
-   * Constructs a new token for the specified Image and Kind.
-   */
-  public Token(int kind, String image)
-  {
-    this.kind = kind;
-    this.image = image;
-  }
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-    return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simply add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use sit in your lexical actions.
-   */
-  public static Token newToken(int ofKind, String image)
-  {
-    switch(ofKind)
-    {
-      default : return new Token(ofKind, image);
-    }
-  }
-
-  public static Token newToken(int ofKind)
-  {
-    return newToken(ofKind, null);
-  }
-
-}
-/* JavaCC - OriginalChecksum=6c9f79d78d53588eccf7c8f0bb40434a (do not edit this line) */
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/TokenMgrError.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/TokenMgrError.java
deleted file mode 100644
index 2e96615..0000000
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/TokenMgrError.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
-/* JavaCCOptions: */
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Mike Norman - June 10 2011, created DDL parser package
- ******************************************************************************/
-package org.eclipse.persistence.tools.oracleddl.parser;
-
-/** Token Manager Error. */
-@SuppressWarnings("all")
-public class TokenMgrError extends Error
-{
-
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /*
-   * Ordinals for various reasons why an Error of this type can be thrown.
-   */
-
-  /**
-   * Lexical error occurred.
-   */
-  static final int LEXICAL_ERROR = 0;
-
-  /**
-   * An attempt was made to create a second instance of a static token manager.
-   */
-  static final int STATIC_LEXER_ERROR = 1;
-
-  /**
-   * Tried to change to an invalid lexical state.
-   */
-  static final int INVALID_LEXICAL_STATE = 2;
-
-  /**
-   * Detected (and bailed out of) an infinite loop in the token manager.
-   */
-  static final int LOOP_DETECTED = 3;
-
-  /**
-   * Indicates the reason why the exception is thrown. It will have
-   * one of the above 4 values.
-   */
-  int errorCode;
-
-  /**
-   * Replaces unprintable characters by their escaped (or unicode escaped)
-   * equivalents in the given string
-   */
-  protected static final String addEscapes(String str) {
-    StringBuffer retval = new StringBuffer();
-    char ch;
-    for (int i = 0; i < str.length(); i++) {
-      switch (str.charAt(i))
-      {
-        case 0 :
-          continue;
-        case '\b':
-          retval.append("\\b");
-          continue;
-        case '\t':
-          retval.append("\\t");
-          continue;
-        case '\n':
-          retval.append("\\n");
-          continue;
-        case '\f':
-          retval.append("\\f");
-          continue;
-        case '\r':
-          retval.append("\\r");
-          continue;
-        case '\"':
-          retval.append("\\\"");
-          continue;
-        case '\'':
-          retval.append("\\\'");
-          continue;
-        case '\\':
-          retval.append("\\\\");
-          continue;
-        default:
-          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-            String s = "0000" + Integer.toString(ch, 16);
-            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-          } else {
-            retval.append(ch);
-          }
-          continue;
-      }
-    }
-    return retval.toString();
-  }
-
-  /**
-   * Returns a detailed message for the Error when it is thrown by the
-   * token manager to indicate a lexical error.
-   * Parameters :
-   *    EOFSeen     : indicates if EOF caused the lexical error
-   *    curLexState : lexical state in which this error occurred
-   *    errorLine   : line number when the error occurred
-   *    errorColumn : column number when the error occurred
-   *    errorAfter  : prefix that was seen before this error occurred
-   *    curchar     : the offending character
-   * Note: You can customize the lexical error message by modifying this method.
-   */
-  protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-    return("Lexical error at line " +
-          errorLine + ", column " +
-          errorColumn + ".  Encountered: " +
-          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-          "after : \"" + addEscapes(errorAfter) + "\"");
-  }
-
-  /**
-   * You can also modify the body of this method to customize your error messages.
-   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-   * of end-users concern, so you can return something like :
-   *
-   *     "Internal Error : Please file a bug report .... "
-   *
-   * from this method for such cases in the release version of your parser.
-   */
-  public String getMessage() {
-    return super.getMessage();
-  }
-
-  /*
-   * Constructors of various flavors follow.
-   */
-
-  /** No arg constructor. */
-  public TokenMgrError() {
-  }
-
-  /** Constructor with message and reason. */
-  public TokenMgrError(String message, int reason) {
-    super(message);
-    errorCode = reason;
-  }
-
-  /** Full Constructor. */
-  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-  }
-}
-/* JavaCC - OriginalChecksum=ce061a9b2d99fb99a53b7768a4a7762e (do not edit this line) */
diff --git a/oracleddlparser/src/main/jjtree/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt b/oracleddlparser/src/main/jjtree/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
new file mode 100644
index 0000000..2035e3a
--- /dev/null
+++ b/oracleddlparser/src/main/jjtree/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
@@ -0,0 +1,1915 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2014 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Mike Norman - June 10 2011, created DDL parser package
+ ******************************************************************************/
+options {
+      STATIC = false;
+      SUPPORT_CLASS_VISIBILITY_PUBLIC = true;
+      ERROR_REPORTING = false;
+      JAVA_UNICODE_ESCAPE = true;
+      UNICODE_INPUT = true;
+      NODE_USES_PARSER = false;
+      NODE_DEFAULT_VOID = true;
+      VISITOR = true;
+      FORCE_LA_CHECK = true;
+}
+
+PARSER_BEGIN(DDLParser)
+/*******************************************************************************
+ * Copyright (c) 2011, 2014 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Mike Norman - June 10 2011, created DDL parser package
+ ******************************************************************************/
+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.util.StringTokenizer;
+
+//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 static org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum.XMLTYPE_TYPE;
+
+public class DDLParser {
+
+    protected Map<String, DatabaseType> localTypes = new HashMap<String, DatabaseType>();
+    protected List<String> schemaPatterns = null;
+
+    protected DatabaseTypesRepository typesRepository = new DatabaseTypesRepository();
+
+    public DDLParser() {
+        super();
+    }
+
+    public void setTypesRepository(DatabaseTypesRepository typesRepository) {
+        this.typesRepository = typesRepository;
+    }
+    public DatabaseTypesRepository getTypesRepository() {
+        return typesRepository;
+    }
+
+    public void setSchemaPatterns(List<String> schemaPatterns) {
+        this.schemaPatterns = schemaPatterns;
+    }
+
+    protected String removeQuotes(String quotedString) {
+        return quotedString.substring(1, quotedString.length() - 1);
+    }
+}
+
+PARSER_END(DDLParser)
+
+// white-space
+SKIP: {
+      " " | "\t" | "\n" | "\r" | "\f"
+}
+
+// comments
+SKIP: {
+    <COMMENT_LINE: "--" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
+}
+SKIP:{
+    <COMMENT_BLOCK: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/">
+}
+
+// token classes
+
+// separators and operators (prefix with O_ to avoid naming conflicts)
+TOKEN: {
+      <O_ASSIGN: ":=">
+    | <O_ASTERISK: "*">
+    | <O_ATSIGN: "@">
+    | <O_CLOSEPAREN: ")">
+    | <O_CONCAT: "||">
+    | <O_COLON: ":">
+    | <O_COMMA: ",">
+    | <O_DOT: ".">
+    | <O_DOUBLEDOT: "..">
+    | <O_DOLLAR: "$">
+    | <O_PERCENT: "%">
+    | <O_EQUAL: "=">
+    | <O_GREATER: ">">
+    | <O_GREATEREQUAL: ">=">
+    | <O_JOINPLUS: "(+)">
+    | <O_LESS: "<">
+    | <O_LESSEQUAL: "<=">
+    | <O_MINUS: "-">
+    | <O_NOTEQUAL2: "<>">
+    | <O_NOTEQUAL: "!=">
+    | <O_OPENPAREN: "(">
+    | <O_PLUS: "+">
+    | <O_POUND: "#">
+    | <O_QUESTIONMARK: "?">
+    | <O_SEMICOLON: ";">
+    | <O_SLASH: "/">
+    | <O_TILDE: "~">
+}
+
+// numeric literals
+TOKEN : {
+      <S_NUMBER: <FLOAT> | <FLOAT> ( ["e","E"] ([ "-","+"])? <FLOAT> )? >
+    | <#FLOAT: <INTEGER> | <INTEGER> ( "." <INTEGER> )? | "." <INTEGER> >
+    | <#INTEGER: ( <DIGIT> )+ >
+    | <#DIGIT: ["0" - "9"] >
+}
+
+//reserved words and keywords literals
+/*
+PLSQL reserved words (prefix with R_ ) and keyword (prefix with K_)
+http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/fundamentals.htm#CBJGBIGI
+"You cannot use reserved words as ordinary user-defined identifiers.
+You can use keywords as ordinary user-defined identifiers, but it is not recommended."
+*/
+
+TOKEN [IGNORE_CASE]: {
+    //reserved words
+      <R_ALL: "ALL">
+    | <R_ALTER: "ALTER">
+    | <R_ANCHORED_ROWTYPE: "%ROWTYPE">
+    | <R_ANCHORED_TYPE: "%TYPE">
+    | <R_AND: "AND">
+    | <R_AS: "AS">
+    | <R_ASC: "ASC">
+    | <R_AT: "AT">
+    | <R_BEGIN: "BEGIN">
+    | <R_BETWEEN: "BETWEEN">
+    | <R_BY: "BY">
+    | <R_CASE: "CASE">
+    | <R_CHARSET: "%CHARSET"> 
+    | <R_CHECK: "CHECK">
+    | <R_CLUSTERS: "CLUSTERS">
+    | <R_CLUSTER: "CLUSTER">
+    | <R_COLAUTH: "COLAUTH">
+    | <R_COLUMNS: "COLUMNS">
+    | <R_COMPRESS: "COMPRESS">
+    | <R_CONNECT: "CONNECT">
+    | <R_CONSTRAINT: "CONSTRAINT">
+    | <R_CRASH: "CRASH">
+    | <R_CREATE: "CREATE">
+    | <R_CURSOR: "CURSOR">
+    | <R_DECLARE: "DECLARE">
+    | <R_DEFAULT: "DEFAULT">
+    | <R_DESC: "DESC">
+    | <R_DISTINCT: "DISTINCT">
+    | <R_DROP: "DROP">
+    | <R_ELSE: "ELSE">
+    | <R_END: "END">
+    | <R_EXCEPTION: "EXCEPTION">
+    | <R_EXCLUSIVE: "EXCLUSIVE">
+    | <R_FETCH: "FETCH">
+    | <R_FOR: "FOR">
+    | <R_FROM: "FROM">
+    | <R_FUNCTION: "FUNCTION">
+    | <R_GOTO: "GOTO">
+    | <R_GRANT: "GRANT">
+    | <R_GROUP: "GROUP">
+    | <R_HAVING: "HAVING">
+    | <R_IDENTIFIED: "IDENTIFIED">
+    | <R_IF: "IF">
+    | <R_IN: "IN">
+    | <R_INDEX: "INDEX">
+    | <R_INDEXES: "INDEXES">
+    | <R_INSERT: "INSERT">
+    | <R_INTERSECT: "INTERSECT">
+    | <R_INTO: "INTO">
+    | <R_IS: "IS">
+    | <R_LIKE: "LIKE">
+    | <R_LOCK: "LOCK">
+    | <R_MINUS: "MINUS">
+    | <R_MODE: "MODE">
+    | <R_NOCOMPRESS: "NOCOMPRESS">
+    | <R_NOT: "NOT">
+    | <R_NOWAIT: "NOWAIT">
+    | <R_NULL: "NULL">
+    | <R_OF: "OF">
+    | <R_ON: "ON">
+    | <R_OPTION: "OPTION">
+    | <R_OR: "OR">
+    | <R_ORDER: "ORDER">
+    | <R_OVERLAPS: "OVERLAPS">
+    | <R_PRIMARY: "PRIMARY">
+    | <R_PROCEDURE: "PROCEDURE">
+    | <R_PUBLIC: "PUBLIC">
+    | <R_RESOURCE: "RESOURCE">
+    | <R_REVOKE: "REVOLE">
+    | <R_SELECT: "SELECT">
+    | <R_SHARE: "SHARE">
+    | <R_SIZE: "SIZE">
+    | <R_SQL: "SQL">
+    | <R_START: "START">
+    | <R_SUBTYPE: "SUBTYPE">
+    | <R_TABAUTH: "TABAUTH">
+    | <R_TABLE: "TABLE">
+    | <R_THEN: "THEN">
+    | <R_TO: "TO">
+    | <R_TYPE: "TYPE">
+    | <R_UNION: "UNION">
+    | <R_UNIQUE: "UNIQUE">
+    | <R_UPDATE: "UPDATE">
+    | <R_VALUES: "VALUES">
+    | <R_VIEW: "VIEW">
+    | <R_VIEWS: "VIEWS">
+    | <R_WHEN: "WHEN">
+    | <R_WHERE: "WHERE">
+    | <R_WITH: "WITH">
+
+    //keywords - not a complete list, just what is sufficient for this parser
+    | <K_ARRAY: "ARRAY">
+    | <K_AUTHID: "AUTHID">
+    | <K_BFILE: "BFILE">
+    | <K_BINARY_DOUBLE: "BINARY_DOUBLE">
+    | <K_BINARY_FLOAT: "BINARY_FLOAT">
+    | <K_BINARY_INTEGER: "BINARY_INTEGER">
+    | <K_BLOB: "BLOB">
+    | <K_BOOLEAN: "BOOLEAN">
+    | <K_BYTE: "BYTE">
+    | <K_CHAR: "CHAR">
+    | <K_CHARACTER: "CHARACTER">
+    | <K_CLOB: "CLOB">
+    | <K_COMMIT: "COMMIT">
+    | <K_CONSTANT: "CONSTANT">
+    | <K_CONSTRUCTOR: "CONSTRUCTOR">
+    | <K_CURRENT_USER: "CURRENT_USER">
+    | <K_DATE :"DATE">
+    | <K_DAY: "DAY">
+    | <K_DEC: "DEC">
+    | <K_DECIMAL: "DECIMAL">
+    | <K_DEFINER: "DEFINER">
+    | <K_DELETE: "DELETE">
+    | <K_DETERMINISTIC: "DETERMINISTIC">
+    | <K_DOUBLE: "DOUBLE">
+    | <K_ENABLE: "ENABLE">
+    | <K_FINAL: "FINAL">
+    | <K_FLOAT: "FLOAT">
+    | <K_FORCE: "FORCE">
+    | <K_GLOBAL: "GLOBAL">
+    | <K_INSTANTIABLE: "INSTANTIABLE">
+    | <K_INT: "INT">
+    | <K_INTEGER: "INTEGER">
+    | <K_INTERVAL: "INTERVAL">
+    | <K_KEY: "KEY">
+    | <K_LOCAL: "LOCAL">
+    | <K_LONG: "LONG">
+    | <K_MLSLABEL: "MLSLABEL">
+    | <K_MONTH: "MONTH">
+    | <K_NATIONAL: "NATIONAL">
+    | <K_NATURAL: "NATURAL">
+    | <K_NCHAR: "NCHAR">
+    | <K_NCLOB: "NCLOB">
+    | <K_NOCOPY: "NOCOPY">
+    | <K_NUMBER: "NUMBER">
+    | <K_NUMERIC: "NUMERIC">
+    | <K_NVARCHAR2: "NVARCHAR2">
+    | <K_NVARCHAR: "NVARCHAR">
+    | <K_OBJECT: "OBJECT">
+    | <K_OID: "OID">
+    | <K_ORGANIZATION: "ORGANIZATION">
+    | <K_OUT: "OUT">
+    | <K_OVERFLOW: "OVERFLOW">
+    | <K_PACKAGE: "PACKAGE">
+    | <K_PARALLEL_ENABLE: "PARALLEL_ENABLE">
+    | <K_PIPELINED: "PIPELINED">
+    | <K_PLS_INTEGER:"PLS_INTEGER">
+    | <K_POSITIVE: "POSITIVE">
+    | <K_PRAGMA: "PRAGMA">
+    | <K_PRECISION:"PRECISION">
+    | <K_PRESERVE: "PRESERVE">
+    | <K_RANGE: "RANGE">
+    | <K_RAW: "RAW">
+    | <K_REAL:"REAL">
+    | <K_RECORD: "RECORD">
+    | <K_REF: "REF">
+    | <K_REPLACE: "REPLACE">
+    | <K_RESULT: "RESULT">
+    | <K_RESULT_CACHE: "RESULT_CACHE">
+    | <K_RETURN: "RETURN">
+    | <K_ROWID:"ROWID">
+    | <K_ROWS: "ROWS">
+    | <K_SECOND: "SECOND">
+    | <K_SELF: "SELF">
+    | <K_SET: "SET">
+    | <K_SIGNTYPE: "SIGNTYPE">
+    | <K_SIMPLE_DOUBLE:"SIMPLE_DOUBLE">
+    | <K_SIMPLE_FLOAT:"SIMPLE_FLOAT">
+    | <K_SIMPLE_INTEGER:"SIMPLE_INTEGER">
+    | <K_SMALLINT:"SMALLINT">
+    | <K_STRING: "STRING">
+    | <K_SYS_REFCURSOR:"SYS_REFCURSOR">
+    | <K_TEMPORARY: "TEMPORARY">
+    | <K_TIME: "TIME">
+    | <K_TIMESTAMP: "TIMESTAMP">
+    | <K_UROWID:"UROWID">
+    | <K_VARCHAR2: "VARCHAR2">
+    | <K_VARCHAR: "VARCHAR">
+    | <K_VARRAY: "VARRAY">
+    | <K_VARYING: "VARYING">
+    | <K_XMLTYPE: "XMLTYPE">
+    | <K_SYSXMLTYPE: "SYS.XMLTYPE">
+    | <K_YEAR: "YEAR">
+    | <K_ZONE: "ZONE">
+}
+
+String keywords():
+{Token t = null;}
+{
+    (
+        t=<K_ARRAY>
+      | t=<K_AUTHID>
+      | t=<K_BFILE>
+      | t=<K_BINARY_DOUBLE>
+      | t=<K_BINARY_FLOAT>
+      | t=<K_BINARY_INTEGER>
+      | t=<K_BLOB>
+      | t=<K_BOOLEAN>
+      | t=<K_BYTE>
+      | t=<K_CHAR>
+      | t=<K_CHARACTER>
+      | t=<K_CLOB>
+      | t=<K_COMMIT>      
+      | t=<K_CONSTANT>
+      | t=<K_CONSTRUCTOR>
+      | t=<K_CURRENT_USER>
+      | t=<K_DATE>
+      | t=<K_DAY>
+      | t=<K_DEC>
+      | t=<K_DECIMAL>
+      | t=<K_DEFINER>
+      | t=<K_DELETE>
+      | t=<K_DETERMINISTIC>
+      | t=<K_DOUBLE>
+      | t=<K_ENABLE>
+      | t=<K_FINAL>
+      | t=<K_FLOAT>
+      | t=<K_FORCE>
+      | t=<K_GLOBAL>
+      | t=<K_INSTANTIABLE>
+      | t=<K_INT>
+      | t=<K_INTEGER>
+      | t=<K_INTERVAL>
+      | t=<K_KEY>
+      | t=<K_LOCAL>
+      | t=<K_LONG>
+      | t=<K_MLSLABEL>
+      | t=<K_MONTH>
+      | t=<K_NATIONAL>
+      | t=<K_NATURAL>
+      | t=<K_NCHAR>
+      | t=<K_NCLOB>
+      | t=<K_NOCOPY>
+      | t=<K_NUMBER>
+      | t=<K_NUMERIC>
+      | t=<K_NVARCHAR2>
+      | t=<K_NVARCHAR>
+      | t=<K_OBJECT>
+      | t=<K_OID>
+      | t=<K_ORGANIZATION>
+      | t=<K_OUT>
+      | t=<K_OVERFLOW>
+      | t=<K_PACKAGE>
+      | t=<K_PARALLEL_ENABLE>
+      | t=<K_PIPELINED>
+      | t=<K_PLS_INTEGER>
+      | t=<K_POSITIVE>
+      | t=<K_PRAGMA>
+      | t=<K_PRECISION>
+      | t=<K_PRESERVE>
+      | t=<K_RANGE>
+      | t=<K_RAW>
+      | t=<K_REAL>
+      | t=<K_RECORD>
+      | t=<K_REF>
+      | t=<K_REPLACE>
+      | t=<K_RESULT>
+      | t=<K_RESULT_CACHE>
+      | t=<K_RETURN>
+      | t=<K_ROWID>
+      | t=<K_ROWS>
+      | t=<K_SECOND>
+      | t=<K_SELF>
+      | t=<K_SET>
+      | t=<K_SIGNTYPE>
+      | t=<K_SIMPLE_DOUBLE>
+      | t=<K_SIMPLE_FLOAT>
+      | t=<K_SIMPLE_INTEGER>
+      | t=<K_SMALLINT>
+      | t=<K_STRING>
+      | t=<K_SYS_REFCURSOR>
+      | t=<K_TEMPORARY>
+      | t=<K_TIME>
+      | t=<K_TIMESTAMP>
+      | t=<K_UROWID>
+      | t=<K_VARCHAR2>
+      | t=<K_VARCHAR>
+      | t=<K_VARRAY>
+      | t=<K_VARYING>
+      | t=<K_XMLTYPE>
+      | t=<K_SYSXMLTYPE>
+      | t=<K_YEAR>
+      | t=<K_ZONE>      
+    )
+    {
+      return t.image;
+    }
+}
+
+// identifiers
+TOKEN:
+{
+      <S_IDENTIFIER: (<LETTER>)+ (<DIGIT> | <LETTER> | <SPECIAL_CHARS>)* >
+    | <#LETTER: ["a"-"z", "A"-"Z"] >
+    | <#SPECIAL_CHARS: "$" | "_" | "#" | "@" >
+    | <S_BIND: ":" ( <S_NUMBER> | <S_IDENTIFIER> ("." <S_IDENTIFIER>)?) >
+    | <S_CHAR_LITERAL: "'" (~["'"])* "'" ("'" (~["'"])* "'")*>
+    | <S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
+}
+
+// stripped-down version of PLSQL grammar: only parses package/top-level DDL specifications
+
+// PLSQLPackage at 'top-level'
+PLSQLPackageType parsePLSQLPackage():
+{PLSQLPackageType packageType = new PLSQLPackageType();
+ String dottedName = null;
+ String schema = null;
+ String packageName = null;
+ }
+{
+    <R_CREATE> [ orReplace() ] <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);
+        }
+        [ invokerRights() ] as()
+         ( packageDeclaration(packageType) )*
+    <R_END> skipToEnd()
+    {
+      typesRepository.setDatabaseType(packageName, packageType);
+      return packageType;
+    }
+}
+
+// procedure at 'top-level'
+ProcedureType parseTopLevelProcedure():
+{ProcedureType procedureType = null;
+ String dottedName = null;
+ String schema = null;
+ String procedureName = null;}
+{
+    <R_CREATE> [ orReplace() ] <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);
+              }
+       }
+    [ <O_OPENPAREN> argumentList(procedureType) <O_CLOSEPAREN> ] as()
+    skipToEnd()
+    {
+      typesRepository.setDatabaseType(procedureName, procedureType);
+      return procedureType;
+    }
+}
+
+// function at 'top-level'
+FunctionType parseTopLevelFunction():
+{FunctionType functionType = null;
+ String dottedName = null;
+ String schema = null;
+ String functionName = null;
+ ArgumentType returnType = null;}
+{
+    <R_CREATE> [ orReplace() ] <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);
+          }
+      }
+    [ <O_OPENPAREN> argumentList(functionType) <O_CLOSEPAREN> ] returnType=functionReturnSpec(functionType) as()
+    skipToEnd()
+    {
+      functionType.setReturnArgument(returnType);
+      typesRepository.setDatabaseType(functionName, functionType);
+      return functionType;
+    }
+}
+
+// table at 'top-level'
+TableType parseTable():
+{TableType tableType = null;
+ String dottedName = null;
+ String schema = null;
+ String tableName = null;
+ Token iot = null;
+}
+{
+    <R_CREATE> [ <K_GLOBAL> <K_TEMPORARY> ] <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);
+                  }
+        }
+        <O_OPENPAREN> columnDeclarations(tableType) <O_CLOSEPAREN>
+         [ <K_ORGANIZATION> ] [ iot=<R_INDEX> ] [ <R_NOCOMPRESS> ] [ <K_OVERFLOW> ]
+         [ onCommit() ] <O_SEMICOLON>
+     <EOF>
+     {
+         if (iot != null) {
+             tableType.setIOT(true);
+         }
+         typesRepository.setDatabaseType(tableName, tableType);
+         return tableType;
+     }
+}
+
+// type at 'top-level'
+CompositeDatabaseType parseType():
+{CompositeDatabaseType databaseType = null;
+ DatabaseType enclosedType = null;
+ String dottedName = null;
+ String schema = null;
+ String typeName = null;
+ Token vsize = null;
+ boolean varray = false;
+ boolean nestedTable = false;
+}
+{
+    <R_CREATE> [ orReplace() ] <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());
+          }
+        }
+        [ <K_FORCE> ] [ <K_OID> <S_CHAR_LITERAL> ] [ invokerRights() ] as()
+        [ <K_OBJECT> <O_OPENPAREN>
+            {
+                databaseType = new ObjectType(typeName);
+                if (schema != null) {
+                    ((ObjectType)databaseType).setSchema(schema);
+                }
+            } columnDeclarations(databaseType) constructorDeclaration() <O_CLOSEPAREN>
+          | <K_VARRAY> <O_OPENPAREN> vsize=<S_NUMBER> <O_CLOSEPAREN> <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)
+          | <R_TABLE> <R_OF>
+           {
+                databaseType = new ObjectTableType(typeName);
+                if (schema != null) {
+                    ((ObjectTableType)databaseType).setSchema(schema);
+                }
+              } enclosedType=columnTypeSpec(databaseType)
+        ]
+     [ [ <R_NOT> ] ( <K_FINAL> | <K_INSTANTIABLE> ) ] [ <O_SEMICOLON> ]
+     <EOF>
+    {
+        if (enclosedType != null) {
+            ((CompositeDatabaseType)databaseType).setEnclosedType(enclosedType);
+        }
+        typesRepository.setDatabaseType(typeName, databaseType);
+        return databaseType;
+    }
+}
+
+void columnDeclarations(CompositeDatabaseType enclosingType):
+{}
+{
+    (LOOKAHEAD(2) constructor() | columnDeclaration(enclosingType) | constraintDeclaration(enclosingType) )
+    [ <O_COMMA> columnDeclarations(enclosingType) ]
+}
+
+void columnDeclaration(CompositeDatabaseType enclosingType):
+{String s = null;
+ String pk = null;
+ boolean notNull = false;
+ DatabaseType columnType = null;
+ FieldType column = null;
+}
+{
+    s=OracleObjectName() columnType=columnTypeSpec(enclosingType) [ notNull=notNull() ]
+        {
+          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();
+          }
+        }
+}
+
+void constraintDeclaration(CompositeDatabaseType enclosingType):
+{String s = null;
+ String pk = null;
+}
+{
+    [ <R_CONSTRAINT> ] [ OracleObjectName() ]
+      (
+          <R_PRIMARY> <K_KEY> <O_OPENPAREN> pkList((TableType)enclosingType) <O_CLOSEPAREN>
+        | <R_CHECK> <O_OPENPAREN> skipToClosingParen() <O_CLOSEPAREN>
+        | <R_UNIQUE> <O_OPENPAREN> uniqList() <O_CLOSEPAREN> 
+      ) [ <K_ENABLE> ]
+}
+
+DatabaseType columnTypeSpec(CompositeDatabaseType enclosingType):
+{String s = null;
+ Token t = null;
+ DatabaseType dt = null;}
+{
+    (
+        LOOKAHEAD(2)
+        dt=datatype()
+      | s=columnSpec() [ <O_OPENPAREN> t=<S_NUMBER> <O_CLOSEPAREN> ]
+    ) [ <R_CONSTRAINT> <S_QUOTED_IDENTIFIER> ]
+    {
+      if (s != null) {
+          if (s.contains(".")) {
+              int dotIdx = s.indexOf(".");
+              String namePart1 = s.substring(0, dotIdx);
+              String namePart2 = s.substring(dotIdx+1, s.length());
+              String schemaName = null;
+              if (enclosingType.isTableType()) {
+                 schemaName = ((TableType)enclosingType).getSchema();
+              } else if (enclosingType.isObjectTableType()) {
+                 schemaName = ((ObjectTableType)enclosingType).getSchema();
+              } else if (enclosingType.isObjectType()) {
+                 schemaName = ((ObjectType)enclosingType).getSchema();
+              } else if (enclosingType.isPLSQLType()) {
+                 schemaName = ((PLSQLType)enclosingType).getParentType().getSchema();
+              } else if (enclosingType.isVArrayType()) {
+                 schemaName = ((VArrayType)enclosingType).getSchema();
+              }
+              if (schemaName != null && schemaName.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);
+          }
+      }
+      return dt;
+    }
+}
+
+void constructorDeclaration():
+{}
+{
+  [ <K_CONSTRUCTOR> skipToReturn() <K_SELF><R_AS><K_RESULT> ]
+  [ <O_COMMA> constructorDeclaration() ]
+}
+
+void uniqList():
+{}
+{
+    OracleObjectName() ( <O_COMMA> OracleObjectName() )*
+}
+
+void pkList(TableType tableType):
+{}
+{
+    pk(tableType) ( <O_COMMA> pk(tableType) )*
+}
+
+void pk(TableType tableType):
+{
+String s = null;
+}
+{
+    s=OracleObjectName()
+    {
+       List<FieldType> columns = tableType.getColumns();
+       for (FieldType column : columns) {
+            if (column.getFieldName().equals(s)) {
+                column.setPk();
+                break;
+            }
+       }
+    }
+}
+
+void packageDeclaration(PLSQLPackageType packageType) :
+{}
+{
+      typeOrSubTypeDeclaration(packageType)
+    | cursorDeclaration(packageType)
+    | procedureSpec(packageType)
+    | functionSpec(packageType)
+    | LOOKAHEAD(2) variableDeclaration(packageType)
+    | pragmaDeclaration()
+}
+
+void variableDeclaration(PLSQLPackageType packageType):
+{String varName = null;
+ DatabaseType varType=null;}
+{
+    varName=OracleObjectName()
+      (
+          LOOKAHEAD(2) <R_EXCEPTION>
+        | [ LOOKAHEAD(2) <K_CONSTANT> ] varType=typeSpec() [ <R_NOT> <R_NULL> ] [ variableDefaultAssignment() ]
+      )
+    <O_SEMICOLON>
+    {
+        FieldType variable = new FieldType(varName);
+        variable.setEnclosedType(varType);
+        packageType.addLocalVariable(variable);
+        if (varType.isROWTYPEType()) {
+            ((ROWTYPEType)varType).setPackageType(packageType);
+        }
+    }
+}
+
+void variableDefaultAssignment():
+{}
+{
+    ( <O_ASSIGN> | <R_DEFAULT> ) skipToSemiColon()
+}
+
+DatabaseType datatype():
+{Token t = null;
+ DatabaseType dt = null;
+ Token precision = null;
+ Long sl;
+ Long pl;
+ Token scale = null;
+ Token withTimeZone = null;
+ Token withLocalTimeZone = null;
+}
+{
+    <K_BINARY_INTEGER>  { return BINARY_INTEGER_TYPE;}
+    | <K_BINARY_FLOAT>  { return BINARY_FLOAT_TYPE;}
+    | <K_BINARY_DOUBLE> { return BINARY_DOUBLE_TYPE;}
+    | <K_NATURAL>       { return NATURAL_TYPE;}
+    | <K_POSITIVE>      { return POSITIVE_TYPE;}
+    | <K_SIGNTYPE>      { return SIGN_TYPE;}
+    | ( t=<K_NUMBER>
+        | t=<K_NUMERIC>
+        | t=<K_DECIMAL>
+        | t=<K_DEC>
+      ) [ <O_OPENPAREN> [ precision=<O_ASTERISK > | precision=<S_NUMBER> ] ( <O_COMMA> scale=<S_NUMBER> )* <O_CLOSEPAREN> ]
+        {
+            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);
+                    }
+                }
+            }
+            return dt;
+        }
+    | <K_LONG> [ t=<K_RAW> ] [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+         {
+              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);
+              }
+            }
+            return dt;
+     }
+    | <K_RAW> [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        {
+            if (precision == null) {
+                dt = new RawType();
+            }
+            else {
+                pl = Long.decode(precision.image);
+                dt = new RawType(pl);
+            }
+            return dt;
+            }
+    | <K_BOOLEAN> { return BOOLEAN_TYPE;}
+    | <K_XMLTYPE> { return XMLTYPE_TYPE;}
+    | <K_SYSXMLTYPE> { return XMLTYPE_TYPE;}
+    | <K_DATE> { return DATE_TYPE;}
+    | <K_INTERVAL>
+         (
+             <K_DAY> [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ] <R_TO> <K_SECOND> [ <O_OPENPAREN> scale=<S_NUMBER> <O_CLOSEPAREN> ]
+             {
+                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);
+                        }
+                    }
+                return dt;
+             }
+           | <K_YEAR> [ <O_OPENPAREN> <S_NUMBER> <O_CLOSEPAREN> ] <R_TO> <K_MONTH>
+             {
+                if (precision == null) {
+                    dt = new IntervalYearToMonth();
+                }
+                else {
+                    pl = Long.decode(precision.image);
+                    dt = new IntervalYearToMonth(pl);
+                }
+                return dt;                 
+             }
+         )
+    | <K_TIME> { return TIME_TYPE;}
+    | <K_TIMESTAMP> [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        [ <R_WITH> [ withLocalTimeZone=<K_LOCAL> ] withTimeZone=<K_TIME> <K_ZONE> ]
+        {
+          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();
+          }
+          return dt;
+        }
+    | <K_INTEGER>  { return INTEGER_TYPE;}
+    | <K_INT>      { return INTEGER_TYPE;}
+    | <K_SMALLINT> { return SMALLINT_TYPE;}
+    | <K_FLOAT> [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        {
+          if (precision == null) {
+              return new FloatType();
+          }
+          else {
+              pl = Long.decode(precision.image);
+              FloatType ft = new FloatType(pl);
+              return ft;
+          }
+        }
+    | <K_REAL> { return new RealType();}
+    | <K_MLSLABEL> { return MLSLABEL_TYPE;}
+    | <K_PLS_INTEGER> { return PLS_INTEGER_TYPE;}
+    | <K_SIMPLE_INTEGER> { return SIMPLE_INTEGER_TYPE;}
+    | <K_SIMPLE_FLOAT> { return SIMPLE_FLOAT_TYPE;}
+    | <K_SIMPLE_DOUBLE> { return SIMPLE_DOUBLE_TYPE;}
+    | <K_SYS_REFCURSOR>  { return SYS_REFCURSOR_TYPE;}
+    | <K_BLOB > { return new BlobType();}
+    | <K_NCLOB> { return new NClobType();}
+    | <K_BFILE>  { return BFILE_TYPE;}
+    | <K_ROWID> { return ROWID_TYPE;}
+    | <K_UROWID> [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        {
+          if (precision == null) {
+              return new URowIdType();
+          }
+          else {
+              pl = Long.decode(precision.image);
+              return new URowIdType(pl);
+          }
+        }
+    | <K_DOUBLE> <K_PRECISION> { return new DoubleType();}
+    | <K_CHAR> [ t=<K_VARYING> ] [ <O_OPENPAREN> precision=<S_NUMBER> [ <K_BYTE> | <K_CHAR> ] <O_CLOSEPAREN> ]
+        [ <K_CHARACTER> <K_SET> <S_IDENTIFIER> [ <R_CHARSET> ] ]
+        {
+          if (t == null) {
+              if (precision == null) {
+                  return new CharType();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new CharType(pl);
+              }
+          }
+          else {
+              // ANSI syntax for VARCHAR2
+              if (precision == null) {
+                  return new VarChar2Type();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new VarChar2Type(pl);
+              }
+          }
+        }
+    | <K_VARCHAR> [ <K_VARYING> ] [ <O_OPENPAREN> precision=<S_NUMBER> [ <K_BYTE> | <K_CHAR> ] <O_CLOSEPAREN> ]
+       [ <K_CHARACTER> <K_SET> <S_IDENTIFIER> [ <R_CHARSET> ] ]
+        {
+          if (precision == null) {
+              return new VarCharType();
+          }
+          else {
+              pl = Long.decode(precision.image);
+              return new VarCharType(pl);
+          }
+        }
+    | <K_VARCHAR2> [ <K_VARYING> ] [ <O_OPENPAREN> precision=<S_NUMBER> [ <K_BYTE> | <K_CHAR> ] <O_CLOSEPAREN> ]
+        [ <K_CHARACTER> <K_SET> <S_IDENTIFIER> [ <R_CHARSET> ] ]
+        {
+            if (precision == null) {
+                return new VarChar2Type();
+            }
+            else {
+                pl = Long.decode(precision.image);
+                return new VarChar2Type(pl);
+            }
+        }
+    | <K_CHARACTER> [ t=<K_VARYING> ] [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        {
+          if (t == null) {
+              if (precision == null) {
+                  return new CharType();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new CharType(pl);
+              }
+          }
+          else {
+              // ANSI syntax for VARCHAR
+              if (precision == null) {
+                  return new VarCharType();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new VarCharType(pl);
+              }
+          }
+        }
+    | <K_NCHAR> [ t=<K_VARYING> ] [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        {
+          if (t == null) {
+              if (precision == null) {
+                  return new NCharType();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new NCharType(pl);
+              }
+          }
+          else {
+              // ANSI syntax for NVARCHAR2
+              if (precision == null) {
+                  return new NVarChar2Type();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new NVarChar2Type(pl);
+              }
+          }
+        }
+    | <K_NVARCHAR> [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+           {
+            if (precision == null) {
+                return new NVarChar2Type();
+            }
+            else {
+                pl = Long.decode(precision.image);
+                return new NVarChar2Type(pl);
+            }
+      }
+    | <K_NVARCHAR2> [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        {
+            if (precision == null) {
+                return new NVarChar2Type();
+            }
+            else {
+                pl = Long.decode(precision.image);
+                return new NVarChar2Type(pl);
+            }
+        }
+    | <K_NATIONAL> ( <K_CHARACTER> | <K_CHAR> ) [ t=<K_VARYING> ] [ <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN> ]
+        {
+          if (t == null) {
+              if (precision == null) {
+                  return new NCharType();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new NCharType(pl);
+              }
+          }
+          else {
+              // ANSI syntax for NVARCHAR2
+              if (precision == null) {
+                  return new NVarChar2Type();
+              }
+              else {
+                  pl = Long.decode(precision.image);
+                  return new NVarChar2Type(pl);
+              }
+          }
+        }
+    | <K_CLOB> [ <K_CHARACTER> <K_SET> <S_IDENTIFIER> [ <R_CHARSET> ] ] { return new ClobType();}
+}
+
+DatabaseType typeSpec():
+{boolean isTYPEType = false;
+ boolean isROWTYPEType = false;
+ DatabaseType dataType = null;
+ String spec = null;
+ String s = null;}
+{
+    (   LOOKAHEAD(3)
+        dataType=datatype()
+      | spec=columnSpec()
+        [
+          ( <O_OPENPAREN> <S_NUMBER> <O_CLOSEPAREN> )
+          |
+          <R_ANCHORED_TYPE>
+            {
+              isTYPEType=true;
+              s = spec + removeQuotes(tokenImage[R_ANCHORED_TYPE]);
+            }
+          |
+          <R_ANCHORED_ROWTYPE>
+            {
+              isROWTYPEType =true;
+              s = spec + removeQuotes(tokenImage[R_ANCHORED_ROWTYPE]);
+            }
+        ]
+    )
+    {
+      if (dataType == null && localTypes != null) {
+          // spec may need schema/catalog stripped off
+          String tName = spec;
+          StringTokenizer stok = new StringTokenizer(spec, ".");
+          while (stok.hasMoreTokens()) {
+              tName = stok.nextToken();
+          }
+          for (String typeName : localTypes.keySet()) {
+              if (typeName.equals(spec)) {
+                  dataType = localTypes.get(spec);
+                  break;
+              } else if (typeName.equals(tName)) {
+                  dataType = localTypes.get(tName);
+                  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;
+          }
+      }
+      return dataType;
+    }
+}
+
+String columnSpec():
+{String s1 = null;
+ String s2 = null;
+ String s3 = null;}
+{
+    s1=OracleObjectName() [ <O_DOT> s2=OracleObjectName() [ <O_DOT> s3=OracleObjectName() ] ]
+    {
+      StringBuilder sb = new StringBuilder(s1);
+      if (s2 != null) {
+          sb.append('.');
+          sb.append(s2);
+          if (s3 != null) {
+              sb.append('.');
+              sb.append(s3);
+          }
+      }
+      return sb.toString();
+    }
+}
+
+String tableSpec():
+{}
+{
+    OracleObjectName() [ <O_DOT> OracleObjectName() [ <O_ATSIGN> <S_IDENTIFIER> ] ]
+    {return token.image;}
+}
+
+String typeName():
+{}
+{
+    OracleObjectName() [ <O_DOT> OracleObjectName() ]
+    {return token.image;}
+}
+
+void typeOrSubTypeDeclaration(PLSQLPackageType packageType) :
+{String s = null;}
+{
+      typeDeclaration(packageType)
+    | subtypeDeclaration(packageType)
+}
+
+void typeDeclaration(PLSQLPackageType packageType) :
+{String s = null;}
+{
+    <R_TYPE> s=typeName() <R_IS> aTypeDeclaration(packageType, s) <O_SEMICOLON>
+}
+
+void aTypeDeclaration(PLSQLPackageType packageType, String typeName) :
+{String spec = null;
+ String anchoredTypeName = null;
+ boolean isTYPEType = false;
+ boolean isROWTYPEType = false;
+}
+{
+      LOOKAHEAD(2)
+      recordDeclaration(packageType, typeName)
+    | plsqlTableDeclaration(packageType, typeName)
+    | LOOKAHEAD(2) varrayDeclaration(packageType)
+    | LOOKAHEAD(2) refCursorDeclaration(packageType, typeName)
+    | LOOKAHEAD(2)
+      spec=columnSpec()
+      (
+        <R_ANCHORED_TYPE>
+          {
+            isTYPEType=true;
+            anchoredTypeName = spec + removeQuotes(tokenImage[R_ANCHORED_TYPE]);
+          }
+        |
+        <R_ANCHORED_ROWTYPE>
+          {
+            isROWTYPEType =true;
+            anchoredTypeName = spec + removeQuotes(tokenImage[R_ANCHORED_ROWTYPE]);
+          }
+      )
+      {
+         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);
+      }
+}
+
+void recordDeclaration(PLSQLPackageType packageType, String typeName) :
+{
+  PLSQLRecordType plsqlRecordType = new PLSQLRecordType(typeName);
+  plsqlRecordType.setParentType(packageType);
+}
+{
+    <K_RECORD> <O_OPENPAREN>
+        fieldDeclarations(plsqlRecordType)
+    <O_CLOSEPAREN>
+    {
+      packageType.addType(plsqlRecordType);
+      localTypes.put(typeName, plsqlRecordType);
+    }
+}
+
+void fieldDeclarations(PLSQLRecordType plsqlRecordType) :
+{}
+{
+    fieldDeclaration(plsqlRecordType) [ <O_COMMA> fieldDeclarations(plsqlRecordType) ]
+}
+
+void fieldDeclaration(PLSQLRecordType plsqlRecordType):
+{
+  String s = null;
+  DatabaseType dataType = null;
+  FieldType fieldType = null;
+}
+{
+    s=typeName() dataType=typeSpec() [ <R_NOT> <R_NULL> ] [ fieldDefaultAssignment() ]
+    {
+      fieldType = new FieldType(s);
+      fieldType.setEnclosedType(dataType);
+      plsqlRecordType.addField(fieldType);
+      if (dataType instanceof UnresolvedType) {
+          ((UnresolvedType)dataType).setOwningType(plsqlRecordType);
+      }
+    }
+}
+
+void fieldDefaultAssignment():
+{}
+{
+    ( <O_ASSIGN> | <R_DEFAULT> ) skipToNextArg()
+}
+
+void subtypeDeclaration(PLSQLPackageType packageType) :
+{String subtypeName;
+DatabaseType subtype;
+Token notNull = null;
+Token rangeStart = null;
+Token rangeEnd = null;}
+{
+    <R_SUBTYPE> subtypeName=OracleObjectName() <R_IS> subtype=typeSpec()
+        [ <K_RANGE> rangeStart=<S_NUMBER> <O_DOUBLEDOT> rangeEnd=<S_NUMBER> ]
+        [ <R_NOT> notNull=<R_NULL> ] <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);
+    }
+}
+
+void plsqlTableDeclaration(PLSQLPackageType packageType, String typeName) :
+{
+  PLSQLCollectionType plsqlTable = new PLSQLCollectionType(typeName);
+  plsqlTable.setParentType(packageType);
+  DatabaseType nestedType;
+}
+{
+    <R_TABLE> <R_OF> nestedType = typeSpec() [ <R_NOT> <R_NULL> ]
+        [ <R_INDEX> <R_BY> plsqlTableIndexByDeclaration(plsqlTable) ]
+    {
+      if (nestedType instanceof UnresolvedType) {
+        ((UnresolvedType)nestedType).setOwningType(plsqlTable);
+      }
+      plsqlTable.setEnclosedType(nestedType);
+      packageType.addType(plsqlTable);
+      localTypes.put(typeName, plsqlTable);
+    }
+}
+
+void plsqlTableIndexByDeclaration(PLSQLCollectionType plsqlTable) :
+{
+  DatabaseType indexType = null;
+  Token precision = null;
+  Token otherIndexByType = null;
+}
+{
+    ( <K_PLS_INTEGER> {indexType = PLS_INTEGER_TYPE; }
+    | <K_BINARY_INTEGER>  {indexType = BINARY_INTEGER_TYPE; }
+    | <K_VARCHAR2> <O_OPENPAREN> precision=<S_NUMBER> <O_CLOSEPAREN>
+      {
+        if (precision == null) {
+            indexType = new VarChar2Type();
+        }
+        else {
+            Long pl = Long.decode(precision.image);
+            indexType = new VarChar2Type(pl);
+        }
+      }
+    | otherIndexByType=<K_STRING> <O_OPENPAREN> <S_NUMBER> <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);
+        }
+      }
+    )
+    {
+      plsqlTable.setIndexed(true);
+      plsqlTable.setIndexType(indexType);
+    }
+}
+
+void varrayDeclaration(PLSQLPackageType packageType) :
+{}
+{
+    ( <K_VARRAY> | <K_VARYING> <K_ARRAY> ) <O_OPENPAREN> <S_NUMBER> <O_CLOSEPAREN>
+        <R_OF> datatype() [ <R_NOT> <R_NULL> ]
+}
+
+void refCursorDeclaration(PLSQLPackageType packageType, String cursorTypeName) :
+{PLSQLCursorType cursorType = null;}
+{
+    <K_REF> <R_CURSOR>
+      {
+        cursorType = new PLSQLCursorType(cursorTypeName);
+        cursorType.setParentType(packageType);
+        packageType.addCursor(cursorType);
+        localTypes.put(cursorTypeName, cursorType);
+      }
+      [ refCursorTypeSpec(cursorType, packageType) ]
+}
+
+void refCursorTypeSpec(PLSQLCursorType cursorType, PLSQLPackageType packageType) :
+{String s = null;
+ String spec = null;
+ boolean isTYPEType = false;
+ boolean isROWTYPEType = false;
+ DatabaseType localType = null;
+}
+{
+    <K_RETURN> spec=OracleObjectName()
+      [
+          <R_ANCHORED_TYPE>
+            {
+                  isTYPEType = true;
+                  s = spec + removeQuotes(tokenImage[R_ANCHORED_TYPE]);
+            }
+        | <R_ANCHORED_ROWTYPE>
+            {
+              isROWTYPEType = true;
+              s = spec + removeQuotes(tokenImage[R_ANCHORED_ROWTYPE]);
+            }
+      ]
+    {
+      //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);
+         }
+      }
+    }
+}
+
+void cursorDeclaration(PLSQLPackageType packageType) :
+{Token t = null;}
+{
+    <R_CURSOR> skipToSemiColon()
+}
+
+// Procedure Specification
+void procedureSpec(PLSQLPackageType packageType) :
+{String procedureName= null;
+ ProcedureType procedureType = null;
+}
+{
+    <R_PROCEDURE> procedureName=OracleObjectName() 
+        {
+            procedureType = new ProcedureType(procedureName);
+            procedureType.setCatalogName(packageType.getPackageName());
+            procedureType.setSchema(packageType.getSchema());
+            procedureType.setParentType(packageType);
+        }
+        [ <O_OPENPAREN> argumentList(procedureType) <O_CLOSEPAREN> ]
+    <O_SEMICOLON>
+    {
+      packageType.addProcedure(procedureType);
+      for (ArgumentType argumentType : procedureType.getArguments()) {
+          DatabaseType databaseType = argumentType.getEnclosedType();
+          if (databaseType.isROWTYPEType()) {
+              ((ROWTYPEType)databaseType).setPackageType(packageType);
+          }
+      }
+    }
+}
+
+void argumentList(ProcedureType procedureType) :
+{}
+{
+   argument(procedureType) ( <O_COMMA> argument(procedureType) )*
+}
+
+// Function Specification
+void functionSpec(PLSQLPackageType packageType) :
+{String functionName= null;
+ FunctionType functionType = null;
+ ArgumentType returnDataType = null;
+}
+{
+    <R_FUNCTION> functionName=OracleObjectName()
+        {
+            functionType = new FunctionType(functionName);
+            functionType.setCatalogName(packageType.getPackageName());
+            functionType.setSchema(packageType.getSchema());
+            functionType.setParentType(packageType);
+        }
+        [ <O_OPENPAREN> argumentList(functionType) <O_CLOSEPAREN> ]
+        returnDataType = functionReturnSpec(functionType)
+        [ <K_DETERMINISTIC> | <K_PIPELINED> | <K_PARALLEL_ENABLE> | <K_RESULT_CACHE> ]
+    <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);
+      }
+    }
+}
+
+ArgumentType functionReturnSpec(FunctionType functionType):
+{DatabaseType dataType = null;}
+{
+    (<K_RETURN> dataType=typeSpec())
+    {
+      ArgumentType returnType = new ArgumentType(null);
+      returnType.setDirection(ArgumentTypeDirection.RETURN);
+      // may need to strip off schema/catalog name
+      if (dataType.getTypeName().contains(".")) {
+          String dataTypeName = dataType.getTypeName();
+          int dotIdx = dataTypeName.indexOf(".");
+          String namePart1 = dataTypeName.substring(0, dotIdx);
+          String namePart2 = dataTypeName.substring(dotIdx+1, dataTypeName.length());
+          if (namePart1.equals(functionType.getCatalogName()) || namePart1.equals(functionType.getSchema())) {
+              dataType.setTypeName(namePart2);
+          } else if (schemaPatterns != null) {
+              for (String possibleSchemaName : schemaPatterns) {
+                  if (namePart1.equals(possibleSchemaName)) {
+                      dataType.setTypeName(namePart2);
+                      break;
+                  }
+              }
+          }
+      }
+      returnType.setEnclosedType(dataType);   
+      if (dataType instanceof UnresolvedType) {
+          ((UnresolvedType)dataType).setOwningType(returnType);
+      }
+      return returnType;
+    }
+}
+
+void argument(ProcedureType procedureType) :
+{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() [ LOOKAHEAD(2) (direction=direction()) ]
+        [  LOOKAHEAD(2) <K_NOCOPY> ] argumentDataType=typeSpec() [ defaultAssignment=argumentDefaultAssignment() ]
+    {
+      // may need to strip off schema/catalog name
+      if (argumentDataType.getTypeName().contains(".")) {
+          String argumentDataTypeName = argumentDataType.getTypeName();
+          int dotIdx = argumentDataTypeName.indexOf(".");
+          String namePart1 = argumentDataTypeName.substring(0, dotIdx);
+          String namePart2 = argumentDataTypeName.substring(dotIdx+1, argumentDataTypeName.length());
+          if (namePart1.equals(procedureType.getCatalogName()) || namePart1.equals(procedureType.getSchema())) {
+              argumentDataType.setTypeName(namePart2);
+          } else if (schemaPatterns != null) {
+              for (String possibleSchemaName : schemaPatterns) {
+                  if (namePart1.equals(possibleSchemaName)) {
+                      argumentDataType.setTypeName(namePart2);
+                      break;
+                  }
+              }
+          }
+      }
+      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);
+    }
+}
+
+boolean argumentDefaultAssignment():
+{}
+{
+    ( <O_ASSIGN> | <R_DEFAULT> ) skipToNextArg()
+    {
+      return true;
+    }
+}
+
+void exceptionDeclaration() :
+{}
+{
+    <S_IDENTIFIER> <R_EXCEPTION> <O_SEMICOLON>
+}
+
+void pragmaDeclaration() :
+{}
+{
+    <K_PRAGMA> skipToSemiColon()
+}
+
+void orReplace():
+{
+}
+{
+    <R_OR> <K_REPLACE>
+}
+
+void invokerRights():
+{
+}
+{
+    <K_AUTHID> (<K_CURRENT_USER> | <K_DEFINER>)
+}
+
+void as():
+{
+}
+{
+    <R_AS> | <R_IS>
+}
+
+void onCommit():
+{
+}
+{
+    ( <R_ON> <K_COMMIT> ( <K_DELETE> | <K_PRESERVE> ) <K_ROWS> )
+}
+
+boolean notNull():
+{
+}
+{
+    <R_NOT> <R_NULL> [ <K_ENABLE> ]
+    {
+      return true;
+    }
+}
+
+String direction():
+{String dir = "";
+}
+{
+    (
+        LOOKAHEAD(2)
+        <R_IN> {dir = "IN";} [ LOOKAHEAD(2) <K_OUT> {dir += " OUT";} ]
+      | <K_OUT> {dir = "OUT";}
+    )
+    {
+      return dir;
+    }
+}
+
+String OracleObjectName():
+{String keyword=null;}
+{
+      LOOKAHEAD(2)
+      keyword=keywords() {return keyword;}
+    | <S_IDENTIFIER> {return token.image;}
+    | <S_QUOTED_IDENTIFIER> { return removeQuotes(token.image);}
+}
+
+String OracleObjectNamePossiblyDotted():
+{String possiblyDottedName = "";
+ String afterDot = null;
+}
+{
+    possiblyDottedName=OracleObjectName() [ <O_DOT> afterDot=OracleObjectName() ]
+    {
+      if (afterDot != null) {
+          possiblyDottedName += "." + afterDot;
+      }
+      return possiblyDottedName;
+    }
+}
+
+void skipToSemiColon():
+{}
+{
+    {
+        Token t = getNextToken();
+        while (t.kind != O_SEMICOLON) {
+                t = getNextToken();
+        }
+        token_source.input_stream.backup(1);
+    }
+}
+
+void skipToClosingParen():
+{}
+{
+    {
+        Token t = getNextToken();
+        while (t.kind != O_CLOSEPAREN) {
+            t = getNextToken();
+        }
+        token_source.input_stream.backup(1);
+    }
+}
+
+void skipToNextArg():
+{}
+{
+    {
+        Token t = getNextToken();
+        while (t.kind != O_COMMA && t.kind != O_CLOSEPAREN) {
+            t = getNextToken();
+        }
+        token_source.input_stream.backup(1);
+    }
+}
+
+void skipToEnd():
+{}
+{
+    {
+      /** skip through all the tokens. */
+      Token t = getNextToken();
+      while (t.kind != EOF) {
+          t = getNextToken();
+      }
+  }
+}
+
+void skipToReturn():
+{}
+{
+    {
+        Token t = getNextToken();
+        while (t.kind != K_RETURN) {
+                t = getNextToken();
+        }
+    }
+}
+
+void constructor():
+{    Token t = token;
+}
+{
+    < K_CONSTRUCTOR >
+    {
+      
+    token = t;
+  }
+}
\ No newline at end of file
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/util/transforms.properties b/oracleddlparser/src/main/resources/org/eclipse/persistence/tools/oracleddl/util/transforms.properties
similarity index 100%
rename from oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/util/transforms.properties
rename to oracleddlparser/src/main/resources/org/eclipse/persistence/tools/oracleddl/util/transforms.properties
