From deba2e1451d3e406a5e92770a12e0f51b3502cfd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gr=C3=A9gory=20Mantelet?=
 <gregory.mantelet@astro.unistra.fr>
Date: Wed, 14 Aug 2019 12:03:56 +0200
Subject: [PATCH] [ADQL] ADQLParser is no longer a Java Interface and
 ADQLParserFactory does not exist anymore.

ADQLParser is now a mix between the former ADQLParserFactory and ADQLParser2xx.
All ADQLParser2xx resulting from the compilation of the JavaCC files are
now named ADQLGrammar2xx and implement the new interface ADQLGrammar. The JavaCC
parsers are no longer used directly. This is the role of ADQLParser to simplify
the parser usage and to allow an easy switch between different grammar versions.

Besides, for more clarity in the class organisation, all generated parser
classes have been moved into the package `adql.parser.grammar`.
---
 .../Examples_DALI.class.violet.html           |    0
 .../tap/examples_endpoint/Examples_DALI.png   |  Bin
 .../Examples_TAPNotes.class.violet.html       |    0
 .../examples_endpoint/Examples_TAPNotes.png   |  Bin
 .../tap/examples_endpoint/examples_DALI.html  |    0
 .../examples_endpoint/examples_TAPNotes.html  |    0
 .../tap/tap_schema/migration_1.1.sql          |    0
 .../tap/tap_schema/tap_schema_1.0.sql         |    0
 .../tap/tap_schema/tap_schema_1.1.sql         |    0
 .../tap_schema_adaptation_1.0_1.1.sql         |    0
 src/adql/db/DBChecker.java                    |    2 +-
 src/adql/db/FunctionDef.java                  |   15 +-
 src/adql/db/STCS.java                         |    2 +-
 .../exception/UnresolvedColumnException.java  |    2 +-
 .../UnresolvedFunctionException.java          |    2 +-
 .../UnresolvedIdentifiersException.java       |    2 +-
 .../db/exception/UnresolvedJoinException.java |    2 +-
 .../exception/UnresolvedTableException.java   |    3 +-
 .../UnsupportedFeatureException.java          |    2 +-
 src/adql/parser/ADQLParser.java               | 1325 ++-
 src/adql/parser/ADQLParser200.java            | 6669 -------------
 src/adql/parser/ADQLParser200Constants.java   |  320 -
 .../parser/ADQLParser200TokenManager.java     | 8567 -----------------
 src/adql/parser/ADQLParser201.java            | 6695 -------------
 src/adql/parser/ADQLParser201Constants.java   |  323 -
 .../parser/ADQLParser201TokenManager.java     | 8470 ----------------
 src/adql/parser/ADQLParserFactory.java        |  370 -
 src/adql/parser/ADQLQueryFactory.java         |    2 +-
 src/adql/parser/IdentifierItems.java          |    3 +
 src/adql/parser/QueryChecker.java             |    1 +
 src/adql/parser/QueryFixer.java               |  258 +
 src/adql/parser/grammar/ADQLGrammar.java      |  438 +
 src/adql/parser/grammar/ADQLGrammarBase.java  |  135 +
 .../parser/{ => grammar}/ParseException.java  |    6 +-
 .../{ => grammar}/ParseException.java.backup  |    6 +-
 .../{ => grammar}/SimpleCharStream.java       |    2 +-
 .../SimpleCharStream.java.backup              |    2 +-
 src/adql/parser/{ => grammar}/Token.java      |    9 +-
 .../parser/{ => grammar}/Token.java.backup    |    7 +-
 .../parser/{ => grammar}/TokenMgrError.java   |   37 +-
 .../{ => grammar}/TokenMgrError.java.backup   |    9 +-
 .../parser/{ => grammar}/adqlGrammar200.jj    |  972 +-
 .../parser/{ => grammar}/adqlGrammar201.jj    |  980 +-
 src/adql/query/ADQLQuery.java                 |    9 +-
 src/adql/query/TextPosition.java              |    2 +-
 .../query/operand/function/DefaultUDF.java    |    2 +-
 .../function/geometry/GeometryFunction.java   |    2 +-
 src/adql/translator/JDBCTranslator.java       |    2 +-
 src/adql/translator/MySQLTranslator.java      |    2 +-
 src/adql/translator/PgSphereTranslator.java   |    2 +-
 src/adql/translator/PostgreSQLTranslator.java |    2 +-
 src/adql/translator/SQLServerTranslator.java  |    2 +-
 src/tap/ADQLExecutor.java                     |    5 +-
 src/tap/AbstractTAPFactory.java               |   13 +-
 .../config/ConfigurableServiceConnection.java |    2 +-
 src/tap/data/ResultSetTableIterator.java      |    2 +-
 src/tap/db/JDBCConnection.java                |    4 +-
 test/adql/db/TestDBChecker.java               |   49 +-
 test/adql/db/TestFunctionDef.java             |    8 +-
 test/adql/db/TestSTCS.java                    |   10 +-
 test/adql/db/TestSubQueries.java              |    9 +-
 test/adql/parser/TestADQLParser.java          |  177 +-
 test/adql/parser/TestADQLVersion.java         |   45 +
 test/adql/parser/TestIdentifierItem.java      |   11 +-
 test/adql/parser/TestQuickFixer.java          |   51 +
 test/adql/parser/TestUnknownTypes.java        |    4 +-
 test/adql/parser/feature/TestFeatureSet.java  |    2 +-
 test/adql/query/TestADQLObjectPosition.java   |   10 +-
 test/adql/query/TestADQLQuery.java            |    2 +-
 .../adql/search/TestSimpleReplaceHandler.java |    8 +-
 test/adql/translator/TestJDBCTranslator.java  |    2 +-
 test/adql/translator/TestMySQLTranslator.java |    5 +-
 .../translator/TestPgSphereTranslator.java    |    2 +-
 .../translator/TestSQLServerTranslator.java   |   11 +-
 test/tap/data/TestResultSetTableIterator.java |    8 +-
 test/tap/db/TestJDBCConnection.java           |   26 +-
 76 files changed, 2602 insertions(+), 33527 deletions(-)
 rename examples/{ => vollt_examples}/tap/examples_endpoint/Examples_DALI.class.violet.html (100%)
 rename examples/{ => vollt_examples}/tap/examples_endpoint/Examples_DALI.png (100%)
 rename examples/{ => vollt_examples}/tap/examples_endpoint/Examples_TAPNotes.class.violet.html (100%)
 rename examples/{ => vollt_examples}/tap/examples_endpoint/Examples_TAPNotes.png (100%)
 rename examples/{ => vollt_examples}/tap/examples_endpoint/examples_DALI.html (100%)
 rename examples/{ => vollt_examples}/tap/examples_endpoint/examples_TAPNotes.html (100%)
 rename examples/{ => vollt_examples}/tap/tap_schema/migration_1.1.sql (100%)
 rename examples/{ => vollt_examples}/tap/tap_schema/tap_schema_1.0.sql (100%)
 rename examples/{ => vollt_examples}/tap/tap_schema/tap_schema_1.1.sql (100%)
 rename examples/{ => vollt_examples}/tap/tap_schema/tap_schema_adaptation_1.0_1.1.sql (100%)
 delete mode 100644 src/adql/parser/ADQLParser200.java
 delete mode 100644 src/adql/parser/ADQLParser200Constants.java
 delete mode 100644 src/adql/parser/ADQLParser200TokenManager.java
 delete mode 100644 src/adql/parser/ADQLParser201.java
 delete mode 100644 src/adql/parser/ADQLParser201Constants.java
 delete mode 100644 src/adql/parser/ADQLParser201TokenManager.java
 delete mode 100644 src/adql/parser/ADQLParserFactory.java
 create mode 100644 src/adql/parser/QueryFixer.java
 create mode 100644 src/adql/parser/grammar/ADQLGrammar.java
 create mode 100644 src/adql/parser/grammar/ADQLGrammarBase.java
 rename src/adql/parser/{ => grammar}/ParseException.java (98%)
 rename src/adql/parser/{ => grammar}/ParseException.java.backup (98%)
 rename src/adql/parser/{ => grammar}/SimpleCharStream.java (99%)
 rename src/adql/parser/{ => grammar}/SimpleCharStream.java.backup (99%)
 rename src/adql/parser/{ => grammar}/Token.java (95%)
 rename src/adql/parser/{ => grammar}/Token.java.backup (97%)
 rename src/adql/parser/{ => grammar}/TokenMgrError.java (89%)
 rename src/adql/parser/{ => grammar}/TokenMgrError.java.backup (96%)
 rename src/adql/parser/{ => grammar}/adqlGrammar200.jj (60%)
 rename src/adql/parser/{ => grammar}/adqlGrammar201.jj (61%)
 create mode 100644 test/adql/parser/TestADQLVersion.java
 create mode 100644 test/adql/parser/TestQuickFixer.java

diff --git a/examples/tap/examples_endpoint/Examples_DALI.class.violet.html b/examples/vollt_examples/tap/examples_endpoint/Examples_DALI.class.violet.html
similarity index 100%
rename from examples/tap/examples_endpoint/Examples_DALI.class.violet.html
rename to examples/vollt_examples/tap/examples_endpoint/Examples_DALI.class.violet.html
diff --git a/examples/tap/examples_endpoint/Examples_DALI.png b/examples/vollt_examples/tap/examples_endpoint/Examples_DALI.png
similarity index 100%
rename from examples/tap/examples_endpoint/Examples_DALI.png
rename to examples/vollt_examples/tap/examples_endpoint/Examples_DALI.png
diff --git a/examples/tap/examples_endpoint/Examples_TAPNotes.class.violet.html b/examples/vollt_examples/tap/examples_endpoint/Examples_TAPNotes.class.violet.html
similarity index 100%
rename from examples/tap/examples_endpoint/Examples_TAPNotes.class.violet.html
rename to examples/vollt_examples/tap/examples_endpoint/Examples_TAPNotes.class.violet.html
diff --git a/examples/tap/examples_endpoint/Examples_TAPNotes.png b/examples/vollt_examples/tap/examples_endpoint/Examples_TAPNotes.png
similarity index 100%
rename from examples/tap/examples_endpoint/Examples_TAPNotes.png
rename to examples/vollt_examples/tap/examples_endpoint/Examples_TAPNotes.png
diff --git a/examples/tap/examples_endpoint/examples_DALI.html b/examples/vollt_examples/tap/examples_endpoint/examples_DALI.html
similarity index 100%
rename from examples/tap/examples_endpoint/examples_DALI.html
rename to examples/vollt_examples/tap/examples_endpoint/examples_DALI.html
diff --git a/examples/tap/examples_endpoint/examples_TAPNotes.html b/examples/vollt_examples/tap/examples_endpoint/examples_TAPNotes.html
similarity index 100%
rename from examples/tap/examples_endpoint/examples_TAPNotes.html
rename to examples/vollt_examples/tap/examples_endpoint/examples_TAPNotes.html
diff --git a/examples/tap/tap_schema/migration_1.1.sql b/examples/vollt_examples/tap/tap_schema/migration_1.1.sql
similarity index 100%
rename from examples/tap/tap_schema/migration_1.1.sql
rename to examples/vollt_examples/tap/tap_schema/migration_1.1.sql
diff --git a/examples/tap/tap_schema/tap_schema_1.0.sql b/examples/vollt_examples/tap/tap_schema/tap_schema_1.0.sql
similarity index 100%
rename from examples/tap/tap_schema/tap_schema_1.0.sql
rename to examples/vollt_examples/tap/tap_schema/tap_schema_1.0.sql
diff --git a/examples/tap/tap_schema/tap_schema_1.1.sql b/examples/vollt_examples/tap/tap_schema/tap_schema_1.1.sql
similarity index 100%
rename from examples/tap/tap_schema/tap_schema_1.1.sql
rename to examples/vollt_examples/tap/tap_schema/tap_schema_1.1.sql
diff --git a/examples/tap/tap_schema/tap_schema_adaptation_1.0_1.1.sql b/examples/vollt_examples/tap/tap_schema/tap_schema_adaptation_1.0_1.1.sql
similarity index 100%
rename from examples/tap/tap_schema/tap_schema_adaptation_1.0_1.1.sql
rename to examples/vollt_examples/tap/tap_schema/tap_schema_adaptation_1.0_1.1.sql
diff --git a/src/adql/db/DBChecker.java b/src/adql/db/DBChecker.java
index 485b0c4..eda5159 100644
--- a/src/adql/db/DBChecker.java
+++ b/src/adql/db/DBChecker.java
@@ -38,8 +38,8 @@ import adql.db.exception.UnresolvedColumnException;
 import adql.db.exception.UnresolvedFunctionException;
 import adql.db.exception.UnresolvedIdentifiersException;
 import adql.db.exception.UnresolvedTableException;
-import adql.parser.ParseException;
 import adql.parser.QueryChecker;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLIterator;
 import adql.query.ADQLObject;
 import adql.query.ADQLQuery;
diff --git a/src/adql/db/FunctionDef.java b/src/adql/db/FunctionDef.java
index 645ede9..a465344 100644
--- a/src/adql/db/FunctionDef.java
+++ b/src/adql/db/FunctionDef.java
@@ -26,11 +26,10 @@ import java.util.regex.Pattern;
 
 import adql.db.DBType.DBDatatype;
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ADQLParserFactory.ADQLVersion;
-import adql.parser.ParseException;
-import adql.parser.Token;
+import adql.parser.ADQLParser.ADQLVersion;
 import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ParseException;
+import adql.parser.grammar.Token;
 import adql.query.operand.ADQLOperand;
 import adql.query.operand.function.ADQLFunction;
 import adql.query.operand.function.DefaultUDF;
@@ -334,7 +333,7 @@ public class FunctionDef implements Comparable<FunctionDef> {
 	 *                       	of the ADQL grammar.
 	 */
 	public FunctionDef(final String fctName, final DBType returnType, final FunctionParam[] params) throws ParseException {
-		this(fctName, returnType, params, ADQLParserFactory.DEFAULT_VERSION);
+		this(fctName, returnType, params, ADQLParser.DEFAULT_VERSION);
 	}
 
 	/**
@@ -415,8 +414,8 @@ public class FunctionDef implements Comparable<FunctionDef> {
 
 		// Tokenize the given function name:
 		try {
-			parser = (new ADQLParserFactory()).createParser(adqlVersion == null ? ADQLParserFactory.DEFAULT_VERSION : adqlVersion);
-			tokens = parser.tokenize(fctName);
+			parser = new ADQLParser(adqlVersion);
+			tokens = parser.tokenize(fctName, true);
 		} catch(ParseException ex) {
 			throw new ParseException("Invalid UDF name: " + ex.getMessage());
 		}
@@ -428,7 +427,7 @@ public class FunctionDef implements Comparable<FunctionDef> {
 			throw new ParseException("Invalid UDF name: too many words (a function name must be a single Regular Identifier)!");
 
 		// ...that it is a regular identifier:
-		if (!parser.isRegularIdentifier(tokens[0].image))
+		if (!parser.getGrammarParser().isRegularIdentifier(tokens[0].image))
 			throw new ParseException("Invalid UDF name: \"" + fctName + "\" is not a Regular Identifier!");
 
 		// ...that it is not already an existing ADQL function name:
diff --git a/src/adql/db/STCS.java b/src/adql/db/STCS.java
index ffeec75..e7d6a92 100644
--- a/src/adql/db/STCS.java
+++ b/src/adql/db/STCS.java
@@ -24,7 +24,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import adql.parser.ADQLQueryFactory;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.TextPosition;
 import adql.query.operand.ADQLOperand;
 import adql.query.operand.NegativeOperand;
diff --git a/src/adql/db/exception/UnresolvedColumnException.java b/src/adql/db/exception/UnresolvedColumnException.java
index dffd8f6..bff55a4 100644
--- a/src/adql/db/exception/UnresolvedColumnException.java
+++ b/src/adql/db/exception/UnresolvedColumnException.java
@@ -20,7 +20,7 @@ package adql.db.exception;
  */
 
 import adql.db.DBChecker;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.operand.ADQLColumn;
 
 /**
diff --git a/src/adql/db/exception/UnresolvedFunctionException.java b/src/adql/db/exception/UnresolvedFunctionException.java
index 4042537..bbf3bb1 100644
--- a/src/adql/db/exception/UnresolvedFunctionException.java
+++ b/src/adql/db/exception/UnresolvedFunctionException.java
@@ -19,7 +19,7 @@ package adql.db.exception;
  * Copyright 2014-2015 - Astronomisches Rechen Institut (ARI)
  */
 
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.TextPosition;
 import adql.query.operand.function.ADQLFunction;
 
diff --git a/src/adql/db/exception/UnresolvedIdentifiersException.java b/src/adql/db/exception/UnresolvedIdentifiersException.java
index 608eb73..bf48b10 100644
--- a/src/adql/db/exception/UnresolvedIdentifiersException.java
+++ b/src/adql/db/exception/UnresolvedIdentifiersException.java
@@ -24,7 +24,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 
 import adql.db.DBChecker;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 
 /**
  * This exception is thrown by {@link DBChecker} when several columns, tables,
diff --git a/src/adql/db/exception/UnresolvedJoinException.java b/src/adql/db/exception/UnresolvedJoinException.java
index c73e464..e566a51 100644
--- a/src/adql/db/exception/UnresolvedJoinException.java
+++ b/src/adql/db/exception/UnresolvedJoinException.java
@@ -19,7 +19,7 @@ package adql.db.exception;
  * Copyright 2013-2015 - Astronomisches Rechen Institut (ARI)
  */
 
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.TextPosition;
 
 /**
diff --git a/src/adql/db/exception/UnresolvedTableException.java b/src/adql/db/exception/UnresolvedTableException.java
index f08e629..0df9fa7 100644
--- a/src/adql/db/exception/UnresolvedTableException.java
+++ b/src/adql/db/exception/UnresolvedTableException.java
@@ -20,8 +20,7 @@ package adql.db.exception;
  */
 
 import adql.db.DBChecker;
-import adql.parser.ParseException;
-
+import adql.parser.grammar.ParseException;
 import adql.query.from.ADQLTable;
 
 import adql.query.operand.ADQLColumn;
diff --git a/src/adql/db/exception/UnsupportedFeatureException.java b/src/adql/db/exception/UnsupportedFeatureException.java
index 1c46fda..d171683 100644
--- a/src/adql/db/exception/UnsupportedFeatureException.java
+++ b/src/adql/db/exception/UnsupportedFeatureException.java
@@ -19,8 +19,8 @@ package adql.db.exception;
  * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
  */
 
-import adql.parser.ParseException;
 import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLObject;
 
 /**
diff --git a/src/adql/parser/ADQLParser.java b/src/adql/parser/ADQLParser.java
index 9292f13..8452e3d 100644
--- a/src/adql/parser/ADQLParser.java
+++ b/src/adql/parser/ADQLParser.java
@@ -19,12 +19,24 @@ package adql.parser;
  * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
  */
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.Reader;
+import java.util.ArrayList;
 
-import adql.parser.ADQLParserFactory.ADQLVersion;
+import adql.db.DBChecker;
+import adql.db.exception.UnresolvedIdentifiersException;
+import adql.db.exception.UnsupportedFeatureException;
 import adql.parser.feature.FeatureSet;
+import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ADQLGrammar;
+import adql.parser.grammar.ADQLGrammar.Tokenizer;
+import adql.parser.grammar.ADQLGrammar200;
+import adql.parser.grammar.ADQLGrammar201;
+import adql.parser.grammar.ParseException;
+import adql.parser.grammar.Token;
+import adql.parser.grammar.TokenMgrError;
+import adql.query.ADQLObject;
 import adql.query.ADQLOrder;
 import adql.query.ADQLQuery;
 import adql.query.ClauseADQL;
@@ -32,108 +44,1317 @@ import adql.query.ClauseConstraints;
 import adql.query.ClauseSelect;
 import adql.query.from.FromContent;
 import adql.query.operand.ADQLColumn;
-import adql.query.operand.ADQLOperand;
+import adql.query.operand.function.geometry.ContainsFunction;
+import adql.search.SearchOptionalFeaturesHandler;
+import adql.translator.PostgreSQLTranslator;
+import adql.translator.TranslationException;
 
 /**
- * TODO
+ * Parser of ADQL expressions.
+ *
+ * <h3>Usage</h3>
+ *
+ * <p>
+ * 	The simplest way to use this parser is just to create a default ADQL
+ * 	parser, and call the function {@link #parseQuery(String)} on the ADQL query
+ * 	to evaluate.
+ * </p>
+ *
+ * <i>
+ * <p><b>Example:</b></p>
+ * <pre>
+ * try {
+ *     // 1. CREATE A PARSER:
+ *     ADQLParser parser = new {@link #ADQLParser()};
+ *
+ *     // 2. PARSE AN ADQL QUERY:
+ *     ADQLQuery query = parser.{@link #parseQuery(String) parseQuery}("SELECT foo FROM bar WHERE stuff = 1");
+ *
+ *     System.out.println("((i)) Correct ADQL query ((i))");
+ *     System.out.println("((i)) As interpreted: ((i))\n    " + query.toADQL().replaceAll("\n", "\n    "));
+ * }
+ * // 3. EVENTUALLY DEAL WITH ERRORS:
+ * catch({@link ParseException} ex) {
+ *     System.err.println("((X)) INCORRECT QUERY! " + ex.getClass().getSimpleName() + " ((X))\n" + ex.getPosition() + " " + ex.getMessage());
+ * }</pre>
+ * </i>
+ *
+ * <p>
+ * 	In the above example, the parser runs with the minimal set of options. It
+ * 	means that only the default optional language features are available, any
+ * 	UDF (even if undeclared) is allowed and no consistency with a list of tables
+ * 	and columns is performed. These points can be customized at creation with
+ * 	{@link #ADQLParser(ADQLVersion, QueryChecker, ADQLQueryFactory, FeatureSet)}
+ * 	but also after creation with {@link #setSupportedFeatures(FeatureSet)} and
+ * 	{@link #setQueryChecker(QueryChecker)}.
+ * </p>
+ *
+ * <h3>Runnable class</h3>
+ *
+ * <p>
+ * 	This class includes a main function and thus, can be executed directly.
+ * 	Its execution allows to parse an ADQL query. Then, in function of the passed
+ * 	parameters, it is possible to just check its syntax, translate it into SQL
+ * 	or try to fix the query.
+ * </p>
+ *
+ * <i>
+ * <p>
+ * 	To get help about this program, just run it with the argument
+ * 	<code>-h</code> or <code>--help</code>:
+ * </p>
+ * <pre>java -jar adqllib.jar --help</pre>
+ * </i>
+ *
+ * <h3>ADQL version</h3>
+ *
+ * <p>
+ * 	It is able to deal with all versions of the ADQL grammar supported by this
+ * 	library. All these versions are listed in the enumeration
+ * 	{@link ADQLVersion}.
+ * </p>
+ *
+ * <p>
+ * 	If a specific version of the grammar must be used, it must be specified in
+ * 	the constructor of the parser.
+ * </p>
+ *
+ * <p><i><b>Example: </b></i>
+ * 	<code>new {@link #ADQLParser(ADQLVersion) ADQLParser}({@link ADQLVersion#V2_1})</code>
+ * </p>
+ *
+ * <h3>Main functions</h3>
+ *
+ * <p>Here are the key functions to use:</p>
+ * <ul>
+ * 	<li>{@link #parseQuery(String)} (or any its alternative with an InputStream)
+ * 		to parse an input ADQL query String and get its corresponding ADQL tree
+ *   </li>
+ *   <li>{@link #tryQuickFix(String)} to try fixing the most common
+ * 		issues with ADQL queries (e.g. Unicode confusable characters,
+ * 		unescaped ADQL identifiers, SQL reserved keywords, ...)</li>
+ * 	<li>{@link #setSupportedFeatures(FeatureSet)} to set which optional ADQL
+ * 		features are supported or not ; all optional features used in the query
+ * 		while being declared as un-supported will throw an error at the end of
+ * 		the parsing</li>
+ * </ul>
+ *
+ * <h3>Custom checks</h3>
+ *
+ * <p>
+ *   This parser is able, thanks to a {@link QueryChecker} object, to check each
+ *   {@link ADQLQuery} just after its generation. It could be used, for
+ *   instance, to check the consistency between the ADQL query to parse and the
+ *   "database" on which the query must be executed.
+ * </p>
+ *
+ * <p>
+ * 	By default, there is no {@link QueryChecker}. Thus you must either use an
+ * 	already existing {@link QueryChecker} or extend this latter to run your own
+ * 	tests on the parsed ADQL queries.
+ * </p>
+ *
+ * <p>
+ * 	{@link DBChecker} is an extension of {@link QueryChecker} able to check that
+ * 	table and column names used in a query exist in a given set of DB metadata.
+ * </p>
+ *
+ * <h3>Custom Query Factory</h3>
+ *
+ * <p>
+ *   To create an object representation of the given ADQL query, this parser
+ *   uses a {@link ADQLQueryFactory} object. All parts of the ADQL grammar can
+ *   already be created with this object.
+ * </p>
+ *
+ * <p>
+ * 	However, in some special cases, you may need to change the type of some
+ * 	specific nodes of the generated ADQL tree (e.g. <code>CONTAINS</code>). In
+ * 	such case, you just have to extend the corresponding default object
+ * 	(i.e. {@link ContainsFunction}) and to extend the corresponding function of
+ * 	{@link ADQLQueryFactory} (i.e. createContains(...)). Then, give an instance
+ * 	of this custom factory to the {@link ADQLParser}, at
+ * 	{@link #ADQLParser(ADQLVersion, QueryChecker, ADQLQueryFactory, FeatureSet) creation}
+ * 	or with the setter {@link #setQueryFactory(ADQLQueryFactory)}.
+ * </p>
  *
  * @author Gr&eacute;gory Mantelet (CDS)
- * @version 2.0 (07/2019)
+ * @version 2.0 (08/2019)
  * @since 2.0
  */
-public interface ADQLParser {
+public class ADQLParser {
+
+	/** Grammar parser to use.
+	 * <p><i><b>Implementation note:</b> Never NULL.</i></p> */
+	protected final ADQLGrammar grammarParser;
+
+	/** List of all supported features.
+	 * <p><i><b>Note:</b>
+	 * 	The default set of features can be set with the function
+	 * 	{@link #setDefaultFeatures()}.
+	 * </i></p>
+	 * <p><i><b>Implementation note:</b> Never NULL.</i></p> */
+	protected FeatureSet supportedFeatures;
+
+	/** API to check {@link ADQLQuery ADQL queries} (sub-queries or not) just
+	 * after their generation.
+	 * <p><i><b>Note:</b>
+	 * 	This check step is optional. To ignore it, set this attribute to NULL.
+	 * </i></p> */
+	protected QueryChecker queryChecker = null;
+
+	/** This object is used only when one of the {@link #tryQuickFix(String)}
+	 * functions is called. It allows to try fixing common errors in the given
+	 * ADQL query.
+	 * <p><i><b>Implementation note:</b> Never NULL.</i></p> */
+	protected QueryFixer quickFixer;
 
 	/* **********************************************************************
-	 *                           GETTERS & SETTERS
-	 * ********************************************************************** */
+	   *                       VERSION MANAGEMENT                           *
+	   ********************************************************************** */
+
+	/**
+	 * Enumeration of all supported versions of the ADQL grammar.
+	 *
+	 * @author Gr&eacute;gory Mantelet (CDS)
+	 * @version 2.0 (08/2019)
+	 * @since 2.0
+	 */
+	public static enum ADQLVersion {
+		/** Version REC-2.0 - <a href="http://www.ivoa.net/documents/cover/ADQL-20081030.html">http://www.ivoa.net/documents/cover/ADQL-20081030.html</a>. */
+		V2_0,
+		/** Version PR-2.1 - <a href="http://www.ivoa.net/documents/ADQL/20180112/index.html">http://www.ivoa.net/documents/ADQL/20180112/index.html</a>. */
+		V2_1; // TODO Move 2.1 as default when it becomes REC
+
+		@Override
+		public String toString() {
+			return name().toLowerCase().replace('_', '.');
+		}
 
-	public ADQLVersion getADQLVersion();
+		/**
+		 * Parse the given string as an ADQL version number.
+		 *
+		 * <p>This function should work with the following syntaxes:</p>
+		 * <ul>
+		 * 	<li><code>2.0</code></li>
+		 * 	<li><code>2_0</code></li>
+		 * 	<li><code>v2.0</code> or <code>V2.0</code></li>
+		 * 	<li><code>v2_0</code> or <code>V2_0</code></li>
+		 * </ul>
+		 *
+		 * @param str	String to parse as an ADQL version specification.
+		 *
+		 * @return	The identified ADQL version.
+		 */
+		public static ADQLVersion parse(String str) {
+			if (str == null)
+				return null;
 
-	public QueryChecker getQueryChecker();
+			str = str.trim().toUpperCase();
 
-	public void setQueryChecker(final QueryChecker checker);
+			if (str.isEmpty())
+				return null;
 
-	public ADQLQueryFactory getQueryFactory();
+			if (str.charAt(0) != 'V')
+				str = 'V' + str;
 
-	public void setQueryFactory(final ADQLQueryFactory factory);
+			try {
+				return ADQLVersion.valueOf(str.replaceAll("\\.", "_"));
+			} catch(IllegalArgumentException iae) {
+				return null;
+			}
+		}
+	}
 
-	public FeatureSet getSupportedFeatures();
+	/** Version of the ADQL grammar to use when none is specified:
+	 * {@link ADQLVersion#V2_0 2.0}. */
+	public final static ADQLVersion DEFAULT_VERSION = ADQLVersion.V2_0; // TODO Move 2.1 as default when it becomes REC
 
-	public void setSupportedFeatures(final FeatureSet features);
+	/**
+	 * Get the list of all supported ADQL grammar versions.
+	 *
+	 * @return	List of all supported ADQL versions.
+	 *
+	 * @see ADQLVersion#values()
+	 */
+	public static ADQLVersion[] getSupportedVersions() {
+		return ADQLVersion.values();
+	}
+
+	/**
+	 * Build on the fly a human list of all supported ADQL grammar versions.
+	 *
+	 * <p>
+	 * 	The default version item will be suffixed by the string
+	 * 	<code>(default)</code>.
+	 * </p>
+	 *
+	 * <i>
+	 * <p><b>Example:</b></p>
+	 * <pre>v2.0, v2.1 (default)</pre>
+	 * </i>
+	 *
+	 * @return	List of all supported ADQL versions.
+	 */
+	public static String getSupportedVersionsAsString() {
+		StringBuilder buf = new StringBuilder();
+		for(ADQLVersion v : ADQLVersion.values()) {
+			if (buf.length() > 0)
+				buf.append(", ");
+			buf.append(v.toString());
+			if (v == DEFAULT_VERSION)
+				buf.append(" (default)");
+		}
+		return buf.toString();
+	}
 
 	/* **********************************************************************
-	 *                         PARSING DEBUG FUNCTIONS
-	 * ********************************************************************** */
+	   *                        PARSER CREATION                             *
+	   ********************************************************************** */
+
+	/**
+	 * Builds an ADQL query parser for the default (i.e. last stable) version
+	 * of the ADQL grammar.
+	 *
+	 * <p>This parser is set with:</p>
+	 * <ul>
+	 * 	<li>the {@link #DEFAULT_VERSION default version} of the ADQL
+	 * 		grammar,</li>
+	 * 	<li>the {@link #setDefaultFeatures() default set} of optional features,</li>
+	 * 	<li>the default {@link ADQLQueryFactory ADQL query factory},</li>
+	 * 	<li>and no custom check (i.e. no {@link QueryChecker} is set).</li>
+	 * </ul>
+	 *
+	 * @see #DEFAULT_VERSION
+	 */
+	public ADQLParser() {
+		this(DEFAULT_VERSION, null, null, null);
+	}
+
+	/**
+	 * Builds an ADQL query parser for the specified version of the ADQL
+	 * grammar.
+	 *
+	 * <p>This parser is set with:</p>
+	 * <ul>
+	 * 	<li>the specified version of the ADQL grammar,</li>
+	 * 	<li>the {@link #setDefaultFeatures() default set} of optional features,</li>
+	 * 	<li>the default {@link ADQLQueryFactory ADQL query factory},</li>
+	 * 	<li>and no custom check (i.e. no {@link QueryChecker} is set).</li>
+	 * </ul>
+	 *
+	 * @param version	Version of the ADQL grammar that the parser must
+	 *               	implement.
+	 *               	<i>If NULL, the {@link #DEFAULT_VERSION} will be used.</i>
+	 */
+	public ADQLParser(ADQLVersion version) {
+		this(version, null, null, null);
+	}
+
+	/**
+	 * Builds a parser whose the query to parse will have to be given as a
+	 * String in parameter of
+	 * {@link ADQLParser#parseQuery(java.lang.String) parseQuery(String)}.
+	 *
+	 * @param version		Version of the ADQL grammar that the parser must
+	 *               		implement.
+	 *               		<i>If NULL, the {@link #DEFAULT_VERSION} will be
+	 *               		used.</i>
+	 * @param queryChecker	The custom checks to perform.
+	 *                    	<i>If NULL, only the general checks (e.g. supported
+	 *                    	features, UDFs, types) will be run.</i>
+	 * @param factory		The factory of ADQL objects to use.
+	 *               		<i>If NULL, the default query factory will be
+	 *               		used.</i>
+	 * @param features		The set of supported features.
+	 *                		<i>If NULL, the default set of supported features
+	 *                		will be used (see {@link #setDefaultFeatures()}).</i>
+	 */
+	public ADQLParser(ADQLVersion version, final QueryChecker queryChecker, final ADQLQueryFactory factory, final FeatureSet features) {
+		// Prevent the NULL value by setting the default version if necessary:
+		if (version == null)
+			version = DEFAULT_VERSION;
+
+		// Create the appropriate parser in function of the specified version:
+		switch(version) {
+			case V2_0:
+				grammarParser = new ADQLGrammar200(new java.io.ByteArrayInputStream("".getBytes()));
+				break;
+			case V2_1:
+			default:
+				grammarParser = new ADQLGrammar201(new java.io.ByteArrayInputStream("".getBytes()));
+				break;
+		}
 
-	public void setDebug(final boolean debug);
+		// Set the query fixer to use (a default one):
+		setQuickFixer(new QueryFixer(grammarParser));
+
+		// Set the appropriate feature set:
+		if (features == null)
+			setDefaultFeatures();
+		else
+			setSupportedFeatures(features);
+
+		// Set the query factory:
+		setQueryFactory((factory == null) ? new ADQLQueryFactory() : factory);
+
+		// Set the query checker, if any:
+		setQueryChecker(queryChecker);
+
+		// Disable debugging messages by default:
+		setDebug(false);
+	}
 
 	/* **********************************************************************
-	 *                           PARSING FUNCTIONS
-	 * ********************************************************************** */
+	   *                        GETTERS & SETTERS                           *
+	   ********************************************************************** */
 
-	public void ReInit(InputStream stream);
+	/**
+	 * Get the ADQL grammar version followed by this parser.
+	 *
+	 * @return	The target ADQL version.
+	 */
+	public final ADQLVersion getADQLVersion() {
+		return grammarParser.getVersion();
+	}
+
+	/**
+	 * Get the internal grammar parser specific to the target ADQL version.
+	 *
+	 * <p><i><b>Warning:</b>
+	 * 	Changing the configuration of this internal parser might break the
+	 * 	normal functioning of this {@link ADQLParser} instance. It is
+	 * 	recommended to not use directly this internal parser. The goal of
+	 * 	{@link ADQLParser} is to provide a nice and safe parser API. If
+	 * 	something is missing or incorrect, please, contact the library
+	 * 	developer so that this API can be completed/fixed.
+	 * </i></p>
+	 *
+	 * @return	The internal grammar parser.
+	 */
+	public final ADQLGrammar getGrammarParser() {
+		return grammarParser;
+	}
+
+	/**
+	 * Get the API used to attempt fixing given ADQL queries with the functions
+	 * {@link #tryQuickFix(InputStream)} and {@link #tryQuickFix(String)}.
+	 *
+	 * @return	The query fixer tool.
+	 */
+	public final QueryFixer getQuickFixer() {
+		return quickFixer;
+	}
 
-	public void ReInit(Reader reader);
+	/**
+	 * Set the tool to use in order to attempt fixing any given ADQL query with
+	 * the functions {@link #tryQuickFix(InputStream)} and
+	 * {@link #tryQuickFix(String)}.
+	 *
+	 * @param fixer	The tool to use.
+	 *
+	 * @throws NullPointerException	If the given fixer is NULL.
+	 */
+	public final void setQuickFixer(final QueryFixer fixer) throws NullPointerException {
+		if (fixer == null)
+			throw new NullPointerException("Missing new QuickFixer! An ADQLParser can not try to fix ADQL queries without a QuickFixer instance.");
+		quickFixer = fixer;
+	}
 
-	public ADQLQuery parseQuery() throws ParseException;
+	/**
+	 * Get the query factory used to create ADQL objects during the parsing
+	 * of an ADQL query.
+	 *
+	 * @return	The used ADQL query factory.
+	 */
+	public final ADQLQueryFactory getQueryFactory() {
+		return grammarParser.getQueryFactory();
+	}
 
-	public ADQLQuery parseQuery(final String query) throws ParseException;
+	/**
+	 * Set the query factory to use when creating ADQL objects during the
+	 * parsing of an ADQL query.
+	 *
+	 * @param factory	The ADQL query factory to use.
+	 *
+	 * @throws NullPointerException	If the given factory is NULL.
+	 */
+	public final void setQueryFactory(ADQLQueryFactory factory) throws NullPointerException {
+		if (factory == null)
+			throw new NullPointerException("Missing ADQLQueryFactory to use! It is required for ADQL query parsing.");
+		grammarParser.setQueryFactory(factory);
+	}
 
-	public ADQLQuery parseQuery(final InputStream stream) throws ParseException;
+	/**
+	 * Get the list of all supported features.
+	 *
+	 * <p><i><b>Note:</b>
+	 * 	To customize the list of supported features, either get the set with
+	 * 	this function and then update it directly, or set a new
+	 * 	{@link FeatureSet} instance with
+	 * 	{@link #setSupportedFeatures(FeatureSet)}.
+	 * </i></p>
+	 *
+	 * @return	Set of supported features.
+	 */
+	public final FeatureSet getSupportedFeatures() {
+		return supportedFeatures;
+	}
 
-	public ClauseSelect parseSelect(final String adql) throws ParseException;
+	/**
+	 * Set a default set of supported language features in function of the
+	 * target ADQL version.
+	 *
+	 * <ul>
+	 * 	<li><b>ADQL-2.0:</b> the geometric functions are the only supported
+	 * 		features.</li>
+	 * 	<li><b>ADQL-2.1:</b> all optional features are supported.</li>
+	 * </ul>
+	 *
+	 * <p><i><b>Note:</b>
+	 * 	To customize the list of supported features, either get the set with
+	 * 	{@link #getSupportedFeatures()} and then update it directly, or set a
+	 * 	new {@link FeatureSet} instance with
+	 * 	{@link #setSupportedFeatures(FeatureSet)}.
+	 * </i></p>
+	 */
+	public final void setDefaultFeatures() {
+		switch(getADQLVersion()) {
+			case V2_0:
+				// any UDF is allowed and no optional feature supported...:
+				this.supportedFeatures = new FeatureSet(false, true);
+				// ...except geometries which are all supported by default:
+				supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
+				break;
+			case V2_1:
+			default:
+				// all available features are considered as supported:
+				this.supportedFeatures = new FeatureSet(true, true);
+				break;
+		}
+	}
 
-	public FromContent parseFrom(final String adql) throws ParseException;
+	/**
+	 * Set a new set of supported features.
+	 *
+	 * @param features	The new list of supported features.
+	 *
+	 * @throws NullPointerException	If the given object is NULL.
+	 */
+	public final void setSupportedFeatures(final FeatureSet features) throws NullPointerException {
+		if (features == null)
+			throw new NullPointerException("Missing list of supported features! It is required for ADQL query parsing.");
+		supportedFeatures = features;
+	}
 
-	public ClauseConstraints parseWhere(final String adql) throws ParseException;
+	/**
+	 * Get the custom checker of parsed ADQL queries.
+	 *
+	 * @return	Custom query checker,
+	 *        	or NULL if no custom check is available.
+	 */
+	public final QueryChecker getQueryChecker() {
+		return queryChecker;
+	}
 
-	public ClauseADQL<ADQLOrder> parseOrderBy(final String adql) throws ParseException;
+	/**
+	 * Set a custom checker of parsed ADQL queries.
+	 *
+	 * @param checker	The custom query checks to run,
+	 *               	or NULL to have no custom check.
+	 */
+	public final void setQueryChecker(QueryChecker checker) {
+		queryChecker = checker;
+	}
 
-	public ClauseADQL<ADQLColumn> parseGroupBy(final String adql) throws ParseException;
+	/**
+	 * Enable/Disable the debugging messages while parsing an ADQL expression.
+	 *
+	 * @param debug	<code>true</code> to enable debugging,
+	 *             	<code>false</code> to disable it.
+	 */
+	public final void setDebug(final boolean debug) {
+		if (debug)
+			grammarParser.enable_tracing();
+		else
+			grammarParser.disable_tracing();
+	}
 
 	/* **********************************************************************
-	 *                           AUTO-FIX FUNCTIONS
-	 * ********************************************************************** */
+	   *                        PARSING FUNCTIONS                           *
+	   ********************************************************************** */
 
-	public String tryQuickFix(final InputStream input) throws IOException, ParseException;
+	/**
+	* Parses the query string given in parameter.
+	*
+	* @param q	The ADQL query to parse.
+	*
+	* @return	The object representation of the given ADQL query.
+	*
+	* @throws ParseException	If there is at least one error.
+	*
+	* @see #effectiveParseQuery()
+	*/
+	public final ADQLQuery parseQuery(final String q) throws ParseException {
+		// Reset the parser with the string to parse:
+		try {
+			grammarParser.reset(new ByteArrayInputStream(q.getBytes()));
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
 
-	public String tryQuickFix(final String adqlQuery) throws ParseException;
+		// Run the query parsing:
+		return effectiveParseQuery();
+	}
 
 	/**
-	 * Tell whether the given string is a valid ADQL regular identifier.
+	* Parses the query contained in the stream given in parameter.
+	*
+	* @param stream		The stream which contains the ADQL query to parse.
+	*
+	* @return	The object representation of the given ADQL query.
+	*
+	* @throws ParseException	If there is at least one error.
+	*
+	* @see #effectiveParseQuery()
+	*/
+	public final ADQLQuery parseQuery(final InputStream stream) throws ParseException {
+		// Reset the parser with the stream to parse:
+		try {
+			grammarParser.reset(stream);
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
+
+		// Run the query parsing:
+		return effectiveParseQuery();
+	}
+
+	/**
+	 * Run the query parsing, then, if successful, the general and the custom
+	 * checks (if any) on the parsing result (i.e. the query tree).
+	 *
+	 * <p>This function follows these steps:</p>
+	 * <ol>
+	 * 	<li>Parse the full ADQL query,</li>
+	 * 	<li>Run the general checks on the parsing result (i.e. the ADQL
+	 * 		tree),</li>
+	 * 	<li>Run the custom checks (if any).</li>
+	 * </ol>
 	 *
 	 * <p>
-	 * 	According to the ADQL grammar, a regular identifier (i.e. not
-	 * 	delimited ; not between double quotes) must be a letter followed by a
-	 * 	letter, digit or underscore. So, the following regular expression:
+	 * 	When a step is successful, this function run the next one. But, if it
+	 * 	fails, a {@link ParseException} is immediately thrown. This exception
+	 * 	may represent more than one error ; especially during the steps 2. and
+	 * 	3.
 	 * </p>
 	 *
-	 * <pre>
-	 * [a-zA-Z]+[a-zA-Z0-9_]*
-	 * </pre>
+	 * @return	The object representation of the successfully parsed query
+	 *        	(i.e. the ADQL tree).
+	 *
+	 * @throws ParseException	If syntax is incorrect (i.e. no ADQL tree can be
+	 *                       	generated), or if any check on the parsing
+	 *                       	result fails.
+	 *
+	 * @see #generalChecks(ADQLQuery)
+	 * @see QueryChecker#check(ADQLQuery)
+	 */
+	protected ADQLQuery effectiveParseQuery() throws ParseException {
+		// 1. Parse the full ADQL query:
+		ADQLQuery parsedQuery;
+		try {
+			parsedQuery = grammarParser.Query();
+		} catch(TokenMgrError tme) {
+			throw new ParseException(tme);
+		}
+
+		/* 2. Run the general checks on the parsed query:
+		 * (note: this check is very close to grammar check...hence its higher
+		 *        priority) */
+		generalChecks(parsedQuery);
+
+		// 3. Run the custom checks (if any):
+		if (queryChecker != null)
+			queryChecker.check(parsedQuery);
+
+		// If no syntactic error and that all checks passed, return the result:
+		return parsedQuery;
+	}
+
+	/**
+	 * Run the general and common checks on the given ADQL tree.
 	 *
 	 * <p>
-	 * 	This is what this function tests on the given string.
+	 * 	By default, this function only checks whether or not language features
+	 * 	found in the given ADQL tree are supported. If not, a
+	 * 	{@link ParseException} is thrown.
+	 * </p>
+	 *
+	 * <p><i><b>Implementation note:</b>
+	 * 	By default, when a part of the ADQL tree uses an unsupported language
+	 * 	feature, an {@link UnsupportedFeatureException} is created. This
+	 * 	function does not stop at the first encountered unsupported feature. It
+	 * 	keeps reading the ADQL tree and appends all created
+	 * 	{@link UnsupportedFeatureException}s into an
+	 * 	{@link UnresolvedIdentifiersException}. Finally, when the tree has been
+	 * 	entirely read and if unsupported features have been encountered, this
+	 * 	{@link UnresolvedIdentifiersException} is thrown.
+	 * </p>
+	 *
+	 * @param q	The ADQL query to check.
+	 *
+	 * @throws ParseException	If any unsupported language feature is used in
+	 *                       	the given ADQL tree.
+	 */
+	protected void generalChecks(final ADQLQuery q) throws ParseException {
+		// Create the exception in which errors have to be appended:
+		UnresolvedIdentifiersException exUnsupportedFeatures = new UnresolvedIdentifiersException("unsupported expression");
+
+		// Search recursively for all optional features inside the given tree:
+		SearchOptionalFeaturesHandler sFeaturesHandler = new SearchOptionalFeaturesHandler(true, false);
+		sFeaturesHandler.search(q);
+
+		// Append an error for each unsupported one:
+		for(ADQLObject obj : sFeaturesHandler) {
+			if (!supportedFeatures.isSupporting(obj.getFeatureDescription()))
+				exUnsupportedFeatures.addException(new UnsupportedFeatureException(obj));
+		}
+
+		// If unsupported features have been found, throw a ParseException:
+		if (exUnsupportedFeatures.getNbErrors() > 0)
+			throw exUnsupportedFeatures;
+	}
+
+	/**
+	 * Parse the given <code>SELECT</code> clause.
+	 *
+	 * <i>
+	 * <p><b>Important note:</b>
+	 * 	The given string MUST start with <code>SELECT</code> (case insensitive).
+	 * 	It MUST also follow the syntax of the FULL clause as described in the
+	 * 	appropriate version of the ADQL Grammar.
+	 * </p>
+	 * <p><b>Examples of INcorrect parameter:</b></p>
+	 * <ul>
+	 * 	<li><code>SELECT</code></li>
+	 * 	<li><code>aColumn</code></li>
+	 * 	<li><code>DISTINCT TOP 10 aColumn, bColumn AS "B"</code></li>
+	 * </ul>
+	 * <p><b>Example of correct parameter:</b></p>
+	 * <pre>SELECT DISTINCT TOP 10 aColumn, bColumn AS "B"</pre>
+	 * </i>
+	 *
+	 * @param adql	The <code>SELECT</code> clause to parse.
+	 *
+	 * @return	The corresponding object representation of the given clause.
+	 *
+	 * @throws ParseException	If the syntax of the given clause is incorrect.
+	 */
+	public final ClauseSelect parseSelect(final String adql) throws ParseException {
+		// Reset the parser with the string to parse:
+		try {
+			grammarParser.reset(new java.io.ByteArrayInputStream(adql.getBytes()));
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
+
+		// Parse the string:
+		try {
+
+			// Parse the string as a SELECT clause:
+			grammarParser.Select();
+
+			// Return what's just got parsed:
+			return grammarParser.getQuery().getSelect();
+
+		} catch(TokenMgrError tme) {
+			throw new ParseException(tme);
+		}
+	}
+
+	/**
+	 * Parse the given <code>FROM</code> clause.
+	 *
+	 * <i>
+	 * <p><b>Important note:</b>
+	 * 	The given string MUST start with <code>FROM</code> (case insensitive).
+	 * 	It MUST also follow the syntax of the FULL clause as described in the
+	 * 	appropriate version of the ADQL Grammar.
+	 * </p>
+	 * <p><b>Examples of INcorrect parameter:</b></p>
+	 * <ul>
+	 * 	<li><code>FROM</code></li>
+	 * 	<li><code>aTable</code></li>
+	 * 	<li><code>aTable JOIN bTable</code></li>
+	 * 	<li><code>aTable JOIN bTable AS "B" USING(id)</code></li>
+	 * </ul>
+	 * <p><b>Example of correct parameter:</b></p>
+	 * <pre>FROM aTable JOIN bTable AS "B" USING(id)</pre>
+	 * </i>
+	 *
+	 * @param adql	The <code>FROM</code> clause to parse.
+	 *
+	 * @return	The corresponding object representation of the given clause.
+	 *
+	 * @throws ParseException	If the syntax of the given clause is incorrect.
+	 */
+	public final FromContent parseFrom(java.lang.String adql) throws ParseException {
+		// Reset the parser with the string to parse:
+		try {
+			grammarParser.reset(new java.io.ByteArrayInputStream(adql.getBytes()));
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
+
+		// Parse the string:
+		try {
+
+			// Parse the string as a FROM clause:
+			grammarParser.From();
+
+			// Return what's just got parsed:
+			return grammarParser.getQuery().getFrom();
+
+		} catch(TokenMgrError tme) {
+			throw new ParseException(tme);
+		}
+	}
+
+	/**
+	 * Parse the given <code>WHERE</code> clause.
+	 *
+	 * <i>
+	 * <p><b>Important note:</b>
+	 * 	The given string MUST start with <code>WHERE</code> (case insensitive).
+	 * 	It MUST also follow the syntax of the FULL clause as described in the
+	 * 	appropriate version of the ADQL Grammar.
+	 * </p>
+	 * <p><b>Examples of INcorrect parameter:</b></p>
+	 * <ul>
+	 * 	<li><code>WHERE</code></li>
+	 * 	<li><code>foo</code></li>
+	 * 	<li><code>foo = 'bar'</code></li>
+	 * </ul>
+	 * <p><b>Example of correct parameter:</b></p>
+	 * <pre>WHERE foo = 'bar'</pre>
+	 * </i>
+	 *
+	 * @param adql	The <code>WHERE</code> clause to parse.
+	 *
+	 * @return	The corresponding object representation of the given clause.
+	 *
+	 * @throws ParseException	If the syntax of the given clause is incorrect.
+	 */
+	public final ClauseConstraints parseWhere(java.lang.String adql) throws ParseException {
+		// Reset the parser with the string to parse:
+		try {
+			grammarParser.reset(new java.io.ByteArrayInputStream(adql.getBytes()));
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
+
+		// Parse the string:
+		try {
+
+			// Parse the string as a WHERE clause:
+			grammarParser.Where();
+
+			// Return what's just got parsed:
+			return grammarParser.getQuery().getWhere();
+
+		} catch(TokenMgrError tme) {
+			throw new ParseException(tme);
+		}
+	}
+
+	/**
+	 * Parse the given <code>ORDER BY</code> clause.
+	 *
+	 * <i>
+	 * <p><b>Important note:</b>
+	 * 	The given string MUST start with <code>ORDER BY</code> (case insensitive).
+	 * 	It MUST also follow the syntax of the FULL clause as described in the
+	 * 	appropriate version of the ADQL Grammar.
+	 * </p>
+	 * <p><b>Examples of INcorrect parameter:</b></p>
+	 * <ul>
+	 * 	<li><code>ORDER BY</code></li>
+	 * 	<li><code>aColumn DESC</code></li>
+	 * </ul>
+	 * <p><b>Example of correct parameter:</b></p>
+	 * <pre>ORDER BY aColumn DESC</pre>
+	 * </i>
+	 *
+	 * @param adql	The <code>ORDER BY</code> clause to parse.
+	 *
+	 * @return	The corresponding object representation of the given clause.
+	 *
+	 * @throws ParseException	If the syntax of the given clause is incorrect.
+	 */
+	public final ClauseADQL<ADQLOrder> parseOrderBy(java.lang.String adql) throws ParseException {
+		// Reset the parser with the string to parse:
+		try {
+			grammarParser.reset(new java.io.ByteArrayInputStream(adql.getBytes()));
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
+
+		// Parse the string:
+		try {
+
+			// Parse the string as a ORDER BY clause:
+			grammarParser.OrderBy();
+
+			// Return what's just got parsed:
+			return grammarParser.getQuery().getOrderBy();
+
+		} catch(TokenMgrError tme) {
+			throw new ParseException(tme);
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
+	}
+
+	/**
+	 * Parse the given <code>GROUP BY</code> clause.
+	 *
+	 * <i>
+	 * <p><b>Important note:</b>
+	 * 	The given string MUST start with <code>GROUP BY</code> (case insensitive).
+	 * 	It MUST also follow the syntax of the FULL clause as described in the
+	 * 	appropriate version of the ADQL Grammar.
+	 * </p>
+	 * <p><b>Examples of INcorrect parameter:</b></p>
+	 * <ul>
+	 * 	<li><code>GROUP BY</code></li>
+	 * 	<li><code>aColumn</code></li>
+	 * </ul>
+	 * <p><b>Example of correct parameter:</b></p>
+	 * <pre>GROUP BY aColumn</pre>
+	 * </i>
+	 *
+	 * @param adql	The <code>GROUP BY</code> clause to parse.
+	 *
+	 * @return	The corresponding object representation of the given clause.
+	 *
+	 * @throws ParseException	If the syntax of the given clause is incorrect.
+	 */
+	public final ClauseADQL<ADQLColumn> parseGroupBy(java.lang.String adql) throws ParseException {
+		// Reset the parser with the string to parse:
+		try {
+			grammarParser.reset(new java.io.ByteArrayInputStream(adql.getBytes()));
+		} catch(Exception ex) {
+			throw grammarParser.generateParseException(ex);
+		}
+
+		// Parse the string:
+		try {
+
+			// Parse the string as a GROUP BY clause:
+			grammarParser.GroupBy();
+
+			// Return what's just got parsed:
+			return grammarParser.getQuery().getGroupBy();
+
+		} catch(TokenMgrError tme) {
+			throw new ParseException(tme);
+		}
+	}
+
+	/* **********************************************************************
+	   *                     TOKENIZATION FUNCTION                          *
+	   ********************************************************************** */
+
+	/**
+	 * Parse the given ADQL expression and split it into {@link Token}s.
+	 *
+	 * <i>
+	 * <p><b>Note:</b>
+	 * 	If <code>stopAtEnd=true</code>, the encountered EOQ (i.e. End Of Query
+	 * 	= <code>;</code>) or EOF (i.e. End Of File) are NOT included in the
+	 * 	returned array.
 	 * </p>
 	 *
-	 * @param idCandidate	The string to test.
+	 * <p><b>Example:</b>
+	 * <pre> tokenize("SELECT ; FROM", <b>false</b>); // = { SELECT, EOQ, FROM }
+	 * tokenize("SELECT ; FROM", <b>true</b>);  // = { SELECT }</pre>
+	 * </i>
 	 *
-	 * @return	<code>true</code> if the given string is a valid regular
-	 *        	identifier,
-	 *        	<code>false</code> otherwise.
+	 * @param expr		The ADQL expression to tokenize.
+	 * @param stopAtEnd	<code>true</code> to stop the tokenization process when
+	 *                 	an EOQ or an EOF is encountered,
+	 *                 	<code>false</code> to stop when the end of the string is
+	 *                 	reached.
 	 *
-	 * @see #testRegularIdentifier(adql.parser.Token)
+	 * @return	The corresponding ordered list of tokens.
+	 *
+	 * @throws ParseException	If an unknown token is encountered.
 	 */
-	public boolean isRegularIdentifier(final String idCandidate);
+	public Token[] tokenize(final String expr, final boolean stopAtEnd) throws ParseException {
+		// Start tokenizing the given expression:
+		/* (note: if the given expression is NULL, behave exactly as an empty
+		 *        string) */
+		Tokenizer tokenizer = grammarParser.getTokenizer((expr == null) ? "" : expr);
 
-	public void testRegularIdentifier(final Token token) throws ParseException;
+		// Iterate over all the tokens:
+		try {
+			ArrayList<Token> tokens = new ArrayList<Token>();
+			Token token = tokenizer.nextToken();
+			while(token != null && (!stopAtEnd || !grammarParser.isEnd(token))) {
+				tokens.add(token);
+				token = tokenizer.nextToken();
+			}
+			return tokens.toArray(new Token[tokens.size()]);
+		} catch(TokenMgrError err) {
+			// wrap such errors and propagate them:
+			throw new ParseException(err);
+		}
+	}
 
 	/* **********************************************************************
-	 *                     FUNCTIONS JUST FOR JUNIT
+	   *                      CORRECTION SUGGESTION                         *
+	   ********************************************************************** */
+
+	/**
+	* Try fixing tokens/terms of the input ADQL query.
+	*
+	* <p>
+	* 	<b>This function does not try to fix syntactical or semantical errors.</b>
+	* 	It just try to fix the most common issues in ADQL queries, such as:
+	* </p>
+	* <ul>
+	* 	<li>some Unicode characters confusable with ASCII characters (like a
+	* 		space, a dash, ...) ; this function replace them by their ASCII
+	* 		alternative,</li>
+	* 	<li>any of the following are double quoted:
+	* 		<ul>
+	* 			<li>non regular ADQL identifiers
+	* 				(e.g. <code>_RAJ2000</code>),</li>
+	* 			<li>ADQL function names used as identifiers
+	* 				(e.g. <code>distance</code>)</li>
+	* 			<li>and SQL reserved keywords
+	* 				(e.g. <code>public</code>).</li>
+	* 		</ul>
+	* 	</li>
+	* </ul>
+	*
+	* <p><i><b>Note 1:</b>
+	* 	The given stream is NOT closed by this function even if the EOF is
+	* 	reached. It is the responsibility of the caller to close it.
+	* </i></p>
+	*
+	* <p><i><b>Note 2:</b>
+	* 	This function does not use any instance variable of this parser
+	* 	(especially the InputStream or Reader provided at initialisation or
+	* 	ReInit).
+	* </i></p>
+	*
+	* @param input	Stream containing the input ADQL query to fix.
+	*
+	* @return	The suggested correction of the input ADQL query.
+	*
+	* @throws java.io.IOException	If there is any error while reading from the
+	*                            	given input stream.
+	* @throws ParseException	If any unrecognised character is encountered,
+	*                       	or if anything else prevented the tokenization
+	*                       	of some characters/words/terms.
+	*
+	* @see QueryFixer#fix(String)
+	*
+	* @since 1.5
+	*/
+	public final String tryQuickFix(final InputStream input) throws IOException, ParseException {
+		// Fetch everything into a single string:
+		StringBuffer buf = new StringBuffer();
+		byte[] cBuf = new byte[1024];
+		int nbChar;
+		while((nbChar = input.read(cBuf)) > -1) {
+			buf.append(new String(cBuf, 0, nbChar));
+		}
+
+		// Convert the buffer into a String and now try to fix it:
+		return quickFixer.fix(buf.toString());
+	}
+
+	/**
+	* Try fixing tokens/terms of the given ADQL query.
+	*
+	* <p>
+	* 	<b>This function does not try to fix syntactical or semantical errors.</b>
+	* 	It just try to fix the most common issues in ADQL queries, such as:
+	* </p>
+	* <ul>
+	* 	<li>some Unicode characters confusable with ASCII characters (like a
+	* 		space, a dash, ...) ; this function replace them by their ASCII
+	* 		alternative,</li>
+	* 	<li>any of the following are double quoted:
+	* 		<ul>
+	* 			<li>non regular ADQL identifiers
+	* 				(e.g. <code>_RAJ2000</code>),</li>
+	* 			<li>ADQL function names used as identifiers
+	* 				(e.g. <code>distance</code>)</li>
+	* 			<li>and SQL reserved keywords
+	* 				(e.g. <code>public</code>).</li>
+	* 		</ul>
+	* 	</li>
+	* </ul>
+	*
+	* <p><i><b>Note:</b>
+	* 	This function does not use any instance variable of this parser
+	* 	(especially the InputStream or Reader provided at initialisation or
+	* 	ReInit).
+	* </i></p>
+	*
+	* @param adqlQuery	The input ADQL query to fix.
+	*
+	* @return	The suggested correction of the given ADQL query.
+	*
+	* @throws ParseException	If any unrecognised character is encountered,
+	*                       	or if anything else prevented the tokenization
+	*                       	of some characters/words/terms.
+	*
+	* @see QueryFixer#fix(String)
+	*
+	* @since 1.5
+	*/
+	public final String tryQuickFix(String adqlQuery) throws ParseException {
+		return quickFixer.fix(adqlQuery);
+	}
+
+	/* **********************************************************************
+	 *                           MAIN FUNCTION
 	 * ********************************************************************** */
 
-	ADQLOperand StringExpression() throws ParseException;
+	/**
+	 * Parse the given ADQL query.
+	 *
+	 * <h3>Usage</h3>
+	 *
+	 * <pre>adqlParser.jar [--version=...] [-h] [-d] [-v] [-e] [-a|-s] [-f] [&lt;FILE&gt;|&lt;URL&gt;]</pre>
+	 *
+	 * <p><i><b>Note:</b>
+	 * 	If no file or URL is given, the ADQL query is expected in the standard
+	 * 	input. This query must end with a ';' or <Ctrl+D>!
+	 * </i></p>
+	 *
+	 * <h3>Parameters</h3>
+	 *
+	 * <ul>
+	 * 	<li><b><code>--version=...</code>:</b>
+	 * 		Set the version of the ADQL grammar to follow.
+	 * 		It must be one among: <i>v2.0, v2.1 (default)</i>.</li>
+	 * 	<li><b><code>-h</code> or <code>--help</code>:</b>
+	 * 		Display this help.</li>
+	 * 	<li><b><code>-v</code> or <code>--verbose</code>:</b>
+	 * 		Print the main steps of the parsing.</li>
+	 * 	<li><b><code>-d</code> or <code>--debug</code>:</b>
+	 * 		Print stack traces when a grave error occurs.</li>
+	 * 	<li><b><code>-e</code> or <code>--explain</code>:</b>
+	 * 		Explain the ADQL parsing (or Expand the parsing tree).</li>
+	 * 	<li><b><code>-a</code> or <code>--adql</code>:</b>
+	 * 		Display the understood ADQL query.</li>
+	 * 	<li><b><code>-s</code> or <code>--sql</code>:</b>
+	 * 		Ask the SQL translation of the given ADQL query (SQL compatible with
+	 * 		PostgreSQL).</li>
+	 * 	<li><b><code>-f</code> or <code>--try-fix</code>:</b>
+	 * 		Try fixing the most common ADQL query issues before attempting to
+	 * 		parse the query.</li>
+	 * </ul>
+	 *
+	 * <h3>Return</h3>
+	 *
+	 * <p>
+	 * 	By default, nothing if the query is correct. Otherwise a message
+	 * 	explaining why the query is not correct is displayed.
+	 * </p>
+	 *
+	 * <p>
+	 * 	With the <code>-s</code> option, the SQL translation of the given ADQL query will be
+	 * 	returned.
+	 * </p>
+	 *
+	 * <p>
+	 * 	With the <code>-a</code> option, the ADQL query is returned as it has been
+	 * 	understood.
+	 * </p>
+	 *
+	 * <h3>Exit status</h3>
+	 *
+	 * <ul>
+	 * 	<li><b><code>0</code>:</b>
+	 * 		OK!</li>
+	 * 	<li><b><code>1</code>:</b>
+	 * 		Parameter error (missing or incorrect parameter)</li>
+	 * 	<li><b><code>2</code>:</b>
+	 * 		File error (incorrect file/url, reading error, ...)</li>
+	 * 	<li><b><code>3</code>:</b>
+	 * 		Parsing error (syntactic or semantic error)</li>
+	 * 	<li><b><code>4</code>:</b>
+	 * 		Translation error (a problem has occurred during the translation of
+	 * 		the given ADQL query in SQL).</li>
+	 * </ul>
+	 *
+	 * @param args	Program parameters.
+	 *
+	 * @throws Exception	If any unexpected error occurs.
+	 */
+	public static final void main(String[] args) throws Exception {
+		final String USAGE = "Usage:\n    adqlParser.jar [--version=...] [-h] [-d] [-v] [-e] [-a|-s] [-f] [<FILE>|<URL>]\n\nNOTE: If no file or URL is given, the ADQL query is expected in the standard\n      input. This query must end with a ';' or <Ctrl+D>!\n\nParameters:\n    --version=...   : Set the version of the ADQL grammar to follow.\n                      It must be one among: " + getSupportedVersionsAsString() + "\n    -h or --help    : Display this help.\n    -v or --verbose : Print the main steps of the parsing\n    -d or --debug   : Print stack traces when a grave error occurs\n    -e or --explain : Explain the ADQL parsing (or Expand the parsing tree)\n    -a or --adql    : Display the understood ADQL query\n    -s or --sql     : Ask the SQL translation of the given ADQL query\n                      (SQL compatible with PostgreSQL)\n    -f or --try-fix : Try fixing the most common ADQL query issues before\n                      attempting to parse the query.\n\nReturn:\n    By default: nothing if the query is correct. Otherwise a message explaining\n                why the query is not correct is displayed.\n    With the -s option, the SQL translation of the given ADQL query will be\n    returned.\n    With the -a option, the ADQL query is returned as it has been understood.\n\nExit status:\n    0  OK !\n    1  Parameter error (missing or incorrect parameter)\n    2  File error (incorrect file/url, reading error, ...)\n    3  Parsing error (syntactic or semantic error)\n    4  Translation error (a problem has occurred during the translation of the\n       given ADQL query in SQL).";
+		final String NEED_HELP_MSG = "Try -h or --help to get more help about the usage of this program.";
+		final String urlRegex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
+
+		ADQLParser parser;
+
+		short mode = -1;
+		String file = null;
+		ADQLVersion version = DEFAULT_VERSION;
+		boolean verbose = false, debug = false, explain = false, tryFix = false;
+
+		// Parameters reading:
+		for(int i = 0; i < args.length; i++) {
+			if (args[i].startsWith("--version=")) {
+				String[] parts = args[i].split("=");
+				if (parts.length <= 1) {
+					System.err.println("((!)) Missing ADQL version! It must be one among: " + getSupportedVersionsAsString() + ". ((!))\n" + NEED_HELP_MSG);
+					System.exit(1);
+				}
+				version = ADQLVersion.parse(parts[1]);
+				if (version == null) {
+					System.err.println("((!)) Incorrect ADQL version: \"" + args[i].split("=")[1] + "\"! It must be one among: " + getSupportedVersionsAsString() + ". ((!))\n" + NEED_HELP_MSG);
+					System.exit(1);
+				}
+			} else if (args[i].equalsIgnoreCase("-d") || args[i].equalsIgnoreCase("--debug"))
+				debug = true;
+			else if (args[i].equalsIgnoreCase("-v") || args[i].equalsIgnoreCase("--verbose"))
+				verbose = true;
+			else if (args[i].equalsIgnoreCase("-e") || args[i].equalsIgnoreCase("--explain"))
+				explain = true;
+			else if (args[i].equalsIgnoreCase("-a") || args[i].equalsIgnoreCase("--adql")) {
+				if (mode != -1) {
+					System.err.println("((!)) Too much parameter: you must choose between -s, -c, -a or nothing ((!))\n" + NEED_HELP_MSG);
+					System.exit(1);
+				} else
+					mode = 1;
+			} else if (args[i].equalsIgnoreCase("-s") || args[i].equalsIgnoreCase("--sql")) {
+				if (mode != -1) {
+					System.err.println("((!)) Too much parameter: you must choose between -s, -c, -a or nothing ((!))\n" + NEED_HELP_MSG);
+					System.exit(1);
+				} else
+					mode = 2;
+			} else if (args[i].equalsIgnoreCase("-f") || args[i].equalsIgnoreCase("--try-fix"))
+				tryFix = true;
+			else if (args[i].equalsIgnoreCase("-h") || args[i].equalsIgnoreCase("--help")) {
+				System.out.println(USAGE);
+				System.exit(0);
+			} else if (args[i].startsWith("-")) {
+				System.err.println("((!)) Unknown parameter: \"" + args[i] + "\" ((!))\u005cn" + NEED_HELP_MSG);
+				System.exit(1);
+			} else
+				file = args[i].trim();
+		}
+
+		try {
+
+			// Get the parser for the specified ADQL version:
+			parser = new ADQLParser(version);
+
+			// Try fixing the query, if asked:
+			InputStream in = null;
+			if (tryFix) {
+				if (verbose)
+					System.out.println("((i)) Trying to automatically fix the query...");
+
+				try {
+					// get the input stream...
+					if (file == null || file.length() == 0)
+						in = System.in;
+					else if (file.matches(urlRegex))
+						in = (new java.net.URL(file)).openStream();
+					else
+						in = new java.io.FileInputStream(file);
+
+					// ...and try fixing the query:
+					String query = parser.tryQuickFix(in);
+
+					if (verbose)
+						System.out.println("((i)) SUGGESTED QUERY:\n" + query);
+
+					// Initialize the parser with this fixed query:
+					in = new java.io.ByteArrayInputStream(query.getBytes());
+				} catch(ParseException pe) {
+					System.out.println("((!)) Quick fix failure! Cause: " + pe.getMessage() + ".");
+					if (debug)
+						pe.printStackTrace();
+					else
+						System.out.println("      (run again with -d for more details)");
+				} finally {
+					// close the stream (if opened):
+					if (in != null)
+						in.close();
+					in = null;
+				}
+			}
+
+			// If no tryQuickFix (or if failed), take the query as provided:
+			if (in == null) {
+				// Initialise the parser with the specified input:
+				if (file == null || file.length() == 0)
+					in = System.in;
+				else if (file.matches(urlRegex))
+					in = (new java.net.URL(file)).openStream();
+				else
+					in = new java.io.FileInputStream(file);
+			}
+
+			// Enable/Disable the debugging in function of the parameters:
+			parser.setDebug(explain);
+
+			// Query parsing:
+			try {
+				if (verbose)
+					System.out.print("((i)) Parsing ADQL query...");
+				ADQLQuery q = parser.parseQuery(in);
+				if (verbose)
+					System.out.println("((i)) CORRECT ADQL QUERY ((i))");
+				if (mode == 2) {
+					PostgreSQLTranslator translator = new PostgreSQLTranslator();
+					if (verbose)
+						System.out.print("((i)) Translating in SQL...");
+					String sql = translator.translate(q);
+					if (verbose)
+						System.out.println("ok");
+					System.out.println(sql);
+				} else if (mode == 1) {
+					System.out.println(q.toADQL());
+				}
+			} catch(UnresolvedIdentifiersException uie) {
+				System.err.println("((X)) " + uie.getNbErrors() + " unresolved identifiers:");
+				for(ParseException pe : uie)
+					System.err.println("\t - at " + pe.getPosition() + ": " + uie.getMessage());
+				if (debug)
+					uie.printStackTrace(System.err);
+				System.exit(3);
+			} catch(ParseException pe) {
+				System.err.println("((X)) Syntax error: " + pe.getMessage() + " ((X))");
+				if (debug)
+					pe.printStackTrace(System.err);
+				System.exit(3);
+			} catch(TranslationException te) {
+				if (verbose)
+					System.out.println("error");
+				System.err.println("((X)) Translation error: " + te.getMessage() + " ((X))");
+				if (debug)
+					te.printStackTrace(System.err);
+				System.exit(4);
+			}
+
+		} catch(IOException ioe) {
+			System.err.println("\n((X)) Error while reading the file \"" + file + "\": " + ioe.getMessage() + " ((X))");
+			if (debug)
+				ioe.printStackTrace(System.err);
+			System.exit(2);
+		}
 
-	public Token[] tokenize(final String expr) throws ParseException;
+	}
 
 }
diff --git a/src/adql/parser/ADQLParser200.java b/src/adql/parser/ADQLParser200.java
deleted file mode 100644
index c3f7eca..0000000
--- a/src/adql/parser/ADQLParser200.java
+++ /dev/null
@@ -1,6669 +0,0 @@
-/* ADQLParser200.java */
-/* Generated By:JavaCC: Do not edit this line. ADQLParser200.java */
-package adql.parser;
-
-import java.util.ArrayList;
-
-/*
- * This file is part of ADQLLibrary.
- *
- * ADQLLibrary is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ADQLLibrary is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
- *
- * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
- */
-
-import java.util.Stack;
-import java.util.Vector;
-
-import adql.db.exception.UnresolvedIdentifiersException;
-import adql.db.exception.UnsupportedFeatureException;
-import adql.parser.ADQLParserFactory.ADQLVersion;
-import adql.parser.ADQLQueryFactory.JoinType;
-import adql.parser.IdentifierItems.IdentifierItem;
-import adql.parser.feature.FeatureSet;
-import adql.parser.feature.LanguageFeature;
-import adql.query.ADQLObject;
-import adql.query.ADQLOrder;
-import adql.query.ADQLQuery;
-import adql.query.ClauseADQL;
-import adql.query.ClauseConstraints;
-import adql.query.ClauseSelect;
-import adql.query.SelectAllColumns;
-import adql.query.SelectItem;
-import adql.query.TextPosition;
-import adql.query.constraint.ADQLConstraint;
-import adql.query.constraint.Between;
-import adql.query.constraint.Comparison;
-import adql.query.constraint.ComparisonOperator;
-import adql.query.constraint.ConstraintsGroup;
-import adql.query.constraint.Exists;
-import adql.query.constraint.In;
-import adql.query.constraint.IsNull;
-import adql.query.constraint.NotConstraint;
-import adql.query.from.ADQLJoin;
-import adql.query.from.FromContent;
-import adql.query.operand.ADQLColumn;
-import adql.query.operand.ADQLOperand;
-import adql.query.operand.Concatenation;
-import adql.query.operand.NegativeOperand;
-import adql.query.operand.NumericConstant;
-import adql.query.operand.Operation;
-import adql.query.operand.OperationType;
-import adql.query.operand.StringConstant;
-import adql.query.operand.WrappedOperand;
-import adql.query.operand.function.ADQLFunction;
-import adql.query.operand.function.MathFunction;
-import adql.query.operand.function.MathFunctionType;
-import adql.query.operand.function.SQLFunction;
-import adql.query.operand.function.SQLFunctionType;
-import adql.query.operand.function.UserDefinedFunction;
-import adql.query.operand.function.geometry.GeometryFunction;
-import adql.query.operand.function.geometry.GeometryFunction.GeometryValue;
-import adql.query.operand.function.geometry.PointFunction;
-import adql.search.SearchOptionalFeaturesHandler;
-
-/**
-* Parses an ADQL-2.0 query thanks to the {@link ADQLParser200#Query() Query()} function.
-*
-* <p>
-*   This parser is able, thanks to a {@link QueryChecker} object, to check each
-*   {@link ADQLQuery} just after its generation. It could be used to check the
-*   consistency between the ADQL query to parse and the "database" on which the
-*   query must be executed. By default, there is no {@link QueryChecker}. Thus
-*   you must extend {@link QueryChecker} to check semantically all generated
-*   ADQLQuery objects.
-* </p>
-*
-* <p>
-*   To create an object representation of the given ADQL query, this parser uses
-*   a {@link ADQLQueryFactory} object. So if you want customize some object
-*   (ie. CONTAINS) of this representation you just have to extend the
-*   corresponding default object (ie. ContainsFunction) and to extend the
-*   corresponding function of {@link ADQLQueryFactory}
-*   (ie. createContains(...)).
-* </p>
-*
-* <p>Here are the key functions to use:</p>
-* <ul>
-* 	<li>{@link #parseQuery(java.lang.String)} (or any of its alternatives)
-* 		to parse an input ADQL query String and get its corresponding ADQL tree
-*   </li>
-*   <li>{@link #tryQuickFix(java.lang.String)} to try fixing the most common
-* 		issues with ADQL queries (e.g. Unicode confusable characters,
-* 		unescaped ADQL identifiers, SQL reserved keywords, ...)</li>
-* </ul>
-*
-* <p><b><u>WARNING:</u>
-*   To modify this class it's strongly encouraged to modify the .jj file in the
-*   section between <i>PARSER_BEGIN</i> and <i>PARSER_END</i> and to re-compile
-*   it with JavaCC.
-* </b></p>
-*
-* @see QueryChecker
-* @see ADQLQueryFactory
-*
-* @author Gr&eacute;gory Mantelet (CDS)
-* @version 2.0 (07/2019)
-* @since 2.0
-*/
-public class ADQLParser200 implements ADQLParser, ADQLParser200Constants {
-
-	/** Tools to build the object representation of the ADQL query. */
-	private ADQLQueryFactory queryFactory = new ADQLQueryFactory();
-
-	/** Default set of supported language features.
-	* <p><i><b>Note:</b>
-	* 	By default, all optional features are supported.
-	* </i></p> */
-	private FeatureSet supportedFeatures = new FeatureSet(false, true);
-
-	/** The stack of queries (because there may be some sub-queries). */
-	private Stack<ADQLQuery> stackQuery = new Stack<ADQLQuery>();
-
-	/** The object representation of the ADQL query to parse.
-	* (ONLY USED DURING THE PARSING, else it is always <i>null</i>). */
-	private ADQLQuery query = null;
-
-	/** Checks each {@link ADQLQuery} (sub-query or not) just after their
-	* generation. */
-	private QueryChecker queryChecker = null;
-
-	/** The first token of a table/column name. This token is extracted by
-	* {@link #Identifier()}. */
-	private Token currentIdentifierToken = null;
-
-	/**
-	* Builds an ADQL parser without a query to parse.
-	*/
-	public ADQLParser200() {
-		this(new java.io.ByteArrayInputStream("".getBytes()));
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-		setDebug(false);
-	}
-
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker} and a {@link ADQLQueryFactory}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(QueryChecker checker, ADQLQueryFactory factory) {
-		this();
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(QueryChecker checker) {
-		this(checker, null);
-	}
-
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link ADQLQueryFactory}.
-	*
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(ADQLQueryFactory factory) {
-		this((QueryChecker)null, factory);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream);
-
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(java.io.InputStream stream, QueryChecker checker) {
-		this(stream, checker, null);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, ADQLQueryFactory factory) {
-		this(stream, (QueryChecker)null, factory);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, String encoding, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream, encoding);
-
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(java.io.InputStream stream, String encoding, QueryChecker checker) {
-		this(stream, encoding, checker, null);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, String encoding, ADQLQueryFactory factory) {
-		this(stream, encoding, null, factory);
-	}
-
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.Reader reader, QueryChecker checker, ADQLQueryFactory factory) {
-		this(reader);
-
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(java.io.Reader reader, QueryChecker checker) {
-		this(reader, checker, null);
-	}
-
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.Reader reader, ADQLQueryFactory factory) {
-		this(reader, null, factory);
-	}
-
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery }.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(ADQLParser200TokenManager tm, QueryChecker checker, ADQLQueryFactory factory) {
-		this(tm);
-
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(ADQLParser200TokenManager tm, QueryChecker checker) {
-		this(tm, checker, null);
-	}
-
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(ADQLParser200TokenManager tm, ADQLQueryFactory factory) {
-		this(tm, null, factory);
-	}
-
-	/* ADDITIONAL GETTERS & SETTERS */
-
-	@Override
-	public final ADQLVersion getADQLVersion() {
-		return ADQLVersion.V2_0;
-	}
-
-	@Override
-	public final void setDebug(boolean debug) {
-		if (debug)
-			enable_tracing();
-		else
-			disable_tracing();
-	}
-
-	@Override
-	public final QueryChecker getQueryChecker() {
-		return queryChecker;
-	}
-
-	@Override
-	public final void setQueryChecker(QueryChecker checker) {
-		queryChecker = checker;
-	}
-
-	@Override
-	public final ADQLQueryFactory getQueryFactory() {
-		return queryFactory;
-	}
-
-	@Override
-	public final void setQueryFactory(ADQLQueryFactory factory) {
-		queryFactory = (factory != null) ? factory : (new ADQLQueryFactory());
-	}
-
-	@Override
-	public final FeatureSet getSupportedFeatures() {
-		return supportedFeatures;
-	}
-
-	@Override
-	public void setSupportedFeatures(final FeatureSet features) {
-		if (features != null)
-			supportedFeatures = features;
-	}
-
-	/* EXCEPTION HELPER FUNCTION */
-
-	private final ParseException generateParseException(Exception ex) {
-		if (!(ex instanceof ParseException)) {
-			ParseException pex = new ParseException("[" + ex.getClass().getName() + "] " + ex.getMessage());
-			pex.setStackTrace(ex.getStackTrace());
-			return pex;
-		} else
-			return (ParseException)ex;
-	}
-
-	/* QUERY PARSING FUNCTIONS */
-
-	/**
-	* Tell whether the given string is a valid ADQL regular identifier.
-	*
-	* <p>
-	* 	According to the ADQL-2.0's BNF, a regular identifier (i.e. not delimited
-	* 	; not between double quotes) must be a letter followed by a letter, digit
-	* 	or underscore. So, the following regular expression:
-	* </p>
-	* <pre>[a-zA-Z]+[a-zA-Z0-9_]*</pre>
-	*
-	* <p>This is what this function tests on the given string.</p>
-	*
-	* @param idCandidate	The string to test.
-	*
-	* @return	<code>true</code> if the given string is a valid regular
-	*        	identifier,
-	*        	<code>false</code> otherwise.
-	*
-	* @see #testRegularIdentifier(adql.parser.Token)
-	*
-	* @since 1.5
-	*/
-	@Override
-	public final boolean isRegularIdentifier(final String idCandidate) {
-		return idCandidate.matches("[a-zA-Z]+[a-zA-Z0-9_]*");
-	}
-
-	/**
-	* Test the given token as an ADQL's regular identifier.
-	*
-	* <p>
-	* 	This function uses {@link #isRegularIdentifier(java.lang.String)} to
-	* 	test the given token's image. If the test fails, a
-	* 	{@link adql.parser.ParseException} is thrown.
-	* </p>
-	*
-	* @param token	The token to test.
-	*
-	* @throws ParseException	If the given token is not a valid ADQL regular
-	*                       	identifier.
-	*
-	* @see #isRegularIdentifier(java.lang.String)
-	*
-	* @since 1.5
-	*/
-	@Override
-	public final void testRegularIdentifier(final Token token) throws ParseException {
-		if (!isRegularIdentifier(token.image))
-			throw new ParseException("Invalid ADQL regular identifier: \u005c"" + token.image + "\u005c"! If it aims to be a column/table name/alias, you should write it between double quotes.", new TextPosition(token));
-	}
-
-	/**
-	* Parses the query given at the creation of this parser or in the
-	* <i>ReInit</i> functions.
-	*
-	* @return 	The object representation of the given ADQL query.
-	*
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser200#Query()
-	*/
-	@Override
-	public final ADQLQuery parseQuery() throws ParseException {
-		stackQuery.clear();
-		query = null;
-		try {
-			return Query();
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-
-	/**
-	* Parses the query given in parameter.
-	*
-	* @param q	The ADQL query to parse.
-	*
-	* @return	The object representation of the given ADQL query.
-	*
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser200#ReInit(java.io.InputStream)
-	* @see ADQLParser200#setDebug(boolean)
-	* @see ADQLParser200#Query()
-	*/
-	@Override
-	public final ADQLQuery parseQuery(String q) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(new java.io.ByteArrayInputStream(q.getBytes()));
-		try {
-			return Query();
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-
-	/**
-	* Parses the query contained in the stream given in parameter.
-	*
-	* @param stream		The stream which contains the ADQL query to parse.
-	*
-	* @return	The object representation of the given ADQL query.
-	*
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser200#ReInit(java.io.InputStream)
-	* @see ADQLParser200#setDebug(boolean)
-	* @see ADQLParser200#Query()
-	*/
-	@Override
-	public final ADQLQuery parseQuery(java.io.InputStream stream) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(stream);
-		try {
-			return Query();
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-
-	@Override
-	public final ClauseSelect parseSelect(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a SELECT clause:
-			Select();
-
-			// Return what's just got parsed:
-			return query.getSelect();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final FromContent parseFrom(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a FROM clause:
-			From();
-
-			// Return what's just got parsed:
-			return query.getFrom();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final ClauseConstraints parseWhere(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a WHERE clause:
-			Where();
-
-			// Return what's just got parsed:
-			return query.getWhere();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final ClauseADQL<ADQLOrder> parseOrderBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a ORDER BY clause:
-			OrderBy();
-
-			// Return what's just got parsed:
-			return query.getOrderBy();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final ClauseADQL<ADQLColumn> parseGroupBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a GROUP BY clause:
-			GroupBy();
-
-			// Return what's just got parsed:
-			return query.getGroupBy();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	/* TOKENIZATION FUNCTION */
-
-	@Override
-	public Token[] tokenize(final String expr) throws ParseException {
-		ADQLParser200TokenManager parser = new ADQLParser200TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(expr.getBytes())));
-		try {
-			ArrayList<Token> tokens = new ArrayList<Token>();
-			Token token;
-			while(!isEnd((token = parser.getNextToken()))) {
-				tokens.add(token);
-			}
-			return tokens.toArray(new Token[tokens.size()]);
-		} catch(TokenMgrError err) {
-			// wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
-	}
-
-	/* CORRECTION SUGGESTION */
-
-	/**
-	* Try fixing tokens/terms of the input ADQL query.
-	*
-	* <p>
-	* 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	*  It just try to fix the most common issues in ADQL queries, such as:
-	* </p>
-	* <ul>
-	* 	<li>some Unicode characters confusable with ASCII characters (like a
-	* 		space, a dash, ...) ; this function replace them by their ASCII
-	* 		alternative,</li>
-	* 	<li>any of the following are double quoted:
-	* 		<ul>
-	* 			<li>non regular ADQL identifiers
-	* 				(e.g. <code>_RAJ2000</code>),</li>
-	* 			<li>ADQL function names used as identifiers
-	* 				(e.g. <code>distance</code>)</li>
-	* 			<li>and SQL reserved keywords
-	* 				(e.g. <code>public</code>).</li>
-	* 		</ul>
-	* 	</li>
-	* </ul>
-	*
-	* <p><i><b>Note 1:</b>
-	* 	The given stream is NOT closed by this function even if the EOF is
-	* 	reached. It is the responsibility of the caller to close it.
-	* </i></p>
-	*
-	* <p><i><b>Note 2:</b>
-	* 	This function does not use any instance variable of this parser
-	* 	(especially the InputStream or Reader provided at initialisation or
-	* 	ReInit).
-	* </i></p>
-	*
-	* @param input	Stream containing the input ADQL query to fix.
-	*
-	* @return	The suggested correction of the input ADQL query.
-	*
-	* @throws java.io.IOException	If there is any error while reading from the
-	*                            	given input stream.
-	* @throws ParseException	If any unrecognised character is encountered,
-	*                       	or if anything else prevented the tokenization
-	*                       	   of some characters/words/terms.
-	*
-	* @see #tryQuickFix(java.lang.String)
-	*
-	* @since 1.5
-	*/
-	@Override
-	public final String tryQuickFix(final java.io.InputStream input) throws java.io.IOException, ParseException {
-		// Fetch everything into a single string:
-		StringBuffer buf = new StringBuffer();
-		byte[] cBuf = new byte[1024];
-		int nbChar;
-		while((nbChar = input.read(cBuf)) > -1) {
-			buf.append(new String(cBuf, 0, nbChar));
-		}
-
-		// Convert the buffer into a String and now try to fix it:
-		return tryQuickFix(buf.toString());
-	}
-
-	/**
-	* Try fixing tokens/terms of the given ADQL query.
-	*
-	* <p>
-	* 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	*  It just try to fix the most common issues in ADQL queries, such as:
-	* </p>
-	* <ul>
-	* 	<li>some Unicode characters confusable with ASCII characters (like a
-	* 		space, a dash, ...) ; this function replace them by their ASCII
-	* 		alternative,</li>
-	* 	<li>any of the following are double quoted:
-	* 		<ul>
-	* 			<li>non regular ADQL identifiers
-	* 				(e.g. <code>_RAJ2000</code>),</li>
-	* 			<li>ADQL function names used as identifiers
-	* 				(e.g. <code>distance</code>)</li>
-	* 			<li>and SQL reserved keywords
-	* 				(e.g. <code>public</code>).</li>
-	* 		</ul>
-	* 	</li>
-	* </ul>
-	*
-	* <p><i><b>Note:</b>
-	* 	This function does not use any instance variable of this parser
-	* 	(especially the InputStream or Reader provided at initialisation or
-	* 	ReInit).
-	* </i></p>
-	*
-	* @param adqlQuery	The input ADQL query to fix.
-	*
-	* @return	The suggested correction of the given ADQL query.
-	*
-	* @throws ParseException	If any unrecognised character is encountered,
-	*                       	or if anything else prevented the tokenization
-	*                       	   of some characters/words/terms.
-	*
-	* @since 1.5
-	*/
-	@Override
-	public String tryQuickFix(String adqlQuery) throws ParseException {
-		StringBuffer suggestedQuery = new StringBuffer();
-
-		// 1. Replace all Unicode confusable characters:
-		adqlQuery = replaceUnicodeConfusables(adqlQuery);
-
-		/* 1.bis. Normalise new lines and tabulations
-		*        (to simplify the column counting): */
-		adqlQuery = adqlQuery.replaceAll("(\u005cr\u005cn|\u005cr|\u005cn)", System.getProperty("line.separator")).replaceAll("\u005ct", "    ");
-
-		// 2. Analyse the query token by token:
-		ADQLParser200TokenManager parser = new ADQLParser200TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(adqlQuery.getBytes())));
-
-		final String[] lines = adqlQuery.split(System.getProperty("line.separator"));
-
-		try {
-			String suggestedToken;
-			int lastLine = 1, lastCol = 1;
-
-			Token token = null, nextToken = parser.getNextToken();
-			// for all tokens until the EOF or EOQ:
-			do {
-				// get the next token:
-				token = nextToken;
-				nextToken = (isEnd(token) ? null : parser.getNextToken());
-
-				// 3. Double quote any suspect token:
-				if (mustEscape(token, nextToken)) {
-					suggestedToken = "\u005c"" + token.image + "\u005c"";
-				} else
-					suggestedToken = token.image;
-
-				/* 4. Append all space characters (and comments) before the
-				*    token: */
-				/* same line, just get the space characters between the last
-				* token and the one to append: */
-				if (lastLine == token.beginLine) {
-					if (token.kind == ADQLParser200Constants.EOF)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1));
-					else
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - (isEnd(token) ? 0 : 1)));
-					lastCol = token.endColumn + 1;
-				}
-				// not the same line...
-				else {
-					/* append all remaining space characters until the position
-					* of the token to append: */
-					do {
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1)).append('\u005cn');
-						lastLine++;
-						lastCol = 1;
-					} while(lastLine < token.beginLine);
-					/* if there are still space characters before the token,
-					* append them as well: */
-					if (lastCol < token.beginColumn)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - 1));
-					// finally, set the correct column position:
-					lastCol = token.endColumn + 1;
-				}
-
-				// 5. Append the suggested token:
-				suggestedQuery.append(suggestedToken);
-
-			} while(!isEnd(token));
-
-		} catch(TokenMgrError err) {
-			// wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
-
-		return suggestedQuery.toString();
-	}
-
-	/**
-	* All of the most common Unicode confusable characters and their
-	* ASCII/UTF-8 alternative.
-	*
-	* <p>
-	* 	Keys of this map represent the ASCII character while the values are the
-	* 	regular expression for all possible Unicode alternatives.
-	* </p>
-	*
-	* <p><i><b>Note:</b>
-	* 	All of them have been listed using
-	* 	<a href="https://unicode.org/cldr/utility/confusables.jsp">Unicode Utilities: Confusables</a>.
-	* </i></p>
-	*
-	* @since 1.5
-	*/
-	protected final static java.util.Map<String, String> REGEX_UNICODE_CONFUSABLES = new java.util.HashMap<String, String>(10);
-	/** Regular expression matching all Unicode alternatives for <code>-</code>.
-	* @since 1.5 */
-	protected final static String REGEX_DASH = "[-\u02d7\u06d4\u2010\u2011\u2012\u2013\u2043\u2212\u2796\u2cba\ufe58\u2014\u2015\u207b\u208b\u0096\u058a\ufe63\uff0d]";
-	/** Regular expression matching all Unicode alternatives for <code>_</code>.
-	* @since 1.5 */
-	protected final static String REGEX_UNDERSCORE = "[_\u07fa\ufe4d\ufe4e\ufe4f]";
-	/** Regular expression matching all Unicode alternatives for <code>'</code>.
-	* @since 1.5 */
-	protected final static String REGEX_QUOTE = "['`\u00b4\u02b9\u02bb\u02bc\u02bd\u02be\u02c8\u02ca\u02cb\u02f4\u0374\u0384\u055a\u055d\u05d9\u05f3\u07f4\u07f5\u144a\u16cc\u1fbd\u1fbf\u1fef\u1ffd\u1ffe\u2018\u2019\u201b\u2032\u2035\ua78c\uff07\uff40]";
-	/** Regular expression matching all Unicode alternatives for <code>"</code>.
-	* @since 1.5 */
-	protected final static String REGEX_DOUBLE_QUOTE = "[\u02ba\u02dd\u02ee\u02f6\u05f2\u05f4\u1cd3\u201c\u201d\u201f\u2033\u2036\u3003\uff02]";
-	/** Regular expression matching all Unicode alternatives for <code>.</code>.
-	* @since 1.5 */
-	protected final static String REGEX_STOP = "[.\u0660\u06f0\u0701\u0702\u2024\ua4f8\ua60e]";
-	/** Regular expression matching all Unicode alternatives for <code>+</code>.
-	* @since 1.5 */
-	protected final static String REGEX_PLUS = "[+\u16ed\u2795]";
-	/** Regular expression matching all Unicode alternatives for <code> </code>.
-	* @since 1.5 */
-	protected final static String REGEX_SPACE = "[ \u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f]";
-	/** Regular expression matching all Unicode alternatives for <code>&lt;</code>.
-	* @since 1.5 */
-	protected final static String REGEX_LESS_THAN = "[<\u02c2\u1438\u16b2\u2039\u276e]";
-	/** Regular expression matching all Unicode alternatives for <code>&gt;</code>.
-	* @since 1.5 */
-	protected final static String REGEX_GREATER_THAN = "[>\u02c3\u1433\u203a\u276f]";
-	/** Regular expression matching all Unicode alternatives for <code>=</code>.
-	* @since 1.5 */
-	protected final static String REGEX_EQUAL = "[=\u1400\u2e40\u30a0\ua4ff]";
-	static {
-		REGEX_UNICODE_CONFUSABLES.put("-", REGEX_DASH);
-		REGEX_UNICODE_CONFUSABLES.put("_", REGEX_UNDERSCORE);
-		REGEX_UNICODE_CONFUSABLES.put("'", REGEX_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put("\u005c"", REGEX_DOUBLE_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put(".", REGEX_STOP);
-		REGEX_UNICODE_CONFUSABLES.put("+", REGEX_PLUS);
-		REGEX_UNICODE_CONFUSABLES.put(" ", REGEX_SPACE);
-		REGEX_UNICODE_CONFUSABLES.put("<", REGEX_LESS_THAN);
-		REGEX_UNICODE_CONFUSABLES.put(">", REGEX_GREATER_THAN);
-		REGEX_UNICODE_CONFUSABLES.put("=", REGEX_EQUAL);
-	}
-
-	/**
-	* Replace all Unicode characters that can be confused with other ASCI/UTF-8
-	* characters (e.g. different spaces, dashes, ...) in their ASCII version.
-	*
-	* @param adqlQuery	The ADQL query string in which Unicode confusable
-	*                 	characters must be replaced.
-	*
-	* @return	The same query without the most common Unicode confusable
-	*        	characters.
-	*
-	* @since 1.5
-	*/
-	protected String replaceUnicodeConfusables(final String adqlQuery) {
-		String newAdqlQuery = adqlQuery;
-		for(java.util.Map.Entry<String, String> confusable : REGEX_UNICODE_CONFUSABLES.entrySet())
-			newAdqlQuery = newAdqlQuery.replaceAll(confusable.getValue(), confusable.getKey());
-		return newAdqlQuery;
-	}
-
-	/**
-	* Tell whether the given token represents the end of an ADQL query.
-	*
-	* @param token	Token to analyze.
-	*
-	* @return	<code>true</code> if the given token represents a query end,
-	*        	<code>false</code> otherwise.
-	*
-	* @since 1.5
-	*/
-	protected boolean isEnd(final Token token) {
-		return token.kind == ADQLParser200Constants.EOF || token.kind == ADQLParser200Constants.EOQ;
-	}
-
-	/**
-	* Tell whether the given token must be double quoted.
-	*
-	* <p>
-	* 	This function considers all the following as terms to double quote:
-	* </p>
-	* <ul>
-	* 	<li>SQL reserved keywords</li>,
-	* 	<li>unrecognised regular identifiers (e.g. neither a delimited nor a
-	* 		valid ADQL regular identifier)</li>
-	* 	<li>and ADQL function name without a parameters list.</li>
-	* </ul>
-	*
-	* @param token		The token to analyze.
-	* @param nextToken	The following token. (useful to detect the start of a
-	*                 	function's parameters list)
-	*
-	* @return	<code>true</code> if the given token must be double quoted,
-	*        	<code>false</code> to keep it as provided.
-	*
-	* @since 1.5
-	*/
-	protected boolean mustEscape(final Token token, final Token nextToken) {
-		switch(token.kind) {
-			case ADQLParser200Constants.SQL_RESERVED_WORD:
-				return true;
-			case ADQLParser200Constants.REGULAR_IDENTIFIER_CANDIDATE:
-				return !isRegularIdentifier(token.image);
-			default:
-				return token.isFunctionName && (nextToken == null || nextToken.kind != ADQLParser200Constants.LEFT_PAR);
-		}
-	}
-
-	/* ########## */
-	/* # SYNTAX # */
-	/* ########## */
-
-	/* ******************* */
-	/* GENERAL ADQL SYNTAX */
-	/* ******************* */
-	/**
-	* Parses the ADQL query given at the parser creation or in the {@link ADQLParser200#ReInit(java.io.InputStream)}
-	* or in the <i>parseQuery</i> functions.
-	*
-	* @return					The object representation of the query.
-	* @throws ParseException	If the query syntax is incorrect.
-	*/
-	final public ADQLQuery Query() throws ParseException {
-		trace_call("Query");
-		try {
-			ADQLQuery q = null;
-			q = QueryExpression();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case 0: {
-					jj_consume_token(0);
-					break;
-				}
-				case EOQ: {
-					jj_consume_token(EOQ);
-					break;
-				}
-				default:
-					jj_la1[0] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			/* check the optional features before any other check:
-					 * (note: this check is very close to grammar check...hence its higher
-					 *        priority) */
-			UnresolvedIdentifiersException exUnsupportedFeatures = new UnresolvedIdentifiersException("unsupported expression");
-			SearchOptionalFeaturesHandler sFeaturesHandler = new SearchOptionalFeaturesHandler(true, false);
-			sFeaturesHandler.search(q);
-			for(ADQLObject obj : sFeaturesHandler) {
-				if (!supportedFeatures.isSupporting(obj.getFeatureDescription()))
-					exUnsupportedFeatures.addException(new UnsupportedFeatureException(obj));
-			}
-			if (exUnsupportedFeatures.getNbErrors() > 0) {
-				if (true)
-					throw exUnsupportedFeatures;
-			}
-
-			// check the query:
-			if (queryChecker != null)
-				queryChecker.check(q);
-
-			{
-				if ("" != null)
-					return q;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Query");
-		}
-	}
-
-	final public ADQLQuery QueryExpression() throws ParseException {
-		trace_call("QueryExpression");
-		try {
-			TextPosition endPos = null;
-			try {
-				// create the query:
-				query = queryFactory.createQuery(ADQLVersion.V2_0);
-				stackQuery.push(query);
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			Select();
-			From();
-			endPos = query.getFrom().getPosition();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case WHERE: {
-					Where();
-					endPos = query.getWhere().getPosition();
-					break;
-				}
-				default:
-					jj_la1[1] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case GROUP: {
-					GroupBy();
-					endPos = query.getGroupBy().getPosition();
-					break;
-				}
-				default:
-					jj_la1[2] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case HAVING: {
-					Having();
-					endPos = query.getHaving().getPosition();
-					break;
-				}
-				default:
-					jj_la1[3] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ORDER: {
-					OrderBy();
-					endPos = query.getOrderBy().getPosition();
-					break;
-				}
-				default:
-					jj_la1[4] = jj_gen;
-					;
-			}
-			// set the position of the query:
-			query.setPosition(new TextPosition(query.getSelect().getPosition(), endPos));
-
-			// get the previous query (!= null if the current query is a sub-query):
-			ADQLQuery previousQuery = stackQuery.pop();
-			if (stackQuery.isEmpty())
-				query = null;
-			else
-				query = stackQuery.peek();
-
-			{
-				if ("" != null)
-					return previousQuery;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("QueryExpression");
-		}
-	}
-
-	final public ADQLQuery SubQueryExpression() throws ParseException {
-		trace_call("SubQueryExpression");
-		try {
-			ADQLQuery q = null;
-			Token start, end;
-			start = jj_consume_token(LEFT_PAR);
-			q = QueryExpression();
-			end = jj_consume_token(RIGHT_PAR);
-			q.setPosition(new TextPosition(start, end));
-			{
-				if ("" != null)
-					return q;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SubQueryExpression");
-		}
-	}
-
-	final public void Select() throws ParseException {
-		trace_call("Select");
-		try {
-			ClauseSelect select = query.getSelect();
-			SelectItem item = null;
-			Token start, t = null;
-			start = jj_consume_token(SELECT);
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case QUANTIFIER: {
-					t = jj_consume_token(QUANTIFIER);
-					select.setDistinctColumns(t.image.equalsIgnoreCase("DISTINCT"));
-					break;
-				}
-				default:
-					jj_la1[5] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case TOP: {
-					jj_consume_token(TOP);
-					t = jj_consume_token(UNSIGNED_INTEGER);
-					try {
-						select.setLimit(Integer.parseInt(t.image));
-					} catch(NumberFormatException nfe) {
-						{
-							if (true)
-								throw new ParseException("[l." + t.beginLine + ";c." + t.beginColumn + "] The TOP limit (\u005c"" + t.image + "\u005c") isn't a regular unsigned integer !");
-						}
-					}
-					break;
-				}
-				default:
-					jj_la1[6] = jj_gen;
-					;
-			}
-			item = SelectItem();
-			select.add(item);
-			label_1: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COMMA: {
-						;
-						break;
-					}
-					default:
-						jj_la1[7] = jj_gen;
-						break label_1;
-				}
-				jj_consume_token(COMMA);
-				item = SelectItem();
-				select.add(item);
-			}
-			TextPosition lastItemPos = query.getSelect().get(query.getSelect().size() - 1).getPosition();
-			select.setPosition(new TextPosition(start.beginLine, start.beginColumn, lastItemPos.endLine, lastItemPos.endColumn));
-		} finally {
-			trace_return("Select");
-		}
-	}
-
-	final public SelectItem SelectItem() throws ParseException {
-		trace_call("SelectItem");
-		try {
-			IdentifierItems identifiers = new IdentifierItems(true);
-			IdentifierItem id = null, label = null;
-			ADQLOperand op = null;
-			SelectItem item;
-			Token starToken;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ASTERISK: {
-					starToken = jj_consume_token(ASTERISK);
-					item = new SelectAllColumns(query);
-					item.setPosition(new TextPosition(starToken));
-					{
-						if ("" != null)
-							return item;
-					}
-					break;
-				}
-				default:
-					jj_la1[12] = jj_gen;
-					if (jj_2_1(7)) {
-						id = Identifier();
-						jj_consume_token(DOT);
-						identifiers.append(id);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								id = Identifier();
-								jj_consume_token(DOT);
-								identifiers.append(id);
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case DELIMITED_IDENTIFIER:
-									case REGULAR_IDENTIFIER_CANDIDATE: {
-										id = Identifier();
-										jj_consume_token(DOT);
-										identifiers.append(id);
-										break;
-									}
-									default:
-										jj_la1[8] = jj_gen;
-										;
-								}
-								break;
-							}
-							default:
-								jj_la1[9] = jj_gen;
-								;
-						}
-						starToken = jj_consume_token(ASTERISK);
-						try {
-							item = new SelectAllColumns(queryFactory.createTable(identifiers, null));
-							TextPosition firstPos = identifiers.get(0).position;
-							item.setPosition(new TextPosition(firstPos.beginLine, firstPos.beginColumn, starToken.endLine, (starToken.endColumn < 0) ? -1 : (starToken.endColumn + 1)));
-							{
-								if ("" != null)
-									return item;
-							}
-						} catch(Exception ex) {
-							{
-								if (true)
-									throw generateParseException(ex);
-							}
-						}
-					} else {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case LEFT_PAR:
-							case PLUS:
-							case MINUS:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case BOX:
-							case CENTROID:
-							case CIRCLE:
-							case POINT:
-							case POLYGON:
-							case REGION:
-							case CONTAINS:
-							case INTERSECTS:
-							case AREA:
-							case COORD1:
-							case COORD2:
-							case COORDSYS:
-							case DISTANCE:
-							case ABS:
-							case CEILING:
-							case DEGREES:
-							case EXP:
-							case FLOOR:
-							case LOG:
-							case LOG10:
-							case MOD:
-							case PI:
-							case POWER:
-							case RADIANS:
-							case RAND:
-							case ROUND:
-							case SQRT:
-							case TRUNCATE:
-							case ACOS:
-							case ASIN:
-							case ATAN:
-							case ATAN2:
-							case COS:
-							case COT:
-							case SIN:
-							case TAN:
-							case STRING_LITERAL:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								op = ValueExpression();
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case AS:
-									case DELIMITED_IDENTIFIER:
-									case REGULAR_IDENTIFIER_CANDIDATE: {
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case AS: {
-												jj_consume_token(AS);
-												break;
-											}
-											default:
-												jj_la1[10] = jj_gen;
-												;
-										}
-										label = Identifier();
-										break;
-									}
-									default:
-										jj_la1[11] = jj_gen;
-										;
-								}
-								break;
-							}
-							default:
-								jj_la1[13] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-					}
-			}
-			try {
-				item = queryFactory.createSelectItem(op, (label == null) ? null : label.identifier);
-				if (label != null) {
-					item.setCaseSensitive(label.caseSensitivity);
-					item.setPosition(new TextPosition(op.getPosition(), label.position));
-				} else
-					item.setPosition(new TextPosition(op.getPosition()));
-				{
-					if ("" != null)
-						return item;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SelectItem");
-		}
-	}
-
-	final public void From() throws ParseException {
-		trace_call("From");
-		try {
-			FromContent content = null, content2 = null;
-			try {
-				jj_consume_token(FROM);
-				content = TableRef();
-				label_2: while(true) {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case COMMA: {
-							;
-							break;
-						}
-						default:
-							jj_la1[14] = jj_gen;
-							break label_2;
-					}
-					jj_consume_token(COMMA);
-					content2 = TableRef();
-					TextPosition startPos = content.getPosition(), endPos = content2.getPosition();
-					content = queryFactory.createJoin(JoinType.CROSS, content, content2);
-					content.setPosition(new TextPosition(startPos, endPos));
-				}
-				query.setFrom(content);
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-		} finally {
-			trace_return("From");
-		}
-	}
-
-	final public void Where() throws ParseException {
-		trace_call("Where");
-		try {
-			ClauseConstraints where = query.getWhere();
-			ADQLConstraint condition;
-			Token start;
-			start = jj_consume_token(WHERE);
-			ConditionsList(where);
-			TextPosition endPosition = where.getPosition();
-			where.setPosition(new TextPosition(start.beginLine, start.beginColumn, endPosition.endLine, endPosition.endColumn));
-		} finally {
-			trace_return("Where");
-		}
-	}
-
-	final public void GroupBy() throws ParseException {
-		trace_call("GroupBy");
-		try {
-			ClauseADQL<ADQLColumn> groupBy = query.getGroupBy();
-			ADQLColumn colRef = null;
-			Token start;
-			start = jj_consume_token(GROUP);
-			jj_consume_token(BY);
-			colRef = Column();
-			groupBy.add(colRef);
-			label_3: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COMMA: {
-						;
-						break;
-					}
-					default:
-						jj_la1[15] = jj_gen;
-						break label_3;
-				}
-				jj_consume_token(COMMA);
-				colRef = Column();
-				groupBy.add(colRef);
-			}
-			groupBy.setPosition(new TextPosition(start.beginLine, start.beginColumn, colRef.getPosition().endLine, colRef.getPosition().endColumn));
-		} finally {
-			trace_return("GroupBy");
-		}
-	}
-
-	final public void Having() throws ParseException {
-		trace_call("Having");
-		try {
-			ClauseConstraints having = query.getHaving();
-			Token start;
-			start = jj_consume_token(HAVING);
-			ConditionsList(having);
-			TextPosition endPosition = having.getPosition();
-			having.setPosition(new TextPosition(start.beginLine, start.beginColumn, endPosition.endLine, endPosition.endColumn));
-		} finally {
-			trace_return("Having");
-		}
-	}
-
-	final public void OrderBy() throws ParseException {
-		trace_call("OrderBy");
-		try {
-			ClauseADQL<ADQLOrder> orderBy = query.getOrderBy();
-			ADQLOrder order = null;
-			Token start;
-			start = jj_consume_token(ORDER);
-			jj_consume_token(BY);
-			order = OrderItem();
-			orderBy.add(order);
-			label_4: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COMMA: {
-						;
-						break;
-					}
-					default:
-						jj_la1[16] = jj_gen;
-						break label_4;
-				}
-				jj_consume_token(COMMA);
-				order = OrderItem();
-				orderBy.add(order);
-			}
-			orderBy.setPosition(new TextPosition(start, token));
-		} finally {
-			trace_return("OrderBy");
-		}
-	}
-
-	/* *************************** */
-	/* COLUMN AND TABLE REFERENCES */
-	/* *************************** */
-	final public IdentifierItem Identifier() throws ParseException {
-		trace_call("Identifier");
-		try {
-			Token t;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					t = jj_consume_token(REGULAR_IDENTIFIER_CANDIDATE);
-					testRegularIdentifier(t);
-					{
-						if ("" != null)
-							return new IdentifierItem(t, false);
-					}
-					break;
-				}
-				case DELIMITED_IDENTIFIER: {
-					t = jj_consume_token(DELIMITED_IDENTIFIER);
-					{
-						if ("" != null)
-							return new IdentifierItem(t, true);
-					}
-					break;
-				}
-				default:
-					jj_la1[17] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Identifier");
-		}
-	}
-
-	/**
-	 * Extracts the name of a table with its possible catalog and schema prefixes.
-	 * 
-	 * @return A {@link IdentifierItems} which contains at most three items: catalogName, schemaName and tableName.
-	 */
-	final public IdentifierItems TableName() throws ParseException {
-		trace_call("TableName");
-		try {
-			IdentifierItems identifiers = new IdentifierItems(true);
-			IdentifierItem id = null;
-			id = Identifier();
-			identifiers.append(id);
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DOT: {
-					jj_consume_token(DOT);
-					id = Identifier();
-					identifiers.append(id);
-					break;
-				}
-				default:
-					jj_la1[18] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DOT: {
-					jj_consume_token(DOT);
-					id = Identifier();
-					identifiers.append(id);
-					break;
-				}
-				default:
-					jj_la1[19] = jj_gen;
-					;
-			}
-			{
-				if ("" != null)
-					return identifiers;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("TableName");
-		}
-	}
-
-	/**
-	 * Extracts the name of a column with its possible catalog, schema and table prefixes.
-	 * 
-	 * @return A {@link IdentifierItems} which contains at most four items: catalogName, schemaName, tableName and columnName.
-	 */
-	final public IdentifierItems ColumnName() throws ParseException {
-		trace_call("ColumnName");
-		try {
-			IdentifierItem id;
-			IdentifierItems table = null, identifiers = new IdentifierItems(false);
-			id = Identifier();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DOT: {
-					jj_consume_token(DOT);
-					table = TableName();
-					break;
-				}
-				default:
-					jj_la1[20] = jj_gen;
-					;
-			}
-			identifiers.append(id);
-			if (table != null) {
-				for(int i = 0; i < table.size(); i++)
-					identifiers.append(table.get(i));
-			}
-			{
-				if ("" != null)
-					return identifiers;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ColumnName");
-		}
-	}
-
-	final public ADQLColumn Column() throws ParseException {
-		trace_call("Column");
-		try {
-			IdentifierItems identifiers;
-			identifiers = ColumnName();
-			try {
-				{
-					if ("" != null)
-						return queryFactory.createColumn(identifiers);
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Column");
-		}
-	}
-
-	final public ADQLOrder OrderItem() throws ParseException {
-		trace_call("OrderItem");
-		try {
-			IdentifierItem identifier = null;
-			Token ind = null, desc = null;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					identifier = Identifier();
-					break;
-				}
-				case UNSIGNED_INTEGER: {
-					ind = jj_consume_token(UNSIGNED_INTEGER);
-					break;
-				}
-				default:
-					jj_la1[21] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ASC:
-				case DESC: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case ASC: {
-							jj_consume_token(ASC);
-							break;
-						}
-						case DESC: {
-							desc = jj_consume_token(DESC);
-							break;
-						}
-						default:
-							jj_la1[22] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					break;
-				}
-				default:
-					jj_la1[23] = jj_gen;
-					;
-			}
-			try {
-				ADQLOrder order = null;
-				if (identifier != null) {
-					order = queryFactory.createOrder(identifier, desc != null);
-					order.setPosition(identifier.position);
-				} else {
-					order = queryFactory.createOrder(Integer.parseInt(ind.image), desc != null);
-					order.setPosition(new TextPosition(ind));
-				}
-				{
-					if ("" != null)
-						return order;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("OrderItem");
-		}
-	}
-
-	final public FromContent SimpleTableRef() throws ParseException {
-		trace_call("SimpleTableRef");
-		try {
-			IdentifierItem alias = null;
-			IdentifierItems identifiers = null;
-			ADQLQuery subQuery = null;
-			FromContent content = null;
-			Token start, end;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						identifiers = TableName();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case AS:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case AS: {
-										jj_consume_token(AS);
-										break;
-									}
-									default:
-										jj_la1[24] = jj_gen;
-										;
-								}
-								alias = Identifier();
-								break;
-							}
-							default:
-								jj_la1[25] = jj_gen;
-								;
-						}
-						content = queryFactory.createTable(identifiers, alias);
-						if (alias == null)
-							content.setPosition(new TextPosition(identifiers.get(0).position, identifiers.get(identifiers.size() - 1).position));
-						else
-							content.setPosition(new TextPosition(identifiers.get(0).position, alias.position));
-						{
-							if ("" != null)
-								return content;
-						}
-						break;
-					}
-					default:
-						jj_la1[27] = jj_gen;
-						if (jj_2_2(2)) {
-							subQuery = SubQueryExpression();
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case AS: {
-									jj_consume_token(AS);
-									break;
-								}
-								default:
-									jj_la1[26] = jj_gen;
-									;
-							}
-							alias = Identifier();
-							content = queryFactory.createTable(subQuery, alias);
-							if (alias == null)
-								content.setPosition(new TextPosition(subQuery.getPosition()));
-							else
-								content.setPosition(new TextPosition(subQuery.getPosition(), alias.position));
-							{
-								if ("" != null)
-									return content;
-							}
-						} else {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case LEFT_PAR: {
-									start = jj_consume_token(LEFT_PAR);
-									content = JoinedTable();
-									end = jj_consume_token(RIGHT_PAR);
-									content.setPosition(new TextPosition(start, end));
-									{
-										if ("" != null)
-											return content;
-									}
-									break;
-								}
-								default:
-									jj_la1[28] = jj_gen;
-									jj_consume_token(-1);
-									throw new ParseException();
-							}
-						}
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SimpleTableRef");
-		}
-	}
-
-	final public FromContent TableRef() throws ParseException {
-		trace_call("TableRef");
-		try {
-			FromContent content;
-			content = SimpleTableRef();
-			label_5: while(true) {
-				if (jj_2_3(2)) {
-					;
-				} else {
-					break label_5;
-				}
-				content = JoinSpecification(content);
-			}
-			{
-				if ("" != null)
-					return content;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("TableRef");
-		}
-	}
-
-	final public FromContent JoinedTable() throws ParseException {
-		trace_call("JoinedTable");
-		try {
-			FromContent content;
-			content = SimpleTableRef();
-			label_6: while(true) {
-				content = JoinSpecification(content);
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case NATURAL:
-					case INNER:
-					case RIGHT:
-					case LEFT:
-					case FULL:
-					case JOIN: {
-						;
-						break;
-					}
-					default:
-						jj_la1[29] = jj_gen;
-						break label_6;
-				}
-			}
-			{
-				if ("" != null)
-					return content;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("JoinedTable");
-		}
-	}
-
-	final public ADQLJoin JoinSpecification(FromContent leftTable) throws ParseException {
-		trace_call("JoinSpecification");
-		try {
-			boolean natural = false;
-			JoinType type = JoinType.INNER;
-			ClauseConstraints condition = new ClauseConstraints("ON");
-			ArrayList<ADQLColumn> lstColumns = new ArrayList<ADQLColumn>();
-			IdentifierItem id;
-			FromContent rightTable;
-			ADQLJoin join;
-			Token lastPar;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case NATURAL: {
-						jj_consume_token(NATURAL);
-						natural = true;
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case INNER:
-							case RIGHT:
-							case LEFT:
-							case FULL: {
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case INNER: {
-										jj_consume_token(INNER);
-										break;
-									}
-									case RIGHT:
-									case LEFT:
-									case FULL: {
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case LEFT: {
-												jj_consume_token(LEFT);
-												type = JoinType.OUTER_LEFT;
-												break;
-											}
-											case RIGHT: {
-												jj_consume_token(RIGHT);
-												type = JoinType.OUTER_RIGHT;
-												break;
-											}
-											case FULL: {
-												jj_consume_token(FULL);
-												type = JoinType.OUTER_FULL;
-												break;
-											}
-											default:
-												jj_la1[30] = jj_gen;
-												jj_consume_token(-1);
-												throw new ParseException();
-										}
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case OUTER: {
-												jj_consume_token(OUTER);
-												break;
-											}
-											default:
-												jj_la1[31] = jj_gen;
-												;
-										}
-										break;
-									}
-									default:
-										jj_la1[32] = jj_gen;
-										jj_consume_token(-1);
-										throw new ParseException();
-								}
-								break;
-							}
-							default:
-								jj_la1[33] = jj_gen;
-								;
-						}
-						jj_consume_token(JOIN);
-						rightTable = SimpleTableRef();
-						join = queryFactory.createJoin(type, leftTable, rightTable);
-						join.setPosition(new TextPosition(leftTable.getPosition(), rightTable.getPosition()));
-						{
-							if ("" != null)
-								return join;
-						}
-						break;
-					}
-					case INNER:
-					case RIGHT:
-					case LEFT:
-					case FULL:
-					case JOIN: {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case INNER:
-							case RIGHT:
-							case LEFT:
-							case FULL: {
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case INNER: {
-										jj_consume_token(INNER);
-										break;
-									}
-									case RIGHT:
-									case LEFT:
-									case FULL: {
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case LEFT: {
-												jj_consume_token(LEFT);
-												type = JoinType.OUTER_LEFT;
-												break;
-											}
-											case RIGHT: {
-												jj_consume_token(RIGHT);
-												type = JoinType.OUTER_RIGHT;
-												break;
-											}
-											case FULL: {
-												jj_consume_token(FULL);
-												type = JoinType.OUTER_FULL;
-												break;
-											}
-											default:
-												jj_la1[34] = jj_gen;
-												jj_consume_token(-1);
-												throw new ParseException();
-										}
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case OUTER: {
-												jj_consume_token(OUTER);
-												break;
-											}
-											default:
-												jj_la1[35] = jj_gen;
-												;
-										}
-										break;
-									}
-									default:
-										jj_la1[36] = jj_gen;
-										jj_consume_token(-1);
-										throw new ParseException();
-								}
-								break;
-							}
-							default:
-								jj_la1[37] = jj_gen;
-								;
-						}
-						jj_consume_token(JOIN);
-						rightTable = SimpleTableRef();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case ON: {
-								jj_consume_token(ON);
-								ConditionsList(condition);
-								join = queryFactory.createJoin(type, leftTable, rightTable, condition);
-								join.setPosition(new TextPosition(leftTable.getPosition(), condition.getPosition()));
-								{
-									if ("" != null)
-										return join;
-								}
-								break;
-							}
-							case USING: {
-								jj_consume_token(USING);
-								jj_consume_token(LEFT_PAR);
-								id = Identifier();
-								lstColumns.add(queryFactory.createColumn(id));
-								label_7: while(true) {
-									switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-										case COMMA: {
-											;
-											break;
-										}
-										default:
-											jj_la1[38] = jj_gen;
-											break label_7;
-									}
-									jj_consume_token(COMMA);
-									id = Identifier();
-									lstColumns.add(queryFactory.createColumn(id));
-								}
-								lastPar = jj_consume_token(RIGHT_PAR);
-								join = queryFactory.createJoin(type, leftTable, rightTable, lstColumns);
-								join.setPosition(new TextPosition(leftTable.getPosition().beginLine, leftTable.getPosition().beginColumn, lastPar.endLine, (lastPar.endColumn < 0) ? -1 : (lastPar.endColumn + 1)));
-								{
-									if ("" != null)
-										return join;
-								}
-								break;
-							}
-							default:
-								jj_la1[39] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						break;
-					}
-					default:
-						jj_la1[40] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("JoinSpecification");
-		}
-	}
-
-	/* ****** */
-	/* STRING */
-	/* ****** */
-	final public StringConstant String() throws ParseException {
-		trace_call("String");
-		try {
-			Token t, start = null;
-			String str = "";
-			StringConstant cst;
-			label_8: while(true) {
-				t = jj_consume_token(STRING_LITERAL);
-				str += t.image.substring(1, t.image.length() - 1).replaceAll("''", "'");
-				if (start == null)
-					start = t;
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case STRING_LITERAL: {
-						;
-						break;
-					}
-					default:
-						jj_la1[41] = jj_gen;
-						break label_8;
-				}
-			}
-			try {
-				cst = queryFactory.createStringConstant(str);
-				cst.setPosition(new TextPosition(start, t));
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("String");
-		}
-	}
-
-	/* ************* */
-	/* NUMERIC TYPES */
-	/* ************* */
-	final public NumericConstant UnsignedNumeric() throws ParseException {
-		trace_call("UnsignedNumeric");
-		try {
-			Token t;
-			NumericConstant cst;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case SCIENTIFIC_NUMBER: {
-					t = jj_consume_token(SCIENTIFIC_NUMBER);
-					break;
-				}
-				case UNSIGNED_FLOAT: {
-					t = jj_consume_token(UNSIGNED_FLOAT);
-					break;
-				}
-				case UNSIGNED_INTEGER: {
-					t = jj_consume_token(UNSIGNED_INTEGER);
-					break;
-				}
-				default:
-					jj_la1[42] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			try {
-				cst = queryFactory.createNumericConstant(t.image);
-				cst.setPosition(new TextPosition(t));
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("UnsignedNumeric");
-		}
-	}
-
-	final public NumericConstant UnsignedFloat() throws ParseException {
-		trace_call("UnsignedFloat");
-		try {
-			Token t;
-			NumericConstant cst;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case UNSIGNED_INTEGER: {
-					t = jj_consume_token(UNSIGNED_INTEGER);
-					break;
-				}
-				case UNSIGNED_FLOAT: {
-					t = jj_consume_token(UNSIGNED_FLOAT);
-					break;
-				}
-				default:
-					jj_la1[43] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			try {
-				cst = queryFactory.createNumericConstant(t.image);
-				cst.setPosition(new TextPosition(t));
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("UnsignedFloat");
-		}
-	}
-
-	final public NumericConstant SignedInteger() throws ParseException {
-		trace_call("SignedInteger");
-		try {
-			Token sign = null, number;
-			NumericConstant cst;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case PLUS:
-				case MINUS: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case PLUS: {
-							sign = jj_consume_token(PLUS);
-							break;
-						}
-						case MINUS: {
-							sign = jj_consume_token(MINUS);
-							break;
-						}
-						default:
-							jj_la1[44] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					break;
-				}
-				default:
-					jj_la1[45] = jj_gen;
-					;
-			}
-			number = jj_consume_token(UNSIGNED_INTEGER);
-			try {
-				if (sign == null) {
-					cst = queryFactory.createNumericConstant(number.image);
-					cst.setPosition(new TextPosition(number));
-				} else {
-					cst = queryFactory.createNumericConstant(sign.image + number.image);
-					cst.setPosition(new TextPosition(sign, number));
-				}
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SignedInteger");
-		}
-	}
-
-	/* *********** */
-	/* EXPRESSIONS */
-	/* *********** */
-	final public ADQLOperand NumericValueExpressionPrimary() throws ParseException {
-		trace_call("NumericValueExpressionPrimary");
-		try {
-			ADQLColumn column;
-			ADQLOperand op;
-			Token left, right;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case SCIENTIFIC_NUMBER:
-					case UNSIGNED_FLOAT:
-					case UNSIGNED_INTEGER: {
-						// unsigned_value_specification
-						op = UnsignedNumeric();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						column = Column();
-						column.setExpectedType('N');
-						{
-							if ("" != null)
-								return column;
-						}
-						break;
-					}
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM:
-					case COUNT: {
-						op = SqlFunction();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case LEFT_PAR: {
-						left = jj_consume_token(LEFT_PAR);
-						op = NumericExpression();
-						right = jj_consume_token(RIGHT_PAR);
-						WrappedOperand wop = queryFactory.createWrappedOperand(op);
-						wop.setPosition(new TextPosition(left, right));
-						{
-							if ("" != null)
-								return wop;
-						}
-						break;
-					}
-					default:
-						jj_la1[46] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericValueExpressionPrimary");
-		}
-	}
-
-	final public ADQLOperand StringValueExpressionPrimary() throws ParseException {
-		trace_call("StringValueExpressionPrimary");
-		try {
-			StringConstant expr;
-			ADQLColumn column;
-			ADQLOperand op;
-			Token left, right;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case STRING_LITERAL: {
-						// string
-						expr = String();
-						{
-							if ("" != null)
-								return expr;
-						}
-						break;
-					}
-					case SCIENTIFIC_NUMBER:
-					case UNSIGNED_FLOAT:
-					case UNSIGNED_INTEGER: {
-						op = UnsignedNumeric();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM:
-					case COUNT: {
-						op = SqlFunction();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						column = Column();
-						column.setExpectedType('*');
-						{
-							if ("" != null)
-								return column;
-						}
-						break;
-					}
-					case LEFT_PAR: {
-						left = jj_consume_token(LEFT_PAR);
-						op = ValueExpression();
-						right = jj_consume_token(RIGHT_PAR);
-						WrappedOperand wop = queryFactory.createWrappedOperand(op);
-						wop.setPosition(new TextPosition(left, right));
-						{
-							if ("" != null)
-								return wop;
-						}
-						break;
-					}
-					default:
-						jj_la1[47] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("StringValueExpressionPrimary");
-		}
-	}
-
-	final public ADQLOperand ValueExpression() throws ParseException {
-		trace_call("ValueExpression");
-		try {
-			ADQLOperand valueExpr = null;
-			Token left, right;
-			try {
-				if (jj_2_4(2147483647)) {
-					valueExpr = NumericExpression();
-				} else if (jj_2_5(2147483647)) {
-					valueExpr = StringExpression();
-				} else if (jj_2_6(2147483647)) {
-					left = jj_consume_token(LEFT_PAR);
-					valueExpr = ValueExpression();
-					right = jj_consume_token(RIGHT_PAR);
-					valueExpr = queryFactory.createWrappedOperand(valueExpr);
-					((WrappedOperand)valueExpr).setPosition(new TextPosition(left, right));
-				} else if (jj_2_7(2147483647)) {
-					valueExpr = UserDefinedFunction();
-				} else if (jj_2_8(2)) {
-					valueExpr = GeometryValueFunction();
-				} else if (jj_2_9(2147483647)) {
-					valueExpr = Column();
-				} else if (jj_2_10(2147483647)) {
-					valueExpr = StringFactor();
-				} else if (jj_2_11(3)) {
-					valueExpr = Factor();
-				} else {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case DELIMITED_IDENTIFIER:
-						case REGULAR_IDENTIFIER_CANDIDATE: {
-							valueExpr = Column();
-							break;
-						}
-						default:
-							jj_la1[48] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-				}
-				{
-					if ("" != null)
-						return valueExpr;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ValueExpression");
-		}
-	}
-
-	final public ADQLOperand NumericExpression() throws ParseException {
-		trace_call("NumericExpression");
-		try {
-			Token sign = null;
-			ADQLOperand leftOp, rightOp = null;
-			leftOp = NumericTerm();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case PLUS:
-				case MINUS: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case PLUS: {
-							sign = jj_consume_token(PLUS);
-							break;
-						}
-						case MINUS: {
-							sign = jj_consume_token(MINUS);
-							break;
-						}
-						default:
-							jj_la1[49] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					rightOp = NumericExpression();
-					break;
-				}
-				default:
-					jj_la1[50] = jj_gen;
-					;
-			}
-			if (sign == null) {
-				if ("" != null)
-					return leftOp;
-			} else {
-				try {
-					Operation operation = queryFactory.createOperation(leftOp, OperationType.getOperator(sign.image), rightOp);
-					operation.setPosition(new TextPosition(leftOp.getPosition(), rightOp.getPosition()));
-					{
-						if ("" != null)
-							return operation;
-					}
-				} catch(Exception ex) {
-					{
-						if (true)
-							throw generateParseException(ex);
-					}
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericExpression");
-		}
-	}
-
-	final public ADQLOperand NumericTerm() throws ParseException {
-		trace_call("NumericTerm");
-		try {
-			Token sign = null;
-			ADQLOperand leftOp, rightOp = null;
-			leftOp = Factor();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ASTERISK:
-				case DIVIDE: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case ASTERISK: {
-							sign = jj_consume_token(ASTERISK);
-							break;
-						}
-						case DIVIDE: {
-							sign = jj_consume_token(DIVIDE);
-							break;
-						}
-						default:
-							jj_la1[51] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					rightOp = NumericTerm();
-					break;
-				}
-				default:
-					jj_la1[52] = jj_gen;
-					;
-			}
-			if (sign == null) {
-				if ("" != null)
-					return leftOp;
-			} else {
-				try {
-					Operation operation = queryFactory.createOperation(leftOp, OperationType.getOperator(sign.image), rightOp);
-					operation.setPosition(new TextPosition(leftOp.getPosition(), rightOp.getPosition()));
-					{
-						if ("" != null)
-							return operation;
-					}
-				} catch(Exception ex) {
-					{
-						if (true)
-							throw generateParseException(ex);
-					}
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericTerm");
-		}
-	}
-
-	final public ADQLOperand Factor() throws ParseException {
-		trace_call("Factor");
-		try {
-			boolean negative = false;
-			Token minusSign = null;
-			ADQLOperand op;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case PLUS:
-				case MINUS: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case PLUS: {
-							jj_consume_token(PLUS);
-							break;
-						}
-						case MINUS: {
-							minusSign = jj_consume_token(MINUS);
-							negative = true;
-							break;
-						}
-						default:
-							jj_la1[53] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					break;
-				}
-				default:
-					jj_la1[54] = jj_gen;
-					;
-			}
-			if (jj_2_12(2)) {
-				op = NumericFunction();
-			} else {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case LEFT_PAR:
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM:
-					case COUNT:
-					case SCIENTIFIC_NUMBER:
-					case UNSIGNED_FLOAT:
-					case UNSIGNED_INTEGER:
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						op = NumericValueExpressionPrimary();
-						break;
-					}
-					default:
-						jj_la1[55] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			}
-			if (negative) {
-				try {
-					TextPosition position = op.getPosition();
-					op = queryFactory.createNegativeOperand(op);
-					NegativeOperand negativeOp = (NegativeOperand)op;
-					if (minusSign != null)
-						negativeOp.setPosition(new TextPosition(minusSign.beginLine, minusSign.beginColumn, position.endLine, position.endColumn));
-					else
-						negativeOp.setPosition(position);
-				} catch(Exception ex) {
-					{
-						if (true)
-							throw generateParseException(ex);
-					}
-				}
-			}
-
-			{
-				if ("" != null)
-					return op;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Factor");
-		}
-	}
-
-	@Override
-	final public ADQLOperand StringExpression() throws ParseException {
-		trace_call("StringExpression");
-		try {
-			ADQLOperand leftOp;
-			ADQLOperand rightOp = null;
-			leftOp = StringFactor();
-			label_9: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case CONCAT: {
-						;
-						break;
-					}
-					default:
-						jj_la1[56] = jj_gen;
-						break label_9;
-				}
-				jj_consume_token(CONCAT);
-				rightOp = StringFactor();
-				if (!(leftOp instanceof Concatenation)) {
-					try {
-						ADQLOperand temp = leftOp;
-						leftOp = queryFactory.createConcatenation();
-						((Concatenation)leftOp).add(temp);
-					} catch(Exception ex) {
-						{
-							if (true)
-								throw generateParseException(ex);
-						}
-					}
-				}
-				((Concatenation)leftOp).add(rightOp);
-			}
-			if (leftOp instanceof Concatenation) {
-				Concatenation concat = (Concatenation)leftOp;
-				concat.setPosition(new TextPosition(concat.get(0).getPosition(), concat.get(concat.size() - 1).getPosition()));
-			}
-			{
-				if ("" != null)
-					return leftOp;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("StringExpression");
-		}
-	}
-
-	final public ADQLOperand StringFactor() throws ParseException {
-		trace_call("StringFactor");
-		try {
-			ADQLOperand op;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case COORDSYS: {
-					op = ExtractCoordSys();
-					break;
-				}
-				default:
-					jj_la1[57] = jj_gen;
-					if (jj_2_13(2)) {
-						op = UserDefinedFunction();
-						((UserDefinedFunction)op).setExpectedType('S');
-					} else {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case LEFT_PAR:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case STRING_LITERAL:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								op = StringValueExpressionPrimary();
-								break;
-							}
-							default:
-								jj_la1[58] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-					}
-			}
-			{
-				if ("" != null)
-					return op;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("StringFactor");
-		}
-	}
-
-	final public GeometryValue<GeometryFunction> GeometryExpression() throws ParseException {
-		trace_call("GeometryExpression");
-		try {
-			ADQLColumn col = null;
-			GeometryFunction gf = null;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					col = Column();
-					break;
-				}
-				case BOX:
-				case CENTROID:
-				case CIRCLE:
-				case POINT:
-				case POLYGON:
-				case REGION: {
-					gf = GeometryValueFunction();
-					break;
-				}
-				default:
-					jj_la1[59] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			if (col != null) {
-				col.setExpectedType('G');
-				{
-					if ("" != null)
-						return new GeometryValue<GeometryFunction>(col);
-				}
-			} else {
-				if ("" != null)
-					return new GeometryValue<GeometryFunction>(gf);
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("GeometryExpression");
-		}
-	}
-
-	/* ********************************** */
-	/* BOOLEAN EXPRESSIONS (WHERE clause) */
-	/* ********************************** */
-	final public ClauseConstraints ConditionsList(ClauseConstraints clause) throws ParseException {
-		trace_call("ConditionsList");
-		try {
-			ADQLConstraint constraint = null;
-			Token op = null;
-			boolean notOp = false;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case NOT: {
-						op = jj_consume_token(NOT);
-						notOp = true;
-						break;
-					}
-					default:
-						jj_la1[60] = jj_gen;
-						;
-				}
-				constraint = Constraint();
-				if (notOp) {
-					TextPosition oldPos = constraint.getPosition();
-					constraint = queryFactory.createNot(constraint);
-					((NotConstraint)constraint).setPosition(new TextPosition(op.beginLine, op.beginColumn, oldPos.endLine, oldPos.endColumn));
-				}
-				notOp = false;
-
-				if (clause instanceof ADQLConstraint)
-					clause.add(constraint);
-				else
-					clause.add(constraint);
-				label_10: while(true) {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case AND:
-						case OR: {
-							;
-							break;
-						}
-						default:
-							jj_la1[61] = jj_gen;
-							break label_10;
-					}
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case AND: {
-							op = jj_consume_token(AND);
-							break;
-						}
-						case OR: {
-							op = jj_consume_token(OR);
-							break;
-						}
-						default:
-							jj_la1[62] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case NOT: {
-							jj_consume_token(NOT);
-							notOp = true;
-							break;
-						}
-						default:
-							jj_la1[63] = jj_gen;
-							;
-					}
-					constraint = Constraint();
-					if (notOp) {
-						TextPosition oldPos = constraint.getPosition();
-						constraint = queryFactory.createNot(constraint);
-						((NotConstraint)constraint).setPosition(new TextPosition(op.beginLine, op.beginColumn, oldPos.endLine, oldPos.endColumn));
-					}
-					notOp = false;
-
-					if (clause instanceof ADQLConstraint)
-						clause.add(op.image, constraint);
-					else
-						clause.add(op.image, constraint);
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			if (!clause.isEmpty()) {
-				TextPosition start = clause.get(0).getPosition();
-				TextPosition end = clause.get(clause.size() - 1).getPosition();
-				clause.setPosition(new TextPosition(start, end));
-			}
-			{
-				if ("" != null)
-					return clause;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ConditionsList");
-		}
-	}
-
-	final public ADQLConstraint Constraint() throws ParseException {
-		trace_call("Constraint");
-		try {
-			ADQLConstraint constraint = null;
-			Token start, end;
-			if (jj_2_14(2147483647)) {
-				constraint = Predicate();
-			} else {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case LEFT_PAR: {
-						start = jj_consume_token(LEFT_PAR);
-						try {
-							constraint = queryFactory.createGroupOfConstraints();
-						} catch(Exception ex) {
-							{
-								if (true)
-									throw generateParseException(ex);
-							}
-						}
-						ConditionsList((ConstraintsGroup)constraint);
-						end = jj_consume_token(RIGHT_PAR);
-						((ConstraintsGroup)constraint).setPosition(new TextPosition(start, end));
-						break;
-					}
-					default:
-						jj_la1[64] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			}
-			{
-				if ("" != null)
-					return constraint;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Constraint");
-		}
-	}
-
-	final public ADQLConstraint Predicate() throws ParseException {
-		trace_call("Predicate");
-		try {
-			ADQLQuery q = null;
-			ADQLColumn column = null;
-			ADQLOperand strExpr1 = null, strExpr2 = null;
-			ADQLOperand op;
-			Token start, notToken = null, end;
-			ADQLConstraint constraint = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case EXISTS: {
-						start = jj_consume_token(EXISTS);
-						q = SubQueryExpression();
-						Exists e = queryFactory.createExists(q);
-						e.setPosition(new TextPosition(start.beginLine, start.beginColumn, q.getPosition().endLine, q.getPosition().endColumn));
-						{
-							if ("" != null)
-								return e;
-						}
-						break;
-					}
-					default:
-						jj_la1[69] = jj_gen;
-						if (jj_2_16(2147483647)) {
-							column = Column();
-							jj_consume_token(IS);
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case NOT: {
-									notToken = jj_consume_token(NOT);
-									break;
-								}
-								default:
-									jj_la1[65] = jj_gen;
-									;
-							}
-							end = jj_consume_token(NULL);
-							IsNull in = queryFactory.createIsNull((notToken != null), column);
-							in.setPosition(new TextPosition(column.getPosition().beginLine, column.getPosition().beginColumn, end.endLine, (end.endColumn < 0) ? -1 : (end.endColumn + 1)));
-							{
-								if ("" != null)
-									return in;
-							}
-						} else if (jj_2_17(2147483647)) {
-							strExpr1 = StringExpression();
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case NOT: {
-									notToken = jj_consume_token(NOT);
-									break;
-								}
-								default:
-									jj_la1[66] = jj_gen;
-									;
-							}
-							jj_consume_token(LIKE);
-							strExpr2 = StringExpression();
-							Comparison comp = queryFactory.createComparison(strExpr1, (notToken == null) ? ComparisonOperator.LIKE : ComparisonOperator.NOTLIKE, strExpr2);
-							comp.setPosition(new TextPosition(strExpr1.getPosition(), strExpr2.getPosition()));
-							{
-								if ("" != null)
-									return comp;
-							}
-						} else {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case LEFT_PAR:
-								case PLUS:
-								case MINUS:
-								case AVG:
-								case MAX:
-								case MIN:
-								case SUM:
-								case COUNT:
-								case BOX:
-								case CENTROID:
-								case CIRCLE:
-								case POINT:
-								case POLYGON:
-								case REGION:
-								case CONTAINS:
-								case INTERSECTS:
-								case AREA:
-								case COORD1:
-								case COORD2:
-								case COORDSYS:
-								case DISTANCE:
-								case ABS:
-								case CEILING:
-								case DEGREES:
-								case EXP:
-								case FLOOR:
-								case LOG:
-								case LOG10:
-								case MOD:
-								case PI:
-								case POWER:
-								case RADIANS:
-								case RAND:
-								case ROUND:
-								case SQRT:
-								case TRUNCATE:
-								case ACOS:
-								case ASIN:
-								case ATAN:
-								case ATAN2:
-								case COS:
-								case COT:
-								case SIN:
-								case TAN:
-								case STRING_LITERAL:
-								case SCIENTIFIC_NUMBER:
-								case UNSIGNED_FLOAT:
-								case UNSIGNED_INTEGER:
-								case DELIMITED_IDENTIFIER:
-								case REGULAR_IDENTIFIER_CANDIDATE: {
-									op = ValueExpression();
-									switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-										case EQUAL:
-										case NOT_EQUAL:
-										case LESS_THAN:
-										case LESS_EQUAL_THAN:
-										case GREATER_THAN:
-										case GREATER_EQUAL_THAN: {
-											constraint = ComparisonEnd(op);
-											break;
-										}
-										default:
-											jj_la1[67] = jj_gen;
-											if (jj_2_15(2)) {
-												constraint = BetweenEnd(op);
-											} else {
-												switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-													case NOT:
-													case IN: {
-														constraint = InEnd(op);
-														break;
-													}
-													default:
-														jj_la1[68] = jj_gen;
-														jj_consume_token(-1);
-														throw new ParseException();
-												}
-											}
-									}
-									break;
-								}
-								default:
-									jj_la1[70] = jj_gen;
-									jj_consume_token(-1);
-									throw new ParseException();
-							}
-						}
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			{
-				if ("" != null)
-					return constraint;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Predicate");
-		}
-	}
-
-	final public Comparison ComparisonEnd(ADQLOperand leftOp) throws ParseException {
-		trace_call("ComparisonEnd");
-		try {
-			Token comp;
-			ADQLOperand rightOp;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case EQUAL: {
-					comp = jj_consume_token(EQUAL);
-					break;
-				}
-				case NOT_EQUAL: {
-					comp = jj_consume_token(NOT_EQUAL);
-					break;
-				}
-				case LESS_THAN: {
-					comp = jj_consume_token(LESS_THAN);
-					break;
-				}
-				case LESS_EQUAL_THAN: {
-					comp = jj_consume_token(LESS_EQUAL_THAN);
-					break;
-				}
-				case GREATER_THAN: {
-					comp = jj_consume_token(GREATER_THAN);
-					break;
-				}
-				case GREATER_EQUAL_THAN: {
-					comp = jj_consume_token(GREATER_EQUAL_THAN);
-					break;
-				}
-				default:
-					jj_la1[71] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			rightOp = ValueExpression();
-			try {
-				Comparison comparison = queryFactory.createComparison(leftOp, ComparisonOperator.getOperator(comp.image), rightOp);
-				comparison.setPosition(new TextPosition(leftOp.getPosition(), rightOp.getPosition()));
-				{
-					if ("" != null)
-						return comparison;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ComparisonEnd");
-		}
-	}
-
-	final public Between BetweenEnd(ADQLOperand leftOp) throws ParseException {
-		trace_call("BetweenEnd");
-		try {
-			Token start, notToken = null;
-			ADQLOperand min, max;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case NOT: {
-					notToken = jj_consume_token(NOT);
-					break;
-				}
-				default:
-					jj_la1[72] = jj_gen;
-					;
-			}
-			start = jj_consume_token(BETWEEN);
-			min = ValueExpression();
-			jj_consume_token(AND);
-			max = ValueExpression();
-			try {
-				Between bet = queryFactory.createBetween((notToken != null), leftOp, min, max);
-				if (notToken != null)
-					start = notToken;
-				bet.setPosition(new TextPosition(start.beginLine, start.beginColumn, max.getPosition().endLine, max.getPosition().endColumn));
-				{
-					if ("" != null)
-						return bet;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("BetweenEnd");
-		}
-	}
-
-	final public In InEnd(ADQLOperand leftOp) throws ParseException {
-		trace_call("InEnd");
-		try {
-			Token not = null, start;
-			ADQLQuery q = null;
-			ADQLOperand item;
-			Vector<ADQLOperand> items = new Vector<ADQLOperand>();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case NOT: {
-					not = jj_consume_token(NOT);
-					break;
-				}
-				default:
-					jj_la1[73] = jj_gen;
-					;
-			}
-			start = jj_consume_token(IN);
-			if (jj_2_18(2)) {
-				q = SubQueryExpression();
-			} else {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case LEFT_PAR: {
-						jj_consume_token(LEFT_PAR);
-						item = ValueExpression();
-						items.add(item);
-						label_11: while(true) {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case COMMA: {
-									;
-									break;
-								}
-								default:
-									jj_la1[74] = jj_gen;
-									break label_11;
-							}
-							jj_consume_token(COMMA);
-							item = ValueExpression();
-							items.add(item);
-						}
-						jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					default:
-						jj_la1[75] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			}
-			try {
-				In in;
-				start = (not != null) ? not : start;
-				if (q != null) {
-					in = queryFactory.createIn(leftOp, q, not != null);
-					in.setPosition(new TextPosition(start.beginLine, start.beginColumn, q.getPosition().endLine, q.getPosition().endColumn));
-				} else {
-					ADQLOperand[] list = new ADQLOperand[items.size()];
-					int i = 0;
-					for(ADQLOperand op : items)
-						list[i++] = op;
-					in = queryFactory.createIn(leftOp, list, not != null);
-					in.setPosition(new TextPosition(start.beginLine, start.beginColumn, list[list.length - 1].getPosition().endLine, list[list.length - 1].getPosition().endColumn));
-				}
-				{
-					if ("" != null)
-						return in;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("InEnd");
-		}
-	}
-
-	/* ************* */
-	/* SQL FUNCTIONS */
-	/* ************* */
-	final public SQLFunction SqlFunction() throws ParseException {
-		trace_call("SqlFunction");
-		try {
-			Token fct, all = null, distinct = null, end;
-			ADQLOperand op = null;
-			SQLFunction funct = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COUNT: {
-						fct = jj_consume_token(COUNT);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case QUANTIFIER: {
-								distinct = jj_consume_token(QUANTIFIER);
-								break;
-							}
-							default:
-								jj_la1[76] = jj_gen;
-								;
-						}
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case ASTERISK: {
-								all = jj_consume_token(ASTERISK);
-								break;
-							}
-							case LEFT_PAR:
-							case PLUS:
-							case MINUS:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case BOX:
-							case CENTROID:
-							case CIRCLE:
-							case POINT:
-							case POLYGON:
-							case REGION:
-							case CONTAINS:
-							case INTERSECTS:
-							case AREA:
-							case COORD1:
-							case COORD2:
-							case COORDSYS:
-							case DISTANCE:
-							case ABS:
-							case CEILING:
-							case DEGREES:
-							case EXP:
-							case FLOOR:
-							case LOG:
-							case LOG10:
-							case MOD:
-							case PI:
-							case POWER:
-							case RADIANS:
-							case RAND:
-							case ROUND:
-							case SQRT:
-							case TRUNCATE:
-							case ACOS:
-							case ASIN:
-							case ATAN:
-							case ATAN2:
-							case COS:
-							case COT:
-							case SIN:
-							case TAN:
-							case STRING_LITERAL:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								op = ValueExpression();
-								break;
-							}
-							default:
-								jj_la1[77] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						funct = queryFactory.createSQLFunction((all != null) ? SQLFunctionType.COUNT_ALL : SQLFunctionType.COUNT, op, distinct != null && distinct.image.equalsIgnoreCase("distinct"));
-						funct.setPosition(new TextPosition(fct, end));
-						break;
-					}
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM: {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case AVG: {
-								fct = jj_consume_token(AVG);
-								break;
-							}
-							case MAX: {
-								fct = jj_consume_token(MAX);
-								break;
-							}
-							case MIN: {
-								fct = jj_consume_token(MIN);
-								break;
-							}
-							case SUM: {
-								fct = jj_consume_token(SUM);
-								break;
-							}
-							default:
-								jj_la1[78] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case QUANTIFIER: {
-								distinct = jj_consume_token(QUANTIFIER);
-								break;
-							}
-							default:
-								jj_la1[79] = jj_gen;
-								;
-						}
-						op = ValueExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						funct = queryFactory.createSQLFunction(SQLFunctionType.valueOf(fct.image.toUpperCase()), op, distinct != null && distinct.image.equalsIgnoreCase("distinct"));
-						funct.setPosition(new TextPosition(fct, end));
-						break;
-					}
-					default:
-						jj_la1[80] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			{
-				if ("" != null)
-					return funct;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SqlFunction");
-		}
-	}
-
-	/* ************** */
-	/* ADQL FUNCTIONS */
-	/* ************** */
-	final public ADQLOperand[] Coordinates() throws ParseException {
-		trace_call("Coordinates");
-		try {
-			ADQLOperand[] ops = new ADQLOperand[2];
-			ops[0] = NumericExpression();
-			jj_consume_token(COMMA);
-			ops[1] = NumericExpression();
-			{
-				if ("" != null)
-					return ops;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Coordinates");
-		}
-	}
-
-	final public GeometryFunction GeometryFunction() throws ParseException {
-		trace_call("GeometryFunction");
-		try {
-			Token fct = null, end;
-			GeometryValue<GeometryFunction> gvf1, gvf2;
-			GeometryValue<PointFunction> gvp1, gvp2;
-			GeometryFunction gf = null;
-			PointFunction p1 = null, p2 = null;
-			ADQLColumn col1 = null, col2 = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case CONTAINS:
-					case INTERSECTS: {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case CONTAINS: {
-								fct = jj_consume_token(CONTAINS);
-								break;
-							}
-							case INTERSECTS: {
-								fct = jj_consume_token(INTERSECTS);
-								break;
-							}
-							default:
-								jj_la1[81] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						jj_consume_token(LEFT_PAR);
-						gvf1 = GeometryExpression();
-						jj_consume_token(COMMA);
-						gvf2 = GeometryExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						if (fct.image.equalsIgnoreCase("contains"))
-							gf = queryFactory.createContains(gvf1, gvf2);
-						else
-							gf = queryFactory.createIntersects(gvf1, gvf2);
-						break;
-					}
-					case AREA: {
-						fct = jj_consume_token(AREA);
-						jj_consume_token(LEFT_PAR);
-						gvf1 = GeometryExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createArea(gvf1);
-						break;
-					}
-					case COORD1: {
-						fct = jj_consume_token(COORD1);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p1 = Point();
-								gf = queryFactory.createCoord1(p1);
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col1 = Column();
-								col1.setExpectedType('G');
-								gf = queryFactory.createCoord1(col1);
-								break;
-							}
-							default:
-								jj_la1[82] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case COORD2: {
-						fct = jj_consume_token(COORD2);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p1 = Point();
-								gf = queryFactory.createCoord2(p1);
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col1 = Column();
-								col1.setExpectedType('G');
-								gf = queryFactory.createCoord2(col1);
-								break;
-							}
-							default:
-								jj_la1[83] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case DISTANCE: {
-						fct = jj_consume_token(DISTANCE);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p1 = Point();
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col1 = Column();
-								break;
-							}
-							default:
-								jj_la1[84] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						if (p1 != null)
-							gvp1 = new GeometryValue<PointFunction>(p1);
-						else {
-							col1.setExpectedType('G');
-							gvp1 = new GeometryValue<PointFunction>(col1);
-						}
-						jj_consume_token(COMMA);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p2 = Point();
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col2 = Column();
-								break;
-							}
-							default:
-								jj_la1[85] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						if (p2 != null)
-							gvp2 = new GeometryValue<PointFunction>(p2);
-						else {
-							col2.setExpectedType('G');
-							gvp2 = new GeometryValue<PointFunction>(col2);
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createDistance(gvp1, gvp2);
-						break;
-					}
-					default:
-						jj_la1[86] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			gf.setPosition(new TextPosition(fct, end));
-			{
-				if ("" != null)
-					return gf;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("GeometryFunction");
-		}
-	}
-
-	final public ADQLOperand CoordinateSystem() throws ParseException {
-		trace_call("CoordinateSystem");
-		try {
-			ADQLOperand coordSys = null;
-			coordSys = StringExpression();
-			{
-				if ("" != null)
-					return coordSys;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("CoordinateSystem");
-		}
-	}
-
-	final public GeometryFunction GeometryValueFunction() throws ParseException {
-		trace_call("GeometryValueFunction");
-		try {
-			Token fct = null, end = null;
-			ADQLOperand coordSys;
-			ADQLOperand width, height;
-			ADQLOperand[] coords, tmp;
-			Vector<ADQLOperand> vCoords;
-			ADQLOperand op = null;
-			GeometryValue<GeometryFunction> gvf = null;
-			GeometryFunction gf = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case BOX: {
-						fct = jj_consume_token(BOX);
-						jj_consume_token(LEFT_PAR);
-						coordSys = CoordinateSystem();
-						jj_consume_token(COMMA);
-						coords = Coordinates();
-						jj_consume_token(COMMA);
-						width = NumericExpression();
-						jj_consume_token(COMMA);
-						height = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createBox(coordSys, coords[0], coords[1], width, height);
-						break;
-					}
-					case CENTROID: {
-						fct = jj_consume_token(CENTROID);
-						jj_consume_token(LEFT_PAR);
-						gvf = GeometryExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createCentroid(gvf);
-						break;
-					}
-					case CIRCLE: {
-						fct = jj_consume_token(CIRCLE);
-						jj_consume_token(LEFT_PAR);
-						coordSys = CoordinateSystem();
-						jj_consume_token(COMMA);
-						coords = Coordinates();
-						jj_consume_token(COMMA);
-						width = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createCircle(coordSys, coords[0], coords[1], width);
-						break;
-					}
-					case POINT: {
-						gf = Point();
-						break;
-					}
-					case POLYGON: {
-						fct = jj_consume_token(POLYGON);
-						jj_consume_token(LEFT_PAR);
-						coordSys = CoordinateSystem();
-						vCoords = new Vector<ADQLOperand>();
-						jj_consume_token(COMMA);
-						tmp = Coordinates();
-						vCoords.add(tmp[0]);
-						vCoords.add(tmp[1]);
-						jj_consume_token(COMMA);
-						tmp = Coordinates();
-						vCoords.add(tmp[0]);
-						vCoords.add(tmp[1]);
-						jj_consume_token(COMMA);
-						tmp = Coordinates();
-						vCoords.add(tmp[0]);
-						vCoords.add(tmp[1]);
-						label_12: while(true) {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case COMMA: {
-									;
-									break;
-								}
-								default:
-									jj_la1[87] = jj_gen;
-									break label_12;
-							}
-							jj_consume_token(COMMA);
-							tmp = Coordinates();
-							vCoords.add(tmp[0]);
-							vCoords.add(tmp[1]);
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createPolygon(coordSys, vCoords);
-						break;
-					}
-					case REGION: {
-						fct = jj_consume_token(REGION);
-						jj_consume_token(LEFT_PAR);
-						op = StringExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createRegion(op);
-						break;
-					}
-					default:
-						jj_la1[88] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			if (fct != null && end != null) // = !(gf instanceof Point)
-				gf.setPosition(new TextPosition(fct, end));
-			{
-				if ("" != null)
-					return gf;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("GeometryValueFunction");
-		}
-	}
-
-	final public PointFunction Point() throws ParseException {
-		trace_call("Point");
-		try {
-			Token start, end;
-			ADQLOperand coordSys;
-			ADQLOperand[] coords;
-			start = jj_consume_token(POINT);
-			jj_consume_token(LEFT_PAR);
-			coordSys = CoordinateSystem();
-			jj_consume_token(COMMA);
-			coords = Coordinates();
-			end = jj_consume_token(RIGHT_PAR);
-			try {
-				PointFunction pf = queryFactory.createPoint(coordSys, coords[0], coords[1]);
-				pf.setPosition(new TextPosition(start, end));
-				{
-					if ("" != null)
-						return pf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Point");
-		}
-	}
-
-	final public GeometryFunction ExtractCoordSys() throws ParseException {
-		trace_call("ExtractCoordSys");
-		try {
-			Token start, end;
-			GeometryValue<GeometryFunction> gvf;
-			start = jj_consume_token(COORDSYS);
-			jj_consume_token(LEFT_PAR);
-			gvf = GeometryExpression();
-			end = jj_consume_token(RIGHT_PAR);
-			try {
-				GeometryFunction gf = queryFactory.createExtractCoordSys(gvf);
-				gf.setPosition(new TextPosition(start, end));
-				{
-					if ("" != null)
-						return gf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ExtractCoordSys");
-		}
-	}
-
-	/* ***************** */
-	/* NUMERIC FUNCTIONS */
-	/* ***************** */
-	final public ADQLFunction NumericFunction() throws ParseException {
-		trace_call("NumericFunction");
-		try {
-			ADQLFunction fct;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ABS:
-				case CEILING:
-				case DEGREES:
-				case EXP:
-				case FLOOR:
-				case LOG:
-				case LOG10:
-				case MOD:
-				case PI:
-				case POWER:
-				case RADIANS:
-				case RAND:
-				case ROUND:
-				case SQRT:
-				case TRUNCATE: {
-					fct = MathFunction();
-					break;
-				}
-				case ACOS:
-				case ASIN:
-				case ATAN:
-				case ATAN2:
-				case COS:
-				case COT:
-				case SIN:
-				case TAN: {
-					fct = TrigFunction();
-					break;
-				}
-				case CONTAINS:
-				case INTERSECTS:
-				case AREA:
-				case COORD1:
-				case COORD2:
-				case DISTANCE: {
-					fct = GeometryFunction();
-					break;
-				}
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					fct = UserDefinedFunction();
-					((UserDefinedFunction)fct).setExpectedType('N');
-					break;
-				}
-				default:
-					jj_la1[89] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			{
-				if ("" != null)
-					return fct;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericFunction");
-		}
-	}
-
-	final public MathFunction MathFunction() throws ParseException {
-		trace_call("MathFunction");
-		try {
-			Token fct = null, end;
-			ADQLOperand param1 = null, param2 = null;
-			NumericConstant integerValue = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case ABS: {
-						fct = jj_consume_token(ABS);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case CEILING: {
-						fct = jj_consume_token(CEILING);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case DEGREES: {
-						fct = jj_consume_token(DEGREES);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case EXP: {
-						fct = jj_consume_token(EXP);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case FLOOR: {
-						fct = jj_consume_token(FLOOR);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case LOG: {
-						fct = jj_consume_token(LOG);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case LOG10: {
-						fct = jj_consume_token(LOG10);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case MOD: {
-						fct = jj_consume_token(MOD);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						jj_consume_token(COMMA);
-						param2 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case PI: {
-						fct = jj_consume_token(PI);
-						jj_consume_token(LEFT_PAR);
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case POWER: {
-						fct = jj_consume_token(POWER);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						jj_consume_token(COMMA);
-						param2 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case RADIANS: {
-						fct = jj_consume_token(RADIANS);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case RAND: {
-						fct = jj_consume_token(RAND);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case LEFT_PAR:
-							case PLUS:
-							case MINUS:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case CONTAINS:
-							case INTERSECTS:
-							case AREA:
-							case COORD1:
-							case COORD2:
-							case DISTANCE:
-							case ABS:
-							case CEILING:
-							case DEGREES:
-							case EXP:
-							case FLOOR:
-							case LOG:
-							case LOG10:
-							case MOD:
-							case PI:
-							case POWER:
-							case RADIANS:
-							case RAND:
-							case ROUND:
-							case SQRT:
-							case TRUNCATE:
-							case ACOS:
-							case ASIN:
-							case ATAN:
-							case ATAN2:
-							case COS:
-							case COT:
-							case SIN:
-							case TAN:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								param1 = NumericExpression();
-								break;
-							}
-							default:
-								jj_la1[90] = jj_gen;
-								;
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case ROUND: {
-						fct = jj_consume_token(ROUND);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case COMMA: {
-								jj_consume_token(COMMA);
-								param2 = SignedInteger();
-								break;
-							}
-							default:
-								jj_la1[91] = jj_gen;
-								;
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case SQRT: {
-						fct = jj_consume_token(SQRT);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case TRUNCATE: {
-						fct = jj_consume_token(TRUNCATE);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case COMMA: {
-								jj_consume_token(COMMA);
-								param2 = SignedInteger();
-								break;
-							}
-							default:
-								jj_la1[92] = jj_gen;
-								;
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					default:
-						jj_la1[93] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-				MathFunction mf = queryFactory.createMathFunction(MathFunctionType.valueOf(fct.image.toUpperCase()), param1, param2);
-				mf.setPosition(new TextPosition(fct, end));
-				{
-					if ("" != null)
-						return mf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("MathFunction");
-		}
-	}
-
-	final public MathFunction TrigFunction() throws ParseException {
-		trace_call("TrigFunction");
-		try {
-			Token fct = null, end;
-			ADQLOperand param1 = null, param2 = null;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ACOS: {
-					fct = jj_consume_token(ACOS);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case ASIN: {
-					fct = jj_consume_token(ASIN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case ATAN: {
-					fct = jj_consume_token(ATAN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case ATAN2: {
-					fct = jj_consume_token(ATAN2);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					jj_consume_token(COMMA);
-					param2 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case COS: {
-					fct = jj_consume_token(COS);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case COT: {
-					fct = jj_consume_token(COT);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case SIN: {
-					fct = jj_consume_token(SIN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case TAN: {
-					fct = jj_consume_token(TAN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				default:
-					jj_la1[94] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			try {
-				MathFunction mf = queryFactory.createMathFunction(MathFunctionType.valueOf(fct.image.toUpperCase()), param1, param2);
-				mf.setPosition(new TextPosition(fct, end));
-				{
-					if ("" != null)
-						return mf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("TrigFunction");
-		}
-	}
-
-	final public UserDefinedFunction UserDefinedFunction() throws ParseException {
-		trace_call("UserDefinedFunction");
-		try {
-			Token fct, end;
-			Vector<ADQLOperand> params = new Vector<ADQLOperand>();
-			ADQLOperand op;
-			fct = jj_consume_token(REGULAR_IDENTIFIER_CANDIDATE);
-			jj_consume_token(LEFT_PAR);
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case LEFT_PAR:
-				case PLUS:
-				case MINUS:
-				case AVG:
-				case MAX:
-				case MIN:
-				case SUM:
-				case COUNT:
-				case BOX:
-				case CENTROID:
-				case CIRCLE:
-				case POINT:
-				case POLYGON:
-				case REGION:
-				case CONTAINS:
-				case INTERSECTS:
-				case AREA:
-				case COORD1:
-				case COORD2:
-				case COORDSYS:
-				case DISTANCE:
-				case ABS:
-				case CEILING:
-				case DEGREES:
-				case EXP:
-				case FLOOR:
-				case LOG:
-				case LOG10:
-				case MOD:
-				case PI:
-				case POWER:
-				case RADIANS:
-				case RAND:
-				case ROUND:
-				case SQRT:
-				case TRUNCATE:
-				case ACOS:
-				case ASIN:
-				case ATAN:
-				case ATAN2:
-				case COS:
-				case COT:
-				case SIN:
-				case TAN:
-				case STRING_LITERAL:
-				case SCIENTIFIC_NUMBER:
-				case UNSIGNED_FLOAT:
-				case UNSIGNED_INTEGER:
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					op = ValueExpression();
-					params.add(op);
-					label_13: while(true) {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case COMMA: {
-								;
-								break;
-							}
-							default:
-								jj_la1[95] = jj_gen;
-								break label_13;
-						}
-						jj_consume_token(COMMA);
-						op = ValueExpression();
-						params.add(op);
-					}
-					break;
-				}
-				default:
-					jj_la1[96] = jj_gen;
-					;
-			}
-			end = jj_consume_token(RIGHT_PAR);
-			// Ensure the given function name is valid: 
-			if (!isRegularIdentifier(fct.image)) {
-				if (true)
-					throw new ParseException("Invalid (User Defined) Function name: \u005c"" + fct.image + "\u005c"!", new TextPosition(fct));
-			}
-
-			//System.out.println("INFO [ADQLParser200]: \""+fct.image+"\" (from line "+fct.beginLine+" and column "+fct.beginColumn+" to line "+token.endLine+" and column "+(token.endColumn+1)+") is considered as an user defined function !");
-
-			try {
-				//  Build the parameters list:
-				ADQLOperand[] parameters = new ADQLOperand[params.size()];
-				for(int i = 0; i < params.size(); i++)
-					parameters[i] = params.get(i);
-
-				// Create the UDF function:
-				UserDefinedFunction udf = queryFactory.createUserDefinedFunction(fct.image, parameters);
-				udf.setPosition(new TextPosition(fct, end));
-				{
-					if ("" != null)
-						return udf;
-				}
-
-			} catch(UnsupportedOperationException uoe) {
-				/* This catch clause is just for backward compatibility:
-				* if the createUserDefinedFunction(...) is overridden and
-				* the function can not be identified a such exception may be thrown). */
-				{
-					if (true)
-						throw new ParseException(uoe.getMessage(), new TextPosition(fct, token));
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("UserDefinedFunction");
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(0, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(1, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(2, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(3, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(4, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(5, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(6, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(7, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(8, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(9, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(10, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(11, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(12, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(13, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(14, xla);
-		}
-	}
-
-	private boolean jj_2_16(int xla) {
-		jj_la = xla;
-		jj_lastpos = jj_scanpos = token;
-		try {
-			return !jj_3_16();
-		} catch(LookaheadSuccess ls) {
-			return true;
-		} finally {
-			jj_save(15, xla);
-		}
-	}
-
-	private boolean jj_2_17(int xla) {
-		jj_la = xla;
-		jj_lastpos = jj_scanpos = token;
-		try {
-			return !jj_3_17();
-		} catch(LookaheadSuccess ls) {
-			return true;
-		} finally {
-			jj_save(16, xla);
-		}
-	}
-
-	private boolean jj_2_18(int xla) {
-		jj_la = xla;
-		jj_lastpos = jj_scanpos = token;
-		try {
-			return !jj_3_18();
-		} catch(LookaheadSuccess ls) {
-			return true;
-		} finally {
-			jj_save(17, xla);
-		}
-	}
-
-	private boolean jj_3R_134() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_51())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_2() {
-		if (jj_3R_16())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_75() {
-		if (jj_3R_79())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_27() {
-		if (jj_3R_51())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_56() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_75()) {
-			jj_scanpos = xsp;
-			if (jj_3_2()) {
-				jj_scanpos = xsp;
-				if (jj_3R_76())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3_14() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(42)) {
-			jj_scanpos = xsp;
-			if (jj_3R_27())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_120() {
-		if (jj_3R_51())
-			return true;
-		Token xsp;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_134()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_60() {
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_79())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_22() {
-		if (jj_3R_43())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_150() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_153())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_149() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_153())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_43() {
-		if (jj_3R_14())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_60())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_127() {
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_14())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_126() {
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_14())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_79() {
-		if (jj_3R_14())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_126())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_127())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_31() {
-		if (jj_scan_token(DELIMITED_IDENTIFIER))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_133() {
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_30() {
-		if (jj_scan_token(REGULAR_IDENTIFIER_CANDIDATE))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_26() {
-		if (jj_scan_token(REGULAR_IDENTIFIER_CANDIDATE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_120())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_141() {
-		if (jj_3R_112())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_14() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_30()) {
-			jj_scanpos = xsp;
-			if (jj_3R_31())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_132() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_119() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_132()) {
-			jj_scanpos = xsp;
-			if (jj_3R_133())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_106() {
-		if (jj_scan_token(TAN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_105() {
-		if (jj_scan_token(SIN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_58() {
-		if (jj_3R_78())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_104() {
-		if (jj_scan_token(COT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_13() {
-		if (jj_3R_26())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_103() {
-		if (jj_scan_token(COS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_102() {
-		if (jj_scan_token(ATAN2))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_57() {
-		if (jj_3R_77())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_101() {
-		if (jj_scan_token(ATAN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_36() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_57()) {
-			jj_scanpos = xsp;
-			if (jj_3_13()) {
-				jj_scanpos = xsp;
-				if (jj_3R_58())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_100() {
-		if (jj_scan_token(ASIN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_99() {
-		if (jj_scan_token(ACOS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_64() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_99()) {
-			jj_scanpos = xsp;
-			if (jj_3R_100()) {
-				jj_scanpos = xsp;
-				if (jj_3R_101()) {
-					jj_scanpos = xsp;
-					if (jj_3R_102()) {
-						jj_scanpos = xsp;
-						if (jj_3R_103()) {
-							jj_scanpos = xsp;
-							if (jj_3R_104()) {
-								jj_scanpos = xsp;
-								if (jj_3R_105()) {
-									jj_scanpos = xsp;
-									if (jj_3R_106())
-										return true;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_46() {
-		if (jj_3R_62())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_98() {
-		if (jj_scan_token(TRUNCATE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_150())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_97() {
-		if (jj_scan_token(SQRT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_96() {
-		if (jj_scan_token(ROUND))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_149())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_95() {
-		if (jj_scan_token(RAND))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_141())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_94() {
-		if (jj_scan_token(RADIANS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_93() {
-		if (jj_scan_token(POWER))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_92() {
-		if (jj_scan_token(PI))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_91() {
-		if (jj_scan_token(MOD))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_90() {
-		if (jj_scan_token(LOG10))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_89() {
-		if (jj_scan_token(LOG))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_88() {
-		if (jj_scan_token(FLOOR))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_87() {
-		if (jj_scan_token(EXP))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_52() {
-		if (jj_scan_token(CONCAT))
-			return true;
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_86() {
-		if (jj_scan_token(DEGREES))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_85() {
-		if (jj_scan_token(CEILING))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_84() {
-		if (jj_scan_token(ABS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_29() {
-		if (jj_3R_36())
-			return true;
-		Token xsp;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_52()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_63() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_84()) {
-			jj_scanpos = xsp;
-			if (jj_3R_85()) {
-				jj_scanpos = xsp;
-				if (jj_3R_86()) {
-					jj_scanpos = xsp;
-					if (jj_3R_87()) {
-						jj_scanpos = xsp;
-						if (jj_3R_88()) {
-							jj_scanpos = xsp;
-							if (jj_3R_89()) {
-								jj_scanpos = xsp;
-								if (jj_3R_90()) {
-									jj_scanpos = xsp;
-									if (jj_3R_91()) {
-										jj_scanpos = xsp;
-										if (jj_3R_92()) {
-											jj_scanpos = xsp;
-											if (jj_3R_93()) {
-												jj_scanpos = xsp;
-												if (jj_3R_94()) {
-													jj_scanpos = xsp;
-													if (jj_3R_95()) {
-														jj_scanpos = xsp;
-														if (jj_3R_96()) {
-															jj_scanpos = xsp;
-															if (jj_3R_97()) {
-																jj_scanpos = xsp;
-																if (jj_3R_98())
-																	return true;
-															}
-														}
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_61() {
-		if (jj_scan_token(MINUS))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_50() {
-		if (jj_3R_26())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_49() {
-		if (jj_3R_65())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_48() {
-		if (jj_3R_64())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_47() {
-		if (jj_3R_63())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_25() {
-		Token xsp;
-		xsp = jj_scanpos;
-		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())
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3_12() {
-		if (jj_3R_25())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_45() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_3R_61())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_32() {
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_137() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(11)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(12))
-				return true;
-		}
-		if (jj_3R_130())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_24() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_45())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3_12()) {
-			jj_scanpos = xsp;
-			if (jj_3R_46())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_15() {
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_32())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_77() {
-		if (jj_scan_token(COORDSYS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_119())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_145() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_143() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_140() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_139())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_131() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10))
-				return true;
-		}
-		if (jj_3R_112())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_59() {
-		if (jj_scan_token(POINT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_138())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_130() {
-		if (jj_3R_24())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_137())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_42() {
-		if (jj_scan_token(REGION))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_29())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_19() {
-		if (jj_3R_24())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10)) {
-				jj_scanpos = xsp;
-				if (jj_scan_token(11)) {
-					jj_scanpos = xsp;
-					if (jj_scan_token(12))
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_20() {
-		if (jj_3R_36())
-			return true;
-		if (jj_scan_token(CONCAT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_1() {
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_15())
-			jj_scanpos = xsp;
-		if (jj_scan_token(ASTERISK))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_41() {
-		if (jj_scan_token(POLYGON))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_138())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_139())
-			return true;
-		Token xsp;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_140()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_72() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_40() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_10() {
-		if (jj_3R_23())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_112() {
-		if (jj_3R_130())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_131())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3_9() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_7() {
-		if (jj_scan_token(REGULAR_IDENTIFIER_CANDIDATE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_6() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_39() {
-		if (jj_scan_token(CIRCLE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_138())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_5() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(65)) {
-			jj_scanpos = xsp;
-			if (jj_3R_20())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3_4() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_18()) {
-			jj_scanpos = xsp;
-			if (jj_3R_19())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_18() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10))
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_38() {
-		if (jj_scan_token(CENTROID))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_119())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_11() {
-		if (jj_3R_24())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_71() {
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_70() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_8() {
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_69() {
-		if (jj_3R_26())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_68() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_51())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_37() {
-		if (jj_scan_token(BOX))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_138())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_67() {
-		if (jj_3R_29())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_66() {
-		if (jj_3R_112())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_152() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_53() {
-		if (jj_scan_token(SELECT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_125() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_51())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_144() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_21() {
-		Token xsp;
-		xsp = jj_scanpos;
-		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())
-								return true;
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_148() {
-		if (jj_3R_51())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_142() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_124() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_51() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_66()) {
-			jj_scanpos = xsp;
-			if (jj_3R_67()) {
-				jj_scanpos = xsp;
-				if (jj_3R_68()) {
-					jj_scanpos = xsp;
-					if (jj_3R_69()) {
-						jj_scanpos = xsp;
-						if (jj_3_8()) {
-							jj_scanpos = xsp;
-							if (jj_3R_70()) {
-								jj_scanpos = xsp;
-								if (jj_3R_71()) {
-									jj_scanpos = xsp;
-									if (jj_3_11()) {
-										jj_scanpos = xsp;
-										if (jj_3R_72())
-											return true;
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_147() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_123() {
-		if (jj_3R_129())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_151() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_138() {
-		if (jj_3R_29())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_122() {
-		if (jj_3R_128())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_16() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_33())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_121() {
-		if (jj_3R_23())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_115() {
-		if (jj_scan_token(FULL))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_146() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_83() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_82() {
-		if (jj_3R_129())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_78() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_121()) {
-			jj_scanpos = xsp;
-			if (jj_3R_122()) {
-				jj_scanpos = xsp;
-				if (jj_3R_123()) {
-					jj_scanpos = xsp;
-					if (jj_3R_124()) {
-						jj_scanpos = xsp;
-						if (jj_3R_125())
-							return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_81() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_80() {
-		if (jj_3R_128())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_111() {
-		if (jj_scan_token(DISTANCE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_146()) {
-			jj_scanpos = xsp;
-			if (jj_3R_147())
-				return true;
-		}
-		if (jj_scan_token(COMMA))
-			return true;
-		xsp = jj_scanpos;
-		if (jj_3R_151()) {
-			jj_scanpos = xsp;
-			if (jj_3R_152())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_110() {
-		if (jj_scan_token(COORD2))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_144()) {
-			jj_scanpos = xsp;
-			if (jj_3R_145())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_109() {
-		if (jj_scan_token(COORD1))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_142()) {
-			jj_scanpos = xsp;
-			if (jj_3R_143())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_108() {
-		if (jj_scan_token(AREA))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_119())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_118() {
-		if (jj_scan_token(FULL))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_62() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_80()) {
-			jj_scanpos = xsp;
-			if (jj_3R_81()) {
-				jj_scanpos = xsp;
-				if (jj_3R_82()) {
-					jj_scanpos = xsp;
-					if (jj_3R_83())
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_107() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(60)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(61))
-				return true;
-		}
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_119())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_119())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_33() {
-		if (jj_3R_53())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_114() {
-		if (jj_scan_token(RIGHT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_154() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10))
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_153() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_154())
-			jj_scanpos = xsp;
-		if (jj_scan_token(UNSIGNED_INTEGER))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_65() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_107()) {
-			jj_scanpos = xsp;
-			if (jj_3R_108()) {
-				jj_scanpos = xsp;
-				if (jj_3R_109()) {
-					jj_scanpos = xsp;
-					if (jj_3R_110()) {
-						jj_scanpos = xsp;
-						if (jj_3R_111())
-							return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_139() {
-		if (jj_3R_112())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_112())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_136() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(49)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(50)) {
-				jj_scanpos = xsp;
-				if (jj_scan_token(51)) {
-					jj_scanpos = xsp;
-					if (jj_scan_token(52))
-						return true;
-				}
-			}
-		}
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		xsp = jj_scanpos;
-		if (jj_scan_token(20))
-			jj_scanpos = xsp;
-		if (jj_3R_51())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_135() {
-		if (jj_scan_token(COUNT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(20))
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(11)) {
-			jj_scanpos = xsp;
-			if (jj_3R_148())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_117() {
-		if (jj_scan_token(RIGHT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_128() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(94)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(95)) {
-				jj_scanpos = xsp;
-				if (jj_scan_token(96))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_129() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_135()) {
-			jj_scanpos = xsp;
-			if (jj_3R_136())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_113() {
-		if (jj_scan_token(LEFT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_73() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_113()) {
-			jj_scanpos = xsp;
-			if (jj_3R_114()) {
-				jj_scanpos = xsp;
-				if (jj_3R_115())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_54() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(25)) {
-			jj_scanpos = xsp;
-			if (jj_3R_73())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_44() {
-		if (jj_scan_token(STRING_LITERAL))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_23() {
-		Token xsp;
-		if (jj_3R_44())
-			return true;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_44()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_116() {
-		if (jj_scan_token(LEFT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_74() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_116()) {
-			jj_scanpos = xsp;
-			if (jj_3R_117()) {
-				jj_scanpos = xsp;
-				if (jj_3R_118())
-					return true;
-			}
-		}
-		xsp = jj_scanpos;
-		if (jj_scan_token(26))
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3_18() {
-		if (jj_3R_16())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_55() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(25)) {
-			jj_scanpos = xsp;
-			if (jj_3R_74())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_35() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_55())
-			jj_scanpos = xsp;
-		if (jj_scan_token(JOIN))
-			return true;
-		if (jj_3R_56())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_34() {
-		if (jj_scan_token(NATURAL))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_54())
-			jj_scanpos = xsp;
-		if (jj_scan_token(JOIN))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_28() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(36))
-			jj_scanpos = xsp;
-		if (jj_scan_token(BETWEEN))
-			return true;
-		if (jj_3R_51())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_15() {
-		if (jj_3R_28())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_17() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_34()) {
-			jj_scanpos = xsp;
-			if (jj_3R_35())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3_17() {
-		if (jj_3R_29())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(36))
-			jj_scanpos = xsp;
-		if (jj_scan_token(LIKE))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_76() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_3() {
-		if (jj_3R_17())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_16() {
-		if (jj_3R_22())
-			return true;
-		if (jj_scan_token(IS))
-			return true;
-		return false;
-	}
-
-	/** Generated Token Manager. */
-	public ADQLParser200TokenManager token_source;
-	SimpleCharStream 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;
-	private int jj_gen;
-	final private int[] jj_la1 = new int[97];
-	static private int[] jj_la1_0;
-	static private int[] jj_la1_1;
-	static private int[] jj_la1_2;
-	static private int[] jj_la1_3;
-	static {
-		jj_la1_init_0();
-		jj_la1_init_1();
-		jj_la1_init_2();
-		jj_la1_init_3();
-	}
-
-	private static void jj_la1_init_0() {
-		jj_la1_0 = new int[]{ 0x81, 0x0, 0x0, 0x0, 0x0, 0x100000, 0x200000, 0x40, 0x0, 0x0, 0x800000, 0x800000, 0x800, 0x608, 0x40, 0x40, 0x40, 0x0, 0x20, 0x20, 0x20, 0x0, 0x0, 0x0, 0x800000, 0x800000, 0x800000, 0x0, 0x8, 0x7b000000, 0x38000000, 0x4000000, 0x3a000000, 0x3a000000, 0x38000000, 0x4000000, 0x3a000000, 0x3a000000, 0x40, 0x80000000, 0x7b000000, 0x0, 0x0, 0x0, 0x600, 0x600, 0x8, 0x8, 0x0, 0x600, 0x600, 0x1800, 0x1800, 0x600, 0x600, 0x8, 0x100, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x7e000, 0x0, 0x0, 0x608, 0x7e000, 0x0, 0x0, 0x40, 0x8, 0x100000, 0xe08, 0x0, 0x100000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x608, 0x40, 0x40, 0x0, 0x0, 0x40, 0x608, };
-	}
-
-	private static void jj_la1_init_1() {
-		jj_la1_1 = new int[]{ 0x0, 0x2, 0x1000, 0x2000, 0x4000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfffe0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18000, 0x18000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e0000, 0x3e0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e0000, 0x0, 0x0, 0x3e0000, 0xfc00000, 0x10, 0xc, 0xc, 0x10, 0x0, 0x10, 0x10, 0x0, 0x210, 0x400, 0xfffe0000, 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0xfffe0000, 0x1e0000, 0x0, 0x3e0000, 0x30000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0xf0000000, 0x0, 0xfc00000, 0xf0000000, 0xf03e0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfffe0000, };
-	}
-
-	private static void jj_la1_init_2() {
-		jj_la1_2 = new int[]{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3ffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000000, 0xc0000000, 0x80000000, 0x0, 0x0, 0xc0000000, 0xe0000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0000000, 0x0, 0x2, 0xe0000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3ffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3ffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3fffffd, 0xc3fffffd, 0x0, 0x0, 0x3fff8, 0x3fc0000, 0x0, 0xe3ffffff, };
-	}
-
-	private static void jj_la1_init_3() {
-		jj_la1_3 = new int[]{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x30, 0x0, 0x30, 0x0, 0x31, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x30, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x31, 0x31, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x31, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x30, 0x30, 0x30, 0x30, 0x0, 0x0, 0x0, 0x20, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, };
-	}
-
-	final private JJCalls[] jj_2_rtns = new JJCalls[18];
-	private boolean jj_rescan = false;
-	private int jj_gc = 0;
-
-	/** Constructor with InputStream. */
-	public ADQLParser200(java.io.InputStream stream) {
-		this(stream, (String)null);
-	}
-
-	/** Constructor with InputStream and supplied encoding */
-	public ADQLParser200(java.io.InputStream stream, String encoding) {
-		try {
-			jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1);
-		} catch(java.io.UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
-		token_source = new ADQLParser200TokenManager(jj_input_stream);
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Reinitialise. */
-	@Override
-	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;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Constructor. */
-	public ADQLParser200(java.io.Reader stream) {
-		jj_input_stream = new SimpleCharStream(stream, 1, 1);
-		token_source = new ADQLParser200TokenManager(jj_input_stream);
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Reinitialise. */
-	@Override
-	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;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Constructor with generated Token Manager. */
-	public ADQLParser200(ADQLParser200TokenManager tm) {
-		token_source = tm;
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Reinitialise. */
-	public void ReInit(ADQLParser200TokenManager tm) {
-		token_source = tm;
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	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) {
-			jj_gen++;
-			if (++jj_gc > 100) {
-				jj_gc = 0;
-				for(int i = 0; i < jj_2_rtns.length; i++) {
-					JJCalls c = jj_2_rtns[i];
-					while(c != null) {
-						if (c.gen < jj_gen)
-							c.first = null;
-						c = c.next;
-					}
-				}
-			}
-			trace_token(token, "");
-			return token;
-		}
-		token = oldToken;
-		jj_kind = kind;
-		throw generateParseException();
-	}
-
-	@SuppressWarnings("serial")
-	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_rescan) {
-			int i = 0;
-			Token tok = token;
-			while(tok != null && tok != jj_scanpos) {
-				i++;
-				tok = tok.next;
-			}
-			if (tok != null)
-				jj_add_error_token(kind, i);
-		}
-		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;
-		jj_gen++;
-		trace_token(token, " (in getNextToken)");
-		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_f() {
-		if ((jj_nt = token.next) == null)
-			return (jj_ntk = (token.next = token_source.getNextToken()).kind);
-		else
-			return (jj_ntk = jj_nt.kind);
-	}
-
-	private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
-	private int[] jj_expentry;
-	private int jj_kind = -1;
-	private int[] jj_lasttokens = new int[100];
-	private int jj_endpos;
-
-	private void jj_add_error_token(int kind, int pos) {
-		if (pos >= 100)
-			return;
-		if (pos == jj_endpos + 1) {
-			jj_lasttokens[jj_endpos++] = kind;
-		} else if (jj_endpos != 0) {
-			jj_expentry = new int[jj_endpos];
-			for(int i = 0; i < jj_endpos; i++) {
-				jj_expentry[i] = jj_lasttokens[i];
-			}
-			jj_entries_loop: for(java.util.Iterator<?> it = jj_expentries.iterator(); it.hasNext();) {
-				int[] oldentry = (int[])(it.next());
-				if (oldentry.length == jj_expentry.length) {
-					for(int i = 0; i < jj_expentry.length; i++) {
-						if (oldentry[i] != jj_expentry[i]) {
-							continue jj_entries_loop;
-						}
-					}
-					jj_expentries.add(jj_expentry);
-					break jj_entries_loop;
-				}
-			}
-			if (pos != 0)
-				jj_lasttokens[(jj_endpos = pos) - 1] = kind;
-		}
-	}
-
-	/** Generate ParseException. */
-	public ParseException generateParseException() {
-		jj_expentries.clear();
-		boolean[] la1tokens = new boolean[103];
-		if (jj_kind >= 0) {
-			la1tokens[jj_kind] = true;
-			jj_kind = -1;
-		}
-		for(int i = 0; i < 97; i++) {
-			if (jj_la1[i] == jj_gen) {
-				for(int j = 0; j < 32; j++) {
-					if ((jj_la1_0[i] & (1 << j)) != 0) {
-						la1tokens[j] = true;
-					}
-					if ((jj_la1_1[i] & (1 << j)) != 0) {
-						la1tokens[32 + j] = true;
-					}
-					if ((jj_la1_2[i] & (1 << j)) != 0) {
-						la1tokens[64 + j] = true;
-					}
-					if ((jj_la1_3[i] & (1 << j)) != 0) {
-						la1tokens[96 + j] = true;
-					}
-				}
-			}
-		}
-		for(int i = 0; i < 103; i++) {
-			if (la1tokens[i]) {
-				jj_expentry = new int[1];
-				jj_expentry[0] = i;
-				jj_expentries.add(jj_expentry);
-			}
-		}
-		jj_endpos = 0;
-		jj_rescan_token();
-		jj_add_error_token(0, 0);
-		int[][] exptokseq = new int[jj_expentries.size()][];
-		for(int i = 0; i < jj_expentries.size(); i++) {
-			exptokseq[i] = jj_expentries.get(i);
-		}
-		return new ParseException(token, exptokseq, tokenImage);
-	}
-
-	private int trace_indent = 0;
-	private boolean trace_enabled = true;
-
-	/** Enable tracing. */
-	final public void enable_tracing() {
-		trace_enabled = true;
-	}
-
-	/** Disable tracing. */
-	final public void disable_tracing() {
-		trace_enabled = false;
-	}
-
-	private void trace_call(String s) {
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.println("Call:   " + s);
-		}
-		trace_indent = trace_indent + 2;
-	}
-
-	private void trace_return(String s) {
-		trace_indent = trace_indent - 2;
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.println("Return: " + s);
-		}
-	}
-
-	private void trace_token(Token t, String where) {
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.print("Consumed token: <" + tokenImage[t.kind]);
-			if (t.kind != 0 && !tokenImage[t.kind].equals("\"" + t.image + "\"")) {
-				System.out.print(": \"" + t.image + "\"");
-			}
-			System.out.println(" at line " + t.beginLine + " column " + t.beginColumn + ">" + where);
-		}
-	}
-
-	private void trace_scan(Token t1, int t2) {
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.print("Visited token: <" + tokenImage[t1.kind]);
-			if (t1.kind != 0 && !tokenImage[t1.kind].equals("\"" + t1.image + "\"")) {
-				System.out.print(": \"" + t1.image + "\"");
-			}
-			System.out.println(" at line " + t1.beginLine + " column " + t1.beginColumn + ">; Expected token: <" + tokenImage[t2] + ">");
-		}
-	}
-
-	private void jj_rescan_token() {
-		jj_rescan = true;
-		for(int i = 0; i < 18; i++) {
-			try {
-				JJCalls p = jj_2_rtns[i];
-				do {
-					if (p.gen > jj_gen) {
-						jj_la = p.arg;
-						jj_lastpos = jj_scanpos = p.first;
-						switch(i) {
-							case 0:
-								jj_3_1();
-								break;
-							case 1:
-								jj_3_2();
-								break;
-							case 2:
-								jj_3_3();
-								break;
-							case 3:
-								jj_3_4();
-								break;
-							case 4:
-								jj_3_5();
-								break;
-							case 5:
-								jj_3_6();
-								break;
-							case 6:
-								jj_3_7();
-								break;
-							case 7:
-								jj_3_8();
-								break;
-							case 8:
-								jj_3_9();
-								break;
-							case 9:
-								jj_3_10();
-								break;
-							case 10:
-								jj_3_11();
-								break;
-							case 11:
-								jj_3_12();
-								break;
-							case 12:
-								jj_3_13();
-								break;
-							case 13:
-								jj_3_14();
-								break;
-							case 14:
-								jj_3_15();
-								break;
-							case 15:
-								jj_3_16();
-								break;
-							case 16:
-								jj_3_17();
-								break;
-							case 17:
-								jj_3_18();
-								break;
-						}
-					}
-					p = p.next;
-				} while(p != null);
-			} catch(LookaheadSuccess ls) {
-			}
-		}
-		jj_rescan = false;
-	}
-
-	private void jj_save(int index, int xla) {
-		JJCalls p = jj_2_rtns[index];
-		while(p.gen > jj_gen) {
-			if (p.next == null) {
-				p = p.next = new JJCalls();
-				break;
-			}
-			p = p.next;
-		}
-		p.gen = jj_gen + xla - jj_la;
-		p.first = token;
-		p.arg = xla;
-	}
-
-	static final class JJCalls {
-		int gen;
-		Token first;
-		int arg;
-		JJCalls next;
-	}
-
-}
diff --git a/src/adql/parser/ADQLParser200Constants.java b/src/adql/parser/ADQLParser200Constants.java
deleted file mode 100644
index 4cd1d26..0000000
--- a/src/adql/parser/ADQLParser200Constants.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ADQLParser200Constants.java */
-package adql.parser;
-
-
-/**
- * Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
- */
-public interface ADQLParser200Constants {
-
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int SQL_RESERVED_WORD = 2;
-  /** RegularExpression Id. */
-  int LEFT_PAR = 3;
-  /** RegularExpression Id. */
-  int RIGHT_PAR = 4;
-  /** RegularExpression Id. */
-  int DOT = 5;
-  /** RegularExpression Id. */
-  int COMMA = 6;
-  /** RegularExpression Id. */
-  int EOQ = 7;
-  /** RegularExpression Id. */
-  int CONCAT = 8;
-  /** RegularExpression Id. */
-  int PLUS = 9;
-  /** RegularExpression Id. */
-  int MINUS = 10;
-  /** RegularExpression Id. */
-  int ASTERISK = 11;
-  /** RegularExpression Id. */
-  int DIVIDE = 12;
-  /** RegularExpression Id. */
-  int EQUAL = 13;
-  /** RegularExpression Id. */
-  int NOT_EQUAL = 14;
-  /** RegularExpression Id. */
-  int LESS_THAN = 15;
-  /** RegularExpression Id. */
-  int LESS_EQUAL_THAN = 16;
-  /** RegularExpression Id. */
-  int GREATER_THAN = 17;
-  /** RegularExpression Id. */
-  int GREATER_EQUAL_THAN = 18;
-  /** RegularExpression Id. */
-  int SELECT = 19;
-  /** RegularExpression Id. */
-  int QUANTIFIER = 20;
-  /** RegularExpression Id. */
-  int TOP = 21;
-  /** RegularExpression Id. */
-  int FROM = 22;
-  /** RegularExpression Id. */
-  int AS = 23;
-  /** RegularExpression Id. */
-  int NATURAL = 24;
-  /** RegularExpression Id. */
-  int INNER = 25;
-  /** RegularExpression Id. */
-  int OUTER = 26;
-  /** RegularExpression Id. */
-  int RIGHT = 27;
-  /** RegularExpression Id. */
-  int LEFT = 28;
-  /** RegularExpression Id. */
-  int FULL = 29;
-  /** RegularExpression Id. */
-  int JOIN = 30;
-  /** RegularExpression Id. */
-  int ON = 31;
-  /** RegularExpression Id. */
-  int USING = 32;
-  /** RegularExpression Id. */
-  int WHERE = 33;
-  /** RegularExpression Id. */
-  int AND = 34;
-  /** RegularExpression Id. */
-  int OR = 35;
-  /** RegularExpression Id. */
-  int NOT = 36;
-  /** RegularExpression Id. */
-  int IS = 37;
-  /** RegularExpression Id. */
-  int NULL = 38;
-  /** RegularExpression Id. */
-  int BETWEEN = 39;
-  /** RegularExpression Id. */
-  int LIKE = 40;
-  /** RegularExpression Id. */
-  int IN = 41;
-  /** RegularExpression Id. */
-  int EXISTS = 42;
-  /** RegularExpression Id. */
-  int BY = 43;
-  /** RegularExpression Id. */
-  int GROUP = 44;
-  /** RegularExpression Id. */
-  int HAVING = 45;
-  /** RegularExpression Id. */
-  int ORDER = 46;
-  /** RegularExpression Id. */
-  int ASC = 47;
-  /** RegularExpression Id. */
-  int DESC = 48;
-  /** RegularExpression Id. */
-  int AVG = 49;
-  /** RegularExpression Id. */
-  int MAX = 50;
-  /** RegularExpression Id. */
-  int MIN = 51;
-  /** RegularExpression Id. */
-  int SUM = 52;
-  /** RegularExpression Id. */
-  int COUNT = 53;
-  /** RegularExpression Id. */
-  int BOX = 54;
-  /** RegularExpression Id. */
-  int CENTROID = 55;
-  /** RegularExpression Id. */
-  int CIRCLE = 56;
-  /** RegularExpression Id. */
-  int POINT = 57;
-  /** RegularExpression Id. */
-  int POLYGON = 58;
-  /** RegularExpression Id. */
-  int REGION = 59;
-  /** RegularExpression Id. */
-  int CONTAINS = 60;
-  /** RegularExpression Id. */
-  int INTERSECTS = 61;
-  /** RegularExpression Id. */
-  int AREA = 62;
-  /** RegularExpression Id. */
-  int COORD1 = 63;
-  /** RegularExpression Id. */
-  int COORD2 = 64;
-  /** RegularExpression Id. */
-  int COORDSYS = 65;
-  /** RegularExpression Id. */
-  int DISTANCE = 66;
-  /** RegularExpression Id. */
-  int ABS = 67;
-  /** RegularExpression Id. */
-  int CEILING = 68;
-  /** RegularExpression Id. */
-  int DEGREES = 69;
-  /** RegularExpression Id. */
-  int EXP = 70;
-  /** RegularExpression Id. */
-  int FLOOR = 71;
-  /** RegularExpression Id. */
-  int LOG = 72;
-  /** RegularExpression Id. */
-  int LOG10 = 73;
-  /** RegularExpression Id. */
-  int MOD = 74;
-  /** RegularExpression Id. */
-  int PI = 75;
-  /** RegularExpression Id. */
-  int POWER = 76;
-  /** RegularExpression Id. */
-  int RADIANS = 77;
-  /** RegularExpression Id. */
-  int RAND = 78;
-  /** RegularExpression Id. */
-  int ROUND = 79;
-  /** RegularExpression Id. */
-  int SQRT = 80;
-  /** RegularExpression Id. */
-  int TRUNCATE = 81;
-  /** RegularExpression Id. */
-  int ACOS = 82;
-  /** RegularExpression Id. */
-  int ASIN = 83;
-  /** RegularExpression Id. */
-  int ATAN = 84;
-  /** RegularExpression Id. */
-  int ATAN2 = 85;
-  /** RegularExpression Id. */
-  int COS = 86;
-  /** RegularExpression Id. */
-  int COT = 87;
-  /** RegularExpression Id. */
-  int SIN = 88;
-  /** RegularExpression Id. */
-  int TAN = 89;
-  /** RegularExpression Id. */
-  int STRING_LITERAL = 93;
-  /** RegularExpression Id. */
-  int SCIENTIFIC_NUMBER = 94;
-  /** RegularExpression Id. */
-  int UNSIGNED_FLOAT = 95;
-  /** RegularExpression Id. */
-  int UNSIGNED_INTEGER = 96;
-  /** RegularExpression Id. */
-  int DIGIT = 97;
-  /** RegularExpression Id. */
-  int DELIMITED_IDENTIFIER = 100;
-  /** RegularExpression Id. */
-  int REGULAR_IDENTIFIER_CANDIDATE = 101;
-  /** RegularExpression Id. */
-  int Letter = 102;
-
-  /** Lexical state. */
-  int DEFAULT = 0;
-  /** Lexical state. */
-  int WithinString = 1;
-  /** Lexical state. */
-  int WithinDelimitedId = 2;
-
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "<token of kind 1>",
-    "<SQL_RESERVED_WORD>",
-    "\"(\"",
-    "\")\"",
-    "\".\"",
-    "\",\"",
-    "\";\"",
-    "\"||\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"=\"",
-    "<NOT_EQUAL>",
-    "\"<\"",
-    "\"<=\"",
-    "\">\"",
-    "\">=\"",
-    "\"SELECT\"",
-    "<QUANTIFIER>",
-    "\"TOP\"",
-    "\"FROM\"",
-    "\"AS\"",
-    "\"NATURAL\"",
-    "\"INNER\"",
-    "\"OUTER\"",
-    "\"RIGHT\"",
-    "\"LEFT\"",
-    "\"FULL\"",
-    "\"JOIN\"",
-    "\"ON\"",
-    "\"USING\"",
-    "\"WHERE\"",
-    "\"AND\"",
-    "\"OR\"",
-    "\"NOT\"",
-    "\"IS\"",
-    "\"NULL\"",
-    "\"BETWEEN\"",
-    "\"LIKE\"",
-    "\"IN\"",
-    "\"EXISTS\"",
-    "\"BY\"",
-    "\"GROUP\"",
-    "\"HAVING\"",
-    "\"ORDER\"",
-    "\"ASC\"",
-    "\"DESC\"",
-    "\"AVG\"",
-    "\"MAX\"",
-    "\"MIN\"",
-    "\"SUM\"",
-    "\"COUNT\"",
-    "\"BOX\"",
-    "\"CENTROID\"",
-    "\"CIRCLE\"",
-    "\"POINT\"",
-    "\"POLYGON\"",
-    "\"REGION\"",
-    "\"CONTAINS\"",
-    "\"INTERSECTS\"",
-    "\"AREA\"",
-    "\"COORD1\"",
-    "\"COORD2\"",
-    "\"COORDSYS\"",
-    "\"DISTANCE\"",
-    "\"ABS\"",
-    "\"CEILING\"",
-    "\"DEGREES\"",
-    "\"EXP\"",
-    "\"FLOOR\"",
-    "\"LOG\"",
-    "\"LOG10\"",
-    "\"MOD\"",
-    "\"PI\"",
-    "\"POWER\"",
-    "\"RADIANS\"",
-    "\"RAND\"",
-    "\"ROUND\"",
-    "\"SQRT\"",
-    "\"TRUNCATE\"",
-    "\"ACOS\"",
-    "\"ASIN\"",
-    "\"ATAN\"",
-    "\"ATAN2\"",
-    "\"COS\"",
-    "\"COT\"",
-    "\"SIN\"",
-    "\"TAN\"",
-    "<token of kind 90>",
-    "\"\\\'\"",
-    "<token of kind 92>",
-    "\"\\\'\"",
-    "<SCIENTIFIC_NUMBER>",
-    "<UNSIGNED_FLOAT>",
-    "<UNSIGNED_INTEGER>",
-    "<DIGIT>",
-    "\"\\\"\"",
-    "<token of kind 99>",
-    "\"\\\"\"",
-    "<REGULAR_IDENTIFIER_CANDIDATE>",
-    "<Letter>",
-  };
-
-}
diff --git a/src/adql/parser/ADQLParser200TokenManager.java b/src/adql/parser/ADQLParser200TokenManager.java
deleted file mode 100644
index 3e87d17..0000000
--- a/src/adql/parser/ADQLParser200TokenManager.java
+++ /dev/null
@@ -1,8567 +0,0 @@
-/* ADQLParser200TokenManager.java */
-/* Generated By:JavaCC: Do not edit this line. ADQLParser200TokenManager.java */
-package adql.parser;
-/*
- * This file is part of ADQLLibrary.
- * 
- * ADQLLibrary is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * ADQLLibrary is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
- * 
- * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
- */
-
-import java.util.Stack;
-import java.util.Vector;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.io.FileReader;
-import java.io.IOException;
-import adql.db.exception.UnresolvedIdentifiersException;
-import adql.db.exception.UnsupportedFeatureException;
-import adql.parser.ADQLParserFactory.ADQLVersion;
-import adql.parser.IdentifierItems.IdentifierItem;
-import adql.parser.ADQLQueryFactory.JoinType;
-import adql.parser.feature.FeatureSet;
-import adql.parser.feature.LanguageFeature;
-import adql.query.*;
-import adql.query.from.*;
-import adql.query.constraint.*;
-import adql.query.operand.*;
-import adql.query.operand.function.*;
-import adql.query.operand.function.geometry.*;
-import adql.query.operand.function.geometry.GeometryFunction.GeometryValue;
-import adql.search.SearchOptionalFeaturesHandler;
-import adql.translator.PostgreSQLTranslator;
-import adql.translator.TranslationException;
-
-/** Token Manager. */
-@SuppressWarnings("unused")public class ADQLParser200TokenManager implements ADQLParser200Constants {
-        protected void CommonTokenAction(final Token t) {
-                t.adqlVersion = ADQLParserFactory.ADQLVersion.V2_0;
-        }
-
-  /** Debug output. */
-  public  java.io.PrintStream debugStream = System.out;
-  /** Set debug output. */
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1)
-{
-   switch (pos)
-   {
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_2(int pos, long active0, long active1)
-{
-   return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0, active1), pos + 1);
-}
-private int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private int jjMoveStringLiteralDfa0_2()
-{
-   switch(curChar)
-   {
-      case 34:
-         return jjStartNfaWithStates_2(0, 100, 1);
-      default :
-         return jjMoveNfa_2(0, 0);
-   }
-}
-private int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_2(state, pos + 1);
-}
-static final long[] jjbitVec0 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private int jjMoveNfa_2(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 3;
-   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 0:
-                  if ((0xfffffffbffffffffL & l) != 0L)
-                  {
-                     if (kind > 99)
-                        kind = 99;
-                  }
-                  else if (curChar == 34)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 1:
-                  if (curChar == 34 && kind > 99)
-                     kind = 99;
-                  break;
-               case 2:
-                  if (curChar == 34)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  kind = 99;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((jjbitVec0[i2] & l2) != 0L && kind > 99)
-                     kind = 99;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
-{
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0x600000000000000L) != 0L || (active1 & 0x1800L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 491;
-         }
-         if ((active0 & 0x10010000000L) != 0L || (active1 & 0x300L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 404;
-         }
-         if ((active0 & 0x200000L) != 0L || (active1 & 0x2020000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 670;
-         }
-         if ((active0 & 0x5001000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 439;
-         }
-         if ((active0 & 0x2000022002000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 332;
-         }
-         if ((active0 & 0x4002800400800000L) != 0L || (active1 & 0x3c0008L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 910;
-         }
-         if ((active0 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 965;
-         }
-         if ((active0 & 0x20L) != 0L)
-            return 966;
-         if ((active0 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 752;
-         }
-         if ((active0 & 0x1000000000000L) != 0L || (active1 & 0x24L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 813;
-         }
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 315;
-         }
-         if ((active0 & 0x18000L) != 0L)
-            return 17;
-         if ((active0 & 0x400L) != 0L)
-            return 22;
-         if ((active0 & 0x40088000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 33;
-         }
-         if ((active0 & 0x20400000L) != 0L || (active1 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 295;
-         }
-         if ((active0 & 0xc000000000000L) != 0L || (active1 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 424;
-         }
-         if ((active0 & 0x91a0000000000000L) != 0L || (active1 & 0xc00013L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 52;
-         }
-         if ((active0 & 0x800000008000000L) != 0L || (active1 & 0xe000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 550;
-         }
-         if ((active0 & 0x10000000080000L) != 0L || (active1 & 0x1010000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 590;
-         }
-         if ((active0 & 0x40000000000L) != 0L || (active1 & 0x40L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 249;
-         }
-         if ((active0 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 797;
-         }
-         if ((active0 & 0x400884000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 471;
-         }
-         if ((active0 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            return 5;
-         }
-         return -1;
-      case 1:
-         if ((active0 & 0x2000020002000000L) != 0L)
-            return 345;
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 45;
-         }
-         if ((active1 & 0x40000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 913;
-         }
-         if ((active1 & 0x2000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 669;
-         }
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 32;
-         }
-         if ((active0 & 0x1000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 438;
-         }
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 656;
-         }
-         if ((active0 & 0x100000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 770;
-         }
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 549;
-         }
-         if ((active0 & 0x2000000000L) != 0L)
-            return 396;
-         if ((active1 & 0x400L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 431;
-         }
-         if ((active1 & 0x10000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 637;
-         }
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 967;
-         }
-         if ((active0 & 0x4000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 482;
-         }
-         if ((active0 & 0x400000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 968;
-         }
-         if ((active1 & 0x300L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 416;
-         }
-         if ((active0 & 0x600000000000000L) != 0L || (active1 & 0x1000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 501;
-         }
-         if ((active1 & 0x8L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 909;
-         }
-         if ((active0 & 0x200000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 796;
-         }
-         if ((active0 & 0x8000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 427;
-         }
-         if ((active0 & 0x182210068400000L) != 0L || (active1 & 0x6010L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 965;
-         }
-         if ((active0 & 0x10000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 410;
-         }
-         if ((active0 & 0x1000000000000L) != 0L || (active1 & 0x20L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 821;
-         }
-         if ((active1 & 0x4L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 877;
-         }
-         if ((active0 & 0x480800000000L) != 0L || (active1 & 0x800L) != 0L)
-            return 965;
-         if ((active1 & 0x20000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 717;
-         }
-         if ((active1 & 0x80L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 303;
-         }
-         if ((active0 & 0x40000000000L) != 0L || (active1 & 0x40L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 264;
-         }
-         if ((active1 & 0x8000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 581;
-         }
-         if ((active0 & 0x80000000L) != 0L)
-            return 472;
-         if ((active0 & 0x4000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 423;
-         }
-         if ((active0 & 0x1000200000L) != 0L || (active1 & 0x300000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 2;
-               jjmatchedPos = 1;
-            }
-            return 965;
-         }
-         if ((active0 & 0x4000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 454;
-         }
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 324;
-         }
-         if ((active0 & 0x800000800000L) != 0L || (active1 & 0x80000L) != 0L)
-            return 932;
-         if ((active1 & 0x1000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 620;
-         }
-         if ((active0 & 0x80000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 597;
-         }
-         if ((active0 & 0x9020000000000000L) != 0L || (active1 & 0xc00003L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 1;
-            }
-            return 113;
-         }
-         return -1;
-      case 2:
-         if ((active0 & 0x56801400200000L) != 0L || (active1 & 0x3c00340L) != 0L)
-            return 965;
-         if ((active0 & 0x8fa075817a480000L) != 0L || (active1 & 0x3df033L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 965;
-         }
-         if ((active0 & 0x1000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 859;
-         }
-         if ((active0 & 0x8000000000000L) != 0L)
-            return 426;
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 2;
-               jjmatchedPos = 2;
-            }
-            return 373;
-         }
-         if ((active0 & 0x4000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 453;
-         }
-         if ((active1 & 0x4L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 884;
-         }
-         if ((active1 & 0x400L) != 0L)
-            return 430;
-         if ((active1 & 0x8L) != 0L)
-            return 908;
-         if ((active0 & 0x200000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 801;
-         }
-         if ((active0 & 0x4000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 481;
-         }
-         if ((active1 & 0x20000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 967;
-         }
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 2;
-               jjmatchedPos = 2;
-            }
-            return 965;
-         }
-         if ((active0 & 0x1000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 443;
-         }
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 137;
-         }
-         if ((active1 & 0x80L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 2;
-            }
-            return 302;
-         }
-         return -1;
-      case 3:
-         if ((active1 & 0x4L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 3;
-            }
-            return 900;
-         }
-         if ((active0 & 0x8fa074830f080000L) != 0L || (active1 & 0x2b0b3L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 3;
-            }
-            return 965;
-         }
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 3;
-            }
-            return 168;
-         }
-         if ((active0 & 0x4000000000L) != 0L)
-            return 452;
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 3;
-            }
-            return 372;
-         }
-         if ((active0 & 0x4000010070400000L) != 0L || (active1 & 0x3d4000L) != 0L)
-            return 965;
-         if ((active1 & 0x200L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 101;
-               jjmatchedPos = 3;
-            }
-            return 28;
-         }
-         if ((active0 & 0x1000000000000L) != 0L)
-            return 858;
-         return -1;
-      case 4:
-         if ((active0 & 0x9d80248001080000L) != 0L || (active1 & 0x22037L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 4;
-            return 965;
-         }
-         if ((active1 & 0x200200L) != 0L)
-            return 28;
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 4;
-            return 378;
-         }
-         if ((active0 & 0x22050030e000000L) != 0L || (active1 & 0x9080L) != 0L)
-            return 965;
-         return -1;
-      case 5:
-         if ((active0 & 0x8000000000000000L) != 0L || (active1 & 0x1L) != 0L)
-            return 28;
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 5;
-            return 377;
-         }
-         if ((active0 & 0x900240000080000L) != 0L)
-            return 965;
-         if ((active0 & 0x1480008001000000L) != 0L || (active1 & 0x22036L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 5;
-            return 965;
-         }
-         return -1;
-      case 6:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 6;
-            return 376;
-         }
-         if ((active0 & 0x1080000000000000L) != 0L || (active1 & 0x20006L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 6;
-            return 965;
-         }
-         if ((active0 & 0x400008001000000L) != 0L || (active1 & 0x2030L) != 0L)
-            return 965;
-         return -1;
-      case 7:
-         if ((active0 & 0x1080000000000000L) != 0L || (active1 & 0x20006L) != 0L)
-            return 965;
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 101;
-            jjmatchedPos = 7;
-            return 969;
-         }
-         return -1;
-      case 8:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 2;
-            jjmatchedPos = 8;
-            return 965;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0, long active1)
-{
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
-}
-private int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 34:
-         return jjStopAtPos(0, 98);
-      case 39:
-         return jjStopAtPos(0, 91);
-      case 40:
-         return jjStopAtPos(0, 3);
-      case 41:
-         return jjStopAtPos(0, 4);
-      case 42:
-         return jjStopAtPos(0, 11);
-      case 43:
-         return jjStopAtPos(0, 9);
-      case 44:
-         return jjStopAtPos(0, 6);
-      case 45:
-         return jjStartNfaWithStates_0(0, 10, 22);
-      case 46:
-         return jjStartNfaWithStates_0(0, 5, 966);
-      case 47:
-         return jjStopAtPos(0, 12);
-      case 59:
-         return jjStopAtPos(0, 7);
-      case 60:
-         jjmatchedKind = 15;
-         return jjMoveStringLiteralDfa1_0(0x10000L, 0x0L);
-      case 61:
-         return jjStopAtPos(0, 13);
-      case 62:
-         jjmatchedKind = 17;
-         return jjMoveStringLiteralDfa1_0(0x40000L, 0x0L);
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x4002800400800000L, 0x3c0008L);
-      case 66:
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x40088000000000L, 0x0L);
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0x91a0000000000000L, 0xc00013L);
-      case 68:
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x1000000000000L, 0x24L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x40000000000L, 0x40L);
-      case 70:
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x20400000L, 0x80L);
-      case 71:
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x100000000000L, 0x0L);
-      case 72:
-      case 104:
-         return jjMoveStringLiteralDfa1_0(0x200000000000L, 0x0L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x2000022002000000L, 0x0L);
-      case 74:
-      case 106:
-         return jjMoveStringLiteralDfa1_0(0x40000000L, 0x0L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x10010000000L, 0x300L);
-      case 77:
-      case 109:
-         return jjMoveStringLiteralDfa1_0(0xc000000000000L, 0x400L);
-      case 78:
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x5001000000L, 0x0L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa1_0(0x400884000000L, 0x0L);
-      case 80:
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x600000000000000L, 0x1800L);
-      case 82:
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x800000008000000L, 0xe000L);
-      case 83:
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x10000000080000L, 0x1010000L);
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x200000L, 0x2020000L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa1_0(0x100000000L, 0x0L);
-      case 87:
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x200000000L, 0x0L);
-      case 124:
-         return jjMoveStringLiteralDfa1_0(0x100L, 0x0L);
-      default :
-         return jjMoveNfa_0(0, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_0(long active0, long active1)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0, active1);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active0 & 0x10000L) != 0L)
-            return jjStopAtPos(1, 16);
-         else if ((active0 & 0x40000L) != 0L)
-            return jjStopAtPos(1, 18);
-         break;
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4200001000000L, active1, 0x2006000L);
-      case 66:
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x8L);
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x881008010080000L, active1, 0x30L);
-      case 72:
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x200000000L, active1, 0L);
-      case 73:
-      case 105:
-         if ((active1 & 0x800L) != 0L)
-            return jjStartNfaWithStates_0(1, 75, 965);
-         return jjMoveStringLiteralDfa2_0(active0, 0x108010008000000L, active1, 0x1000004L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80L);
-      case 78:
-      case 110:
-         if ((active0 & 0x80000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 31, 472);
-         else if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000000402000000L, active1, 0L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa2_0(active0, 0x9660001040200000L, active1, 0xc09703L);
-      case 81:
-      case 113:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x10000L);
-      case 82:
-      case 114:
-         if ((active0 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 35;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000500000400000L, active1, 0x20000L);
-      case 83:
-      case 115:
-         if ((active0 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 23;
-            jjmatchedPos = 1;
-         }
-         else if ((active0 & 0x2000000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 37, 396);
-         return jjMoveStringLiteralDfa2_0(active0, 0x800100000000L, active1, 0x80000L);
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x300000L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10004024000000L, active1, 0L);
-      case 86:
-      case 118:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000000000000L, active1, 0L);
-      case 88:
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0x40L);
-      case 89:
-      case 121:
-         if ((active0 & 0x80000000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 43, 965);
-         break;
-      case 124:
-         if ((active0 & 0x100L) != 0L)
-            return jjStopAtPos(1, 8);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0, active1);
-}
-private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(0, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0, active1);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x300000L);
-      case 67:
-      case 99:
-         if ((active0 & 0x800000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 47, 965);
-         break;
-      case 68:
-      case 100:
-         if ((active0 & 0x400000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 34, 965);
-         else if ((active1 & 0x400L) != 0L)
-            return jjStartNfaWithStates_0(2, 74, 430);
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0x2000L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000200000000L, active1, 0L);
-      case 70:
-      case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x10000000L, active1, 0L);
-      case 71:
-      case 103:
-         if ((active0 & 0x2000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 49, 965);
-         else if ((active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 72;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000008000000L, active1, 0x220L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200040140000000L, active1, 0x80010L);
-      case 75:
-      case 107:
-         return jjMoveStringLiteralDfa3_0(active0, 0x10000000000L, active1, 0L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400004020080000L, active1, 0L);
-      case 77:
-      case 109:
-         if ((active0 & 0x10000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 52, 965);
-         break;
-      case 78:
-      case 110:
-         if ((active0 & 0x8000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 51, 426);
-         else if ((active1 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 88, 965);
-         else if ((active1 & 0x2000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 89, 965);
-         return jjMoveStringLiteralDfa3_0(active0, 0x1080000002000000L, active1, 0x4000L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000100000400000L, active1, 0x40083L);
-      case 80:
-      case 112:
-         if ((active0 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(2, 21, 965);
-         else if ((active1 & 0x40L) != 0L)
-            return jjStartNfaWithStates_0(2, 70, 965);
-         break;
-      case 82:
-      case 114:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L, active1, 0x10000L);
-      case 83:
-      case 115:
-         if ((active1 & 0x8L) != 0L)
-            return jjStartNfaWithStates_0(2, 67, 908);
-         else if ((active1 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(2, 86, 965);
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000L, active1, 0x4L);
-      case 84:
-      case 116:
-         if ((active0 & 0x1000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 36, 965);
-         else if ((active1 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_0(2, 87, 965);
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000008005000000L, active1, 0L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000000L, active1, 0x28000L);
-      case 86:
-      case 118:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000L, active1, 0L);
-      case 87:
-      case 119:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1000L);
-      case 88:
-      case 120:
-         if ((active0 & 0x4000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 50, 965);
-         else if ((active0 & 0x40000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 54, 965);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0, active1);
-}
-private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(1, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(2, active0, active1);
-      return 3;
-   }
-   switch(curChar)
-   {
-      case 49:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200L);
-      case 65:
-      case 97:
-         if ((active0 & 0x4000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 62, 965);
-         break;
-      case 67:
-      case 99:
-         if ((active0 & 0x1000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 48, 858);
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0L);
-      case 68:
-      case 100:
-         if ((active1 & 0x4000L) != 0L)
-            return jjStartNfaWithStates_0(3, 78, 965);
-         break;
-      case 69:
-      case 101:
-         if ((active0 & 0x10000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 40, 965);
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000400006080000L, active1, 0x1000L);
-      case 72:
-      case 104:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000L, active1, 0L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800200000000000L, active1, 0x2000L);
-      case 76:
-      case 108:
-         if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 29, 965);
-         else if ((active0 & 0x4000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 38, 452);
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x10L);
-      case 77:
-      case 109:
-         if ((active0 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(3, 22, 965);
-         break;
-      case 78:
-      case 110:
-         if ((active0 & 0x40000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 30, 965);
-         else if ((active1 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(3, 83, 965);
-         else if ((active1 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 84;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x220000100000000L, active1, 0x228000L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x80L);
-      case 82:
-      case 114:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000200000000L, active1, 0x23L);
-      case 83:
-      case 115:
-         if ((active1 & 0x40000L) != 0L)
-            return jjStartNfaWithStates_0(3, 82, 965);
-         return jjMoveStringLiteralDfa4_0(active0, 0x40000000000L, active1, 0L);
-      case 84:
-      case 116:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 28, 965);
-         else if ((active1 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_0(3, 80, 965);
-         return jjMoveStringLiteralDfa4_0(active0, 0x1080000000000000L, active1, 0x4L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100001000000L, active1, 0L);
-      case 87:
-      case 119:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000L, active1, 0L);
-      case 89:
-      case 121:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(2, active0, active1);
-}
-private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(2, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(3, active0, active1);
-      return 4;
-   }
-   switch(curChar)
-   {
-      case 48:
-         if ((active1 & 0x200L) != 0L)
-            return jjStartNfaWithStates_0(4, 73, 28);
-         break;
-      case 50:
-         if ((active1 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(4, 85, 28);
-         break;
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0x2004L);
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000L, active1, 0x20000L);
-      case 68:
-      case 100:
-         if ((active1 & 0x8000L) != 0L)
-            return jjStartNfaWithStates_0(4, 79, 965);
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0x3L);
-      case 69:
-      case 101:
-         if ((active0 & 0x200000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 33, 965);
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000L, active1, 0x20L);
-      case 71:
-      case 103:
-         if ((active0 & 0x100000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 32, 965);
-         return jjMoveStringLiteralDfa5_0(active0, 0x400000000000000L, active1, 0L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x10L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0L);
-      case 78:
-      case 110:
-         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000L, active1, 0L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000000000000L, active1, 0L);
-      case 80:
-      case 112:
-         if ((active0 & 0x100000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 44, 965);
-         break;
-      case 82:
-      case 114:
-         if ((active0 & 0x2000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 25, 965);
-         else if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 26, 965);
-         else if ((active0 & 0x400000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 46, 965);
-         else if ((active1 & 0x80L) != 0L)
-            return jjStartNfaWithStates_0(4, 71, 965);
-         else if ((active1 & 0x1000L) != 0L)
-            return jjStartNfaWithStates_0(4, 76, 965);
-         return jjMoveStringLiteralDfa5_0(active0, 0x2080000001000000L, active1, 0L);
-      case 84:
-      case 116:
-         if ((active0 & 0x8000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 27, 965);
-         else if ((active0 & 0x20000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 53, 965);
-         else if ((active0 & 0x200000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 57, 965);
-         return jjMoveStringLiteralDfa5_0(active0, 0x40000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(3, active0, active1);
-}
-private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(3, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(4, active0, active1);
-      return 5;
-   }
-   switch(curChar)
-   {
-      case 49:
-         if ((active0 & 0x8000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 63, 28);
-         break;
-      case 50:
-         if ((active1 & 0x1L) != 0L)
-            return jjStartNfaWithStates_0(5, 64, 28);
-         break;
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000L, active1, 0x20000L);
-      case 69:
-      case 101:
-         if ((active0 & 0x100000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 56, 965);
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000L, active1, 0x20L);
-      case 71:
-      case 103:
-         if ((active0 & 0x200000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 45, 965);
-         break;
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000000L, active1, 0L);
-      case 78:
-      case 110:
-         if ((active0 & 0x800000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 59, 965);
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2014L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa6_0(active0, 0x480000000000000L, active1, 0L);
-      case 83:
-      case 115:
-         if ((active0 & 0x40000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 42, 965);
-         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0x2L);
-      case 84:
-      case 116:
-         if ((active0 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(5, 19, 965);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(4, active0, active1);
-}
-private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(4, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(5, active0, active1);
-      return 6;
-   }
-   switch(curChar)
-   {
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa7_0(active0, 0x2000000000000000L, active1, 0L);
-      case 71:
-      case 103:
-         if ((active1 & 0x10L) != 0L)
-            return jjStartNfaWithStates_0(6, 68, 965);
-         break;
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa7_0(active0, 0x80000000000000L, active1, 0L);
-      case 76:
-      case 108:
-         if ((active0 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 24, 965);
-         break;
-      case 78:
-      case 110:
-         if ((active0 & 0x8000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 39, 965);
-         else if ((active0 & 0x400000000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 58, 965);
-         return jjMoveStringLiteralDfa7_0(active0, 0x1000000000000000L, active1, 0L);
-      case 83:
-      case 115:
-         if ((active1 & 0x20L) != 0L)
-            return jjStartNfaWithStates_0(6, 69, 965);
-         else if ((active1 & 0x2000L) != 0L)
-            return jjStartNfaWithStates_0(6, 77, 965);
-         break;
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x20000L);
-      case 89:
-      case 121:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(5, active0, active1);
-}
-private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(5, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(6, active0, active1);
-      return 7;
-   }
-   switch(curChar)
-   {
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0x2000000000000000L, active1, 0L);
-      case 68:
-      case 100:
-         if ((active0 & 0x80000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 55, 965);
-         break;
-      case 69:
-      case 101:
-         if ((active1 & 0x4L) != 0L)
-            return jjStartNfaWithStates_0(7, 66, 965);
-         else if ((active1 & 0x20000L) != 0L)
-            return jjStartNfaWithStates_0(7, 81, 965);
-         break;
-      case 83:
-      case 115:
-         if ((active0 & 0x1000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 60, 965);
-         else if ((active1 & 0x2L) != 0L)
-            return jjStartNfaWithStates_0(7, 65, 965);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(6, active0, active1);
-}
-private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(6, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(7, active0, 0L);
-      return 8;
-   }
-   switch(curChar)
-   {
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa9_0(active0, 0x2000000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(7, active0, 0L);
-}
-private int jjMoveStringLiteralDfa9_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(7, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(8, active0, 0L);
-      return 9;
-   }
-   switch(curChar)
-   {
-      case 83:
-      case 115:
-         if ((active0 & 0x2000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 61, 965);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(8, active0, 0L);
-}
-private int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-private int jjMoveNfa_0(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 965;
-   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 590:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 620:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 656:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 373:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 376:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 966:
-                  if ((0x3ff000000000000L & l) != 0L)
-                  {
-                     if (kind > 95)
-                        kind = 95;
-                     jjCheckNAdd(952);
-                  }
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(948, 949);
-                  break;
-               case 303:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 431:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 5:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 168:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 669:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 137:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 324:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 910:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 295:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 33:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 877:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 423:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 908:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 932:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 249:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 821:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 491:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 637:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 967:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 813:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 501:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 481:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 452:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 410:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 372:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 752:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 969:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 859:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 315:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 32:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 52:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 426:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 0:
-                  if ((0x3ff000000000000L & l) != 0L)
-                  {
-                     if (kind > 96)
-                        kind = 96;
-                     jjCheckNAddStates(0, 8);
-                  }
-                  else if ((0x100002600L & l) != 0L)
-                  {
-                     if (kind > 1)
-                        kind = 1;
-                  }
-                  else if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  else if (curChar == 46)
-                     jjCheckNAddTwoStates(948, 952);
-                  else if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 22;
-                  else if (curChar == 33)
-                     jjstateSet[jjnewStateCnt++] = 19;
-                  else if (curChar == 60)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 332:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 377:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 404:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 45:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 717:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 345:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 909:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 378:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 302:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 454:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 416:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 670:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 797:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 482:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 453:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 439:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 396:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 550:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 597:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 471:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 770:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 549:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 430:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 965:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 438:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 801:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 581:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 858:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 472:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 913:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 796:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 427:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 443:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 424:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 900:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 264:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 968:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 113:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 884:
-                  if ((0x83ff001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x8000001800000000L & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 1:
-                  if (curChar == 10 && kind > 1)
-                     kind = 1;
-                  break;
-               case 2:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 17:
-                  if (curChar == 62 && kind > 14)
-                     kind = 14;
-                  break;
-               case 18:
-                  if (curChar == 60)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  break;
-               case 19:
-                  if (curChar == 61 && kind > 14)
-                     kind = 14;
-                  break;
-               case 20:
-                  if (curChar == 33)
-                     jjstateSet[jjnewStateCnt++] = 19;
-                  break;
-               case 21:
-                  if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 22;
-                  break;
-               case 22:
-                  if (curChar != 45)
-                     break;
-                  if (kind > 90)
-                     kind = 90;
-                  jjCheckNAddStates(9, 11);
-                  break;
-               case 23:
-                  if ((0xffffffffffffdbffL & l) == 0L)
-                     break;
-                  if (kind > 90)
-                     kind = 90;
-                  jjCheckNAddStates(9, 11);
-                  break;
-               case 24:
-                  if ((0x2400L & l) != 0L && kind > 90)
-                     kind = 90;
-                  break;
-               case 25:
-                  if (curChar == 10 && kind > 90)
-                     kind = 90;
-                  break;
-               case 26:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 25;
-                  break;
-               case 27:
-                  if ((0x8000001800000000L & l) == 0L)
-                     break;
-                  if (kind > 101)
-                     kind = 101;
-                  jjCheckNAddTwoStates(27, 28);
-                  break;
-               case 28:
-                  if ((0x83ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 101)
-                     kind = 101;
-                  jjCheckNAdd(28);
-                  break;
-               case 255:
-                  if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 254;
-                  break;
-               case 947:
-                  if (curChar == 46)
-                     jjCheckNAddTwoStates(948, 952);
-                  break;
-               case 948:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(948, 949);
-                  break;
-               case 950:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(951);
-                  break;
-               case 951:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 94)
-                     kind = 94;
-                  jjCheckNAdd(951);
-                  break;
-               case 952:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 95)
-                     kind = 95;
-                  jjCheckNAdd(952);
-                  break;
-               case 953:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 96)
-                     kind = 96;
-                  jjCheckNAddStates(0, 8);
-                  break;
-               case 954:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(954, 949);
-                  break;
-               case 955:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(955, 956);
-                  break;
-               case 956:
-                  if (curChar == 46)
-                     jjCheckNAddTwoStates(957, 949);
-                  break;
-               case 957:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(957, 949);
-                  break;
-               case 958:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(958, 959);
-                  break;
-               case 959:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 95)
-                     kind = 95;
-                  jjCheckNAdd(960);
-                  break;
-               case 960:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 95)
-                     kind = 95;
-                  jjCheckNAdd(960);
-                  break;
-               case 961:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 96)
-                     kind = 96;
-                  jjCheckNAdd(961);
-                  break;
-               case 962:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(962, 963);
-                  break;
-               case 963:
-                  if ((0x8000001800000000L & l) == 0L)
-                     break;
-                  if (kind > 101)
-                     kind = 101;
-                  jjCheckNAdd(964);
-                  break;
-               case 964:
-                  if ((0x83ff001800000000L & l) == 0L)
-                     break;
-                  if (kind > 101)
-                     kind = 101;
-                  jjCheckNAdd(964);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 590:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 665;
-                  else if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 656;
-                  else if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 649;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 631;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 628;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 626;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 620;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(34);
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 593;
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 643;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 617;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 589;
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 637;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 607;
-                  if ((0x2000000020000L & l) != 0L)
-                     jjCheckNAdd(280);
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 602;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 597;
-                  break;
-               case 620:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x400000004000000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 656:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 655;
-                  break;
-               case 373:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 385;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 379;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 372;
-                  break;
-               case 376:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 303:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 302;
-                  break;
-               case 431:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 433;
-                  else if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 430;
-                  break;
-               case 5:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 4;
-                  break;
-               case 168:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 167;
-                  break;
-               case 669:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 668;
-                  break;
-               case 137:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 173;
-                  else if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 168;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 162;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 144;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 152;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 136;
-                  break;
-               case 324:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 323;
-                  break;
-               case 910:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 945;
-                  else if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 943;
-                  else if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 932;
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  else if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  else if ((0x1000000010L & l) != 0L)
-                     jjCheckNAdd(53);
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 913;
-                  else if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 909;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 923;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 920;
-                  break;
-               case 295:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 312;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 303;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 300;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 297;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 294;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 309;
-                  if ((0x800000008000L & l) != 0L)
-                     jjCheckNAdd(3);
-                  break;
-               case 33:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 45;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 43;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 32;
-                  if ((0x20000000200L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 877:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 901;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 876;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 884;
-                  break;
-               case 423:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 422;
-                  break;
-               case 908:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 907;
-                  break;
-               case 932:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 931;
-                  break;
-               case 249:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 290;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 260;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 256;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 248;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 285;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(53);
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 278;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 273;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 271;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 264;
-                  break;
-               case 821:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 867;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 853;
-                  else if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 849;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 830;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 820;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 859;
-                  else if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 843;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 825;
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 835;
-                  break;
-               case 491:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 546;
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 542;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 501;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 495;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 535;
-                  else if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(53);
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 527;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 524;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 519;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 513;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 508;
-                  break;
-               case 637:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 648;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 642;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 636;
-                  if ((0x100000001000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 967:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 813:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 902;
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 895;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 893;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 868;
-                  else if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(7);
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 889;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 885;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 860;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 812;
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 877;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 854;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 850;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 844;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 836;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 831;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 826;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 821;
-                  break;
-               case 501:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 500;
-                  break;
-               case 481:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 480;
-                  break;
-               case 452:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjCheckNAdd(451);
-                  break;
-               case 410:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 412;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 409;
-                  break;
-               case 372:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 384;
-                  else if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 371;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 378;
-                  break;
-               case 752:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 772;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 767;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 760;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 770;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 764;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 755;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 751;
-                  break;
-               case 969:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 859:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 866;
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 858;
-                  break;
-               case 315:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 324;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 321;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 318;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(34);
-                  if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 32:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 31;
-                  break;
-               case 52:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 245;
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 190;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 186;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 107;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 104;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 68;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 241;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 175;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 100;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 62;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 231;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 170;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 86;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 60;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 215;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 164;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 77;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 58;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 205;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 154;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 70;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 51;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 195;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 146;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 138;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 133;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 129;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 125;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 118;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 113;
-                  break;
-               case 426:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 425;
-                  break;
-               case 0:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAddStates(12, 22);
-                  else if ((0x1000000010L & l) != 0L)
-                     jjAddStates(23, 39);
-                  else if ((0x80000000800000L & l) != 0L)
-                     jjAddStates(40, 44);
-                  else if ((0x40000000400000L & l) != 0L)
-                     jjAddStates(45, 49);
-                  else if ((0x20000000200000L & l) != 0L)
-                     jjAddStates(50, 56);
-                  else if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAddStates(57, 70);
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjAddStates(71, 87);
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjAddStates(88, 95);
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjAddStates(96, 106);
-                  else if ((0x800000008000L & l) != 0L)
-                     jjCheckNAddStates(107, 113);
-                  else if ((0x400000004000L & l) != 0L)
-                     jjCheckNAddStates(114, 120);
-                  else if ((0x200000002000L & l) != 0L)
-                     jjAddStates(121, 124);
-                  else if ((0x100000001000L & l) != 0L)
-                     jjAddStates(125, 130);
-                  else if ((0x20000000200L & l) != 0L)
-                     jjAddStates(131, 143);
-                  else if ((0x8000000080L & l) != 0L)
-                     jjCheckNAddStates(144, 148);
-                  else if ((0x4000000040L & l) != 0L)
-                     jjAddStates(149, 155);
-                  else if ((0x2000000020L & l) != 0L)
-                     jjAddStates(156, 165);
-                  else if ((0x800000008L & l) != 0L)
-                     jjAddStates(166, 195);
-                  else if ((0x400000004L & l) != 0L)
-                     jjAddStates(196, 199);
-                  else if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 15;
-                  else if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  else if ((0x80000000800L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 8;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 5;
-                  break;
-               case 332:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 396;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 389;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 338;
-                  else if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 331;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 387;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 381;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 374;
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 368;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 364;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 355;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 352;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 345;
-                  break;
-               case 377:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 376;
-                  break;
-               case 404:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 419;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 413;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 405;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 416;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 410;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 403;
-                  break;
-               case 45:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(36);
-                  break;
-               case 717:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 744;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 741;
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 732;
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 725;
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 716;
-                  break;
-               case 345:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(320);
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 367;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 354;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 351;
-                  else if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 344;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 386;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 363;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 380;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 373;
-                  if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 909:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 908;
-                  break;
-               case 378:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 383;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 377;
-                  break;
-               case 302:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 454:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 458;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 453;
-                  break;
-               case 416:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x80000000800000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 418;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 415;
-                  break;
-               case 670:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 747;
-                  else if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 711;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 678;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 676;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 669;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 745;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 698;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 742;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 687;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 733;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 680;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 726;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 717;
-                  break;
-               case 797:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 809;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 806;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 804;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 802;
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 796;
-                  break;
-               case 482:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 481;
-                  break;
-               case 453:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 452;
-                  break;
-               case 439:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 459;
-                  else if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 449;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 447;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 444;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 454;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 438;
-                  break;
-               case 396:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 395;
-                  break;
-               case 550:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 583;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 575;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 581;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 571;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 565;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 559;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 551;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 549;
-                  break;
-               case 597:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 616;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 601;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 606;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 596;
-                  break;
-               case 471:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 488;
-                  else if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 482;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 478;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 472;
-                  else if ((0x4000000040L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 470;
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 474;
-                  break;
-               case 770:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(3);
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 769;
-                  break;
-               case 549:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 574;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 570;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 564;
-                  else if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 558;
-                  else if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(280);
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(53);
-                  break;
-               case 430:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 429;
-                  break;
-               case 965:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  break;
-               case 438:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 443;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 437;
-                  break;
-               case 801:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 800;
-                  if ((0x400000004000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 581:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x80000000800000L & l) != 0L)
-                     jjCheckNAdd(156);
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 580;
-                  break;
-               case 858:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 865;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 857;
-                  break;
-               case 472:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 913:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 912;
-                  break;
-               case 796:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 801;
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(30);
-                  break;
-               case 427:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 426;
-                  break;
-               case 443:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 442;
-                  break;
-               case 424:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 434;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 427;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 423;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 431;
-                  break;
-               case 900:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 899;
-                  break;
-               case 264:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 289;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 277;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 270;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 284;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(251);
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 263;
-                  break;
-               case 968:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x200000002000000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 113:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 185;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 174;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 132;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 128;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 112;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 169;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 124;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 163;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 117;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 153;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 145;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 137;
-                  break;
-               case 884:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAdd(28);
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 101)
-                        kind = 101;
-                     jjCheckNAddTwoStates(27, 28);
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 900;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 883;
-                  break;
-               case 3:
-                  if ((0x4000000040000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 4:
-               case 689:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjCheckNAdd(3);
-                  break;
-               case 6:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 5;
-                  break;
-               case 7:
-                  if ((0x200000002000000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 8:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 9:
-                  if ((0x80000000800L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 8;
-                  break;
-               case 10:
-               case 70:
-               case 446:
-               case 782:
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(3);
-                  break;
-               case 11:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 10;
-                  break;
-               case 12:
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  break;
-               case 13:
-                  if ((0x2000000020L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 14:
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 15:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 14;
-                  break;
-               case 16:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 15;
-                  break;
-               case 23:
-                  if (kind > 90)
-                     kind = 90;
-                  jjAddStates(9, 11);
-                  break;
-               case 27:
-                  if ((0x6fffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 101)
-                     kind = 101;
-                  jjCheckNAddTwoStates(27, 28);
-                  break;
-               case 28:
-                  if ((0x6fffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 101)
-                     kind = 101;
-                  jjCheckNAdd(28);
-                  break;
-               case 29:
-                  if ((0x400000004L & l) != 0L)
-                     jjAddStates(196, 199);
-                  break;
-               case 30:
-                  if ((0x400000004000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 31:
-               case 887:
-                  if ((0x20000000200L & l) != 0L)
-                     jjCheckNAdd(30);
-                  break;
-               case 34:
-                  if ((0x10000000100000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 35:
-               case 131:
-                  if ((0x20000000200L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 36:
-                  if ((0x10000000100L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 37:
-               case 79:
-               case 88:
-               case 433:
-               case 462:
-               case 804:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(36);
-                  break;
-               case 38:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 37;
-                  break;
-               case 39:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 38;
-                  break;
-               case 40:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 39;
-                  break;
-               case 41:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 40;
-                  break;
-               case 42:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 41;
-                  break;
-               case 43:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 42;
-                  break;
-               case 44:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 43;
-                  break;
-               case 46:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 45;
-                  break;
-               case 47:
-                  if ((0x800000008L & l) != 0L)
-                     jjAddStates(166, 195);
-                  break;
-               case 48:
-               case 634:
-                  if ((0x1000000010L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 49:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 48;
-                  break;
-               case 50:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 49;
-                  break;
-               case 51:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 50;
-                  break;
-               case 53:
-                  if ((0x1000000010L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 54:
-               case 846:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(53);
-                  break;
-               case 55:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 54;
-                  break;
-               case 56:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 55;
-                  break;
-               case 57:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 56;
-                  break;
-               case 58:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 57;
-                  break;
-               case 59:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 58;
-                  break;
-               case 60:
-               case 106:
-               case 248:
-               case 293:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 61:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 60;
-                  break;
-               case 62:
-               case 299:
-               case 405:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 63:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 62;
-                  break;
-               case 64:
-                  if ((0x8000000080L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 65:
-                  if ((0x800000008000L & l) != 0L)
-                     jjCheckNAdd(64);
-                  break;
-               case 66:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 65;
-                  break;
-               case 67:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 66;
-                  break;
-               case 68:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 67;
-                  break;
-               case 69:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 68;
-                  break;
-               case 71:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 70;
-                  break;
-               case 72:
-               case 233:
-               case 371:
-               case 418:
-               case 609:
-               case 658:
-               case 766:
-               case 798:
-               case 922:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(3);
-                  break;
-               case 73:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 72;
-                  break;
-               case 74:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 73;
-                  break;
-               case 75:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 74;
-                  break;
-               case 76:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 75;
-                  break;
-               case 77:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 76;
-                  break;
-               case 78:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 77;
-                  break;
-               case 80:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 79;
-                  break;
-               case 81:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 80;
-                  break;
-               case 82:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 81;
-                  break;
-               case 83:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 82;
-                  break;
-               case 84:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 83;
-                  break;
-               case 85:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 84;
-                  break;
-               case 86:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 85;
-                  break;
-               case 87:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 86;
-                  break;
-               case 89:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 88;
-                  break;
-               case 90:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 89;
-                  break;
-               case 91:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 90;
-                  break;
-               case 92:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 91;
-                  break;
-               case 93:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 92;
-                  break;
-               case 94:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 93;
-                  break;
-               case 95:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 94;
-                  break;
-               case 96:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 95;
-                  break;
-               case 97:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 96;
-                  break;
-               case 98:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 97;
-                  break;
-               case 99:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 98;
-                  break;
-               case 100:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 99;
-                  break;
-               case 101:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 100;
-                  break;
-               case 102:
-                  if ((0x80000000800L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 103:
-               case 577:
-                  if ((0x800000008L & l) != 0L)
-                     jjCheckNAdd(102);
-                  break;
-               case 104:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 103;
-                  break;
-               case 105:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 104;
-                  break;
-               case 107:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 106;
-                  break;
-               case 108:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 107;
-                  break;
-               case 109:
-               case 630:
-                  if ((0x800000008L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 110:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 109;
-                  break;
-               case 111:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 110;
-                  break;
-               case 112:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 111;
-                  break;
-               case 114:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 113;
-                  break;
-               case 115:
-               case 188:
-               case 197:
-               case 275:
-               case 333:
-               case 425:
-               case 645:
-               case 700:
-               case 728:
-               case 762:
-               case 808:
-               case 812:
-               case 815:
-               case 852:
-               case 905:
-               case 916:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 116:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 115;
-                  break;
-               case 117:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 116;
-                  break;
-               case 118:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 117;
-                  break;
-               case 119:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 118;
-                  break;
-               case 120:
-               case 140:
-               case 266:
-               case 391:
-               case 476:
-               case 497:
-               case 503:
-               case 599:
-               case 604:
-               case 719:
-               case 735:
-               case 750:
-               case 911:
-               case 927:
-               case 934:
-                  if ((0x800000008000L & l) != 0L)
-                     jjCheckNAdd(30);
-                  break;
-               case 121:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 120;
-                  break;
-               case 122:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 121;
-                  break;
-               case 123:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 122;
-                  break;
-               case 124:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 123;
-                  break;
-               case 125:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 124;
-                  break;
-               case 126:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 125;
-                  break;
-               case 127:
-                  if ((0x200000002000L & l) != 0L)
-                     jjCheckNAdd(30);
-                  break;
-               case 128:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 127;
-                  break;
-               case 129:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 128;
-                  break;
-               case 130:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 129;
-                  break;
-               case 132:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 131;
-                  break;
-               case 133:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 132;
-                  break;
-               case 134:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 133;
-                  break;
-               case 135:
-               case 287:
-               case 567:
-               case 879:
-                  if ((0x800000008L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 136:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 135;
-                  break;
-               case 138:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 137;
-                  break;
-               case 139:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 138;
-                  break;
-               case 141:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 140;
-                  break;
-               case 142:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 141;
-                  break;
-               case 143:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 142;
-                  break;
-               case 144:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 143;
-                  break;
-               case 145:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 144;
-                  break;
-               case 146:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 145;
-                  break;
-               case 147:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 146;
-                  break;
-               case 148:
-               case 192:
-               case 323:
-               case 622:
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 149:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 148;
-                  break;
-               case 150:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 149;
-                  break;
-               case 151:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 150;
-                  break;
-               case 152:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 151;
-                  break;
-               case 153:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 152;
-                  break;
-               case 154:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 153;
-                  break;
-               case 155:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 154;
-                  break;
-               case 156:
-                  if ((0x8000000080000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 157:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(156);
-                  break;
-               case 158:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 157;
-                  break;
-               case 159:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 158;
-                  break;
-               case 160:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 159;
-                  break;
-               case 161:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 160;
-                  break;
-               case 162:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 161;
-                  break;
-               case 163:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 162;
-                  break;
-               case 164:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 163;
-                  break;
-               case 165:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 164;
-                  break;
-               case 166:
-               case 753:
-               case 775:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 167:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 166;
-                  break;
-               case 169:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 168;
-                  break;
-               case 170:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 169;
-                  break;
-               case 171:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 170;
-                  break;
-               case 172:
-               case 366:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 173:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 172;
-                  break;
-               case 174:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 173;
-                  break;
-               case 175:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 174;
-                  break;
-               case 176:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 175;
-                  break;
-               case 177:
-               case 407:
-               case 651:
-               case 713:
-               case 787:
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(64);
-                  break;
-               case 178:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 177;
-                  break;
-               case 179:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 178;
-                  break;
-               case 180:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 179;
-                  break;
-               case 181:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 180;
-                  break;
-               case 182:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 181;
-                  break;
-               case 183:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 182;
-                  break;
-               case 184:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 183;
-                  break;
-               case 185:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 184;
-                  break;
-               case 186:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 185;
-                  break;
-               case 187:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 186;
-                  break;
-               case 189:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 188;
-                  break;
-               case 190:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 189;
-                  break;
-               case 191:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 190;
-                  break;
-               case 193:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 192;
-                  break;
-               case 194:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 193;
-                  break;
-               case 195:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 194;
-                  break;
-               case 196:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 195;
-                  break;
-               case 198:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 197;
-                  break;
-               case 199:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 198;
-                  break;
-               case 200:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 199;
-                  break;
-               case 201:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 200;
-                  break;
-               case 202:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 201;
-                  break;
-               case 203:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 202;
-                  break;
-               case 204:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 203;
-                  break;
-               case 205:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 204;
-                  break;
-               case 206:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 205;
-                  break;
-               case 207:
-               case 628:
-               case 680:
-                  if ((0x200000002000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 208:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 207;
-                  break;
-               case 209:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 208;
-                  break;
-               case 210:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 209;
-                  break;
-               case 211:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 210;
-                  break;
-               case 212:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 211;
-                  break;
-               case 213:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 212;
-                  break;
-               case 214:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 213;
-                  break;
-               case 215:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 214;
-                  break;
-               case 216:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 215;
-                  break;
-               case 217:
-                  if ((0x1000000010000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 218:
-               case 682:
-                  if ((0x200000002000L & l) != 0L)
-                     jjCheckNAdd(217);
-                  break;
-               case 219:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 218;
-                  break;
-               case 220:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 219;
-                  break;
-               case 221:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 220;
-                  break;
-               case 222:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 221;
-                  break;
-               case 223:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 222;
-                  break;
-               case 224:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 223;
-                  break;
-               case 225:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 224;
-                  break;
-               case 226:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 225;
-                  break;
-               case 227:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 226;
-                  break;
-               case 228:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 227;
-                  break;
-               case 229:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 228;
-                  break;
-               case 230:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 229;
-                  break;
-               case 231:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 230;
-                  break;
-               case 232:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 231;
-                  break;
-               case 234:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 233;
-                  break;
-               case 235:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 234;
-                  break;
-               case 236:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 235;
-                  break;
-               case 237:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 236;
-                  break;
-               case 238:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 237;
-                  break;
-               case 239:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 238;
-                  break;
-               case 240:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 239;
-                  break;
-               case 241:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 240;
-                  break;
-               case 242:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 241;
-                  break;
-               case 243:
-               case 340:
-               case 526:
-               case 639:
-               case 862:
-                  if ((0x800000008000L & l) != 0L)
-                     jjCheckNAdd(3);
-                  break;
-               case 244:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 243;
-                  break;
-               case 245:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 244;
-                  break;
-               case 246:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 245;
-                  break;
-               case 247:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(156, 165);
-                  break;
-               case 250:
-               case 311:
-               case 595:
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(53);
-                  break;
-               case 251:
-                  if ((0x800000008L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 252:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(251);
-                  break;
-               case 253:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 252;
-                  break;
-               case 254:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 253;
-                  break;
-               case 256:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 255;
-                  break;
-               case 257:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 256;
-                  break;
-               case 258:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 259:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 258;
-                  break;
-               case 260:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 259;
-                  break;
-               case 261:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 260;
-                  break;
-               case 262:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 263:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 262;
-                  break;
-               case 265:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 264;
-                  break;
-               case 267:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 266;
-                  break;
-               case 268:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 267;
-                  break;
-               case 269:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 268;
-                  break;
-               case 270:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 269;
-                  break;
-               case 271:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 270;
-                  break;
-               case 272:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 271;
-                  break;
-               case 273:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(251);
-                  break;
-               case 274:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 273;
-                  break;
-               case 276:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 275;
-                  break;
-               case 277:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 276;
-                  break;
-               case 278:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 277;
-                  break;
-               case 279:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 278;
-                  break;
-               case 280:
-                  if ((0x100000001000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 281:
-               case 316:
-               case 383:
-               case 415:
-               case 440:
-               case 492:
-               case 823:
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(280);
-                  break;
-               case 282:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 281;
-                  break;
-               case 283:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 282;
-                  break;
-               case 284:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 283;
-                  break;
-               case 285:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 284;
-                  break;
-               case 286:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 285;
-                  break;
-               case 288:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 287;
-                  break;
-               case 289:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 288;
-                  break;
-               case 290:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 289;
-                  break;
-               case 291:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 290;
-                  break;
-               case 292:
-                  if ((0x4000000040L & l) != 0L)
-                     jjAddStates(149, 155);
-                  break;
-               case 294:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 293;
-                  break;
-               case 296:
-               case 422:
-                  if ((0x800000008L & l) != 0L)
-                     jjCheckNAdd(36);
-                  break;
-               case 297:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 296;
-                  break;
-               case 298:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 297;
-                  break;
-               case 300:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 299;
-                  break;
-               case 301:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 300;
-                  break;
-               case 304:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 303;
-                  break;
-               case 305:
-                  if ((0x800000008000L & l) != 0L)
-                     jjCheckNAdd(3);
-                  break;
-               case 306:
-                  if ((0x8000000080L & l) != 0L)
-                     jjCheckNAdd(30);
-                  break;
-               case 307:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 306;
-                  break;
-               case 308:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 307;
-                  break;
-               case 309:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 308;
-                  break;
-               case 310:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 309;
-                  break;
-               case 312:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 311;
-                  break;
-               case 313:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 312;
-                  break;
-               case 314:
-                  if ((0x8000000080L & l) != 0L)
-                     jjCheckNAddStates(144, 148);
-                  break;
-               case 317:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 316;
-                  break;
-               case 318:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 317;
-                  break;
-               case 319:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 318;
-                  break;
-               case 320:
-                  if ((0x800000008000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 321:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(320);
-                  break;
-               case 322:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 321;
-                  break;
-               case 325:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 324;
-                  break;
-               case 326:
-                  if ((0x20000000200L & l) != 0L)
-                     jjAddStates(131, 143);
-                  break;
-               case 327:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 328:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 327;
-                  break;
-               case 329:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 328;
-                  break;
-               case 330:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 329;
-                  break;
-               case 331:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 330;
-                  break;
-               case 334:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 333;
-                  break;
-               case 335:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 334;
-                  break;
-               case 336:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 335;
-                  break;
-               case 337:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 336;
-                  break;
-               case 338:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 337;
-                  break;
-               case 339:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 338;
-                  break;
-               case 341:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 340;
-                  break;
-               case 342:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 341;
-                  break;
-               case 343:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 342;
-                  break;
-               case 344:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 343;
-                  break;
-               case 346:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 345;
-                  break;
-               case 347:
-                  if ((0x100000001000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 348:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 347;
-                  break;
-               case 349:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 348;
-                  break;
-               case 350:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 349;
-                  break;
-               case 351:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 350;
-                  break;
-               case 352:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 351;
-                  break;
-               case 353:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 352;
-                  break;
-               case 354:
-               case 480:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 355:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 354;
-                  break;
-               case 356:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 355;
-                  break;
-               case 357:
-               case 515:
-               case 561:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 358:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 357;
-                  break;
-               case 359:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 358;
-                  break;
-               case 360:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 359;
-                  break;
-               case 361:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 360;
-                  break;
-               case 362:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 361;
-                  break;
-               case 363:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 362;
-                  break;
-               case 364:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 363;
-                  break;
-               case 365:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 364;
-                  break;
-               case 367:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 366;
-                  break;
-               case 368:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 367;
-                  break;
-               case 369:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 368;
-                  break;
-               case 370:
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 374:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 373;
-                  break;
-               case 375:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 374;
-                  break;
-               case 379:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 378;
-                  break;
-               case 380:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 379;
-                  break;
-               case 381:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 380;
-                  break;
-               case 382:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 381;
-                  break;
-               case 384:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 383;
-                  break;
-               case 385:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 384;
-                  break;
-               case 386:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 385;
-                  break;
-               case 387:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 386;
-                  break;
-               case 388:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 387;
-                  break;
-               case 389:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAdd(320);
-                  break;
-               case 390:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 389;
-                  break;
-               case 392:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 391;
-                  break;
-               case 393:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 392;
-                  break;
-               case 394:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 393;
-                  break;
-               case 395:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 394;
-                  break;
-               case 397:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 396;
-                  break;
-               case 398:
-                  if ((0x100000001000L & l) != 0L)
-                     jjAddStates(125, 130);
-                  break;
-               case 399:
-               case 769:
-                  if ((0x8000000080L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 400:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 399;
-                  break;
-               case 401:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 400;
-                  break;
-               case 402:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 401;
-                  break;
-               case 403:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 402;
-                  break;
-               case 406:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 405;
-                  break;
-               case 408:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 407;
-                  break;
-               case 409:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 408;
-                  break;
-               case 411:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 410;
-                  break;
-               case 412:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(280);
-                  break;
-               case 413:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 412;
-                  break;
-               case 414:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 413;
-                  break;
-               case 417:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 416;
-                  break;
-               case 419:
-                  if ((0x80000000800000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 418;
-                  break;
-               case 420:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 419;
-                  break;
-               case 421:
-                  if ((0x200000002000L & l) != 0L)
-                     jjAddStates(121, 124);
-                  break;
-               case 428:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 427;
-                  break;
-               case 429:
-               case 668:
-               case 838:
-               case 891:
-                  if ((0x100000001000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 432:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 431;
-                  break;
-               case 434:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 433;
-                  break;
-               case 435:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 434;
-                  break;
-               case 436:
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAddStates(114, 120);
-                  break;
-               case 437:
-               case 529:
-               case 553:
-               case 778:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(156);
-                  break;
-               case 441:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 440;
-                  break;
-               case 442:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 441;
-                  break;
-               case 444:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 443;
-                  break;
-               case 445:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 444;
-                  break;
-               case 447:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 446;
-                  break;
-               case 448:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 447;
-                  break;
-               case 449:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 450:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 449;
-                  break;
-               case 451:
-                  if ((0x4000000040L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 455:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 454;
-                  break;
-               case 456:
-               case 544:
-                  if ((0x20000000200L & l) != 0L)
-                     jjCheckNAdd(251);
-                  break;
-               case 457:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 456;
-                  break;
-               case 458:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 457;
-                  break;
-               case 459:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 458;
-                  break;
-               case 460:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 459;
-                  break;
-               case 461:
-                  if ((0x800000008000L & l) != 0L)
-                     jjCheckNAddStates(107, 113);
-                  break;
-               case 463:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 462;
-                  break;
-               case 464:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 463;
-                  break;
-               case 465:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 464;
-                  break;
-               case 466:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 465;
-                  break;
-               case 467:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 466;
-                  break;
-               case 468:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 467;
-                  break;
-               case 469:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 468;
-                  break;
-               case 470:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 469;
-                  break;
-               case 473:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 472;
-                  break;
-               case 474:
-               case 678:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(30);
-                  break;
-               case 475:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 474;
-                  break;
-               case 477:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 476;
-                  break;
-               case 478:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 477;
-                  break;
-               case 479:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 478;
-                  break;
-               case 483:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 482;
-                  break;
-               case 484:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjCheckNAdd(156);
-                  break;
-               case 485:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 484;
-                  break;
-               case 486:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 485;
-                  break;
-               case 487:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 486;
-                  break;
-               case 488:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 487;
-                  break;
-               case 489:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 488;
-                  break;
-               case 490:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjAddStates(96, 106);
-                  break;
-               case 493:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 492;
-                  break;
-               case 494:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 493;
-                  break;
-               case 495:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 494;
-                  break;
-               case 496:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 495;
-                  break;
-               case 498:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 497;
-                  break;
-               case 499:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 498;
-                  break;
-               case 500:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 499;
-                  break;
-               case 502:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 501;
-                  break;
-               case 504:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 503;
-                  break;
-               case 505:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 504;
-                  break;
-               case 506:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 505;
-                  break;
-               case 507:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 506;
-                  break;
-               case 508:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 507;
-                  break;
-               case 509:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 508;
-                  break;
-               case 510:
-               case 537:
-               case 828:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 511:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 510;
-                  break;
-               case 512:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 511;
-                  break;
-               case 513:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 512;
-                  break;
-               case 514:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 513;
-                  break;
-               case 516:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 515;
-                  break;
-               case 517:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 516;
-                  break;
-               case 518:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 517;
-                  break;
-               case 519:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 518;
-                  break;
-               case 520:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 519;
-                  break;
-               case 521:
-               case 671:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 522:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 521;
-                  break;
-               case 523:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 522;
-                  break;
-               case 524:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 523;
-                  break;
-               case 525:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 524;
-                  break;
-               case 527:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 526;
-                  break;
-               case 528:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 527;
-                  break;
-               case 530:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 529;
-                  break;
-               case 531:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 530;
-                  break;
-               case 532:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 531;
-                  break;
-               case 533:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 532;
-                  break;
-               case 534:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 533;
-                  break;
-               case 535:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 534;
-                  break;
-               case 536:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 535;
-                  break;
-               case 538:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 537;
-                  break;
-               case 539:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 538;
-                  break;
-               case 540:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 539;
-                  break;
-               case 541:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 540;
-                  break;
-               case 542:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 541;
-                  break;
-               case 543:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 542;
-                  break;
-               case 545:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 544;
-                  break;
-               case 546:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 545;
-                  break;
-               case 547:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 546;
-                  break;
-               case 548:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjAddStates(88, 95);
-                  break;
-               case 551:
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(280);
-                  break;
-               case 552:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 551;
-                  break;
-               case 554:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 553;
-                  break;
-               case 555:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 554;
-                  break;
-               case 556:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 555;
-                  break;
-               case 557:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 556;
-                  break;
-               case 558:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 557;
-                  break;
-               case 559:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 558;
-                  break;
-               case 560:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 559;
-                  break;
-               case 562:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 561;
-                  break;
-               case 563:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 562;
-                  break;
-               case 564:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 563;
-                  break;
-               case 565:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 564;
-                  break;
-               case 566:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 565;
-                  break;
-               case 568:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 567;
-                  break;
-               case 569:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 568;
-                  break;
-               case 570:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 569;
-                  break;
-               case 571:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 570;
-                  break;
-               case 572:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 571;
-                  break;
-               case 573:
-                  if ((0x80000000800L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 574:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 573;
-                  break;
-               case 575:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 574;
-                  break;
-               case 576:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 575;
-                  break;
-               case 578:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 577;
-                  break;
-               case 579:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 578;
-                  break;
-               case 580:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 579;
-                  break;
-               case 582:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 581;
-                  break;
-               case 583:
-                  if ((0x80000000800000L & l) != 0L)
-                     jjCheckNAdd(156);
-                  break;
-               case 584:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 583;
-                  break;
-               case 585:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjAddStates(71, 87);
-                  break;
-               case 586:
-                  if ((0x200000002L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 587:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 586;
-                  break;
-               case 588:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 587;
-                  break;
-               case 589:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 588;
-                  break;
-               case 591:
-                  if ((0x100000001000L & l) != 0L)
-                     jjCheckNAdd(280);
-                  break;
-               case 592:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 591;
-                  break;
-               case 593:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 592;
-                  break;
-               case 594:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 593;
-                  break;
-               case 596:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 595;
-                  break;
-               case 598:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 597;
-                  break;
-               case 600:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 599;
-                  break;
-               case 601:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 600;
-                  break;
-               case 602:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 601;
-                  break;
-               case 603:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 602;
-                  break;
-               case 605:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 604;
-                  break;
-               case 606:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 605;
-                  break;
-               case 607:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 606;
-                  break;
-               case 608:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 607;
-                  break;
-               case 610:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 609;
-                  break;
-               case 611:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 610;
-                  break;
-               case 612:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 611;
-                  break;
-               case 613:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 612;
-                  break;
-               case 614:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 613;
-                  break;
-               case 615:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 614;
-                  break;
-               case 616:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 615;
-                  break;
-               case 617:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 616;
-                  break;
-               case 618:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 617;
-                  break;
-               case 619:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 621:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 620;
-                  break;
-               case 623:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 622;
-                  break;
-               case 624:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 623;
-                  break;
-               case 625:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 624;
-                  break;
-               case 626:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 625;
-                  break;
-               case 627:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 626;
-                  break;
-               case 629:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 628;
-                  break;
-               case 631:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 630;
-                  break;
-               case 632:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 631;
-                  break;
-               case 633:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjCheckNAdd(280);
-                  break;
-               case 635:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 634;
-                  break;
-               case 636:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 635;
-                  break;
-               case 638:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 637;
-                  break;
-               case 640:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 639;
-                  break;
-               case 641:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 640;
-                  break;
-               case 642:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 641;
-                  break;
-               case 643:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 642;
-                  break;
-               case 644:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 643;
-                  break;
-               case 646:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 645;
-                  break;
-               case 647:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 646;
-                  break;
-               case 648:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 647;
-                  break;
-               case 649:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 648;
-                  break;
-               case 650:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 649;
-                  break;
-               case 652:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 651;
-                  break;
-               case 653:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 652;
-                  break;
-               case 654:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 653;
-                  break;
-               case 655:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 654;
-                  break;
-               case 657:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 656;
-                  break;
-               case 659:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 658;
-                  break;
-               case 660:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 659;
-                  break;
-               case 661:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 660;
-                  break;
-               case 662:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 661;
-                  break;
-               case 663:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 662;
-                  break;
-               case 664:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 663;
-                  break;
-               case 665:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 664;
-                  break;
-               case 666:
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 665;
-                  break;
-               case 667:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjCheckNAddStates(57, 70);
-                  break;
-               case 672:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 671;
-                  break;
-               case 673:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 672;
-                  break;
-               case 674:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 673;
-                  break;
-               case 675:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 674;
-                  break;
-               case 676:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 675;
-                  break;
-               case 677:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 676;
-                  break;
-               case 679:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 678;
-                  break;
-               case 681:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 680;
-                  break;
-               case 683:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 682;
-                  break;
-               case 684:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 683;
-                  break;
-               case 685:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 684;
-                  break;
-               case 686:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 685;
-                  break;
-               case 687:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 686;
-                  break;
-               case 688:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 687;
-                  break;
-               case 690:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 689;
-                  break;
-               case 691:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 690;
-                  break;
-               case 692:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 691;
-                  break;
-               case 693:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 692;
-                  break;
-               case 694:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 693;
-                  break;
-               case 695:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 694;
-                  break;
-               case 696:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 695;
-                  break;
-               case 697:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 696;
-                  break;
-               case 698:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 697;
-                  break;
-               case 699:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 698;
-                  break;
-               case 701:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 700;
-                  break;
-               case 702:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 701;
-                  break;
-               case 703:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 702;
-                  break;
-               case 704:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 703;
-                  break;
-               case 705:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 704;
-                  break;
-               case 706:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 705;
-                  break;
-               case 707:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 706;
-                  break;
-               case 708:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 707;
-                  break;
-               case 709:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 708;
-                  break;
-               case 710:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 709;
-                  break;
-               case 711:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 710;
-                  break;
-               case 712:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 711;
-                  break;
-               case 714:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 713;
-                  break;
-               case 715:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 714;
-                  break;
-               case 716:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 715;
-                  break;
-               case 718:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 717;
-                  break;
-               case 720:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 719;
-                  break;
-               case 721:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 720;
-                  break;
-               case 722:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 721;
-                  break;
-               case 723:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 722;
-                  break;
-               case 724:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 723;
-                  break;
-               case 725:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 724;
-                  break;
-               case 726:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 725;
-                  break;
-               case 727:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 726;
-                  break;
-               case 729:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 728;
-                  break;
-               case 730:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 729;
-                  break;
-               case 731:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 730;
-                  break;
-               case 732:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 731;
-                  break;
-               case 733:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 732;
-                  break;
-               case 734:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 733;
-                  break;
-               case 736:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 735;
-                  break;
-               case 737:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 736;
-                  break;
-               case 738:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 737;
-                  break;
-               case 739:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 738;
-                  break;
-               case 740:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 739;
-                  break;
-               case 741:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 740;
-                  break;
-               case 742:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 741;
-                  break;
-               case 743:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 742;
-                  break;
-               case 744:
-                  if ((0x200000002000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 745:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 744;
-                  break;
-               case 746:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 745;
-                  break;
-               case 747:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 748:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 747;
-                  break;
-               case 749:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjAddStates(50, 56);
-                  break;
-               case 751:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 750;
-                  break;
-               case 754:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 753;
-                  break;
-               case 755:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 754;
-                  break;
-               case 756:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 755;
-                  break;
-               case 757:
-                  if ((0x80000000800000L & l) != 0L)
-                     jjCheckNAdd(30);
-                  break;
-               case 758:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 757;
-                  break;
-               case 759:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 758;
-                  break;
-               case 760:
-                  if ((0x80000000800L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 759;
-                  break;
-               case 761:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 760;
-                  break;
-               case 763:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 762;
-                  break;
-               case 764:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 763;
-                  break;
-               case 765:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 764;
-                  break;
-               case 767:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 766;
-                  break;
-               case 768:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 767;
-                  break;
-               case 771:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 770;
-                  break;
-               case 772:
-                  if ((0x2000000020L & l) != 0L)
-                     jjCheckNAdd(3);
-                  break;
-               case 773:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 772;
-                  break;
-               case 774:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjAddStates(45, 49);
-                  break;
-               case 776:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 775;
-                  break;
-               case 777:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 776;
-                  break;
-               case 779:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 778;
-                  break;
-               case 780:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 779;
-                  break;
-               case 781:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 780;
-                  break;
-               case 783:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 782;
-                  break;
-               case 784:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 783;
-                  break;
-               case 785:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 784;
-                  break;
-               case 786:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 785;
-                  break;
-               case 788:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 787;
-                  break;
-               case 789:
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 788;
-                  break;
-               case 790:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 789;
-                  break;
-               case 791:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 790;
-                  break;
-               case 792:
-                  if ((0x80000000800000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 793:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 792;
-                  break;
-               case 794:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 793;
-                  break;
-               case 795:
-                  if ((0x80000000800000L & l) != 0L)
-                     jjAddStates(40, 44);
-                  break;
-               case 799:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 798;
-                  break;
-               case 800:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 799;
-                  break;
-               case 802:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 801;
-                  break;
-               case 803:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 802;
-                  break;
-               case 805:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 804;
-                  break;
-               case 806:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjCheckNAdd(102);
-                  break;
-               case 807:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 806;
-                  break;
-               case 809:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 808;
-                  break;
-               case 810:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 809;
-                  break;
-               case 811:
-                  if ((0x1000000010L & l) != 0L)
-                     jjAddStates(23, 39);
-                  break;
-               case 814:
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 816:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 815;
-                  break;
-               case 817:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 816;
-                  break;
-               case 818:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 817;
-                  break;
-               case 819:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 818;
-                  break;
-               case 820:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 819;
-                  break;
-               case 822:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 821;
-                  break;
-               case 824:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 823;
-                  break;
-               case 825:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 824;
-                  break;
-               case 826:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 825;
-                  break;
-               case 827:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 826;
-                  break;
-               case 829:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 828;
-                  break;
-               case 830:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 829;
-                  break;
-               case 831:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 830;
-                  break;
-               case 832:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 831;
-                  break;
-               case 833:
-                  if ((0x100000001000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 834:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 833;
-                  break;
-               case 835:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 834;
-                  break;
-               case 836:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 835;
-                  break;
-               case 837:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 836;
-                  break;
-               case 839:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 838;
-                  break;
-               case 840:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 839;
-                  break;
-               case 841:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 840;
-                  break;
-               case 842:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 841;
-                  break;
-               case 843:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 842;
-                  break;
-               case 844:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 843;
-                  break;
-               case 845:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 844;
-                  break;
-               case 847:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 846;
-                  break;
-               case 848:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 847;
-                  break;
-               case 849:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 848;
-                  break;
-               case 850:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 849;
-                  break;
-               case 851:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 850;
-                  break;
-               case 853:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 852;
-                  break;
-               case 854:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 853;
-                  break;
-               case 855:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 854;
-                  break;
-               case 856:
-                  if ((0x400000004L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 857:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 856;
-                  break;
-               case 860:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 859;
-                  break;
-               case 861:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 860;
-                  break;
-               case 863:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 862;
-                  break;
-               case 864:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 863;
-                  break;
-               case 865:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 864;
-                  break;
-               case 866:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 865;
-                  break;
-               case 867:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 866;
-                  break;
-               case 868:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 867;
-                  break;
-               case 869:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 868;
-                  break;
-               case 870:
-                  if ((0x800000008L & l) != 0L)
-                     jjCheckNAdd(156);
-                  break;
-               case 871:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 870;
-                  break;
-               case 872:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 871;
-                  break;
-               case 873:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 872;
-                  break;
-               case 874:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 873;
-                  break;
-               case 875:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 874;
-                  break;
-               case 876:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 875;
-                  break;
-               case 878:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 877;
-                  break;
-               case 880:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 879;
-                  break;
-               case 881:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 880;
-                  break;
-               case 882:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 881;
-                  break;
-               case 883:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 882;
-                  break;
-               case 885:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 884;
-                  break;
-               case 886:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 885;
-                  break;
-               case 888:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 887;
-                  break;
-               case 889:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 888;
-                  break;
-               case 890:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 889;
-                  break;
-               case 892:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 891;
-                  break;
-               case 893:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 892;
-                  break;
-               case 894:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 893;
-                  break;
-               case 895:
-                  if ((0x800000008000L & l) != 0L)
-                     jjCheckNAdd(217);
-                  break;
-               case 896:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 895;
-                  break;
-               case 897:
-                  if ((0x10000000100000L & l) != 0L && kind > 20)
-                     kind = 20;
-                  break;
-               case 898:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 897;
-                  break;
-               case 899:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 898;
-                  break;
-               case 901:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 900;
-                  break;
-               case 902:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 901;
-                  break;
-               case 903:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 902;
-                  break;
-               case 904:
-                  if ((0x200000002L & l) != 0L)
-                     jjCheckNAddStates(12, 22);
-                  break;
-               case 906:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 905;
-                  break;
-               case 907:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 906;
-                  break;
-               case 912:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 911;
-                  break;
-               case 914:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 913;
-                  break;
-               case 915:
-                  if ((0x1000000010L & l) != 0L)
-                     jjCheckNAdd(53);
-                  break;
-               case 917:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 916;
-                  break;
-               case 918:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 917;
-                  break;
-               case 919:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 918;
-                  break;
-               case 920:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 919;
-                  break;
-               case 921:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 920;
-                  break;
-               case 923:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 922;
-                  break;
-               case 924:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 923;
-                  break;
-               case 925:
-                  if ((0x400000004000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 926:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjCheckNAdd(13);
-                  break;
-               case 928:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 927;
-                  break;
-               case 929:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 928;
-                  break;
-               case 930:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 929;
-                  break;
-               case 931:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 930;
-                  break;
-               case 933:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 932;
-                  break;
-               case 935:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 934;
-                  break;
-               case 936:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 935;
-                  break;
-               case 937:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 936;
-                  break;
-               case 938:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 937;
-                  break;
-               case 939:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 938;
-                  break;
-               case 940:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 939;
-                  break;
-               case 941:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 940;
-                  break;
-               case 942:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 941;
-                  break;
-               case 943:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 942;
-                  break;
-               case 944:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 943;
-                  break;
-               case 945:
-                  if ((0x100000001000L & l) != 0L && kind > 20)
-                     kind = 20;
-                  break;
-               case 946:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 945;
-                  break;
-               case 949:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(200, 201);
-                  break;
-               case 963:
-               case 964:
-                  if ((0x6fffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 101)
-                     kind = 101;
-                  jjCheckNAdd(964);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 23:
-                  if ((jjbitVec0[i2] & l2) == 0L)
-                     break;
-                  if (kind > 90)
-                     kind = 90;
-                  jjAddStates(9, 11);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 965 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1)
-{
-   switch (pos)
-   {
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_1(int pos, long active0, long active1)
-{
-   return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0, active1), pos + 1);
-}
-private int jjMoveStringLiteralDfa0_1()
-{
-   switch(curChar)
-   {
-      case 39:
-         return jjStartNfaWithStates_1(0, 93, 1);
-      default :
-         return jjMoveNfa_1(0, 0);
-   }
-}
-private int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_1(state, pos + 1);
-}
-private int jjMoveNfa_1(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 3;
-   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 0:
-                  if ((0xffffff7fffffffffL & l) != 0L)
-                  {
-                     if (kind > 92)
-                        kind = 92;
-                  }
-                  else if (curChar == 39)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 1:
-                  if (curChar == 39 && kind > 92)
-                     kind = 92;
-                  break;
-               case 2:
-                  if (curChar == 39)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  kind = 92;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((jjbitVec0[i2] & l2) != 0L && kind > 92)
-                     kind = 92;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-static final int[] jjnextStates = {
-   954, 955, 956, 949, 958, 959, 961, 962, 963, 23, 24, 26, 910, 914, 915, 921, 
-   924, 925, 926, 933, 34, 944, 946, 813, 814, 822, 827, 832, 837, 845, 851, 855, 
-   861, 869, 878, 886, 890, 894, 896, 903, 797, 803, 805, 807, 810, 777, 781, 786, 
-   791, 794, 752, 756, 761, 765, 768, 771, 773, 670, 677, 679, 681, 688, 699, 712, 
-   320, 718, 727, 734, 743, 746, 748, 590, 594, 598, 603, 608, 618, 619, 621, 627, 
-   629, 632, 633, 638, 644, 650, 657, 666, 550, 552, 560, 566, 572, 576, 582, 584, 
-   491, 496, 502, 509, 514, 520, 525, 528, 536, 543, 547, 471, 451, 473, 475, 479, 
-   483, 489, 439, 445, 448, 450, 320, 455, 460, 424, 428, 432, 435, 404, 406, 411, 
-   414, 417, 420, 332, 339, 346, 353, 356, 365, 369, 370, 375, 382, 388, 390, 397, 
-   315, 319, 320, 322, 325, 295, 298, 301, 304, 305, 310, 313, 249, 250, 257, 261, 
-   265, 272, 274, 279, 286, 291, 52, 59, 61, 63, 69, 71, 78, 87, 101, 105, 
-   108, 114, 119, 126, 130, 134, 139, 147, 155, 165, 171, 176, 187, 191, 196, 206, 
-   216, 232, 242, 246, 33, 35, 44, 46, 950, 951, 
-};
-
-/** Token literal values. */
-public static final String[] jjstrLiteralImages = {
-"", null, null, "\50", "\51", "\56", "\54", "\73", "\174\174", "\53", "\55", 
-"\52", "\57", "\75", null, "\74", "\74\75", "\76", "\76\75", null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-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",
-   "WithinString",
-   "WithinDelimitedId",
-};
-
-/** Lex State array. */
-public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 0, -1, -1, -1, -1, 2, -1, 
-   0, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xfffffffffffffffdL, 0x31e3ffffffL, 
-};
-static final long[] jjtoSkip = {
-   0x2L, 0x4000000L, 
-};
-static final long[] jjtoMore = {
-   0x0L, 0xc18000000L, 
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[965];
-private final int[] jjstateSet = new int[1930];
-protected char curChar;
-/** Constructor. */
-public ADQLParserTokenManager(SimpleCharStream stream){
-   if (SimpleCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-
-/** Constructor. */
-public ADQLParserTokenManager(SimpleCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
-
-/** Reinitialise parser. */
-public void ReInit(SimpleCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 965; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-
-/** Reinitialise parser. */
-public void ReInit(SimpleCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-
-/** Switch to specified lex state. */
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 3 || 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();
-      CommonTokenAction(matchedToken);
-      return matchedToken;
-   }
-   image = jjimage;
-   image.setLength(0);
-   jjimageLen = 0;
-
-   for (;;)
-   {
-     switch(curLexState)
-     {
-       case 0:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_0();
-         break;
-       case 1:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_1();
-         break;
-       case 2:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_2();
-         break;
-     }
-     if (jjmatchedKind != 0x7fffffff)
-     {
-        if (jjmatchedPos + 1 < curPos)
-           input_stream.backup(curPos - jjmatchedPos - 1);
-        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           matchedToken = jjFillToken();
-           TokenLexicalActions(matchedToken);
-       if (jjnewLexState[jjmatchedKind] != -1)
-         curLexState = jjnewLexState[jjmatchedKind];
-           CommonTokenAction(matchedToken);
-           return matchedToken;
-        }
-        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-         if (jjnewLexState[jjmatchedKind] != -1)
-           curLexState = jjnewLexState[jjmatchedKind];
-           continue EOFLoop;
-        }
-        jjimageLen += jjmatchedPos + 1;
-      if (jjnewLexState[jjmatchedKind] != -1)
-        curLexState = jjnewLexState[jjmatchedKind];
-        curPos = 0;
-        jjmatchedKind = 0x7fffffff;
-        try {
-           curChar = input_stream.readChar();
-           continue;
-        }
-        catch (java.io.IOException e1) { }
-     }
-     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);
-   }
-  }
-}
-
-void TokenLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      case 2 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-          matchedToken.sqlReserved = true;
-         break;
-      case 19 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                             matchedToken.adqlReserved = true;
-         break;
-      case 20 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                             matchedToken.adqlReserved = true;
-         break;
-      case 21 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                             matchedToken.adqlReserved = true;
-         break;
-      case 22 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 23 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 24 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 25 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 26 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 27 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 28 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 29 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 30 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 31 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 32 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 33 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 34 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 35 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 36 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 37 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 38 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 39 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 40 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 41 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 42 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 43 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 44 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 45 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 46 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 47 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 48 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 49 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 50 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 51 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 52 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 53 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 54 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 55 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 56 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 57 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 58 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 59 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 60 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 61 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 62 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 63 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 64 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 65 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 66 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 67 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 68 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 69 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 70 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 71 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 72 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 73 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 74 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 75 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 76 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 77 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 78 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 79 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 80 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 81 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 82 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 83 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 84 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 85 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 86 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 87 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 88 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 89 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      default :
-         break;
-   }
-}
-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);
-}
-
-    /** Constructor. */
-    public ADQLParser200TokenManager(SimpleCharStream stream){
-
-      if (SimpleCharStream.staticFlag)
-            throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-
-    input_stream = stream;
-  }
-
-  /** Constructor. */
-  public ADQLParser200TokenManager (SimpleCharStream stream, int lexState){
-    ReInit(stream);
-    SwitchTo(lexState);
-  }
-
-  /** Reinitialise parser. */
-  public void ReInit(SimpleCharStream stream)
-  {
-    jjmatchedPos = jjnewStateCnt = 0;
-    curLexState = defaultLexState;
-    input_stream = stream;
-    ReInitRounds();
-  }
-
-  private void ReInitRounds()
-  {
-    int i;
-    jjround = 0x80000001;
-    for (i = 965; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-  }
-
-  /** Reinitialise parser. */
-  public void ReInit(SimpleCharStream stream, int lexState)
-  {
-    ReInit(stream);
-    SwitchTo(lexState);
-  }
-
-  /** Switch to specified lex state. */
-  public void SwitchTo(int lexState)
-  {
-    if (lexState >= 3 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-    else
-      curLexState = lexState;
-  }
-
-/** Lexer state names. */
-public static final String[] lexStateNames = {
-   "DEFAULT",
-   "WithinString",
-   "WithinDelimitedId",
-};
-
-/** Lex State array. */
-public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 0, -1, -1, -1, -1, 2, -1, 
-   0, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xfffffffffffffffdL, 0x31e3ffffffL, 
-};
-static final long[] jjtoSkip = {
-   0x2L, 0x4000000L, 
-};
-static final long[] jjtoMore = {
-   0x0L, 0xc18000000L, 
-};
-    protected SimpleCharStream  input_stream;
-
-    private final int[] jjrounds = new int[965];
-    private final int[] jjstateSet = new int[2 * 965];
-
-    private final StringBuilder jjimage = new StringBuilder();
-    private StringBuilder image = jjimage;
-    private int jjimageLen;
-    private int lengthOfMatch;
-    
-    protected char curChar;
-}
diff --git a/src/adql/parser/ADQLParser201.java b/src/adql/parser/ADQLParser201.java
deleted file mode 100644
index 1d8499f..0000000
--- a/src/adql/parser/ADQLParser201.java
+++ /dev/null
@@ -1,6695 +0,0 @@
-/* ADQLParser201.java */
-/* Generated By:JavaCC: Do not edit this line. ADQLParser201.java */
-package adql.parser;
-
-import java.util.ArrayList;
-
-/*
- * This file is part of ADQLLibrary.
- *
- * ADQLLibrary is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ADQLLibrary is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
- *
- * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
- */
-
-import java.util.Stack;
-import java.util.Vector;
-
-import adql.db.exception.UnresolvedIdentifiersException;
-import adql.db.exception.UnsupportedFeatureException;
-import adql.parser.ADQLParserFactory.ADQLVersion;
-import adql.parser.ADQLQueryFactory.JoinType;
-import adql.parser.IdentifierItems.IdentifierItem;
-import adql.parser.feature.FeatureSet;
-import adql.query.ADQLObject;
-import adql.query.ADQLOrder;
-import adql.query.ADQLQuery;
-import adql.query.ClauseADQL;
-import adql.query.ClauseConstraints;
-import adql.query.ClauseSelect;
-import adql.query.SelectAllColumns;
-import adql.query.SelectItem;
-import adql.query.TextPosition;
-import adql.query.constraint.ADQLConstraint;
-import adql.query.constraint.Between;
-import adql.query.constraint.Comparison;
-import adql.query.constraint.ComparisonOperator;
-import adql.query.constraint.ConstraintsGroup;
-import adql.query.constraint.Exists;
-import adql.query.constraint.In;
-import adql.query.constraint.IsNull;
-import adql.query.constraint.NotConstraint;
-import adql.query.from.ADQLJoin;
-import adql.query.from.FromContent;
-import adql.query.operand.ADQLColumn;
-import adql.query.operand.ADQLOperand;
-import adql.query.operand.Concatenation;
-import adql.query.operand.NegativeOperand;
-import adql.query.operand.NumericConstant;
-import adql.query.operand.Operation;
-import adql.query.operand.OperationType;
-import adql.query.operand.StringConstant;
-import adql.query.operand.WrappedOperand;
-import adql.query.operand.function.ADQLFunction;
-import adql.query.operand.function.MathFunction;
-import adql.query.operand.function.MathFunctionType;
-import adql.query.operand.function.SQLFunction;
-import adql.query.operand.function.SQLFunctionType;
-import adql.query.operand.function.UserDefinedFunction;
-import adql.query.operand.function.geometry.GeometryFunction;
-import adql.query.operand.function.geometry.GeometryFunction.GeometryValue;
-import adql.query.operand.function.geometry.PointFunction;
-import adql.query.operand.function.string.LowerFunction;
-import adql.search.SearchOptionalFeaturesHandler;
-
-/**
-* Parses an ADQL-2.1 query thanks to the {@link ADQLParser201#Query() Query()} function.
-*
-* <p>
-*   This parser is able, thanks to a {@link QueryChecker} object, to check each
-*   {@link ADQLQuery} just after its generation. It could be used to check the
-*   consistency between the ADQL query to parse and the "database" on which the
-*   query must be executed. By default, there is no {@link QueryChecker}. Thus
-*   you must extend {@link QueryChecker} to check semantically all generated
-*   ADQLQuery objects.
-* </p>
-*
-* <p>
-*   To create an object representation of the given ADQL query, this parser uses
-*   a {@link ADQLQueryFactory} object. So if you want customize some object
-*   (ie. CONTAINS) of this representation you just have to extend the
-*   corresponding default object (ie. ContainsFunction) and to extend the
-*   corresponding function of {@link ADQLQueryFactory}
-*   (ie. createContains(...)).
-* </p>
-*
-* <p>Here are the key functions to use:</p>
-* <ul>
-* 	<li>{@link #parseQuery(java.lang.String)} (or any of its alternatives)
-* 		to parse an input ADQL query String and get its corresponding ADQL tree
-*   </li>
-*   <li>{@link #tryQuickFix(java.lang.String)} to try fixing the most common
-* 		issues with ADQL queries (e.g. Unicode confusable characters,
-* 		unescaped ADQL identifiers, SQL reserved keywords, ...)</li>
-*   <li>{@link #setSupportedFeatures(FeatureSet)} to set which optional ADQL
-* 		features are supported or not ; all optional features used in the query
-* 		while being declared as un-supported will throw an error at the end of
-* 		the parsing</li>
-* </ul>
-*
-* <p><b><u>WARNING:</u>
-*   To modify this class it's strongly encouraged to modify the .jj file in the
-*   section between <i>PARSER_BEGIN</i> and <i>PARSER_END</i> and to re-compile
-*   it with JavaCC.
-* </b></p>
-*
-* @see QueryChecker
-* @see ADQLQueryFactory
-*
-* @author Gr&eacute;gory Mantelet (CDS)
-* @version 2.0 (07/2019)
-* @since 2.0
-*/
-public class ADQLParser201 implements ADQLParser, ADQLParser201Constants {
-
-	/** Tools to build the object representation of the ADQL query. */
-	private ADQLQueryFactory queryFactory = new ADQLQueryFactory();
-
-	/** Default set of supported language features.
-	* <p><i><b>Note:</b>
-	* 	By default, all optional features are supported.
-	* </i></p> */
-	private FeatureSet supportedFeatures = new FeatureSet(true, true);
-
-	/** The stack of queries (because there may be some sub-queries). */
-	private Stack<ADQLQuery> stackQuery = new Stack<ADQLQuery>();
-
-	/** The object representation of the ADQL query to parse.
-	* (ONLY USED DURING THE PARSING, else it is always <i>null</i>). */
-	private ADQLQuery query = null;
-
-	/** Checks each {@link ADQLQuery} (sub-query or not) just after their
-	* generation. */
-	private QueryChecker queryChecker = null;
-
-	/**
-	* Builds an ADQL parser without a query to parse.
-	*/
-	public ADQLParser201() {
-		this(new java.io.ByteArrayInputStream("".getBytes()));
-		setDebug(false);
-	}
-
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker} and a {@link ADQLQueryFactory}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(QueryChecker checker, ADQLQueryFactory factory) {
-		this();
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(QueryChecker checker) {
-		this(checker, null);
-	}
-
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link ADQLQueryFactory}.
-	*
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(ADQLQueryFactory factory) {
-		this((QueryChecker)null, factory);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(java.io.InputStream stream, QueryChecker checker) {
-		this(stream, checker, null);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, ADQLQueryFactory factory) {
-		this(stream, (QueryChecker)null, factory);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, String encoding, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream, encoding);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(java.io.InputStream stream, String encoding, QueryChecker checker) {
-		this(stream, encoding, checker, null);
-	}
-
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, String encoding, ADQLQueryFactory factory) {
-		this(stream, encoding, null, factory);
-	}
-
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.Reader reader, QueryChecker checker, ADQLQueryFactory factory) {
-		this(reader);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(java.io.Reader reader, QueryChecker checker) {
-		this(reader, checker, null);
-	}
-
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.Reader reader, ADQLQueryFactory factory) {
-		this(reader, null, factory);
-	}
-
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery }.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(ADQLParser201TokenManager tm, QueryChecker checker, ADQLQueryFactory factory) {
-		this(tm);
-
-		setDebug(false);
-
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(ADQLParser201TokenManager tm, QueryChecker checker) {
-		this(tm, checker, null);
-	}
-
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(ADQLParser201TokenManager tm, ADQLQueryFactory factory) {
-		this(tm, null, factory);
-	}
-
-	/* ADDITIONAL GETTERS & SETTERS */
-
-	@Override
-	public final ADQLVersion getADQLVersion() {
-		return ADQLVersion.V2_1;
-	}
-
-	@Override
-	public final void setDebug(boolean debug) {
-		if (debug)
-			enable_tracing();
-		else
-			disable_tracing();
-	}
-
-	@Override
-	public final QueryChecker getQueryChecker() {
-		return queryChecker;
-	}
-
-	@Override
-	public final void setQueryChecker(QueryChecker checker) {
-		queryChecker = checker;
-	}
-
-	@Override
-	public final ADQLQueryFactory getQueryFactory() {
-		return queryFactory;
-	}
-
-	@Override
-	public final void setQueryFactory(ADQLQueryFactory factory) {
-		queryFactory = (factory != null) ? factory : (new ADQLQueryFactory());
-	}
-
-	@Override
-	public final FeatureSet getSupportedFeatures() {
-		return supportedFeatures;
-	}
-
-	@Override
-	public void setSupportedFeatures(final FeatureSet features) {
-		if (features != null)
-			supportedFeatures = features;
-	}
-
-	/* EXCEPTION HELPER FUNCTION */
-
-	private final ParseException generateParseException(Exception ex) {
-		if (!(ex instanceof ParseException)) {
-			ParseException pex = new ParseException("[" + ex.getClass().getName() + "] " + ex.getMessage());
-			pex.setStackTrace(ex.getStackTrace());
-			return pex;
-		} else
-			return (ParseException)ex;
-	}
-
-	/* QUERY PARSING FUNCTIONS */
-
-	/**
-	* Tell whether the given string is a valid ADQL regular identifier.
-	*
-	* <p>
-	* 	According to the ADQL-2.0's BNF, a regular identifier (i.e. not delimited
-	* 	; not between double quotes) must be a letter followed by a letter, digit
-	* 	or underscore. So, the following regular expression:
-	* </p>
-	* <pre>[a-zA-Z]+[a-zA-Z0-9_]*</pre>
-	*
-	* <p>This is what this function tests on the given string.</p>
-	*
-	* @param idCandidate	The string to test.
-	*
-	* @return	<code>true</code> if the given string is a valid regular
-	*        	identifier,
-	*        	<code>false</code> otherwise.
-	*
-	* @see #testRegularIdentifier(adql.parser.Token)
-	*
-	* @since 1.5
-	*/
-	@Override
-	public final boolean isRegularIdentifier(final String idCandidate) {
-		return idCandidate.matches("[a-zA-Z]+[a-zA-Z0-9_]*");
-	}
-
-	/**
-	* Test the given token as an ADQL's regular identifier.
-	*
-	* <p>
-	* 	This function uses {@link #isRegularIdentifier(java.lang.String)} to
-	* 	test the given token's image. If the test fails, a
-	* 	{@link adql.parser.ParseException} is thrown.
-	* </p>
-	*
-	* @param token	The token to test.
-	*
-	* @throws ParseException	If the given token is not a valid ADQL regular
-	*                       	identifier.
-	*
-	* @see #isRegularIdentifier(java.lang.String)
-	*
-	* @since 1.5
-	*/
-	@Override
-	public final void testRegularIdentifier(final Token token) throws ParseException {
-		if (!isRegularIdentifier(token.image))
-			throw new ParseException("Invalid ADQL regular identifier: \u005c"" + token.image + "\u005c"! If it aims to be a column/table name/alias, you should write it between double quotes.", new TextPosition(token));
-	}
-
-	/**
-	* Parses the query given at the creation of this parser or in the
-	* <i>ReInit</i> functions.
-	*
-	* @return 	The object representation of the given ADQL query.
-	*
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser201#Query()
-	*/
-	@Override
-	public final ADQLQuery parseQuery() throws ParseException {
-		stackQuery.clear();
-		query = null;
-		try {
-			return Query();
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-
-	/**
-	* Parses the query given in parameter.
-	*
-	* @param q	The ADQL query to parse.
-	*
-	* @return	The object representation of the given ADQL query.
-	*
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser201#ReInit(java.io.InputStream)
-	* @see ADQLParser201#setDebug(boolean)
-	* @see ADQLParser201#Query()
-	*/
-	@Override
-	public final ADQLQuery parseQuery(String q) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(new java.io.ByteArrayInputStream(q.getBytes()));
-		try {
-			return Query();
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-
-	/**
-	* Parses the query contained in the stream given in parameter.
-	*
-	* @param stream		The stream which contains the ADQL query to parse.
-	*
-	* @return	The object representation of the given ADQL query.
-	*
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser201#ReInit(java.io.InputStream)
-	* @see ADQLParser201#setDebug(boolean)
-	* @see ADQLParser201#Query()
-	*/
-	@Override
-	public final ADQLQuery parseQuery(java.io.InputStream stream) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(stream);
-		try {
-			return Query();
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-
-	@Override
-	public final ClauseSelect parseSelect(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a SELECT clause:
-			Select();
-
-			// Return what's just got parsed:
-			return query.getSelect();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final FromContent parseFrom(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a FROM clause:
-			From();
-
-			// Return what's just got parsed:
-			return query.getFrom();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final ClauseConstraints parseWhere(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a WHERE clause:
-			Where();
-
-			// Return what's just got parsed:
-			return query.getWhere();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final ClauseADQL<ADQLOrder> parseOrderBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a ORDER BY clause:
-			OrderBy();
-
-			// Return what's just got parsed:
-			return query.getOrderBy();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	@Override
-	public final ClauseADQL<ADQLColumn> parseGroupBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a GROUP BY clause:
-			GroupBy();
-
-			// Return what's just got parsed:
-			return query.getGroupBy();
-
-		} catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		} catch(Exception ex) {
-			throw generateParseException(ex);
-		}
-	}
-
-	/* TOKENIZATION FUNCTION */
-
-	@Override
-	public Token[] tokenize(final String expr) throws ParseException {
-		ADQLParser201TokenManager parser = new ADQLParser201TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(expr.getBytes())));
-		try {
-			ArrayList<Token> tokens = new ArrayList<Token>();
-			Token token;
-			while(!isEnd((token = parser.getNextToken()))) {
-				tokens.add(token);
-			}
-			return tokens.toArray(new Token[tokens.size()]);
-		} catch(TokenMgrError err) {
-			// wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
-	}
-
-	/* CORRECTION SUGGESTION */
-
-	/**
-	* Try fixing tokens/terms of the input ADQL query.
-	*
-	* <p>
-	* 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	*  It just try to fix the most common issues in ADQL queries, such as:
-	* </p>
-	* <ul>
-	* 	<li>some Unicode characters confusable with ASCII characters (like a
-	* 		space, a dash, ...) ; this function replace them by their ASCII
-	* 		alternative,</li>
-	* 	<li>any of the following are double quoted:
-	* 		<ul>
-	* 			<li>non regular ADQL identifiers
-	* 				(e.g. <code>_RAJ2000</code>),</li>
-	* 			<li>ADQL function names used as identifiers
-	* 				(e.g. <code>distance</code>)</li>
-	* 			<li>and SQL reserved keywords
-	* 				(e.g. <code>public</code>).</li>
-	* 		</ul>
-	* 	</li>
-	* </ul>
-	*
-	* <p><i><b>Note 1:</b>
-	* 	The given stream is NOT closed by this function even if the EOF is
-	* 	reached. It is the responsibility of the caller to close it.
-	* </i></p>
-	*
-	* <p><i><b>Note 2:</b>
-	* 	This function does not use any instance variable of this parser
-	* 	(especially the InputStream or Reader provided at initialisation or
-	* 	ReInit).
-	* </i></p>
-	*
-	* @param input	Stream containing the input ADQL query to fix.
-	*
-	* @return	The suggested correction of the input ADQL query.
-	*
-	* @throws java.io.IOException	If there is any error while reading from the
-	*                            	given input stream.
-	* @throws ParseException	If any unrecognised character is encountered,
-	*                       	or if anything else prevented the tokenization
-	*                       	   of some characters/words/terms.
-	*
-	* @see #tryQuickFix(java.lang.String)
-	*
-	* @since 1.5
-	*/
-	@Override
-	public final String tryQuickFix(final java.io.InputStream input) throws java.io.IOException, ParseException {
-		// Fetch everything into a single string:
-		StringBuffer buf = new StringBuffer();
-		byte[] cBuf = new byte[1024];
-		int nbChar;
-		while((nbChar = input.read(cBuf)) > -1) {
-			buf.append(new String(cBuf, 0, nbChar));
-		}
-
-		// Convert the buffer into a String and now try to fix it:
-		return tryQuickFix(buf.toString());
-	}
-
-	/**
-	* Try fixing tokens/terms of the given ADQL query.
-	*
-	* <p>
-	* 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	*  It just try to fix the most common issues in ADQL queries, such as:
-	* </p>
-	* <ul>
-	* 	<li>some Unicode characters confusable with ASCII characters (like a
-	* 		space, a dash, ...) ; this function replace them by their ASCII
-	* 		alternative,</li>
-	* 	<li>any of the following are double quoted:
-	* 		<ul>
-	* 			<li>non regular ADQL identifiers
-	* 				(e.g. <code>_RAJ2000</code>),</li>
-	* 			<li>ADQL function names used as identifiers
-	* 				(e.g. <code>distance</code>)</li>
-	* 			<li>and SQL reserved keywords
-	* 				(e.g. <code>public</code>).</li>
-	* 		</ul>
-	* 	</li>
-	* </ul>
-	*
-	* <p><i><b>Note:</b>
-	* 	This function does not use any instance variable of this parser
-	* 	(especially the InputStream or Reader provided at initialisation or
-	* 	ReInit).
-	* </i></p>
-	*
-	* @param adqlQuery	The input ADQL query to fix.
-	*
-	* @return	The suggested correction of the given ADQL query.
-	*
-	* @throws ParseException	If any unrecognised character is encountered,
-	*                       	or if anything else prevented the tokenization
-	*                       	   of some characters/words/terms.
-	*
-	* @since 1.5
-	*/
-	@Override
-	public String tryQuickFix(String adqlQuery) throws ParseException {
-		StringBuffer suggestedQuery = new StringBuffer();
-
-		// 1. Replace all Unicode confusable characters:
-		adqlQuery = replaceUnicodeConfusables(adqlQuery);
-
-		/* 1.bis. Normalise new lines and tabulations
-		*        (to simplify the column counting): */
-		adqlQuery = adqlQuery.replaceAll("(\u005cr\u005cn|\u005cr|\u005cn)", System.getProperty("line.separator")).replaceAll("\u005ct", "    ");
-
-		// 2. Analyse the query token by token:
-		ADQLParser201TokenManager parser = new ADQLParser201TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(adqlQuery.getBytes())));
-
-		final String[] lines = adqlQuery.split(System.getProperty("line.separator"));
-
-		try {
-			String suggestedToken;
-			int lastLine = 1, lastCol = 1;
-
-			Token token = null, nextToken = parser.getNextToken();
-			// for all tokens until the EOF or EOQ:
-			do {
-				// get the next token:
-				token = nextToken;
-				nextToken = (isEnd(token) ? null : parser.getNextToken());
-
-				// 3. Double quote any suspect token:
-				if (mustEscape(token, nextToken)) {
-					suggestedToken = "\u005c"" + token.image + "\u005c"";
-				} else
-					suggestedToken = token.image;
-
-				/* 4. Append all space characters (and comments) before the
-				*    token: */
-				/* same line, just get the space characters between the last
-				* token and the one to append: */
-				if (lastLine == token.beginLine) {
-					if (token.kind == ADQLParser201Constants.EOF)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1));
-					else
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - (isEnd(token) ? 0 : 1)));
-					lastCol = token.endColumn + 1;
-				}
-				// not the same line...
-				else {
-					/* append all remaining space characters until the position
-					* of the token to append: */
-					do {
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1)).append('\u005cn');
-						lastLine++;
-						lastCol = 1;
-					} while(lastLine < token.beginLine);
-					/* if there are still space characters before the token,
-					* append them as well: */
-					if (lastCol < token.beginColumn)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - 1));
-					// finally, set the correct column position:
-					lastCol = token.endColumn + 1;
-				}
-
-				// 5. Append the suggested token:
-				suggestedQuery.append(suggestedToken);
-
-			} while(!isEnd(token));
-
-		} catch(TokenMgrError err) {
-			// wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
-
-		return suggestedQuery.toString();
-	}
-
-	/**
-	* All of the most common Unicode confusable characters and their
-	* ASCII/UTF-8 alternative.
-	*
-	* <p>
-	* 	Keys of this map represent the ASCII character while the values are the
-	* 	regular expression for all possible Unicode alternatives.
-	* </p>
-	*
-	* <p><i><b>Note:</b>
-	* 	All of them have been listed using
-	* 	<a href="https://unicode.org/cldr/utility/confusables.jsp">Unicode Utilities: Confusables</a>.
-	* </i></p>
-	*
-	* @since 1.5
-	*/
-	protected final static java.util.Map<String, String> REGEX_UNICODE_CONFUSABLES = new java.util.HashMap<String, String>(10);
-	/** Regular expression matching all Unicode alternatives for <code>-</code>.
-	* @since 1.5 */
-	protected final static String REGEX_DASH = "[-\u02d7\u06d4\u2010\u2011\u2012\u2013\u2043\u2212\u2796\u2cba\ufe58\u2014\u2015\u207b\u208b\u0096\u058a\ufe63\uff0d]";
-	/** Regular expression matching all Unicode alternatives for <code>_</code>.
-	* @since 1.5 */
-	protected final static String REGEX_UNDERSCORE = "[_\u07fa\ufe4d\ufe4e\ufe4f]";
-	/** Regular expression matching all Unicode alternatives for <code>'</code>.
-	* @since 1.5 */
-	protected final static String REGEX_QUOTE = "['`\u00b4\u02b9\u02bb\u02bc\u02bd\u02be\u02c8\u02ca\u02cb\u02f4\u0374\u0384\u055a\u055d\u05d9\u05f3\u07f4\u07f5\u144a\u16cc\u1fbd\u1fbf\u1fef\u1ffd\u1ffe\u2018\u2019\u201b\u2032\u2035\ua78c\uff07\uff40]";
-	/** Regular expression matching all Unicode alternatives for <code>"</code>.
-	* @since 1.5 */
-	protected final static String REGEX_DOUBLE_QUOTE = "[\u02ba\u02dd\u02ee\u02f6\u05f2\u05f4\u1cd3\u201c\u201d\u201f\u2033\u2036\u3003\uff02]";
-	/** Regular expression matching all Unicode alternatives for <code>.</code>.
-	* @since 1.5 */
-	protected final static String REGEX_STOP = "[.\u0660\u06f0\u0701\u0702\u2024\ua4f8\ua60e]";
-	/** Regular expression matching all Unicode alternatives for <code>+</code>.
-	* @since 1.5 */
-	protected final static String REGEX_PLUS = "[+\u16ed\u2795]";
-	/** Regular expression matching all Unicode alternatives for <code> </code>.
-	* @since 1.5 */
-	protected final static String REGEX_SPACE = "[ \u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f]";
-	/** Regular expression matching all Unicode alternatives for <code>&lt;</code>.
-	* @since 1.5 */
-	protected final static String REGEX_LESS_THAN = "[<\u02c2\u1438\u16b2\u2039\u276e]";
-	/** Regular expression matching all Unicode alternatives for <code>&gt;</code>.
-	* @since 1.5 */
-	protected final static String REGEX_GREATER_THAN = "[>\u02c3\u1433\u203a\u276f]";
-	/** Regular expression matching all Unicode alternatives for <code>=</code>.
-	* @since 1.5 */
-	protected final static String REGEX_EQUAL = "[=\u1400\u2e40\u30a0\ua4ff]";
-	static {
-		REGEX_UNICODE_CONFUSABLES.put("-", REGEX_DASH);
-		REGEX_UNICODE_CONFUSABLES.put("_", REGEX_UNDERSCORE);
-		REGEX_UNICODE_CONFUSABLES.put("'", REGEX_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put("\u005c"", REGEX_DOUBLE_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put(".", REGEX_STOP);
-		REGEX_UNICODE_CONFUSABLES.put("+", REGEX_PLUS);
-		REGEX_UNICODE_CONFUSABLES.put(" ", REGEX_SPACE);
-		REGEX_UNICODE_CONFUSABLES.put("<", REGEX_LESS_THAN);
-		REGEX_UNICODE_CONFUSABLES.put(">", REGEX_GREATER_THAN);
-		REGEX_UNICODE_CONFUSABLES.put("=", REGEX_EQUAL);
-	}
-
-	/**
-	* Replace all Unicode characters that can be confused with other ASCI/UTF-8
-	* characters (e.g. different spaces, dashes, ...) in their ASCII version.
-	*
-	* @param adqlQuery	The ADQL query string in which Unicode confusable
-	*                 	characters must be replaced.
-	*
-	* @return	The same query without the most common Unicode confusable
-	*        	characters.
-	*
-	* @since 1.5
-	*/
-	protected String replaceUnicodeConfusables(final String adqlQuery) {
-		String newAdqlQuery = adqlQuery;
-		for(java.util.Map.Entry<String, String> confusable : REGEX_UNICODE_CONFUSABLES.entrySet())
-			newAdqlQuery = newAdqlQuery.replaceAll(confusable.getValue(), confusable.getKey());
-		return newAdqlQuery;
-	}
-
-	/**
-	* Tell whether the given token represents the end of an ADQL query.
-	*
-	* @param token	Token to analyze.
-	*
-	* @return	<code>true</code> if the given token represents a query end,
-	*        	<code>false</code> otherwise.
-	*
-	* @since 1.5
-	*/
-	protected boolean isEnd(final Token token) {
-		return token.kind == ADQLParser201Constants.EOF || token.kind == ADQLParser201Constants.EOQ;
-	}
-
-	/**
-	* Tell whether the given token must be double quoted.
-	*
-	* <p>
-	* 	This function considers all the following as terms to double quote:
-	* </p>
-	* <ul>
-	* 	<li>SQL reserved keywords</li>,
-	* 	<li>unrecognised regular identifiers (e.g. neither a delimited nor a
-	* 		valid ADQL regular identifier)</li>
-	* 	<li>and ADQL function name without a parameters list.</li>
-	* </ul>
-	*
-	* @param token		The token to analyze.
-	* @param nextToken	The following token. (useful to detect the start of a
-	*                 	function's parameters list)
-	*
-	* @return	<code>true</code> if the given token must be double quoted,
-	*        	<code>false</code> to keep it as provided.
-	*
-	* @since 1.5
-	*/
-	protected boolean mustEscape(final Token token, final Token nextToken) {
-		switch(token.kind) {
-			case ADQLParser201Constants.SQL_RESERVED_WORD:
-				return true;
-			case ADQLParser201Constants.REGULAR_IDENTIFIER_CANDIDATE:
-				return !isRegularIdentifier(token.image);
-			default:
-				return token.isFunctionName && (nextToken == null || nextToken.kind != ADQLParser201Constants.LEFT_PAR);
-		}
-	}
-
-	/* ########## */
-	/* # SYNTAX # */
-	/* ########## */
-
-	/* ******************* */
-	/* GENERAL ADQL SYNTAX */
-	/* ******************* */
-	/**
-	* Parses the ADQL query given at the parser creation or in the {@link ADQLParser201#ReInit(java.io.InputStream)}
-	* or in the <i>parseQuery</i> functions.
-	*
-	* @return					The object representation of the query.
-	* @throws ParseException	If the query syntax is incorrect.
-	*/
-	final public ADQLQuery Query() throws ParseException {
-		trace_call("Query");
-		try {
-			ADQLQuery q = null;
-			q = QueryExpression();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case 0: {
-					jj_consume_token(0);
-					break;
-				}
-				case EOQ: {
-					jj_consume_token(EOQ);
-					break;
-				}
-				default:
-					jj_la1[0] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			/* check the optional features before any other check:
-					 * (note: this check is very close to grammar check...hence its higher
-					 *        priority) */
-			UnresolvedIdentifiersException exUnsupportedFeatures = new UnresolvedIdentifiersException("unsupported expression");
-			SearchOptionalFeaturesHandler sFeaturesHandler = new SearchOptionalFeaturesHandler(true, false);
-			sFeaturesHandler.search(q);
-			for(ADQLObject obj : sFeaturesHandler) {
-				if (!supportedFeatures.isSupporting(obj.getFeatureDescription()))
-					exUnsupportedFeatures.addException(new UnsupportedFeatureException(obj));
-			}
-			if (exUnsupportedFeatures.getNbErrors() > 0) {
-				if (true)
-					throw exUnsupportedFeatures;
-			}
-
-			// check the query:
-			if (queryChecker != null)
-				queryChecker.check(q);
-
-			{
-				if ("" != null)
-					return q;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Query");
-		}
-	}
-
-	final public ADQLQuery QueryExpression() throws ParseException {
-		trace_call("QueryExpression");
-		try {
-			TextPosition endPos = null;
-			try {
-				// create the query:
-				query = queryFactory.createQuery(ADQLVersion.V2_1);
-				stackQuery.push(query);
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			Select();
-			From();
-			endPos = query.getFrom().getPosition();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case WHERE: {
-					Where();
-					endPos = query.getWhere().getPosition();
-					break;
-				}
-				default:
-					jj_la1[1] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case GROUP: {
-					GroupBy();
-					endPos = query.getGroupBy().getPosition();
-					break;
-				}
-				default:
-					jj_la1[2] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case HAVING: {
-					Having();
-					endPos = query.getHaving().getPosition();
-					break;
-				}
-				default:
-					jj_la1[3] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ORDER: {
-					OrderBy();
-					endPos = query.getOrderBy().getPosition();
-					break;
-				}
-				default:
-					jj_la1[4] = jj_gen;
-					;
-			}
-			// set the position of the query:
-			query.setPosition(new TextPosition(query.getSelect().getPosition(), endPos));
-
-			// get the previous query (!= null if the current query is a sub-query):
-			ADQLQuery previousQuery = stackQuery.pop();
-			if (stackQuery.isEmpty())
-				query = null;
-			else
-				query = stackQuery.peek();
-
-			{
-				if ("" != null)
-					return previousQuery;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("QueryExpression");
-		}
-	}
-
-	final public ADQLQuery SubQueryExpression() throws ParseException {
-		trace_call("SubQueryExpression");
-		try {
-			ADQLQuery q = null;
-			Token start, end;
-			start = jj_consume_token(LEFT_PAR);
-			q = QueryExpression();
-			end = jj_consume_token(RIGHT_PAR);
-			q.setPosition(new TextPosition(start, end));
-			{
-				if ("" != null)
-					return q;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SubQueryExpression");
-		}
-	}
-
-	final public void Select() throws ParseException {
-		trace_call("Select");
-		try {
-			ClauseSelect select = query.getSelect();
-			SelectItem item = null;
-			Token start, t = null;
-			start = jj_consume_token(SELECT);
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case QUANTIFIER: {
-					t = jj_consume_token(QUANTIFIER);
-					select.setDistinctColumns(t.image.equalsIgnoreCase("DISTINCT"));
-					break;
-				}
-				default:
-					jj_la1[5] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case TOP: {
-					jj_consume_token(TOP);
-					t = jj_consume_token(UNSIGNED_INTEGER);
-					try {
-						select.setLimit(Integer.parseInt(t.image));
-					} catch(NumberFormatException nfe) {
-						{
-							if (true)
-								throw new ParseException("[l." + t.beginLine + ";c." + t.beginColumn + "] The TOP limit (\u005c"" + t.image + "\u005c") isn't a regular unsigned integer !");
-						}
-					}
-					break;
-				}
-				default:
-					jj_la1[6] = jj_gen;
-					;
-			}
-			item = SelectItem();
-			select.add(item);
-			label_1: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COMMA: {
-						;
-						break;
-					}
-					default:
-						jj_la1[7] = jj_gen;
-						break label_1;
-				}
-				jj_consume_token(COMMA);
-				item = SelectItem();
-				select.add(item);
-			}
-			TextPosition lastItemPos = query.getSelect().get(query.getSelect().size() - 1).getPosition();
-			select.setPosition(new TextPosition(start.beginLine, start.beginColumn, lastItemPos.endLine, lastItemPos.endColumn));
-		} finally {
-			trace_return("Select");
-		}
-	}
-
-	final public SelectItem SelectItem() throws ParseException {
-		trace_call("SelectItem");
-		try {
-			IdentifierItems identifiers = new IdentifierItems(true);
-			IdentifierItem id = null, label = null;
-			ADQLOperand op = null;
-			SelectItem item;
-			Token starToken;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ASTERISK: {
-					starToken = jj_consume_token(ASTERISK);
-					item = new SelectAllColumns(query);
-					item.setPosition(new TextPosition(starToken));
-					{
-						if ("" != null)
-							return item;
-					}
-					break;
-				}
-				default:
-					jj_la1[12] = jj_gen;
-					if (jj_2_1(7)) {
-						id = Identifier();
-						jj_consume_token(DOT);
-						identifiers.append(id);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								id = Identifier();
-								jj_consume_token(DOT);
-								identifiers.append(id);
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case DELIMITED_IDENTIFIER:
-									case REGULAR_IDENTIFIER_CANDIDATE: {
-										id = Identifier();
-										jj_consume_token(DOT);
-										identifiers.append(id);
-										break;
-									}
-									default:
-										jj_la1[8] = jj_gen;
-										;
-								}
-								break;
-							}
-							default:
-								jj_la1[9] = jj_gen;
-								;
-						}
-						starToken = jj_consume_token(ASTERISK);
-						try {
-							item = new SelectAllColumns(queryFactory.createTable(identifiers, null));
-							TextPosition firstPos = identifiers.get(0).position;
-							item.setPosition(new TextPosition(firstPos.beginLine, firstPos.beginColumn, starToken.endLine, (starToken.endColumn < 0) ? -1 : (starToken.endColumn + 1)));
-							{
-								if ("" != null)
-									return item;
-							}
-						} catch(Exception ex) {
-							{
-								if (true)
-									throw generateParseException(ex);
-							}
-						}
-					} else {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case LEFT_PAR:
-							case PLUS:
-							case MINUS:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case BOX:
-							case CENTROID:
-							case CIRCLE:
-							case POINT:
-							case POLYGON:
-							case CONTAINS:
-							case INTERSECTS:
-							case AREA:
-							case COORD1:
-							case COORD2:
-							case COORDSYS:
-							case DISTANCE:
-							case LOWER:
-							case ABS:
-							case CEILING:
-							case DEGREES:
-							case EXP:
-							case FLOOR:
-							case LOG:
-							case LOG10:
-							case MOD:
-							case PI:
-							case POWER:
-							case RADIANS:
-							case RAND:
-							case ROUND:
-							case SQRT:
-							case TRUNCATE:
-							case ACOS:
-							case ASIN:
-							case ATAN:
-							case ATAN2:
-							case COS:
-							case COT:
-							case SIN:
-							case TAN:
-							case STRING_LITERAL:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								op = ValueExpression();
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case AS:
-									case DELIMITED_IDENTIFIER:
-									case REGULAR_IDENTIFIER_CANDIDATE: {
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case AS: {
-												jj_consume_token(AS);
-												break;
-											}
-											default:
-												jj_la1[10] = jj_gen;
-												;
-										}
-										label = Identifier();
-										break;
-									}
-									default:
-										jj_la1[11] = jj_gen;
-										;
-								}
-								break;
-							}
-							default:
-								jj_la1[13] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-					}
-			}
-			try {
-				item = queryFactory.createSelectItem(op, (label == null) ? null : label.identifier);
-				if (label != null) {
-					item.setCaseSensitive(label.caseSensitivity);
-					item.setPosition(new TextPosition(op.getPosition(), label.position));
-				} else
-					item.setPosition(new TextPosition(op.getPosition()));
-				{
-					if ("" != null)
-						return item;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SelectItem");
-		}
-	}
-
-	final public void From() throws ParseException {
-		trace_call("From");
-		try {
-			FromContent content = null, content2 = null;
-			try {
-				jj_consume_token(FROM);
-				content = TableRef();
-				label_2: while(true) {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case COMMA: {
-							;
-							break;
-						}
-						default:
-							jj_la1[14] = jj_gen;
-							break label_2;
-					}
-					jj_consume_token(COMMA);
-					content2 = TableRef();
-					TextPosition startPos = content.getPosition(), endPos = content2.getPosition();
-					content = queryFactory.createJoin(JoinType.CROSS, content, content2);
-					content.setPosition(new TextPosition(startPos, endPos));
-				}
-				query.setFrom(content);
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-		} finally {
-			trace_return("From");
-		}
-	}
-
-	final public void Where() throws ParseException {
-		trace_call("Where");
-		try {
-			ClauseConstraints where = query.getWhere();
-			ADQLConstraint condition;
-			Token start;
-			start = jj_consume_token(WHERE);
-			ConditionsList(where);
-			TextPosition endPosition = where.getPosition();
-			where.setPosition(new TextPosition(start.beginLine, start.beginColumn, endPosition.endLine, endPosition.endColumn));
-		} finally {
-			trace_return("Where");
-		}
-	}
-
-	final public void GroupBy() throws ParseException {
-		trace_call("GroupBy");
-		try {
-			ClauseADQL<ADQLColumn> groupBy = query.getGroupBy();
-			ADQLColumn colRef = null;
-			Token start;
-			start = jj_consume_token(GROUP);
-			jj_consume_token(BY);
-			colRef = Column();
-			groupBy.add(colRef);
-			label_3: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COMMA: {
-						;
-						break;
-					}
-					default:
-						jj_la1[15] = jj_gen;
-						break label_3;
-				}
-				jj_consume_token(COMMA);
-				colRef = Column();
-				groupBy.add(colRef);
-			}
-			groupBy.setPosition(new TextPosition(start.beginLine, start.beginColumn, colRef.getPosition().endLine, colRef.getPosition().endColumn));
-		} finally {
-			trace_return("GroupBy");
-		}
-	}
-
-	final public void Having() throws ParseException {
-		trace_call("Having");
-		try {
-			ClauseConstraints having = query.getHaving();
-			Token start;
-			start = jj_consume_token(HAVING);
-			ConditionsList(having);
-			TextPosition endPosition = having.getPosition();
-			having.setPosition(new TextPosition(start.beginLine, start.beginColumn, endPosition.endLine, endPosition.endColumn));
-		} finally {
-			trace_return("Having");
-		}
-	}
-
-	final public void OrderBy() throws ParseException {
-		trace_call("OrderBy");
-		try {
-			ClauseADQL<ADQLOrder> orderBy = query.getOrderBy();
-			ADQLOrder order = null;
-			Token start;
-			start = jj_consume_token(ORDER);
-			jj_consume_token(BY);
-			order = OrderItem();
-			orderBy.add(order);
-			label_4: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COMMA: {
-						;
-						break;
-					}
-					default:
-						jj_la1[16] = jj_gen;
-						break label_4;
-				}
-				jj_consume_token(COMMA);
-				order = OrderItem();
-				orderBy.add(order);
-			}
-			orderBy.setPosition(new TextPosition(start, token));
-		} finally {
-			trace_return("OrderBy");
-		}
-	}
-
-	/* *************************** */
-	/* COLUMN AND TABLE REFERENCES */
-	/* *************************** */
-	final public IdentifierItem Identifier() throws ParseException {
-		trace_call("Identifier");
-		try {
-			Token t;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					t = jj_consume_token(REGULAR_IDENTIFIER_CANDIDATE);
-					testRegularIdentifier(t);
-					{
-						if ("" != null)
-							return new IdentifierItem(t, false);
-					}
-					break;
-				}
-				case DELIMITED_IDENTIFIER: {
-					t = jj_consume_token(DELIMITED_IDENTIFIER);
-					{
-						if ("" != null)
-							return new IdentifierItem(t, true);
-					}
-					break;
-				}
-				default:
-					jj_la1[17] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Identifier");
-		}
-	}
-
-	/**
-	 * Extracts the name of a table with its possible catalog and schema prefixes.
-	 * 
-	 * @return A {@link IdentifierItems} which contains at most three items: catalogName, schemaName and tableName.
-	 */
-	final public IdentifierItems TableName() throws ParseException {
-		trace_call("TableName");
-		try {
-			IdentifierItems identifiers = new IdentifierItems(true);
-			IdentifierItem id = null;
-			id = Identifier();
-			identifiers.append(id);
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DOT: {
-					jj_consume_token(DOT);
-					id = Identifier();
-					identifiers.append(id);
-					break;
-				}
-				default:
-					jj_la1[18] = jj_gen;
-					;
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DOT: {
-					jj_consume_token(DOT);
-					id = Identifier();
-					identifiers.append(id);
-					break;
-				}
-				default:
-					jj_la1[19] = jj_gen;
-					;
-			}
-			{
-				if ("" != null)
-					return identifiers;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("TableName");
-		}
-	}
-
-	/**
-	 * Extracts the name of a column with its possible catalog, schema and table prefixes.
-	 * 
-	 * @return A {@link IdentifierItems} which contains at most four items: catalogName, schemaName, tableName and columnName.
-	 */
-	final public IdentifierItems ColumnName() throws ParseException {
-		trace_call("ColumnName");
-		try {
-			IdentifierItem id;
-			IdentifierItems table = null, identifiers = new IdentifierItems(false);
-			id = Identifier();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DOT: {
-					jj_consume_token(DOT);
-					table = TableName();
-					break;
-				}
-				default:
-					jj_la1[20] = jj_gen;
-					;
-			}
-			identifiers.append(id);
-			if (table != null) {
-				for(int i = 0; i < table.size(); i++)
-					identifiers.append(table.get(i));
-			}
-			{
-				if ("" != null)
-					return identifiers;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ColumnName");
-		}
-	}
-
-	final public ADQLColumn Column() throws ParseException {
-		trace_call("Column");
-		try {
-			IdentifierItems identifiers;
-			identifiers = ColumnName();
-			try {
-				{
-					if ("" != null)
-						return queryFactory.createColumn(identifiers);
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Column");
-		}
-	}
-
-	final public ADQLOrder OrderItem() throws ParseException {
-		trace_call("OrderItem");
-		try {
-			IdentifierItem identifier = null;
-			Token ind = null, desc = null;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					identifier = Identifier();
-					break;
-				}
-				case UNSIGNED_INTEGER: {
-					ind = jj_consume_token(UNSIGNED_INTEGER);
-					break;
-				}
-				default:
-					jj_la1[21] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ASC:
-				case DESC: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case ASC: {
-							jj_consume_token(ASC);
-							break;
-						}
-						case DESC: {
-							desc = jj_consume_token(DESC);
-							break;
-						}
-						default:
-							jj_la1[22] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					break;
-				}
-				default:
-					jj_la1[23] = jj_gen;
-					;
-			}
-			try {
-				ADQLOrder order = null;
-				if (identifier != null) {
-					order = queryFactory.createOrder(identifier, desc != null);
-					order.setPosition(identifier.position);
-				} else {
-					order = queryFactory.createOrder(Integer.parseInt(ind.image), desc != null);
-					order.setPosition(new TextPosition(ind));
-				}
-				{
-					if ("" != null)
-						return order;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("OrderItem");
-		}
-	}
-
-	final public FromContent SimpleTableRef() throws ParseException {
-		trace_call("SimpleTableRef");
-		try {
-			IdentifierItem alias = null;
-			IdentifierItems identifiers = null;
-			ADQLQuery subQuery = null;
-			FromContent content = null;
-			Token start, end;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						identifiers = TableName();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case AS:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case AS: {
-										jj_consume_token(AS);
-										break;
-									}
-									default:
-										jj_la1[24] = jj_gen;
-										;
-								}
-								alias = Identifier();
-								break;
-							}
-							default:
-								jj_la1[25] = jj_gen;
-								;
-						}
-						content = queryFactory.createTable(identifiers, alias);
-						if (alias == null)
-							content.setPosition(new TextPosition(identifiers.get(0).position, identifiers.get(identifiers.size() - 1).position));
-						else
-							content.setPosition(new TextPosition(identifiers.get(0).position, alias.position));
-						{
-							if ("" != null)
-								return content;
-						}
-						break;
-					}
-					default:
-						jj_la1[27] = jj_gen;
-						if (jj_2_2(2)) {
-							subQuery = SubQueryExpression();
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case AS: {
-									jj_consume_token(AS);
-									break;
-								}
-								default:
-									jj_la1[26] = jj_gen;
-									;
-							}
-							alias = Identifier();
-							content = queryFactory.createTable(subQuery, alias);
-							if (alias == null)
-								content.setPosition(new TextPosition(subQuery.getPosition()));
-							else
-								content.setPosition(new TextPosition(subQuery.getPosition(), alias.position));
-							{
-								if ("" != null)
-									return content;
-							}
-						} else {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case LEFT_PAR: {
-									start = jj_consume_token(LEFT_PAR);
-									content = JoinedTable();
-									end = jj_consume_token(RIGHT_PAR);
-									content.setPosition(new TextPosition(start, end));
-									{
-										if ("" != null)
-											return content;
-									}
-									break;
-								}
-								default:
-									jj_la1[28] = jj_gen;
-									jj_consume_token(-1);
-									throw new ParseException();
-							}
-						}
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SimpleTableRef");
-		}
-	}
-
-	final public FromContent TableRef() throws ParseException {
-		trace_call("TableRef");
-		try {
-			FromContent content;
-			content = SimpleTableRef();
-			label_5: while(true) {
-				if (jj_2_3(2)) {
-					;
-				} else {
-					break label_5;
-				}
-				content = JoinSpecification(content);
-			}
-			{
-				if ("" != null)
-					return content;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("TableRef");
-		}
-	}
-
-	final public FromContent JoinedTable() throws ParseException {
-		trace_call("JoinedTable");
-		try {
-			FromContent content;
-			content = SimpleTableRef();
-			label_6: while(true) {
-				content = JoinSpecification(content);
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case NATURAL:
-					case INNER:
-					case RIGHT:
-					case LEFT:
-					case FULL:
-					case JOIN: {
-						;
-						break;
-					}
-					default:
-						jj_la1[29] = jj_gen;
-						break label_6;
-				}
-			}
-			{
-				if ("" != null)
-					return content;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("JoinedTable");
-		}
-	}
-
-	final public ADQLJoin JoinSpecification(FromContent leftTable) throws ParseException {
-		trace_call("JoinSpecification");
-		try {
-			boolean natural = false;
-			JoinType type = JoinType.INNER;
-			ClauseConstraints condition = new ClauseConstraints("ON");
-			ArrayList<ADQLColumn> lstColumns = new ArrayList<ADQLColumn>();
-			IdentifierItem id;
-			FromContent rightTable;
-			ADQLJoin join;
-			Token lastPar;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case NATURAL: {
-						jj_consume_token(NATURAL);
-						natural = true;
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case INNER:
-							case RIGHT:
-							case LEFT:
-							case FULL: {
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case INNER: {
-										jj_consume_token(INNER);
-										break;
-									}
-									case RIGHT:
-									case LEFT:
-									case FULL: {
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case LEFT: {
-												jj_consume_token(LEFT);
-												type = JoinType.OUTER_LEFT;
-												break;
-											}
-											case RIGHT: {
-												jj_consume_token(RIGHT);
-												type = JoinType.OUTER_RIGHT;
-												break;
-											}
-											case FULL: {
-												jj_consume_token(FULL);
-												type = JoinType.OUTER_FULL;
-												break;
-											}
-											default:
-												jj_la1[30] = jj_gen;
-												jj_consume_token(-1);
-												throw new ParseException();
-										}
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case OUTER: {
-												jj_consume_token(OUTER);
-												break;
-											}
-											default:
-												jj_la1[31] = jj_gen;
-												;
-										}
-										break;
-									}
-									default:
-										jj_la1[32] = jj_gen;
-										jj_consume_token(-1);
-										throw new ParseException();
-								}
-								break;
-							}
-							default:
-								jj_la1[33] = jj_gen;
-								;
-						}
-						jj_consume_token(JOIN);
-						rightTable = SimpleTableRef();
-						join = queryFactory.createJoin(type, leftTable, rightTable);
-						join.setPosition(new TextPosition(leftTable.getPosition(), rightTable.getPosition()));
-						{
-							if ("" != null)
-								return join;
-						}
-						break;
-					}
-					case INNER:
-					case RIGHT:
-					case LEFT:
-					case FULL:
-					case JOIN: {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case INNER:
-							case RIGHT:
-							case LEFT:
-							case FULL: {
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-									case INNER: {
-										jj_consume_token(INNER);
-										break;
-									}
-									case RIGHT:
-									case LEFT:
-									case FULL: {
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case LEFT: {
-												jj_consume_token(LEFT);
-												type = JoinType.OUTER_LEFT;
-												break;
-											}
-											case RIGHT: {
-												jj_consume_token(RIGHT);
-												type = JoinType.OUTER_RIGHT;
-												break;
-											}
-											case FULL: {
-												jj_consume_token(FULL);
-												type = JoinType.OUTER_FULL;
-												break;
-											}
-											default:
-												jj_la1[34] = jj_gen;
-												jj_consume_token(-1);
-												throw new ParseException();
-										}
-										switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-											case OUTER: {
-												jj_consume_token(OUTER);
-												break;
-											}
-											default:
-												jj_la1[35] = jj_gen;
-												;
-										}
-										break;
-									}
-									default:
-										jj_la1[36] = jj_gen;
-										jj_consume_token(-1);
-										throw new ParseException();
-								}
-								break;
-							}
-							default:
-								jj_la1[37] = jj_gen;
-								;
-						}
-						jj_consume_token(JOIN);
-						rightTable = SimpleTableRef();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case ON: {
-								jj_consume_token(ON);
-								ConditionsList(condition);
-								join = queryFactory.createJoin(type, leftTable, rightTable, condition);
-								join.setPosition(new TextPosition(leftTable.getPosition(), condition.getPosition()));
-								{
-									if ("" != null)
-										return join;
-								}
-								break;
-							}
-							case USING: {
-								jj_consume_token(USING);
-								jj_consume_token(LEFT_PAR);
-								id = Identifier();
-								lstColumns.add(queryFactory.createColumn(id));
-								label_7: while(true) {
-									switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-										case COMMA: {
-											;
-											break;
-										}
-										default:
-											jj_la1[38] = jj_gen;
-											break label_7;
-									}
-									jj_consume_token(COMMA);
-									id = Identifier();
-									lstColumns.add(queryFactory.createColumn(id));
-								}
-								lastPar = jj_consume_token(RIGHT_PAR);
-								join = queryFactory.createJoin(type, leftTable, rightTable, lstColumns);
-								join.setPosition(new TextPosition(leftTable.getPosition().beginLine, leftTable.getPosition().beginColumn, lastPar.endLine, (lastPar.endColumn < 0) ? -1 : (lastPar.endColumn + 1)));
-								{
-									if ("" != null)
-										return join;
-								}
-								break;
-							}
-							default:
-								jj_la1[39] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						break;
-					}
-					default:
-						jj_la1[40] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("JoinSpecification");
-		}
-	}
-
-	/* ****** */
-	/* STRING */
-	/* ****** */
-	final public StringConstant String() throws ParseException {
-		trace_call("String");
-		try {
-			Token t, start = null;
-			String str = "";
-			StringConstant cst;
-			label_8: while(true) {
-				t = jj_consume_token(STRING_LITERAL);
-				str += t.image.substring(1, t.image.length() - 1).replaceAll("''", "'");
-				if (start == null)
-					start = t;
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case STRING_LITERAL: {
-						;
-						break;
-					}
-					default:
-						jj_la1[41] = jj_gen;
-						break label_8;
-				}
-			}
-			try {
-				cst = queryFactory.createStringConstant(str);
-				cst.setPosition(new TextPosition(start, t));
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("String");
-		}
-	}
-
-	/* ************* */
-	/* NUMERIC TYPES */
-	/* ************* */
-	final public NumericConstant UnsignedNumeric() throws ParseException {
-		trace_call("UnsignedNumeric");
-		try {
-			Token t;
-			NumericConstant cst;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case SCIENTIFIC_NUMBER: {
-					t = jj_consume_token(SCIENTIFIC_NUMBER);
-					break;
-				}
-				case UNSIGNED_FLOAT: {
-					t = jj_consume_token(UNSIGNED_FLOAT);
-					break;
-				}
-				case UNSIGNED_INTEGER: {
-					t = jj_consume_token(UNSIGNED_INTEGER);
-					break;
-				}
-				default:
-					jj_la1[42] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			try {
-				cst = queryFactory.createNumericConstant(t.image);
-				cst.setPosition(new TextPosition(t));
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("UnsignedNumeric");
-		}
-	}
-
-	final public NumericConstant UnsignedFloat() throws ParseException {
-		trace_call("UnsignedFloat");
-		try {
-			Token t;
-			NumericConstant cst;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case UNSIGNED_INTEGER: {
-					t = jj_consume_token(UNSIGNED_INTEGER);
-					break;
-				}
-				case UNSIGNED_FLOAT: {
-					t = jj_consume_token(UNSIGNED_FLOAT);
-					break;
-				}
-				default:
-					jj_la1[43] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			try {
-				cst = queryFactory.createNumericConstant(t.image);
-				cst.setPosition(new TextPosition(t));
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("UnsignedFloat");
-		}
-	}
-
-	final public NumericConstant SignedInteger() throws ParseException {
-		trace_call("SignedInteger");
-		try {
-			Token sign = null, number;
-			NumericConstant cst;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case PLUS:
-				case MINUS: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case PLUS: {
-							sign = jj_consume_token(PLUS);
-							break;
-						}
-						case MINUS: {
-							sign = jj_consume_token(MINUS);
-							break;
-						}
-						default:
-							jj_la1[44] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					break;
-				}
-				default:
-					jj_la1[45] = jj_gen;
-					;
-			}
-			number = jj_consume_token(UNSIGNED_INTEGER);
-			try {
-				if (sign == null) {
-					cst = queryFactory.createNumericConstant(number.image);
-					cst.setPosition(new TextPosition(number));
-				} else {
-					cst = queryFactory.createNumericConstant(sign.image + number.image);
-					cst.setPosition(new TextPosition(sign, number));
-				}
-				{
-					if ("" != null)
-						return cst;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SignedInteger");
-		}
-	}
-
-	/* *********** */
-	/* EXPRESSIONS */
-	/* *********** */
-	final public ADQLOperand NumericValueExpressionPrimary() throws ParseException {
-		trace_call("NumericValueExpressionPrimary");
-		try {
-			ADQLColumn column;
-			ADQLOperand op;
-			Token left, right;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case SCIENTIFIC_NUMBER:
-					case UNSIGNED_FLOAT:
-					case UNSIGNED_INTEGER: {
-						// unsigned_value_specification
-						op = UnsignedNumeric();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						column = Column();
-						column.setExpectedType('N');
-						{
-							if ("" != null)
-								return column;
-						}
-						break;
-					}
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM:
-					case COUNT: {
-						op = SqlFunction();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case LEFT_PAR: {
-						left = jj_consume_token(LEFT_PAR);
-						op = NumericExpression();
-						right = jj_consume_token(RIGHT_PAR);
-						WrappedOperand wop = queryFactory.createWrappedOperand(op);
-						wop.setPosition(new TextPosition(left, right));
-						{
-							if ("" != null)
-								return wop;
-						}
-						break;
-					}
-					default:
-						jj_la1[46] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericValueExpressionPrimary");
-		}
-	}
-
-	final public ADQLOperand StringValueExpressionPrimary() throws ParseException {
-		trace_call("StringValueExpressionPrimary");
-		try {
-			StringConstant expr;
-			ADQLColumn column;
-			ADQLOperand op;
-			Token left, right;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case STRING_LITERAL: {
-						// string
-						expr = String();
-						{
-							if ("" != null)
-								return expr;
-						}
-						break;
-					}
-					case SCIENTIFIC_NUMBER:
-					case UNSIGNED_FLOAT:
-					case UNSIGNED_INTEGER: {
-						op = UnsignedNumeric();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM:
-					case COUNT: {
-						op = SqlFunction();
-						{
-							if ("" != null)
-								return op;
-						}
-						break;
-					}
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						column = Column();
-						column.setExpectedType('*');
-						{
-							if ("" != null)
-								return column;
-						}
-						break;
-					}
-					case LEFT_PAR: {
-						left = jj_consume_token(LEFT_PAR);
-						op = ValueExpression();
-						right = jj_consume_token(RIGHT_PAR);
-						WrappedOperand wop = queryFactory.createWrappedOperand(op);
-						wop.setPosition(new TextPosition(left, right));
-						{
-							if ("" != null)
-								return wop;
-						}
-						break;
-					}
-					default:
-						jj_la1[47] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("StringValueExpressionPrimary");
-		}
-	}
-
-	final public ADQLOperand ValueExpression() throws ParseException {
-		trace_call("ValueExpression");
-		try {
-			ADQLOperand valueExpr = null;
-			Token left, right;
-			try {
-				if (jj_2_4(2147483647)) {
-					valueExpr = NumericExpression();
-				} else if (jj_2_5(2147483647)) {
-					valueExpr = StringExpression();
-				} else if (jj_2_6(2147483647)) {
-					left = jj_consume_token(LEFT_PAR);
-					valueExpr = ValueExpression();
-					right = jj_consume_token(RIGHT_PAR);
-					valueExpr = queryFactory.createWrappedOperand(valueExpr);
-					((WrappedOperand)valueExpr).setPosition(new TextPosition(left, right));
-				} else if (jj_2_7(2147483647)) {
-					valueExpr = UserDefinedFunction();
-				} else if (jj_2_8(2)) {
-					valueExpr = GeometryValueFunction();
-				} else if (jj_2_9(2147483647)) {
-					valueExpr = Column();
-				} else if (jj_2_10(2147483647)) {
-					valueExpr = StringFactor();
-				} else if (jj_2_11(3)) {
-					valueExpr = Factor();
-				} else {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case DELIMITED_IDENTIFIER:
-						case REGULAR_IDENTIFIER_CANDIDATE: {
-							valueExpr = Column();
-							break;
-						}
-						default:
-							jj_la1[48] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-				}
-				{
-					if ("" != null)
-						return valueExpr;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ValueExpression");
-		}
-	}
-
-	final public ADQLOperand NumericExpression() throws ParseException {
-		trace_call("NumericExpression");
-		try {
-			Token sign = null;
-			ADQLOperand leftOp, rightOp = null;
-			leftOp = NumericTerm();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case PLUS:
-				case MINUS: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case PLUS: {
-							sign = jj_consume_token(PLUS);
-							break;
-						}
-						case MINUS: {
-							sign = jj_consume_token(MINUS);
-							break;
-						}
-						default:
-							jj_la1[49] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					rightOp = NumericExpression();
-					break;
-				}
-				default:
-					jj_la1[50] = jj_gen;
-					;
-			}
-			if (sign == null) {
-				if ("" != null)
-					return leftOp;
-			} else {
-				try {
-					Operation operation = queryFactory.createOperation(leftOp, OperationType.getOperator(sign.image), rightOp);
-					operation.setPosition(new TextPosition(leftOp.getPosition(), rightOp.getPosition()));
-					{
-						if ("" != null)
-							return operation;
-					}
-				} catch(Exception ex) {
-					{
-						if (true)
-							throw generateParseException(ex);
-					}
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericExpression");
-		}
-	}
-
-	final public ADQLOperand NumericTerm() throws ParseException {
-		trace_call("NumericTerm");
-		try {
-			Token sign = null;
-			ADQLOperand leftOp, rightOp = null;
-			leftOp = Factor();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ASTERISK:
-				case DIVIDE: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case ASTERISK: {
-							sign = jj_consume_token(ASTERISK);
-							break;
-						}
-						case DIVIDE: {
-							sign = jj_consume_token(DIVIDE);
-							break;
-						}
-						default:
-							jj_la1[51] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					rightOp = NumericTerm();
-					break;
-				}
-				default:
-					jj_la1[52] = jj_gen;
-					;
-			}
-			if (sign == null) {
-				if ("" != null)
-					return leftOp;
-			} else {
-				try {
-					Operation operation = queryFactory.createOperation(leftOp, OperationType.getOperator(sign.image), rightOp);
-					operation.setPosition(new TextPosition(leftOp.getPosition(), rightOp.getPosition()));
-					{
-						if ("" != null)
-							return operation;
-					}
-				} catch(Exception ex) {
-					{
-						if (true)
-							throw generateParseException(ex);
-					}
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericTerm");
-		}
-	}
-
-	final public ADQLOperand Factor() throws ParseException {
-		trace_call("Factor");
-		try {
-			boolean negative = false;
-			Token minusSign = null;
-			ADQLOperand op;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case PLUS:
-				case MINUS: {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case PLUS: {
-							jj_consume_token(PLUS);
-							break;
-						}
-						case MINUS: {
-							minusSign = jj_consume_token(MINUS);
-							negative = true;
-							break;
-						}
-						default:
-							jj_la1[53] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					break;
-				}
-				default:
-					jj_la1[54] = jj_gen;
-					;
-			}
-			if (jj_2_12(2)) {
-				op = NumericFunction();
-			} else {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case LEFT_PAR:
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM:
-					case COUNT:
-					case SCIENTIFIC_NUMBER:
-					case UNSIGNED_FLOAT:
-					case UNSIGNED_INTEGER:
-					case DELIMITED_IDENTIFIER:
-					case REGULAR_IDENTIFIER_CANDIDATE: {
-						op = NumericValueExpressionPrimary();
-						break;
-					}
-					default:
-						jj_la1[55] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			}
-			if (negative) {
-				try {
-					TextPosition position = op.getPosition();
-					op = queryFactory.createNegativeOperand(op);
-					NegativeOperand negativeOp = (NegativeOperand)op;
-					if (minusSign != null)
-						negativeOp.setPosition(new TextPosition(minusSign.beginLine, minusSign.beginColumn, position.endLine, position.endColumn));
-					else
-						negativeOp.setPosition(position);
-				} catch(Exception ex) {
-					{
-						if (true)
-							throw generateParseException(ex);
-					}
-				}
-			}
-
-			{
-				if ("" != null)
-					return op;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Factor");
-		}
-	}
-
-	@Override
-	final public ADQLOperand StringExpression() throws ParseException {
-		trace_call("StringExpression");
-		try {
-			ADQLOperand leftOp;
-			ADQLOperand rightOp = null;
-			leftOp = StringFactor();
-			label_9: while(true) {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case CONCAT: {
-						;
-						break;
-					}
-					default:
-						jj_la1[56] = jj_gen;
-						break label_9;
-				}
-				jj_consume_token(CONCAT);
-				rightOp = StringFactor();
-				if (!(leftOp instanceof Concatenation)) {
-					try {
-						ADQLOperand temp = leftOp;
-						leftOp = queryFactory.createConcatenation();
-						((Concatenation)leftOp).add(temp);
-					} catch(Exception ex) {
-						{
-							if (true)
-								throw generateParseException(ex);
-						}
-					}
-				}
-				((Concatenation)leftOp).add(rightOp);
-			}
-			if (leftOp instanceof Concatenation) {
-				Concatenation concat = (Concatenation)leftOp;
-				concat.setPosition(new TextPosition(concat.get(0).getPosition(), concat.get(concat.size() - 1).getPosition()));
-			}
-			{
-				if ("" != null)
-					return leftOp;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("StringExpression");
-		}
-	}
-
-	final public ADQLOperand StringFactor() throws ParseException {
-		trace_call("StringFactor");
-		try {
-			ADQLOperand op;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case COORDSYS: {
-					op = ExtractCoordSys();
-					break;
-				}
-				case LOWER: {
-					op = LowerFunction();
-					break;
-				}
-				default:
-					jj_la1[57] = jj_gen;
-					if (jj_2_13(2)) {
-						op = UserDefinedFunction();
-						((UserDefinedFunction)op).setExpectedType('S');
-					} else {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case LEFT_PAR:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case STRING_LITERAL:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								op = StringValueExpressionPrimary();
-								break;
-							}
-							default:
-								jj_la1[58] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-					}
-			}
-			{
-				if ("" != null)
-					return op;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("StringFactor");
-		}
-	}
-
-	final public GeometryValue<GeometryFunction> GeometryExpression() throws ParseException {
-		trace_call("GeometryExpression");
-		try {
-			ADQLColumn col = null;
-			GeometryFunction gf = null;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					col = Column();
-					break;
-				}
-				case BOX:
-				case CENTROID:
-				case CIRCLE:
-				case POINT:
-				case POLYGON: {
-					gf = GeometryValueFunction();
-					break;
-				}
-				default:
-					jj_la1[59] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			if (col != null) {
-				col.setExpectedType('G');
-				{
-					if ("" != null)
-						return new GeometryValue<GeometryFunction>(col);
-				}
-			} else {
-				if ("" != null)
-					return new GeometryValue<GeometryFunction>(gf);
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("GeometryExpression");
-		}
-	}
-
-	/* ********************************** */
-	/* BOOLEAN EXPRESSIONS (WHERE clause) */
-	/* ********************************** */
-	final public ClauseConstraints ConditionsList(ClauseConstraints clause) throws ParseException {
-		trace_call("ConditionsList");
-		try {
-			ADQLConstraint constraint = null;
-			Token op = null;
-			boolean notOp = false;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case NOT: {
-						op = jj_consume_token(NOT);
-						notOp = true;
-						break;
-					}
-					default:
-						jj_la1[60] = jj_gen;
-						;
-				}
-				constraint = Constraint();
-				if (notOp) {
-					TextPosition oldPos = constraint.getPosition();
-					constraint = queryFactory.createNot(constraint);
-					((NotConstraint)constraint).setPosition(new TextPosition(op.beginLine, op.beginColumn, oldPos.endLine, oldPos.endColumn));
-				}
-				notOp = false;
-
-				if (clause instanceof ADQLConstraint)
-					clause.add(constraint);
-				else
-					clause.add(constraint);
-				label_10: while(true) {
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case AND:
-						case OR: {
-							;
-							break;
-						}
-						default:
-							jj_la1[61] = jj_gen;
-							break label_10;
-					}
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case AND: {
-							op = jj_consume_token(AND);
-							break;
-						}
-						case OR: {
-							op = jj_consume_token(OR);
-							break;
-						}
-						default:
-							jj_la1[62] = jj_gen;
-							jj_consume_token(-1);
-							throw new ParseException();
-					}
-					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-						case NOT: {
-							jj_consume_token(NOT);
-							notOp = true;
-							break;
-						}
-						default:
-							jj_la1[63] = jj_gen;
-							;
-					}
-					constraint = Constraint();
-					if (notOp) {
-						TextPosition oldPos = constraint.getPosition();
-						constraint = queryFactory.createNot(constraint);
-						((NotConstraint)constraint).setPosition(new TextPosition(op.beginLine, op.beginColumn, oldPos.endLine, oldPos.endColumn));
-					}
-					notOp = false;
-
-					if (clause instanceof ADQLConstraint)
-						clause.add(op.image, constraint);
-					else
-						clause.add(op.image, constraint);
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			if (!clause.isEmpty()) {
-				TextPosition start = clause.get(0).getPosition();
-				TextPosition end = clause.get(clause.size() - 1).getPosition();
-				clause.setPosition(new TextPosition(start, end));
-			}
-			{
-				if ("" != null)
-					return clause;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ConditionsList");
-		}
-	}
-
-	final public ADQLConstraint Constraint() throws ParseException {
-		trace_call("Constraint");
-		try {
-			ADQLConstraint constraint = null;
-			Token start, end;
-			if (jj_2_14(2147483647)) {
-				constraint = Predicate();
-			} else {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case LEFT_PAR: {
-						start = jj_consume_token(LEFT_PAR);
-						try {
-							constraint = queryFactory.createGroupOfConstraints();
-						} catch(Exception ex) {
-							{
-								if (true)
-									throw generateParseException(ex);
-							}
-						}
-						ConditionsList((ConstraintsGroup)constraint);
-						end = jj_consume_token(RIGHT_PAR);
-						((ConstraintsGroup)constraint).setPosition(new TextPosition(start, end));
-						break;
-					}
-					default:
-						jj_la1[64] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			}
-			{
-				if ("" != null)
-					return constraint;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Constraint");
-		}
-	}
-
-	final public ADQLConstraint Predicate() throws ParseException {
-		trace_call("Predicate");
-		try {
-			ADQLQuery q = null;
-			ADQLColumn column = null;
-			ADQLOperand strExpr1 = null, strExpr2 = null;
-			ADQLOperand op;
-			Token start, notToken = null, end;
-			ADQLConstraint constraint = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case EXISTS: {
-						start = jj_consume_token(EXISTS);
-						q = SubQueryExpression();
-						Exists e = queryFactory.createExists(q);
-						e.setPosition(new TextPosition(start.beginLine, start.beginColumn, q.getPosition().endLine, q.getPosition().endColumn));
-						{
-							if ("" != null)
-								return e;
-						}
-						break;
-					}
-					default:
-						jj_la1[69] = jj_gen;
-						if (jj_2_16(2147483647)) {
-							column = Column();
-							jj_consume_token(IS);
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case NOT: {
-									notToken = jj_consume_token(NOT);
-									break;
-								}
-								default:
-									jj_la1[65] = jj_gen;
-									;
-							}
-							end = jj_consume_token(NULL);
-							IsNull in = queryFactory.createIsNull((notToken != null), column);
-							in.setPosition(new TextPosition(column.getPosition().beginLine, column.getPosition().beginColumn, end.endLine, (end.endColumn < 0) ? -1 : (end.endColumn + 1)));
-							{
-								if ("" != null)
-									return in;
-							}
-						} else if (jj_2_17(2147483647)) {
-							strExpr1 = StringExpression();
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case NOT: {
-									notToken = jj_consume_token(NOT);
-									break;
-								}
-								default:
-									jj_la1[66] = jj_gen;
-									;
-							}
-							jj_consume_token(LIKE);
-							strExpr2 = StringExpression();
-							Comparison comp = queryFactory.createComparison(strExpr1, (notToken == null) ? ComparisonOperator.LIKE : ComparisonOperator.NOTLIKE, strExpr2);
-							comp.setPosition(new TextPosition(strExpr1.getPosition(), strExpr2.getPosition()));
-							{
-								if ("" != null)
-									return comp;
-							}
-						} else {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case LEFT_PAR:
-								case PLUS:
-								case MINUS:
-								case AVG:
-								case MAX:
-								case MIN:
-								case SUM:
-								case COUNT:
-								case BOX:
-								case CENTROID:
-								case CIRCLE:
-								case POINT:
-								case POLYGON:
-								case CONTAINS:
-								case INTERSECTS:
-								case AREA:
-								case COORD1:
-								case COORD2:
-								case COORDSYS:
-								case DISTANCE:
-								case LOWER:
-								case ABS:
-								case CEILING:
-								case DEGREES:
-								case EXP:
-								case FLOOR:
-								case LOG:
-								case LOG10:
-								case MOD:
-								case PI:
-								case POWER:
-								case RADIANS:
-								case RAND:
-								case ROUND:
-								case SQRT:
-								case TRUNCATE:
-								case ACOS:
-								case ASIN:
-								case ATAN:
-								case ATAN2:
-								case COS:
-								case COT:
-								case SIN:
-								case TAN:
-								case STRING_LITERAL:
-								case SCIENTIFIC_NUMBER:
-								case UNSIGNED_FLOAT:
-								case UNSIGNED_INTEGER:
-								case DELIMITED_IDENTIFIER:
-								case REGULAR_IDENTIFIER_CANDIDATE: {
-									op = ValueExpression();
-									switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-										case EQUAL:
-										case NOT_EQUAL:
-										case LESS_THAN:
-										case LESS_EQUAL_THAN:
-										case GREATER_THAN:
-										case GREATER_EQUAL_THAN: {
-											constraint = ComparisonEnd(op);
-											break;
-										}
-										default:
-											jj_la1[67] = jj_gen;
-											if (jj_2_15(2)) {
-												constraint = BetweenEnd(op);
-											} else {
-												switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-													case NOT:
-													case IN: {
-														constraint = InEnd(op);
-														break;
-													}
-													default:
-														jj_la1[68] = jj_gen;
-														jj_consume_token(-1);
-														throw new ParseException();
-												}
-											}
-									}
-									break;
-								}
-								default:
-									jj_la1[70] = jj_gen;
-									jj_consume_token(-1);
-									throw new ParseException();
-							}
-						}
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			{
-				if ("" != null)
-					return constraint;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Predicate");
-		}
-	}
-
-	final public Comparison ComparisonEnd(ADQLOperand leftOp) throws ParseException {
-		trace_call("ComparisonEnd");
-		try {
-			Token comp;
-			ADQLOperand rightOp;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case EQUAL: {
-					comp = jj_consume_token(EQUAL);
-					break;
-				}
-				case NOT_EQUAL: {
-					comp = jj_consume_token(NOT_EQUAL);
-					break;
-				}
-				case LESS_THAN: {
-					comp = jj_consume_token(LESS_THAN);
-					break;
-				}
-				case LESS_EQUAL_THAN: {
-					comp = jj_consume_token(LESS_EQUAL_THAN);
-					break;
-				}
-				case GREATER_THAN: {
-					comp = jj_consume_token(GREATER_THAN);
-					break;
-				}
-				case GREATER_EQUAL_THAN: {
-					comp = jj_consume_token(GREATER_EQUAL_THAN);
-					break;
-				}
-				default:
-					jj_la1[71] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			rightOp = ValueExpression();
-			try {
-				Comparison comparison = queryFactory.createComparison(leftOp, ComparisonOperator.getOperator(comp.image), rightOp);
-				comparison.setPosition(new TextPosition(leftOp.getPosition(), rightOp.getPosition()));
-				{
-					if ("" != null)
-						return comparison;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ComparisonEnd");
-		}
-	}
-
-	final public Between BetweenEnd(ADQLOperand leftOp) throws ParseException {
-		trace_call("BetweenEnd");
-		try {
-			Token start, notToken = null;
-			ADQLOperand min, max;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case NOT: {
-					notToken = jj_consume_token(NOT);
-					break;
-				}
-				default:
-					jj_la1[72] = jj_gen;
-					;
-			}
-			start = jj_consume_token(BETWEEN);
-			min = ValueExpression();
-			jj_consume_token(AND);
-			max = ValueExpression();
-			try {
-				Between bet = queryFactory.createBetween((notToken != null), leftOp, min, max);
-				if (notToken != null)
-					start = notToken;
-				bet.setPosition(new TextPosition(start.beginLine, start.beginColumn, max.getPosition().endLine, max.getPosition().endColumn));
-				{
-					if ("" != null)
-						return bet;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("BetweenEnd");
-		}
-	}
-
-	final public In InEnd(ADQLOperand leftOp) throws ParseException {
-		trace_call("InEnd");
-		try {
-			Token not = null, start;
-			ADQLQuery q = null;
-			ADQLOperand item;
-			Vector<ADQLOperand> items = new Vector<ADQLOperand>();
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case NOT: {
-					not = jj_consume_token(NOT);
-					break;
-				}
-				default:
-					jj_la1[73] = jj_gen;
-					;
-			}
-			start = jj_consume_token(IN);
-			if (jj_2_18(2)) {
-				q = SubQueryExpression();
-			} else {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case LEFT_PAR: {
-						jj_consume_token(LEFT_PAR);
-						item = ValueExpression();
-						items.add(item);
-						label_11: while(true) {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case COMMA: {
-									;
-									break;
-								}
-								default:
-									jj_la1[74] = jj_gen;
-									break label_11;
-							}
-							jj_consume_token(COMMA);
-							item = ValueExpression();
-							items.add(item);
-						}
-						jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					default:
-						jj_la1[75] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			}
-			try {
-				In in;
-				start = (not != null) ? not : start;
-				if (q != null) {
-					in = queryFactory.createIn(leftOp, q, not != null);
-					in.setPosition(new TextPosition(start.beginLine, start.beginColumn, q.getPosition().endLine, q.getPosition().endColumn));
-				} else {
-					ADQLOperand[] list = new ADQLOperand[items.size()];
-					int i = 0;
-					for(ADQLOperand op : items)
-						list[i++] = op;
-					in = queryFactory.createIn(leftOp, list, not != null);
-					in.setPosition(new TextPosition(start.beginLine, start.beginColumn, list[list.length - 1].getPosition().endLine, list[list.length - 1].getPosition().endColumn));
-				}
-				{
-					if ("" != null)
-						return in;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("InEnd");
-		}
-	}
-
-	/* ************* */
-	/* SQL FUNCTIONS */
-	/* ************* */
-	final public SQLFunction SqlFunction() throws ParseException {
-		trace_call("SqlFunction");
-		try {
-			Token fct, all = null, distinct = null, end;
-			ADQLOperand op = null;
-			SQLFunction funct = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case COUNT: {
-						fct = jj_consume_token(COUNT);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case QUANTIFIER: {
-								distinct = jj_consume_token(QUANTIFIER);
-								break;
-							}
-							default:
-								jj_la1[76] = jj_gen;
-								;
-						}
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case ASTERISK: {
-								all = jj_consume_token(ASTERISK);
-								break;
-							}
-							case LEFT_PAR:
-							case PLUS:
-							case MINUS:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case BOX:
-							case CENTROID:
-							case CIRCLE:
-							case POINT:
-							case POLYGON:
-							case CONTAINS:
-							case INTERSECTS:
-							case AREA:
-							case COORD1:
-							case COORD2:
-							case COORDSYS:
-							case DISTANCE:
-							case LOWER:
-							case ABS:
-							case CEILING:
-							case DEGREES:
-							case EXP:
-							case FLOOR:
-							case LOG:
-							case LOG10:
-							case MOD:
-							case PI:
-							case POWER:
-							case RADIANS:
-							case RAND:
-							case ROUND:
-							case SQRT:
-							case TRUNCATE:
-							case ACOS:
-							case ASIN:
-							case ATAN:
-							case ATAN2:
-							case COS:
-							case COT:
-							case SIN:
-							case TAN:
-							case STRING_LITERAL:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								op = ValueExpression();
-								break;
-							}
-							default:
-								jj_la1[77] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						funct = queryFactory.createSQLFunction((all != null) ? SQLFunctionType.COUNT_ALL : SQLFunctionType.COUNT, op, distinct != null && distinct.image.equalsIgnoreCase("distinct"));
-						funct.setPosition(new TextPosition(fct, end));
-						break;
-					}
-					case AVG:
-					case MAX:
-					case MIN:
-					case SUM: {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case AVG: {
-								fct = jj_consume_token(AVG);
-								break;
-							}
-							case MAX: {
-								fct = jj_consume_token(MAX);
-								break;
-							}
-							case MIN: {
-								fct = jj_consume_token(MIN);
-								break;
-							}
-							case SUM: {
-								fct = jj_consume_token(SUM);
-								break;
-							}
-							default:
-								jj_la1[78] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case QUANTIFIER: {
-								distinct = jj_consume_token(QUANTIFIER);
-								break;
-							}
-							default:
-								jj_la1[79] = jj_gen;
-								;
-						}
-						op = ValueExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						funct = queryFactory.createSQLFunction(SQLFunctionType.valueOf(fct.image.toUpperCase()), op, distinct != null && distinct.image.equalsIgnoreCase("distinct"));
-						funct.setPosition(new TextPosition(fct, end));
-						break;
-					}
-					default:
-						jj_la1[80] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			{
-				if ("" != null)
-					return funct;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("SqlFunction");
-		}
-	}
-
-	/* ************** */
-	/* ADQL FUNCTIONS */
-	/* ************** */
-	final public ADQLOperand[] Coordinates() throws ParseException {
-		trace_call("Coordinates");
-		try {
-			ADQLOperand[] ops = new ADQLOperand[2];
-			ops[0] = NumericExpression();
-			jj_consume_token(COMMA);
-			ops[1] = NumericExpression();
-			{
-				if ("" != null)
-					return ops;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Coordinates");
-		}
-	}
-
-	final public GeometryFunction GeometryFunction() throws ParseException {
-		trace_call("GeometryFunction");
-		try {
-			Token fct = null, end;
-			GeometryValue<GeometryFunction> gvf1, gvf2;
-			GeometryValue<PointFunction> gvp1, gvp2;
-			GeometryFunction gf = null;
-			PointFunction p1 = null, p2 = null;
-			ADQLColumn col1 = null, col2 = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case CONTAINS:
-					case INTERSECTS: {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case CONTAINS: {
-								fct = jj_consume_token(CONTAINS);
-								break;
-							}
-							case INTERSECTS: {
-								fct = jj_consume_token(INTERSECTS);
-								break;
-							}
-							default:
-								jj_la1[81] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						jj_consume_token(LEFT_PAR);
-						gvf1 = GeometryExpression();
-						jj_consume_token(COMMA);
-						gvf2 = GeometryExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						if (fct.image.equalsIgnoreCase("contains"))
-							gf = queryFactory.createContains(gvf1, gvf2);
-						else
-							gf = queryFactory.createIntersects(gvf1, gvf2);
-						break;
-					}
-					case AREA: {
-						fct = jj_consume_token(AREA);
-						jj_consume_token(LEFT_PAR);
-						gvf1 = GeometryExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createArea(gvf1);
-						break;
-					}
-					case COORD1: {
-						fct = jj_consume_token(COORD1);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p1 = Point();
-								gf = queryFactory.createCoord1(p1);
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col1 = Column();
-								col1.setExpectedType('G');
-								gf = queryFactory.createCoord1(col1);
-								break;
-							}
-							default:
-								jj_la1[82] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case COORD2: {
-						fct = jj_consume_token(COORD2);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p1 = Point();
-								gf = queryFactory.createCoord2(p1);
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col1 = Column();
-								col1.setExpectedType('G');
-								gf = queryFactory.createCoord2(col1);
-								break;
-							}
-							default:
-								jj_la1[83] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case DISTANCE: {
-						fct = jj_consume_token(DISTANCE);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p1 = Point();
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col1 = Column();
-								break;
-							}
-							default:
-								jj_la1[84] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						if (p1 != null)
-							gvp1 = new GeometryValue<PointFunction>(p1);
-						else {
-							col1.setExpectedType('G');
-							gvp1 = new GeometryValue<PointFunction>(col1);
-						}
-						jj_consume_token(COMMA);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case POINT: {
-								p2 = Point();
-								break;
-							}
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								col2 = Column();
-								break;
-							}
-							default:
-								jj_la1[85] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
-						}
-						if (p2 != null)
-							gvp2 = new GeometryValue<PointFunction>(p2);
-						else {
-							col2.setExpectedType('G');
-							gvp2 = new GeometryValue<PointFunction>(col2);
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createDistance(gvp1, gvp2);
-						break;
-					}
-					default:
-						jj_la1[86] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			gf.setPosition(new TextPosition(fct, end));
-			{
-				if ("" != null)
-					return gf;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("GeometryFunction");
-		}
-	}
-
-	final public ADQLOperand CoordinateSystem() throws ParseException {
-		trace_call("CoordinateSystem");
-		try {
-			ADQLOperand coordSys = null;
-			coordSys = StringExpression();
-			{
-				if ("" != null)
-					return coordSys;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("CoordinateSystem");
-		}
-	}
-
-	final public GeometryFunction GeometryValueFunction() throws ParseException {
-		trace_call("GeometryValueFunction");
-		try {
-			Token fct = null, end = null;
-			ADQLOperand coordSys;
-			ADQLOperand width, height;
-			ADQLOperand[] coords, tmp;
-			Vector<ADQLOperand> vCoords;
-			ADQLOperand op = null;
-			GeometryValue<GeometryFunction> gvf = null;
-			GeometryFunction gf = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case BOX: {
-						fct = jj_consume_token(BOX);
-						jj_consume_token(LEFT_PAR);
-						coordSys = CoordinateSystem();
-						jj_consume_token(COMMA);
-						coords = Coordinates();
-						jj_consume_token(COMMA);
-						width = NumericExpression();
-						jj_consume_token(COMMA);
-						height = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createBox(coordSys, coords[0], coords[1], width, height);
-						break;
-					}
-					case CENTROID: {
-						fct = jj_consume_token(CENTROID);
-						jj_consume_token(LEFT_PAR);
-						gvf = GeometryExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createCentroid(gvf);
-						break;
-					}
-					case CIRCLE: {
-						fct = jj_consume_token(CIRCLE);
-						jj_consume_token(LEFT_PAR);
-						coordSys = CoordinateSystem();
-						jj_consume_token(COMMA);
-						coords = Coordinates();
-						jj_consume_token(COMMA);
-						width = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createCircle(coordSys, coords[0], coords[1], width);
-						break;
-					}
-					case POINT: {
-						gf = Point();
-						break;
-					}
-					case POLYGON: {
-						fct = jj_consume_token(POLYGON);
-						jj_consume_token(LEFT_PAR);
-						coordSys = CoordinateSystem();
-						vCoords = new Vector<ADQLOperand>();
-						jj_consume_token(COMMA);
-						tmp = Coordinates();
-						vCoords.add(tmp[0]);
-						vCoords.add(tmp[1]);
-						jj_consume_token(COMMA);
-						tmp = Coordinates();
-						vCoords.add(tmp[0]);
-						vCoords.add(tmp[1]);
-						jj_consume_token(COMMA);
-						tmp = Coordinates();
-						vCoords.add(tmp[0]);
-						vCoords.add(tmp[1]);
-						label_12: while(true) {
-							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-								case COMMA: {
-									;
-									break;
-								}
-								default:
-									jj_la1[87] = jj_gen;
-									break label_12;
-							}
-							jj_consume_token(COMMA);
-							tmp = Coordinates();
-							vCoords.add(tmp[0]);
-							vCoords.add(tmp[1]);
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						gf = queryFactory.createPolygon(coordSys, vCoords);
-						break;
-					}
-					default:
-						jj_la1[88] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			if (fct != null && end != null) // = !(gf instanceof Point)
-				gf.setPosition(new TextPosition(fct, end));
-			{
-				if ("" != null)
-					return gf;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("GeometryValueFunction");
-		}
-	}
-
-	final public PointFunction Point() throws ParseException {
-		trace_call("Point");
-		try {
-			Token start, end;
-			ADQLOperand coordSys;
-			ADQLOperand[] coords;
-			start = jj_consume_token(POINT);
-			jj_consume_token(LEFT_PAR);
-			coordSys = CoordinateSystem();
-			jj_consume_token(COMMA);
-			coords = Coordinates();
-			end = jj_consume_token(RIGHT_PAR);
-			try {
-				PointFunction pf = queryFactory.createPoint(coordSys, coords[0], coords[1]);
-				pf.setPosition(new TextPosition(start, end));
-				{
-					if ("" != null)
-						return pf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("Point");
-		}
-	}
-
-	final public GeometryFunction ExtractCoordSys() throws ParseException {
-		trace_call("ExtractCoordSys");
-		try {
-			Token start, end;
-			GeometryValue<GeometryFunction> gvf;
-			start = jj_consume_token(COORDSYS);
-			jj_consume_token(LEFT_PAR);
-			gvf = GeometryExpression();
-			end = jj_consume_token(RIGHT_PAR);
-			try {
-				GeometryFunction gf = queryFactory.createExtractCoordSys(gvf);
-				gf.setPosition(new TextPosition(start, end));
-				{
-					if ("" != null)
-						return gf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("ExtractCoordSys");
-		}
-	}
-
-	/* **************** */
-	/* STRING FUNCTIONS */
-	/* **************** */
-	final public LowerFunction LowerFunction() throws ParseException {
-		trace_call("LowerFunction");
-		try {
-			Token start, end;
-			ADQLOperand str;
-			start = jj_consume_token(LOWER);
-			jj_consume_token(LEFT_PAR);
-			str = StringExpression();
-			end = jj_consume_token(RIGHT_PAR);
-			try {
-				LowerFunction lf = queryFactory.createLowerFunction(str);
-				lf.setPosition(new TextPosition(start, end));
-				{
-					if ("" != null)
-						return lf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("LowerFunction");
-		}
-	}
-
-	/* ***************** */
-	/* NUMERIC FUNCTIONS */
-	/* ***************** */
-	final public ADQLFunction NumericFunction() throws ParseException {
-		trace_call("NumericFunction");
-		try {
-			ADQLFunction fct;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ABS:
-				case CEILING:
-				case DEGREES:
-				case EXP:
-				case FLOOR:
-				case LOG:
-				case LOG10:
-				case MOD:
-				case PI:
-				case POWER:
-				case RADIANS:
-				case RAND:
-				case ROUND:
-				case SQRT:
-				case TRUNCATE: {
-					fct = MathFunction();
-					break;
-				}
-				case ACOS:
-				case ASIN:
-				case ATAN:
-				case ATAN2:
-				case COS:
-				case COT:
-				case SIN:
-				case TAN: {
-					fct = TrigFunction();
-					break;
-				}
-				case CONTAINS:
-				case INTERSECTS:
-				case AREA:
-				case COORD1:
-				case COORD2:
-				case DISTANCE: {
-					fct = GeometryFunction();
-					break;
-				}
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					fct = UserDefinedFunction();
-					((UserDefinedFunction)fct).setExpectedType('N');
-					break;
-				}
-				default:
-					jj_la1[89] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			{
-				if ("" != null)
-					return fct;
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("NumericFunction");
-		}
-	}
-
-	final public MathFunction MathFunction() throws ParseException {
-		trace_call("MathFunction");
-		try {
-			Token fct = null, end;
-			ADQLOperand param1 = null, param2 = null;
-			NumericConstant integerValue = null;
-			try {
-				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-					case ABS: {
-						fct = jj_consume_token(ABS);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case CEILING: {
-						fct = jj_consume_token(CEILING);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case DEGREES: {
-						fct = jj_consume_token(DEGREES);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case EXP: {
-						fct = jj_consume_token(EXP);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case FLOOR: {
-						fct = jj_consume_token(FLOOR);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case LOG: {
-						fct = jj_consume_token(LOG);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case LOG10: {
-						fct = jj_consume_token(LOG10);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case MOD: {
-						fct = jj_consume_token(MOD);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						jj_consume_token(COMMA);
-						param2 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case PI: {
-						fct = jj_consume_token(PI);
-						jj_consume_token(LEFT_PAR);
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case POWER: {
-						fct = jj_consume_token(POWER);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						jj_consume_token(COMMA);
-						param2 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case RADIANS: {
-						fct = jj_consume_token(RADIANS);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case RAND: {
-						fct = jj_consume_token(RAND);
-						jj_consume_token(LEFT_PAR);
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case LEFT_PAR:
-							case PLUS:
-							case MINUS:
-							case AVG:
-							case MAX:
-							case MIN:
-							case SUM:
-							case COUNT:
-							case CONTAINS:
-							case INTERSECTS:
-							case AREA:
-							case COORD1:
-							case COORD2:
-							case DISTANCE:
-							case ABS:
-							case CEILING:
-							case DEGREES:
-							case EXP:
-							case FLOOR:
-							case LOG:
-							case LOG10:
-							case MOD:
-							case PI:
-							case POWER:
-							case RADIANS:
-							case RAND:
-							case ROUND:
-							case SQRT:
-							case TRUNCATE:
-							case ACOS:
-							case ASIN:
-							case ATAN:
-							case ATAN2:
-							case COS:
-							case COT:
-							case SIN:
-							case TAN:
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-							case DELIMITED_IDENTIFIER:
-							case REGULAR_IDENTIFIER_CANDIDATE: {
-								param1 = NumericExpression();
-								break;
-							}
-							default:
-								jj_la1[90] = jj_gen;
-								;
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case ROUND: {
-						fct = jj_consume_token(ROUND);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case COMMA: {
-								jj_consume_token(COMMA);
-								param2 = SignedInteger();
-								break;
-							}
-							default:
-								jj_la1[91] = jj_gen;
-								;
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case SQRT: {
-						fct = jj_consume_token(SQRT);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					case TRUNCATE: {
-						fct = jj_consume_token(TRUNCATE);
-						jj_consume_token(LEFT_PAR);
-						param1 = NumericExpression();
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case COMMA: {
-								jj_consume_token(COMMA);
-								param2 = SignedInteger();
-								break;
-							}
-							default:
-								jj_la1[92] = jj_gen;
-								;
-						}
-						end = jj_consume_token(RIGHT_PAR);
-						break;
-					}
-					default:
-						jj_la1[93] = jj_gen;
-						jj_consume_token(-1);
-						throw new ParseException();
-				}
-				MathFunction mf = queryFactory.createMathFunction(MathFunctionType.valueOf(fct.image.toUpperCase()), param1, param2);
-				mf.setPosition(new TextPosition(fct, end));
-				{
-					if ("" != null)
-						return mf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("MathFunction");
-		}
-	}
-
-	final public MathFunction TrigFunction() throws ParseException {
-		trace_call("TrigFunction");
-		try {
-			Token fct = null, end;
-			ADQLOperand param1 = null, param2 = null;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case ACOS: {
-					fct = jj_consume_token(ACOS);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case ASIN: {
-					fct = jj_consume_token(ASIN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case ATAN: {
-					fct = jj_consume_token(ATAN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case ATAN2: {
-					fct = jj_consume_token(ATAN2);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					jj_consume_token(COMMA);
-					param2 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case COS: {
-					fct = jj_consume_token(COS);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case COT: {
-					fct = jj_consume_token(COT);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case SIN: {
-					fct = jj_consume_token(SIN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				case TAN: {
-					fct = jj_consume_token(TAN);
-					jj_consume_token(LEFT_PAR);
-					param1 = NumericExpression();
-					end = jj_consume_token(RIGHT_PAR);
-					break;
-				}
-				default:
-					jj_la1[94] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
-			try {
-				MathFunction mf = queryFactory.createMathFunction(MathFunctionType.valueOf(fct.image.toUpperCase()), param1, param2);
-				mf.setPosition(new TextPosition(fct, end));
-				{
-					if ("" != null)
-						return mf;
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("TrigFunction");
-		}
-	}
-
-	final public UserDefinedFunction UserDefinedFunction() throws ParseException {
-		trace_call("UserDefinedFunction");
-		try {
-			Token fct, end;
-			Vector<ADQLOperand> params = new Vector<ADQLOperand>();
-			ADQLOperand op;
-			fct = jj_consume_token(REGULAR_IDENTIFIER_CANDIDATE);
-			jj_consume_token(LEFT_PAR);
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-				case LEFT_PAR:
-				case PLUS:
-				case MINUS:
-				case AVG:
-				case MAX:
-				case MIN:
-				case SUM:
-				case COUNT:
-				case BOX:
-				case CENTROID:
-				case CIRCLE:
-				case POINT:
-				case POLYGON:
-				case CONTAINS:
-				case INTERSECTS:
-				case AREA:
-				case COORD1:
-				case COORD2:
-				case COORDSYS:
-				case DISTANCE:
-				case LOWER:
-				case ABS:
-				case CEILING:
-				case DEGREES:
-				case EXP:
-				case FLOOR:
-				case LOG:
-				case LOG10:
-				case MOD:
-				case PI:
-				case POWER:
-				case RADIANS:
-				case RAND:
-				case ROUND:
-				case SQRT:
-				case TRUNCATE:
-				case ACOS:
-				case ASIN:
-				case ATAN:
-				case ATAN2:
-				case COS:
-				case COT:
-				case SIN:
-				case TAN:
-				case STRING_LITERAL:
-				case SCIENTIFIC_NUMBER:
-				case UNSIGNED_FLOAT:
-				case UNSIGNED_INTEGER:
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER_CANDIDATE: {
-					op = ValueExpression();
-					params.add(op);
-					label_13: while(true) {
-						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-							case COMMA: {
-								;
-								break;
-							}
-							default:
-								jj_la1[95] = jj_gen;
-								break label_13;
-						}
-						jj_consume_token(COMMA);
-						op = ValueExpression();
-						params.add(op);
-					}
-					break;
-				}
-				default:
-					jj_la1[96] = jj_gen;
-					;
-			}
-			end = jj_consume_token(RIGHT_PAR);
-			// Ensure the given function name is valid: 
-			if (!isRegularIdentifier(fct.image)) {
-				if (true)
-					throw new ParseException("Invalid (User Defined) Function name: \u005c"" + fct.image + "\u005c"!", new TextPosition(fct));
-			}
-
-			//System.out.println("INFO [ADQLParser201]: \""+fct.image+"\" (from line "+fct.beginLine+" and column "+fct.beginColumn+" to line "+token.endLine+" and column "+(token.endColumn+1)+") is considered as an user defined function !");
-
-			try {
-				//  Build the parameters list:
-				ADQLOperand[] parameters = new ADQLOperand[params.size()];
-				for(int i = 0; i < params.size(); i++)
-					parameters[i] = params.get(i);
-
-				// Create the UDF function:
-				UserDefinedFunction udf = queryFactory.createUserDefinedFunction(fct.image, parameters);
-				udf.setPosition(new TextPosition(fct, end));
-				{
-					if ("" != null)
-						return udf;
-				}
-
-			} catch(UnsupportedOperationException uoe) {
-				/* This catch clause is just for backward compatibility:
-				* if the createUserDefinedFunction(...) is overridden and
-				* the function can not be identified a such exception may be thrown). */
-				{
-					if (true)
-						throw new ParseException(uoe.getMessage(), new TextPosition(fct, token));
-				}
-			} catch(Exception ex) {
-				{
-					if (true)
-						throw generateParseException(ex);
-				}
-			}
-			throw new Error("Missing return statement in function");
-		} finally {
-			trace_return("UserDefinedFunction");
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(0, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(1, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(2, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(3, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(4, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(5, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(6, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(7, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(8, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(9, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(10, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(11, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(12, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(13, xla);
-		}
-	}
-
-	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;
-		} finally {
-			jj_save(14, xla);
-		}
-	}
-
-	private boolean jj_2_16(int xla) {
-		jj_la = xla;
-		jj_lastpos = jj_scanpos = token;
-		try {
-			return !jj_3_16();
-		} catch(LookaheadSuccess ls) {
-			return true;
-		} finally {
-			jj_save(15, xla);
-		}
-	}
-
-	private boolean jj_2_17(int xla) {
-		jj_la = xla;
-		jj_lastpos = jj_scanpos = token;
-		try {
-			return !jj_3_17();
-		} catch(LookaheadSuccess ls) {
-			return true;
-		} finally {
-			jj_save(16, xla);
-		}
-	}
-
-	private boolean jj_2_18(int xla) {
-		jj_la = xla;
-		jj_lastpos = jj_scanpos = token;
-		try {
-			return !jj_3_18();
-		} catch(LookaheadSuccess ls) {
-			return true;
-		} finally {
-			jj_save(17, xla);
-		}
-	}
-
-	private boolean jj_3_2() {
-		if (jj_3R_16())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_75() {
-		if (jj_3R_80())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_27() {
-		if (jj_3R_50())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_121() {
-		if (jj_3R_50())
-			return true;
-		Token xsp;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_135()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_55() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_75()) {
-			jj_scanpos = xsp;
-			if (jj_3_2()) {
-				jj_scanpos = xsp;
-				if (jj_3R_76())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3_14() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(42)) {
-			jj_scanpos = xsp;
-			if (jj_3R_27())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_151() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_154())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_150() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_154())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_60() {
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_80())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_22() {
-		if (jj_3R_42())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_42() {
-		if (jj_3R_14())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_60())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_128() {
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_14())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_127() {
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_14())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_26() {
-		if (jj_scan_token(REGULAR_IDENTIFIER_CANDIDATE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_121())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_142() {
-		if (jj_3R_113())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_80() {
-		if (jj_3R_14())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_127())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_128())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_107() {
-		if (jj_scan_token(TAN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_134() {
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_106() {
-		if (jj_scan_token(SIN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_31() {
-		if (jj_scan_token(DELIMITED_IDENTIFIER))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_105() {
-		if (jj_scan_token(COT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_104() {
-		if (jj_scan_token(COS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_103() {
-		if (jj_scan_token(ATAN2))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_102() {
-		if (jj_scan_token(ATAN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_101() {
-		if (jj_scan_token(ASIN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_30() {
-		if (jj_scan_token(REGULAR_IDENTIFIER_CANDIDATE))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_100() {
-		if (jj_scan_token(ACOS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_64() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_100()) {
-			jj_scanpos = xsp;
-			if (jj_3R_101()) {
-				jj_scanpos = xsp;
-				if (jj_3R_102()) {
-					jj_scanpos = xsp;
-					if (jj_3R_103()) {
-						jj_scanpos = xsp;
-						if (jj_3R_104()) {
-							jj_scanpos = xsp;
-							if (jj_3R_105()) {
-								jj_scanpos = xsp;
-								if (jj_3R_106()) {
-									jj_scanpos = xsp;
-									if (jj_3R_107())
-										return true;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_99() {
-		if (jj_scan_token(TRUNCATE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_151())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_98() {
-		if (jj_scan_token(SQRT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_97() {
-		if (jj_scan_token(ROUND))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_150())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_96() {
-		if (jj_scan_token(RAND))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_142())
-			jj_scanpos = xsp;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_95() {
-		if (jj_scan_token(RADIANS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_133() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_94() {
-		if (jj_scan_token(POWER))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_14() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_30()) {
-			jj_scanpos = xsp;
-			if (jj_3R_31())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_120() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_133()) {
-			jj_scanpos = xsp;
-			if (jj_3R_134())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_93() {
-		if (jj_scan_token(PI))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_92() {
-		if (jj_scan_token(MOD))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_91() {
-		if (jj_scan_token(LOG10))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_58() {
-		if (jj_3R_79())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_90() {
-		if (jj_scan_token(LOG))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_13() {
-		if (jj_3R_26())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_89() {
-		if (jj_scan_token(FLOOR))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_57() {
-		if (jj_3R_78())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_88() {
-		if (jj_scan_token(EXP))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_87() {
-		if (jj_scan_token(DEGREES))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_56() {
-		if (jj_3R_77())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_86() {
-		if (jj_scan_token(CEILING))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_36() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_56()) {
-			jj_scanpos = xsp;
-			if (jj_3R_57()) {
-				jj_scanpos = xsp;
-				if (jj_3_13()) {
-					jj_scanpos = xsp;
-					if (jj_3R_58())
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_85() {
-		if (jj_scan_token(ABS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_45() {
-		if (jj_3R_62())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_63() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_85()) {
-			jj_scanpos = xsp;
-			if (jj_3R_86()) {
-				jj_scanpos = xsp;
-				if (jj_3R_87()) {
-					jj_scanpos = xsp;
-					if (jj_3R_88()) {
-						jj_scanpos = xsp;
-						if (jj_3R_89()) {
-							jj_scanpos = xsp;
-							if (jj_3R_90()) {
-								jj_scanpos = xsp;
-								if (jj_3R_91()) {
-									jj_scanpos = xsp;
-									if (jj_3R_92()) {
-										jj_scanpos = xsp;
-										if (jj_3R_93()) {
-											jj_scanpos = xsp;
-											if (jj_3R_94()) {
-												jj_scanpos = xsp;
-												if (jj_3R_95()) {
-													jj_scanpos = xsp;
-													if (jj_3R_96()) {
-														jj_scanpos = xsp;
-														if (jj_3R_97()) {
-															jj_scanpos = xsp;
-															if (jj_3R_98()) {
-																jj_scanpos = xsp;
-																if (jj_3R_99())
-																	return true;
-															}
-														}
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_49() {
-		if (jj_3R_26())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_48() {
-		if (jj_3R_65())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_47() {
-		if (jj_3R_64())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_51() {
-		if (jj_scan_token(CONCAT))
-			return true;
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_46() {
-		if (jj_3R_63())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_25() {
-		Token xsp;
-		xsp = jj_scanpos;
-		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())
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_29() {
-		if (jj_3R_36())
-			return true;
-		Token xsp;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_51()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_61() {
-		if (jj_scan_token(MINUS))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_78() {
-		if (jj_scan_token(LOWER))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_29())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_12() {
-		if (jj_3R_25())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_44() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_3R_61())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_32() {
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_138() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(11)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(12))
-				return true;
-		}
-		if (jj_3R_131())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_24() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_44())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3_12()) {
-			jj_scanpos = xsp;
-			if (jj_3R_45())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_77() {
-		if (jj_scan_token(COORDSYS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_120())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_15() {
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_32())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_146() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_144() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_141() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_140())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_132() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10))
-				return true;
-		}
-		if (jj_3R_113())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_59() {
-		if (jj_scan_token(POINT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_140())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_20() {
-		if (jj_3R_36())
-			return true;
-		if (jj_scan_token(CONCAT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_131() {
-		if (jj_3R_24())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_138())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_19() {
-		if (jj_3R_24())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10)) {
-				jj_scanpos = xsp;
-				if (jj_scan_token(11)) {
-					jj_scanpos = xsp;
-					if (jj_scan_token(12))
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3_1() {
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_15())
-			jj_scanpos = xsp;
-		if (jj_scan_token(ASTERISK))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_41() {
-		if (jj_scan_token(POLYGON))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_140())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_140())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_140())
-			return true;
-		Token xsp;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_141()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_40() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_72() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_10() {
-		if (jj_3R_23())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_113() {
-		if (jj_3R_131())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_132())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3_9() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_7() {
-		if (jj_scan_token(REGULAR_IDENTIFIER_CANDIDATE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_39() {
-		if (jj_scan_token(CIRCLE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_140())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_6() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_5() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(65)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(67)) {
-				jj_scanpos = xsp;
-				if (jj_3R_20())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_38() {
-		if (jj_scan_token(CENTROID))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_120())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_4() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_18()) {
-			jj_scanpos = xsp;
-			if (jj_3R_19())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_18() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10))
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3_11() {
-		if (jj_3R_24())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_71() {
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_70() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_8() {
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_69() {
-		if (jj_3R_26())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_37() {
-		if (jj_scan_token(BOX))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_139())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_140())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_68() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_50())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_67() {
-		if (jj_3R_29())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_153() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_66() {
-		if (jj_3R_113())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_145() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_52() {
-		if (jj_scan_token(SELECT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_126() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_50())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_21() {
-		Token xsp;
-		xsp = jj_scanpos;
-		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())
-							return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_149() {
-		if (jj_3R_50())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_143() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_125() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_148() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_50() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_66()) {
-			jj_scanpos = xsp;
-			if (jj_3R_67()) {
-				jj_scanpos = xsp;
-				if (jj_3R_68()) {
-					jj_scanpos = xsp;
-					if (jj_3R_69()) {
-						jj_scanpos = xsp;
-						if (jj_3_8()) {
-							jj_scanpos = xsp;
-							if (jj_3R_70()) {
-								jj_scanpos = xsp;
-								if (jj_3R_71()) {
-									jj_scanpos = xsp;
-									if (jj_3_11()) {
-										jj_scanpos = xsp;
-										if (jj_3R_72())
-											return true;
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_152() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_124() {
-		if (jj_3R_130())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_139() {
-		if (jj_3R_29())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_123() {
-		if (jj_3R_129())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_16() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_33())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_122() {
-		if (jj_3R_23())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_116() {
-		if (jj_scan_token(FULL))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_147() {
-		if (jj_3R_59())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_84() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_83() {
-		if (jj_3R_130())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_79() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_122()) {
-			jj_scanpos = xsp;
-			if (jj_3R_123()) {
-				jj_scanpos = xsp;
-				if (jj_3R_124()) {
-					jj_scanpos = xsp;
-					if (jj_3R_125()) {
-						jj_scanpos = xsp;
-						if (jj_3R_126())
-							return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_82() {
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_81() {
-		if (jj_3R_129())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_112() {
-		if (jj_scan_token(DISTANCE))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_147()) {
-			jj_scanpos = xsp;
-			if (jj_3R_148())
-				return true;
-		}
-		if (jj_scan_token(COMMA))
-			return true;
-		xsp = jj_scanpos;
-		if (jj_3R_152()) {
-			jj_scanpos = xsp;
-			if (jj_3R_153())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_111() {
-		if (jj_scan_token(COORD2))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_145()) {
-			jj_scanpos = xsp;
-			if (jj_3R_146())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_110() {
-		if (jj_scan_token(COORD1))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_143()) {
-			jj_scanpos = xsp;
-			if (jj_3R_144())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_109() {
-		if (jj_scan_token(AREA))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_120())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_119() {
-		if (jj_scan_token(FULL))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_62() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_81()) {
-			jj_scanpos = xsp;
-			if (jj_3R_82()) {
-				jj_scanpos = xsp;
-				if (jj_3R_83()) {
-					jj_scanpos = xsp;
-					if (jj_3R_84())
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_108() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(60)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(61))
-				return true;
-		}
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_120())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_120())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_33() {
-		if (jj_3R_52())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_115() {
-		if (jj_scan_token(RIGHT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_155() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(9)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(10))
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_154() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_155())
-			jj_scanpos = xsp;
-		if (jj_scan_token(UNSIGNED_INTEGER))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_65() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_108()) {
-			jj_scanpos = xsp;
-			if (jj_3R_109()) {
-				jj_scanpos = xsp;
-				if (jj_3R_110()) {
-					jj_scanpos = xsp;
-					if (jj_3R_111()) {
-						jj_scanpos = xsp;
-						if (jj_3R_112())
-							return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_140() {
-		if (jj_3R_113())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_113())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_137() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(49)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(50)) {
-				jj_scanpos = xsp;
-				if (jj_scan_token(51)) {
-					jj_scanpos = xsp;
-					if (jj_scan_token(52))
-						return true;
-				}
-			}
-		}
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		xsp = jj_scanpos;
-		if (jj_scan_token(20))
-			jj_scanpos = xsp;
-		if (jj_3R_50())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_136() {
-		if (jj_scan_token(COUNT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(20))
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(11)) {
-			jj_scanpos = xsp;
-			if (jj_3R_149())
-				return true;
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_118() {
-		if (jj_scan_token(RIGHT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_129() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(95)) {
-			jj_scanpos = xsp;
-			if (jj_scan_token(96)) {
-				jj_scanpos = xsp;
-				if (jj_scan_token(97))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_130() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_136()) {
-			jj_scanpos = xsp;
-			if (jj_3R_137())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_114() {
-		if (jj_scan_token(LEFT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_73() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_114()) {
-			jj_scanpos = xsp;
-			if (jj_3R_115()) {
-				jj_scanpos = xsp;
-				if (jj_3R_116())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_53() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(25)) {
-			jj_scanpos = xsp;
-			if (jj_3R_73())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_43() {
-		if (jj_scan_token(STRING_LITERAL))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_23() {
-		Token xsp;
-		if (jj_3R_43())
-			return true;
-		while(true) {
-			xsp = jj_scanpos;
-			if (jj_3R_43()) {
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_117() {
-		if (jj_scan_token(LEFT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_74() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_117()) {
-			jj_scanpos = xsp;
-			if (jj_3R_118()) {
-				jj_scanpos = xsp;
-				if (jj_3R_119())
-					return true;
-			}
-		}
-		xsp = jj_scanpos;
-		if (jj_scan_token(26))
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3_18() {
-		if (jj_3R_16())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_54() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(25)) {
-			jj_scanpos = xsp;
-			if (jj_3R_74())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_35() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_54())
-			jj_scanpos = xsp;
-		if (jj_scan_token(JOIN))
-			return true;
-		if (jj_3R_55())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_34() {
-		if (jj_scan_token(NATURAL))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_53())
-			jj_scanpos = xsp;
-		if (jj_scan_token(JOIN))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_28() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(36))
-			jj_scanpos = xsp;
-		if (jj_scan_token(BETWEEN))
-			return true;
-		if (jj_3R_50())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_15() {
-		if (jj_3R_28())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_17() {
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_34()) {
-			jj_scanpos = xsp;
-			if (jj_3R_35())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3_17() {
-		if (jj_3R_29())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(36))
-			jj_scanpos = xsp;
-		if (jj_scan_token(LIKE))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_135() {
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_50())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_76() {
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_3() {
-		if (jj_3R_17())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_16() {
-		if (jj_3R_22())
-			return true;
-		if (jj_scan_token(IS))
-			return true;
-		return false;
-	}
-
-	/** Generated Token Manager. */
-	public ADQLParser201TokenManager token_source;
-	SimpleCharStream 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;
-	private int jj_gen;
-	final private int[] jj_la1 = new int[97];
-	static private int[] jj_la1_0;
-	static private int[] jj_la1_1;
-	static private int[] jj_la1_2;
-	static private int[] jj_la1_3;
-	static {
-		jj_la1_init_0();
-		jj_la1_init_1();
-		jj_la1_init_2();
-		jj_la1_init_3();
-	}
-
-	private static void jj_la1_init_0() {
-		jj_la1_0 = new int[]{ 0x81, 0x0, 0x0, 0x0, 0x0, 0x100000, 0x200000, 0x40, 0x0, 0x0, 0x800000, 0x800000, 0x800, 0x608, 0x40, 0x40, 0x40, 0x0, 0x20, 0x20, 0x20, 0x0, 0x0, 0x0, 0x800000, 0x800000, 0x800000, 0x0, 0x8, 0x7b000000, 0x38000000, 0x4000000, 0x3a000000, 0x3a000000, 0x38000000, 0x4000000, 0x3a000000, 0x3a000000, 0x40, 0x80000000, 0x7b000000, 0x0, 0x0, 0x0, 0x600, 0x600, 0x8, 0x8, 0x0, 0x600, 0x600, 0x1800, 0x1800, 0x600, 0x600, 0x8, 0x100, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x7e000, 0x0, 0x0, 0x608, 0x7e000, 0x0, 0x0, 0x40, 0x8, 0x100000, 0xe08, 0x0, 0x100000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x608, 0x40, 0x40, 0x0, 0x0, 0x40, 0x608, };
-	}
-
-	private static void jj_la1_init_1() {
-		jj_la1_1 = new int[]{ 0x0, 0x2, 0x1000, 0x2000, 0x4000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7fe0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18000, 0x18000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e0000, 0x3e0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e0000, 0x0, 0x0, 0x3e0000, 0x7c00000, 0x10, 0xc, 0xc, 0x10, 0x0, 0x10, 0x10, 0x0, 0x210, 0x400, 0xf7fe0000, 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0xf7fe0000, 0x1e0000, 0x0, 0x3e0000, 0x30000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0xf0000000, 0x0, 0x7c00000, 0xf0000000, 0xf03e0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7fe0000, };
-	}
-
-	private static void jj_la1_init_2() {
-		jj_la1_2 = new int[]{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7ffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40000000, 0x80000000, 0x0, 0x0, 0x0, 0x80000000, 0xc0000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80000000, 0x0, 0xa, 0xc0000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7ffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7ffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x7fffff5, 0x87fffff5, 0x0, 0x0, 0x7fff0, 0x7f80000, 0x0, 0xc7ffffff, };
-	}
-
-	private static void jj_la1_init_3() {
-		jj_la1_3 = new int[]{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x60, 0x0, 0x60, 0x0, 0x63, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x62, 0x0, 0x0, 0x0, 0x60, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x63, 0x63, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x63, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0x0, 0x60, 0x60, 0x60, 0x60, 0x0, 0x0, 0x0, 0x40, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, };
-	}
-
-	final private JJCalls[] jj_2_rtns = new JJCalls[18];
-	private boolean jj_rescan = false;
-	private int jj_gc = 0;
-
-	/** Constructor with InputStream. */
-	public ADQLParser201(java.io.InputStream stream) {
-		this(stream, (String)null);
-	}
-
-	/** Constructor with InputStream and supplied encoding */
-	public ADQLParser201(java.io.InputStream stream, String encoding) {
-		try {
-			jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1);
-		} catch(java.io.UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
-		token_source = new ADQLParser201TokenManager(jj_input_stream);
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Reinitialise. */
-	@Override
-	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;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Constructor. */
-	public ADQLParser201(java.io.Reader stream) {
-		jj_input_stream = new SimpleCharStream(stream, 1, 1);
-		token_source = new ADQLParser201TokenManager(jj_input_stream);
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Reinitialise. */
-	@Override
-	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;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Constructor with generated Token Manager. */
-	public ADQLParser201(ADQLParser201TokenManager tm) {
-		token_source = tm;
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	/** Reinitialise. */
-	public void ReInit(ADQLParser201TokenManager tm) {
-		token_source = tm;
-		token = new Token();
-		jj_ntk = -1;
-		jj_gen = 0;
-		for(int i = 0; i < 97; i++)
-			jj_la1[i] = -1;
-		for(int i = 0; i < jj_2_rtns.length; i++)
-			jj_2_rtns[i] = new JJCalls();
-	}
-
-	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) {
-			jj_gen++;
-			if (++jj_gc > 100) {
-				jj_gc = 0;
-				for(int i = 0; i < jj_2_rtns.length; i++) {
-					JJCalls c = jj_2_rtns[i];
-					while(c != null) {
-						if (c.gen < jj_gen)
-							c.first = null;
-						c = c.next;
-					}
-				}
-			}
-			trace_token(token, "");
-			return token;
-		}
-		token = oldToken;
-		jj_kind = kind;
-		throw generateParseException();
-	}
-
-	@SuppressWarnings("serial")
-	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_rescan) {
-			int i = 0;
-			Token tok = token;
-			while(tok != null && tok != jj_scanpos) {
-				i++;
-				tok = tok.next;
-			}
-			if (tok != null)
-				jj_add_error_token(kind, i);
-		}
-		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;
-		jj_gen++;
-		trace_token(token, " (in getNextToken)");
-		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_f() {
-		if ((jj_nt = token.next) == null)
-			return (jj_ntk = (token.next = token_source.getNextToken()).kind);
-		else
-			return (jj_ntk = jj_nt.kind);
-	}
-
-	private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
-	private int[] jj_expentry;
-	private int jj_kind = -1;
-	private int[] jj_lasttokens = new int[100];
-	private int jj_endpos;
-
-	private void jj_add_error_token(int kind, int pos) {
-		if (pos >= 100)
-			return;
-		if (pos == jj_endpos + 1) {
-			jj_lasttokens[jj_endpos++] = kind;
-		} else if (jj_endpos != 0) {
-			jj_expentry = new int[jj_endpos];
-			for(int i = 0; i < jj_endpos; i++) {
-				jj_expentry[i] = jj_lasttokens[i];
-			}
-			jj_entries_loop: for(java.util.Iterator<?> it = jj_expentries.iterator(); it.hasNext();) {
-				int[] oldentry = (int[])(it.next());
-				if (oldentry.length == jj_expentry.length) {
-					for(int i = 0; i < jj_expentry.length; i++) {
-						if (oldentry[i] != jj_expentry[i]) {
-							continue jj_entries_loop;
-						}
-					}
-					jj_expentries.add(jj_expentry);
-					break jj_entries_loop;
-				}
-			}
-			if (pos != 0)
-				jj_lasttokens[(jj_endpos = pos) - 1] = kind;
-		}
-	}
-
-	/** Generate ParseException. */
-	public ParseException generateParseException() {
-		jj_expentries.clear();
-		boolean[] la1tokens = new boolean[104];
-		if (jj_kind >= 0) {
-			la1tokens[jj_kind] = true;
-			jj_kind = -1;
-		}
-		for(int i = 0; i < 97; i++) {
-			if (jj_la1[i] == jj_gen) {
-				for(int j = 0; j < 32; j++) {
-					if ((jj_la1_0[i] & (1 << j)) != 0) {
-						la1tokens[j] = true;
-					}
-					if ((jj_la1_1[i] & (1 << j)) != 0) {
-						la1tokens[32 + j] = true;
-					}
-					if ((jj_la1_2[i] & (1 << j)) != 0) {
-						la1tokens[64 + j] = true;
-					}
-					if ((jj_la1_3[i] & (1 << j)) != 0) {
-						la1tokens[96 + j] = true;
-					}
-				}
-			}
-		}
-		for(int i = 0; i < 104; i++) {
-			if (la1tokens[i]) {
-				jj_expentry = new int[1];
-				jj_expentry[0] = i;
-				jj_expentries.add(jj_expentry);
-			}
-		}
-		jj_endpos = 0;
-		jj_rescan_token();
-		jj_add_error_token(0, 0);
-		int[][] exptokseq = new int[jj_expentries.size()][];
-		for(int i = 0; i < jj_expentries.size(); i++) {
-			exptokseq[i] = jj_expentries.get(i);
-		}
-		return new ParseException(token, exptokseq, tokenImage);
-	}
-
-	private int trace_indent = 0;
-	private boolean trace_enabled = true;
-
-	/** Enable tracing. */
-	final public void enable_tracing() {
-		trace_enabled = true;
-	}
-
-	/** Disable tracing. */
-	final public void disable_tracing() {
-		trace_enabled = false;
-	}
-
-	private void trace_call(String s) {
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.println("Call:   " + s);
-		}
-		trace_indent = trace_indent + 2;
-	}
-
-	private void trace_return(String s) {
-		trace_indent = trace_indent - 2;
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.println("Return: " + s);
-		}
-	}
-
-	private void trace_token(Token t, String where) {
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.print("Consumed token: <" + tokenImage[t.kind]);
-			if (t.kind != 0 && !tokenImage[t.kind].equals("\"" + t.image + "\"")) {
-				System.out.print(": \"" + t.image + "\"");
-			}
-			System.out.println(" at line " + t.beginLine + " column " + t.beginColumn + ">" + where);
-		}
-	}
-
-	private void trace_scan(Token t1, int t2) {
-		if (trace_enabled) {
-			for(int i = 0; i < trace_indent; i++) {
-				System.out.print(" ");
-			}
-			System.out.print("Visited token: <" + tokenImage[t1.kind]);
-			if (t1.kind != 0 && !tokenImage[t1.kind].equals("\"" + t1.image + "\"")) {
-				System.out.print(": \"" + t1.image + "\"");
-			}
-			System.out.println(" at line " + t1.beginLine + " column " + t1.beginColumn + ">; Expected token: <" + tokenImage[t2] + ">");
-		}
-	}
-
-	private void jj_rescan_token() {
-		jj_rescan = true;
-		for(int i = 0; i < 18; i++) {
-			try {
-				JJCalls p = jj_2_rtns[i];
-				do {
-					if (p.gen > jj_gen) {
-						jj_la = p.arg;
-						jj_lastpos = jj_scanpos = p.first;
-						switch(i) {
-							case 0:
-								jj_3_1();
-								break;
-							case 1:
-								jj_3_2();
-								break;
-							case 2:
-								jj_3_3();
-								break;
-							case 3:
-								jj_3_4();
-								break;
-							case 4:
-								jj_3_5();
-								break;
-							case 5:
-								jj_3_6();
-								break;
-							case 6:
-								jj_3_7();
-								break;
-							case 7:
-								jj_3_8();
-								break;
-							case 8:
-								jj_3_9();
-								break;
-							case 9:
-								jj_3_10();
-								break;
-							case 10:
-								jj_3_11();
-								break;
-							case 11:
-								jj_3_12();
-								break;
-							case 12:
-								jj_3_13();
-								break;
-							case 13:
-								jj_3_14();
-								break;
-							case 14:
-								jj_3_15();
-								break;
-							case 15:
-								jj_3_16();
-								break;
-							case 16:
-								jj_3_17();
-								break;
-							case 17:
-								jj_3_18();
-								break;
-						}
-					}
-					p = p.next;
-				} while(p != null);
-			} catch(LookaheadSuccess ls) {
-			}
-		}
-		jj_rescan = false;
-	}
-
-	private void jj_save(int index, int xla) {
-		JJCalls p = jj_2_rtns[index];
-		while(p.gen > jj_gen) {
-			if (p.next == null) {
-				p = p.next = new JJCalls();
-				break;
-			}
-			p = p.next;
-		}
-		p.gen = jj_gen + xla - jj_la;
-		p.first = token;
-		p.arg = xla;
-	}
-
-	static final class JJCalls {
-		int gen;
-		Token first;
-		int arg;
-		JJCalls next;
-	}
-
-}
diff --git a/src/adql/parser/ADQLParser201Constants.java b/src/adql/parser/ADQLParser201Constants.java
deleted file mode 100644
index 4a67dbb..0000000
--- a/src/adql/parser/ADQLParser201Constants.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ADQLParser201Constants.java */
-package adql.parser;
-
-
-/**
- * Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
- */
-public interface ADQLParser201Constants {
-
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int SQL_RESERVED_WORD = 2;
-  /** RegularExpression Id. */
-  int LEFT_PAR = 3;
-  /** RegularExpression Id. */
-  int RIGHT_PAR = 4;
-  /** RegularExpression Id. */
-  int DOT = 5;
-  /** RegularExpression Id. */
-  int COMMA = 6;
-  /** RegularExpression Id. */
-  int EOQ = 7;
-  /** RegularExpression Id. */
-  int CONCAT = 8;
-  /** RegularExpression Id. */
-  int PLUS = 9;
-  /** RegularExpression Id. */
-  int MINUS = 10;
-  /** RegularExpression Id. */
-  int ASTERISK = 11;
-  /** RegularExpression Id. */
-  int DIVIDE = 12;
-  /** RegularExpression Id. */
-  int EQUAL = 13;
-  /** RegularExpression Id. */
-  int NOT_EQUAL = 14;
-  /** RegularExpression Id. */
-  int LESS_THAN = 15;
-  /** RegularExpression Id. */
-  int LESS_EQUAL_THAN = 16;
-  /** RegularExpression Id. */
-  int GREATER_THAN = 17;
-  /** RegularExpression Id. */
-  int GREATER_EQUAL_THAN = 18;
-  /** RegularExpression Id. */
-  int SELECT = 19;
-  /** RegularExpression Id. */
-  int QUANTIFIER = 20;
-  /** RegularExpression Id. */
-  int TOP = 21;
-  /** RegularExpression Id. */
-  int FROM = 22;
-  /** RegularExpression Id. */
-  int AS = 23;
-  /** RegularExpression Id. */
-  int NATURAL = 24;
-  /** RegularExpression Id. */
-  int INNER = 25;
-  /** RegularExpression Id. */
-  int OUTER = 26;
-  /** RegularExpression Id. */
-  int RIGHT = 27;
-  /** RegularExpression Id. */
-  int LEFT = 28;
-  /** RegularExpression Id. */
-  int FULL = 29;
-  /** RegularExpression Id. */
-  int JOIN = 30;
-  /** RegularExpression Id. */
-  int ON = 31;
-  /** RegularExpression Id. */
-  int USING = 32;
-  /** RegularExpression Id. */
-  int WHERE = 33;
-  /** RegularExpression Id. */
-  int AND = 34;
-  /** RegularExpression Id. */
-  int OR = 35;
-  /** RegularExpression Id. */
-  int NOT = 36;
-  /** RegularExpression Id. */
-  int IS = 37;
-  /** RegularExpression Id. */
-  int NULL = 38;
-  /** RegularExpression Id. */
-  int BETWEEN = 39;
-  /** RegularExpression Id. */
-  int LIKE = 40;
-  /** RegularExpression Id. */
-  int IN = 41;
-  /** RegularExpression Id. */
-  int EXISTS = 42;
-  /** RegularExpression Id. */
-  int BY = 43;
-  /** RegularExpression Id. */
-  int GROUP = 44;
-  /** RegularExpression Id. */
-  int HAVING = 45;
-  /** RegularExpression Id. */
-  int ORDER = 46;
-  /** RegularExpression Id. */
-  int ASC = 47;
-  /** RegularExpression Id. */
-  int DESC = 48;
-  /** RegularExpression Id. */
-  int AVG = 49;
-  /** RegularExpression Id. */
-  int MAX = 50;
-  /** RegularExpression Id. */
-  int MIN = 51;
-  /** RegularExpression Id. */
-  int SUM = 52;
-  /** RegularExpression Id. */
-  int COUNT = 53;
-  /** RegularExpression Id. */
-  int BOX = 54;
-  /** RegularExpression Id. */
-  int CENTROID = 55;
-  /** RegularExpression Id. */
-  int CIRCLE = 56;
-  /** RegularExpression Id. */
-  int POINT = 57;
-  /** RegularExpression Id. */
-  int POLYGON = 58;
-  /** RegularExpression Id. */
-  int REGION = 59;
-  /** RegularExpression Id. */
-  int CONTAINS = 60;
-  /** RegularExpression Id. */
-  int INTERSECTS = 61;
-  /** RegularExpression Id. */
-  int AREA = 62;
-  /** RegularExpression Id. */
-  int COORD1 = 63;
-  /** RegularExpression Id. */
-  int COORD2 = 64;
-  /** RegularExpression Id. */
-  int COORDSYS = 65;
-  /** RegularExpression Id. */
-  int DISTANCE = 66;
-  /** RegularExpression Id. */
-  int LOWER = 67;
-  /** RegularExpression Id. */
-  int ABS = 68;
-  /** RegularExpression Id. */
-  int CEILING = 69;
-  /** RegularExpression Id. */
-  int DEGREES = 70;
-  /** RegularExpression Id. */
-  int EXP = 71;
-  /** RegularExpression Id. */
-  int FLOOR = 72;
-  /** RegularExpression Id. */
-  int LOG = 73;
-  /** RegularExpression Id. */
-  int LOG10 = 74;
-  /** RegularExpression Id. */
-  int MOD = 75;
-  /** RegularExpression Id. */
-  int PI = 76;
-  /** RegularExpression Id. */
-  int POWER = 77;
-  /** RegularExpression Id. */
-  int RADIANS = 78;
-  /** RegularExpression Id. */
-  int RAND = 79;
-  /** RegularExpression Id. */
-  int ROUND = 80;
-  /** RegularExpression Id. */
-  int SQRT = 81;
-  /** RegularExpression Id. */
-  int TRUNCATE = 82;
-  /** RegularExpression Id. */
-  int ACOS = 83;
-  /** RegularExpression Id. */
-  int ASIN = 84;
-  /** RegularExpression Id. */
-  int ATAN = 85;
-  /** RegularExpression Id. */
-  int ATAN2 = 86;
-  /** RegularExpression Id. */
-  int COS = 87;
-  /** RegularExpression Id. */
-  int COT = 88;
-  /** RegularExpression Id. */
-  int SIN = 89;
-  /** RegularExpression Id. */
-  int TAN = 90;
-  /** RegularExpression Id. */
-  int STRING_LITERAL = 94;
-  /** RegularExpression Id. */
-  int SCIENTIFIC_NUMBER = 95;
-  /** RegularExpression Id. */
-  int UNSIGNED_FLOAT = 96;
-  /** RegularExpression Id. */
-  int UNSIGNED_INTEGER = 97;
-  /** RegularExpression Id. */
-  int DIGIT = 98;
-  /** RegularExpression Id. */
-  int DELIMITED_IDENTIFIER = 101;
-  /** RegularExpression Id. */
-  int REGULAR_IDENTIFIER_CANDIDATE = 102;
-  /** RegularExpression Id. */
-  int Letter = 103;
-
-  /** Lexical state. */
-  int DEFAULT = 0;
-  /** Lexical state. */
-  int WithinString = 1;
-  /** Lexical state. */
-  int WithinDelimitedId = 2;
-
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "<token of kind 1>",
-    "<SQL_RESERVED_WORD>",
-    "\"(\"",
-    "\")\"",
-    "\".\"",
-    "\",\"",
-    "\";\"",
-    "\"||\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"=\"",
-    "<NOT_EQUAL>",
-    "\"<\"",
-    "\"<=\"",
-    "\">\"",
-    "\">=\"",
-    "\"SELECT\"",
-    "<QUANTIFIER>",
-    "\"TOP\"",
-    "\"FROM\"",
-    "\"AS\"",
-    "\"NATURAL\"",
-    "\"INNER\"",
-    "\"OUTER\"",
-    "\"RIGHT\"",
-    "\"LEFT\"",
-    "\"FULL\"",
-    "\"JOIN\"",
-    "\"ON\"",
-    "\"USING\"",
-    "\"WHERE\"",
-    "\"AND\"",
-    "\"OR\"",
-    "\"NOT\"",
-    "\"IS\"",
-    "\"NULL\"",
-    "\"BETWEEN\"",
-    "\"LIKE\"",
-    "\"IN\"",
-    "\"EXISTS\"",
-    "\"BY\"",
-    "\"GROUP\"",
-    "\"HAVING\"",
-    "\"ORDER\"",
-    "\"ASC\"",
-    "\"DESC\"",
-    "\"AVG\"",
-    "\"MAX\"",
-    "\"MIN\"",
-    "\"SUM\"",
-    "\"COUNT\"",
-    "\"BOX\"",
-    "\"CENTROID\"",
-    "\"CIRCLE\"",
-    "\"POINT\"",
-    "\"POLYGON\"",
-    "\"REGION\"",
-    "\"CONTAINS\"",
-    "\"INTERSECTS\"",
-    "\"AREA\"",
-    "\"COORD1\"",
-    "\"COORD2\"",
-    "\"COORDSYS\"",
-    "\"DISTANCE\"",
-    "\"LOWER\"",
-    "\"ABS\"",
-    "\"CEILING\"",
-    "\"DEGREES\"",
-    "\"EXP\"",
-    "\"FLOOR\"",
-    "\"LOG\"",
-    "\"LOG10\"",
-    "\"MOD\"",
-    "\"PI\"",
-    "\"POWER\"",
-    "\"RADIANS\"",
-    "\"RAND\"",
-    "\"ROUND\"",
-    "\"SQRT\"",
-    "\"TRUNCATE\"",
-    "\"ACOS\"",
-    "\"ASIN\"",
-    "\"ATAN\"",
-    "\"ATAN2\"",
-    "\"COS\"",
-    "\"COT\"",
-    "\"SIN\"",
-    "\"TAN\"",
-    "<token of kind 91>",
-    "\"\\\'\"",
-    "<token of kind 93>",
-    "\"\\\'\"",
-    "<SCIENTIFIC_NUMBER>",
-    "<UNSIGNED_FLOAT>",
-    "<UNSIGNED_INTEGER>",
-    "<DIGIT>",
-    "\"\\\"\"",
-    "<token of kind 100>",
-    "\"\\\"\"",
-    "<REGULAR_IDENTIFIER_CANDIDATE>",
-    "<Letter>",
-  };
-
-}
diff --git a/src/adql/parser/ADQLParser201TokenManager.java b/src/adql/parser/ADQLParser201TokenManager.java
deleted file mode 100644
index 6e23972..0000000
--- a/src/adql/parser/ADQLParser201TokenManager.java
+++ /dev/null
@@ -1,8470 +0,0 @@
-/* ADQLParser201TokenManager.java */
-/* Generated By:JavaCC: Do not edit this line. ADQLParser201TokenManager.java */
-package adql.parser;
-/*
- * This file is part of ADQLLibrary.
- * 
- * ADQLLibrary is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * ADQLLibrary is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
- * 
- * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
- */
-
-import java.util.Stack;
-import java.util.Vector;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.io.FileReader;
-import java.io.IOException;
-import adql.db.exception.UnsupportedFeatureException;
-import adql.db.exception.UnresolvedIdentifiersException;
-import adql.parser.ADQLParserFactory.ADQLVersion;
-import adql.parser.IdentifierItems.IdentifierItem;
-import adql.parser.ADQLQueryFactory.JoinType;
-import adql.parser.feature.FeatureSet;
-import adql.parser.feature.LanguageFeature;
-import adql.query.*;
-import adql.query.from.*;
-import adql.query.constraint.*;
-import adql.query.operand.*;
-import adql.query.operand.function.*;
-import adql.query.operand.function.string.*;
-import adql.query.operand.function.geometry.*;
-import adql.query.operand.function.geometry.GeometryFunction.GeometryValue;
-import adql.search.SearchOptionalFeaturesHandler;
-import adql.translator.PostgreSQLTranslator;
-import adql.translator.TranslationException;
-
-/** Token Manager. */
-@SuppressWarnings("unused")public class ADQLParser201TokenManager implements ADQLParser201Constants {
-        protected void CommonTokenAction(final Token t) {
-                t.adqlVersion = ADQLParserFactory.ADQLVersion.V2_1;
-        }
-
-  /** Debug output. */
-  public  java.io.PrintStream debugStream = System.out;
-  /** Set debug output. */
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1){
-   switch (pos)
-   {
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_2(int pos, long active0, long active1){
-   return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0, active1), pos + 1);
-}
-private int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private int jjMoveStringLiteralDfa0_2(){
-   switch(curChar)
-   {
-      case 34:
-         return jjStartNfaWithStates_2(0, 101, 1);
-      default :
-         return jjMoveNfa_2(0, 0);
-   }
-}
-private int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_2(state, pos + 1);
-}
-static final long[] jjbitVec0 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private int jjMoveNfa_2(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 3;
-   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 0:
-                  if ((0xfffffffbffffffffL & l) != 0L)
-                  {
-                     if (kind > 100)
-                        kind = 100;
-                  }
-                  else if (curChar == 34)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 1:
-                  if (curChar == 34 && kind > 100)
-                     kind = 100;
-                  break;
-               case 2:
-                  if (curChar == 34)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  kind = 100;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((jjbitVec0[i2] & l2) != 0L && kind > 100)
-                     kind = 100;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1){
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0x200000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 5;
-         }
-         if ((active0 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 794;
-         }
-         if ((active0 & 0x40000000000L) != 0L || (active1 & 0x80L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 249;
-         }
-         if ((active0 & 0x40088000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 33;
-         }
-         if ((active0 & 0x10000000080000L) != 0L || (active1 & 0x2020000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 587;
-         }
-         if ((active0 & 0x100000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 749;
-         }
-         if ((active0 & 0x20L) != 0L)
-            return 962;
-         if ((active0 & 0x91a0000000000000L) != 0L || (active1 & 0x1800023L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 52;
-         }
-         if ((active0 & 0x600000000000000L) != 0L || (active1 & 0x3000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 488;
-         }
-         if ((active0 & 0x18000L) != 0L)
-            return 17;
-         if ((active0 & 0x4002800400800000L) != 0L || (active1 & 0x780010L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 907;
-         }
-         if ((active0 & 0x10010000000L) != 0L || (active1 & 0x608L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 404;
-         }
-         if ((active0 & 0x400L) != 0L)
-            return 22;
-         if ((active0 & 0x2000022002000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 332;
-         }
-         if ((active0 & 0x1000000000000L) != 0L || (active1 & 0x44L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 810;
-         }
-         if ((active0 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 963;
-         }
-         if ((active0 & 0x200000L) != 0L || (active1 & 0x4040000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 667;
-         }
-         if ((active0 & 0xc000000000000L) != 0L || (active1 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 421;
-         }
-         if ((active0 & 0x5001000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 436;
-         }
-         if ((active0 & 0x20400000L) != 0L || (active1 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 295;
-         }
-         if ((active0 & 0x400884000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 468;
-         }
-         if ((active0 & 0x800000008000000L) != 0L || (active1 & 0x1c000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 547;
-         }
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            return 315;
-         }
-         return -1;
-      case 1:
-         if ((active0 & 0x800000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 546;
-         }
-         if ((active0 & 0x2000020002000000L) != 0L)
-            return 345;
-         if ((active1 & 0x40000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 714;
-         }
-         if ((active1 & 0x80000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 910;
-         }
-         if ((active0 & 0x400000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 964;
-         }
-         if ((active1 & 0x4000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 666;
-         }
-         if ((active0 & 0x182210068400000L) != 0L || (active1 & 0xc020L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 963;
-         }
-         if ((active0 & 0x800000800000L) != 0L || (active1 & 0x100000L) != 0L)
-            return 929;
-         if ((active1 & 0x2000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 617;
-         }
-         if ((active0 & 0x1000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 435;
-         }
-         if ((active0 & 0x40000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 45;
-         }
-         if ((active1 & 0x4L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 874;
-         }
-         if ((active1 & 0x800L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 428;
-         }
-         if ((active1 & 0x608L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 416;
-         }
-         if ((active0 & 0x10000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 653;
-         }
-         if ((active0 & 0x100000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 767;
-         }
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 32;
-         }
-         if ((active0 & 0x9020000000000000L) != 0L || (active1 & 0x1800003L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 113;
-         }
-         if ((active0 & 0x600000000000000L) != 0L || (active1 & 0x2000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 498;
-         }
-         if ((active0 & 0x2000000000L) != 0L)
-            return 396;
-         if ((active0 & 0x1000000000000L) != 0L || (active1 & 0x40L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 818;
-         }
-         if ((active0 & 0x80000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 594;
-         }
-         if ((active0 & 0x200000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 793;
-         }
-         if ((active1 & 0x10000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 578;
-         }
-         if ((active1 & 0x10L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 906;
-         }
-         if ((active0 & 0x8000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 424;
-         }
-         if ((active1 & 0x20000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 634;
-         }
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 965;
-         }
-         if ((active0 & 0x4000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 479;
-         }
-         if ((active0 & 0x40000000000L) != 0L || (active1 & 0x80L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 264;
-         }
-         if ((active0 & 0x4000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 420;
-         }
-         if ((active0 & 0x480800000000L) != 0L || (active1 & 0x1000L) != 0L)
-            return 963;
-         if ((active1 & 0x100L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 303;
-         }
-         if ((active0 & 0x4000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 451;
-         }
-         if ((active0 & 0x1000200000L) != 0L || (active1 & 0x600000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 2;
-               jjmatchedPos = 1;
-            }
-            return 963;
-         }
-         if ((active0 & 0x100000000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 324;
-         }
-         if ((active0 & 0x80000000L) != 0L)
-            return 469;
-         if ((active0 & 0x10000000L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 1;
-            }
-            return 410;
-         }
-         return -1;
-      case 2:
-         if ((active0 & 0x8000000000000L) != 0L)
-            return 423;
-         if ((active1 & 0x10L) != 0L)
-            return 905;
-         if ((active1 & 0x4L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 881;
-         }
-         if ((active0 & 0x56801400200000L) != 0L || (active1 & 0x7800680L) != 0L)
-            return 963;
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 137;
-         }
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 2;
-               jjmatchedPos = 2;
-            }
-            return 373;
-         }
-         if ((active0 & 0x4000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 450;
-         }
-         if ((active0 & 0x1000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 856;
-         }
-         if ((active1 & 0x100L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 302;
-         }
-         if ((active0 & 0x4000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 478;
-         }
-         if ((active1 & 0x40000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 965;
-         }
-         if ((active1 & 0x800L) != 0L)
-            return 427;
-         if ((active0 & 0x200000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 798;
-         }
-         if ((active0 & 0x4000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 2;
-               jjmatchedPos = 2;
-            }
-            return 963;
-         }
-         if ((active0 & 0x1000000L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 440;
-         }
-         if ((active0 & 0x8fa075817a480000L) != 0L || (active1 & 0x7be06bL) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 2;
-            }
-            return 963;
-         }
-         return -1;
-      case 3:
-         if ((active1 & 0x4L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 3;
-            }
-            return 897;
-         }
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 3;
-            }
-            return 168;
-         }
-         if ((active0 & 0x8fa074830f080000L) != 0L || (active1 & 0x5616bL) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 3;
-            }
-            return 963;
-         }
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 3;
-            }
-            return 372;
-         }
-         if ((active0 & 0x4000000000L) != 0L)
-            return 449;
-         if ((active0 & 0x4000010070400000L) != 0L || (active1 & 0x7a8000L) != 0L)
-            return 963;
-         if ((active0 & 0x1000000000000L) != 0L)
-            return 855;
-         if ((active1 & 0x400L) != 0L)
-         {
-            if (jjmatchedPos != 3)
-            {
-               jjmatchedKind = 102;
-               jjmatchedPos = 3;
-            }
-            return 28;
-         }
-         return -1;
-      case 4:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 4;
-            return 378;
-         }
-         if ((active0 & 0x9d80248001080000L) != 0L || (active1 & 0x44067L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 4;
-            return 963;
-         }
-         if ((active1 & 0x400400L) != 0L)
-            return 28;
-         if ((active0 & 0x22050030e000000L) != 0L || (active1 & 0x12108L) != 0L)
-            return 963;
-         return -1;
-      case 5:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 5;
-            return 377;
-         }
-         if ((active0 & 0x8000000000000000L) != 0L || (active1 & 0x1L) != 0L)
-            return 28;
-         if ((active0 & 0x900240000080000L) != 0L)
-            return 963;
-         if ((active0 & 0x1480008001000000L) != 0L || (active1 & 0x44066L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 5;
-            return 963;
-         }
-         return -1;
-      case 6:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 6;
-            return 376;
-         }
-         if ((active0 & 0x1080000000000000L) != 0L || (active1 & 0x40006L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 6;
-            return 963;
-         }
-         if ((active0 & 0x400008001000000L) != 0L || (active1 & 0x4060L) != 0L)
-            return 963;
-         return -1;
-      case 7:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 7;
-            return 966;
-         }
-         if ((active0 & 0x1080000000000000L) != 0L || (active1 & 0x40006L) != 0L)
-            return 963;
-         return -1;
-      case 8:
-         if ((active0 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 2;
-            jjmatchedPos = 8;
-            return 963;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0, long active1){
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
-}
-private int jjMoveStringLiteralDfa0_0(){
-   switch(curChar)
-   {
-      case 34:
-         return jjStopAtPos(0, 99);
-      case 39:
-         return jjStopAtPos(0, 92);
-      case 40:
-         return jjStopAtPos(0, 3);
-      case 41:
-         return jjStopAtPos(0, 4);
-      case 42:
-         return jjStopAtPos(0, 11);
-      case 43:
-         return jjStopAtPos(0, 9);
-      case 44:
-         return jjStopAtPos(0, 6);
-      case 45:
-         return jjStartNfaWithStates_0(0, 10, 22);
-      case 46:
-         return jjStartNfaWithStates_0(0, 5, 962);
-      case 47:
-         return jjStopAtPos(0, 12);
-      case 59:
-         return jjStopAtPos(0, 7);
-      case 60:
-         jjmatchedKind = 15;
-         return jjMoveStringLiteralDfa1_0(0x10000L, 0x0L);
-      case 61:
-         return jjStopAtPos(0, 13);
-      case 62:
-         jjmatchedKind = 17;
-         return jjMoveStringLiteralDfa1_0(0x40000L, 0x0L);
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x4002800400800000L, 0x780010L);
-      case 66:
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x40088000000000L, 0x0L);
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0x91a0000000000000L, 0x1800023L);
-      case 68:
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x1000000000000L, 0x44L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x40000000000L, 0x80L);
-      case 70:
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x20400000L, 0x100L);
-      case 71:
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x100000000000L, 0x0L);
-      case 72:
-      case 104:
-         return jjMoveStringLiteralDfa1_0(0x200000000000L, 0x0L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x2000022002000000L, 0x0L);
-      case 74:
-      case 106:
-         return jjMoveStringLiteralDfa1_0(0x40000000L, 0x0L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x10010000000L, 0x608L);
-      case 77:
-      case 109:
-         return jjMoveStringLiteralDfa1_0(0xc000000000000L, 0x800L);
-      case 78:
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x5001000000L, 0x0L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa1_0(0x400884000000L, 0x0L);
-      case 80:
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x600000000000000L, 0x3000L);
-      case 82:
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x800000008000000L, 0x1c000L);
-      case 83:
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x10000000080000L, 0x2020000L);
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x200000L, 0x4040000L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa1_0(0x100000000L, 0x0L);
-      case 87:
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x200000000L, 0x0L);
-      case 124:
-         return jjMoveStringLiteralDfa1_0(0x100L, 0x0L);
-      default :
-         return jjMoveNfa_0(0, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_0(long active0, long active1){
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0, active1);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active0 & 0x10000L) != 0L)
-            return jjStopAtPos(1, 16);
-         else if ((active0 & 0x40000L) != 0L)
-            return jjStopAtPos(1, 18);
-         break;
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4200001000000L, active1, 0x400c000L);
-      case 66:
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x10L);
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80000L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x881008010080000L, active1, 0x60L);
-      case 72:
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x200000000L, active1, 0L);
-      case 73:
-      case 105:
-         if ((active1 & 0x1000L) != 0L)
-            return jjStartNfaWithStates_0(1, 76, 963);
-         return jjMoveStringLiteralDfa2_0(active0, 0x108010008000000L, active1, 0x2000004L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x100L);
-      case 78:
-      case 110:
-         if ((active0 & 0x80000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 31, 469);
-         else if ((active0 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 41;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000000402000000L, active1, 0L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa2_0(active0, 0x9660001040200000L, active1, 0x1812e0bL);
-      case 81:
-      case 113:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x20000L);
-      case 82:
-      case 114:
-         if ((active0 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 35;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000500000400000L, active1, 0x40000L);
-      case 83:
-      case 115:
-         if ((active0 & 0x800000L) != 0L)
-         {
-            jjmatchedKind = 23;
-            jjmatchedPos = 1;
-         }
-         else if ((active0 & 0x2000000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 37, 396);
-         return jjMoveStringLiteralDfa2_0(active0, 0x800100000000L, active1, 0x100000L);
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x600000L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10004024000000L, active1, 0L);
-      case 86:
-      case 118:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000000000000L, active1, 0L);
-      case 88:
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0x80L);
-      case 89:
-      case 121:
-         if ((active0 & 0x80000000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 43, 963);
-         break;
-      case 124:
-         if ((active0 & 0x100L) != 0L)
-            return jjStopAtPos(1, 8);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0, active1);
-}
-private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1){
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(0, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0, active1);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x600000L);
-      case 67:
-      case 99:
-         if ((active0 & 0x800000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 47, 963);
-         break;
-      case 68:
-      case 100:
-         if ((active0 & 0x400000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 34, 963);
-         else if ((active1 & 0x800L) != 0L)
-            return jjStartNfaWithStates_0(2, 75, 427);
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0x4000L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000200000000L, active1, 0L);
-      case 70:
-      case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x10000000L, active1, 0L);
-      case 71:
-      case 103:
-         if ((active0 & 0x2000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 49, 963);
-         else if ((active1 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 73;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000008000000L, active1, 0x440L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200040140000000L, active1, 0x100020L);
-      case 75:
-      case 107:
-         return jjMoveStringLiteralDfa3_0(active0, 0x10000000000L, active1, 0L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400004020080000L, active1, 0L);
-      case 77:
-      case 109:
-         if ((active0 & 0x10000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 52, 963);
-         break;
-      case 78:
-      case 110:
-         if ((active0 & 0x8000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 51, 423);
-         else if ((active1 & 0x2000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 89, 963);
-         else if ((active1 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 90, 963);
-         return jjMoveStringLiteralDfa3_0(active0, 0x1080000002000000L, active1, 0x8000L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000100000400000L, active1, 0x80103L);
-      case 80:
-      case 112:
-         if ((active0 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(2, 21, 963);
-         else if ((active1 & 0x80L) != 0L)
-            return jjStartNfaWithStates_0(2, 71, 963);
-         break;
-      case 82:
-      case 114:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L, active1, 0x20000L);
-      case 83:
-      case 115:
-         if ((active1 & 0x10L) != 0L)
-            return jjStartNfaWithStates_0(2, 68, 905);
-         else if ((active1 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_0(2, 87, 963);
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000L, active1, 0x4L);
-      case 84:
-      case 116:
-         if ((active0 & 0x1000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 36, 963);
-         else if ((active1 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 88, 963);
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000008005000000L, active1, 0L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000000L, active1, 0x50000L);
-      case 86:
-      case 118:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000L, active1, 0L);
-      case 87:
-      case 119:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x2008L);
-      case 88:
-      case 120:
-         if ((active0 & 0x4000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 50, 963);
-         else if ((active0 & 0x40000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 54, 963);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0, active1);
-}
-private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1){
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(1, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(2, active0, active1);
-      return 3;
-   }
-   switch(curChar)
-   {
-      case 49:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x400L);
-      case 65:
-      case 97:
-         if ((active0 & 0x4000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 62, 963);
-         break;
-      case 67:
-      case 99:
-         if ((active0 & 0x1000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 48, 855);
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0L);
-      case 68:
-      case 100:
-         if ((active1 & 0x8000L) != 0L)
-            return jjStartNfaWithStates_0(3, 79, 963);
-         break;
-      case 69:
-      case 101:
-         if ((active0 & 0x10000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 40, 963);
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000400006080000L, active1, 0x2008L);
-      case 72:
-      case 104:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000L, active1, 0L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800200000000000L, active1, 0x4000L);
-      case 76:
-      case 108:
-         if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 29, 963);
-         else if ((active0 & 0x4000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 38, 449);
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20L);
-      case 77:
-      case 109:
-         if ((active0 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(3, 22, 963);
-         break;
-      case 78:
-      case 110:
-         if ((active0 & 0x40000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 30, 963);
-         else if ((active1 & 0x100000L) != 0L)
-            return jjStartNfaWithStates_0(3, 84, 963);
-         else if ((active1 & 0x200000L) != 0L)
-         {
-            jjmatchedKind = 85;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x220000100000000L, active1, 0x450000L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x100L);
-      case 82:
-      case 114:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000200000000L, active1, 0x43L);
-      case 83:
-      case 115:
-         if ((active1 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(3, 83, 963);
-         return jjMoveStringLiteralDfa4_0(active0, 0x40000000000L, active1, 0L);
-      case 84:
-      case 116:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 28, 963);
-         else if ((active1 & 0x20000L) != 0L)
-            return jjStartNfaWithStates_0(3, 81, 963);
-         return jjMoveStringLiteralDfa4_0(active0, 0x1080000000000000L, active1, 0x4L);
-      case 85:
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100001000000L, active1, 0L);
-      case 87:
-      case 119:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000L, active1, 0L);
-      case 89:
-      case 121:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(2, active0, active1);
-}
-private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1){
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(2, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(3, active0, active1);
-      return 4;
-   }
-   switch(curChar)
-   {
-      case 48:
-         if ((active1 & 0x400L) != 0L)
-            return jjStartNfaWithStates_0(4, 74, 28);
-         break;
-      case 50:
-         if ((active1 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(4, 86, 28);
-         break;
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0x4004L);
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000L, active1, 0x40000L);
-      case 68:
-      case 100:
-         if ((active1 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_0(4, 80, 963);
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0x3L);
-      case 69:
-      case 101:
-         if ((active0 & 0x200000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 33, 963);
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000L, active1, 0x40L);
-      case 71:
-      case 103:
-         if ((active0 & 0x100000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 32, 963);
-         return jjMoveStringLiteralDfa5_0(active0, 0x400000000000000L, active1, 0L);
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x20L);
-      case 76:
-      case 108:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0L);
-      case 78:
-      case 110:
-         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000L, active1, 0L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000000000000L, active1, 0L);
-      case 80:
-      case 112:
-         if ((active0 & 0x100000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 44, 963);
-         break;
-      case 82:
-      case 114:
-         if ((active0 & 0x2000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 25, 963);
-         else if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 26, 963);
-         else if ((active0 & 0x400000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 46, 963);
-         else if ((active1 & 0x8L) != 0L)
-            return jjStartNfaWithStates_0(4, 67, 963);
-         else if ((active1 & 0x100L) != 0L)
-            return jjStartNfaWithStates_0(4, 72, 963);
-         else if ((active1 & 0x2000L) != 0L)
-            return jjStartNfaWithStates_0(4, 77, 963);
-         return jjMoveStringLiteralDfa5_0(active0, 0x2080000001000000L, active1, 0L);
-      case 84:
-      case 116:
-         if ((active0 & 0x8000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 27, 963);
-         else if ((active0 & 0x20000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 53, 963);
-         else if ((active0 & 0x200000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 57, 963);
-         return jjMoveStringLiteralDfa5_0(active0, 0x40000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(3, active0, active1);
-}
-private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1){
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(3, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(4, active0, active1);
-      return 5;
-   }
-   switch(curChar)
-   {
-      case 49:
-         if ((active0 & 0x8000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 63, 28);
-         break;
-      case 50:
-         if ((active1 & 0x1L) != 0L)
-            return jjStartNfaWithStates_0(5, 64, 28);
-         break;
-      case 65:
-      case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000L, active1, 0x40000L);
-      case 69:
-      case 101:
-         if ((active0 & 0x100000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 56, 963);
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000L, active1, 0x40L);
-      case 71:
-      case 103:
-         if ((active0 & 0x200000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 45, 963);
-         break;
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000000L, active1, 0L);
-      case 78:
-      case 110:
-         if ((active0 & 0x800000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 59, 963);
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4024L);
-      case 79:
-      case 111:
-         return jjMoveStringLiteralDfa6_0(active0, 0x480000000000000L, active1, 0L);
-      case 83:
-      case 115:
-         if ((active0 & 0x40000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 42, 963);
-         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0x2L);
-      case 84:
-      case 116:
-         if ((active0 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(5, 19, 963);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(4, active0, active1);
-}
-private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1){
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(4, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(5, active0, active1);
-      return 6;
-   }
-   switch(curChar)
-   {
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4L);
-      case 69:
-      case 101:
-         return jjMoveStringLiteralDfa7_0(active0, 0x2000000000000000L, active1, 0L);
-      case 71:
-      case 103:
-         if ((active1 & 0x20L) != 0L)
-            return jjStartNfaWithStates_0(6, 69, 963);
-         break;
-      case 73:
-      case 105:
-         return jjMoveStringLiteralDfa7_0(active0, 0x80000000000000L, active1, 0L);
-      case 76:
-      case 108:
-         if ((active0 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 24, 963);
-         break;
-      case 78:
-      case 110:
-         if ((active0 & 0x8000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 39, 963);
-         else if ((active0 & 0x400000000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 58, 963);
-         return jjMoveStringLiteralDfa7_0(active0, 0x1000000000000000L, active1, 0L);
-      case 83:
-      case 115:
-         if ((active1 & 0x40L) != 0L)
-            return jjStartNfaWithStates_0(6, 70, 963);
-         else if ((active1 & 0x4000L) != 0L)
-            return jjStartNfaWithStates_0(6, 78, 963);
-         break;
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x40000L);
-      case 89:
-      case 121:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(5, active0, active1);
-}
-private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1){
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(5, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(6, active0, active1);
-      return 7;
-   }
-   switch(curChar)
-   {
-      case 67:
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0x2000000000000000L, active1, 0L);
-      case 68:
-      case 100:
-         if ((active0 & 0x80000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 55, 963);
-         break;
-      case 69:
-      case 101:
-         if ((active1 & 0x4L) != 0L)
-            return jjStartNfaWithStates_0(7, 66, 963);
-         else if ((active1 & 0x40000L) != 0L)
-            return jjStartNfaWithStates_0(7, 82, 963);
-         break;
-      case 83:
-      case 115:
-         if ((active0 & 0x1000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 60, 963);
-         else if ((active1 & 0x2L) != 0L)
-            return jjStartNfaWithStates_0(7, 65, 963);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(6, active0, active1);
-}
-private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1){
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(6, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(7, active0, 0L);
-      return 8;
-   }
-   switch(curChar)
-   {
-      case 84:
-      case 116:
-         return jjMoveStringLiteralDfa9_0(active0, 0x2000000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(7, active0, 0L);
-}
-private int jjMoveStringLiteralDfa9_0(long old0, long active0){
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(7, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(8, active0, 0L);
-      return 9;
-   }
-   switch(curChar)
-   {
-      case 83:
-      case 115:
-         if ((active0 & 0x2000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 61, 963);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(8, active0, 0L);
-}
-private int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-private int jjMoveNfa_0(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 962;
-   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 714:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 962:
-                  if ((0x3ff000000000000L & l) != 0L)
-                  {
-                     if (kind > 96)
-                        kind = 96;
-                     { jjCheckNAdd(949); }
-                  }
-                  if ((0x3ff000000000000L & l) != 0L)
-                     { jjCheckNAddTwoStates(945, 946); }
-                  break;
-               case 373:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 810:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 469:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 420:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 376:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 303:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 5:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 578:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 168:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 428:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 617:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 137:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 818:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 907:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 498:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 767:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 324:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 435:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 855:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 295:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 421:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 33:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 793:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 423:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 249:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 594:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 965:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 404:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 874:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 749:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 449:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 0:
-                  if ((0x3ff000000000000L & l) != 0L)
-                  {
-                     if (kind > 97)
-                        kind = 97;
-                     { jjCheckNAddStates(0, 8); }
-                  }
-                  else if ((0x100002600L & l) != 0L)
-                  {
-                     if (kind > 1)
-                        kind = 1;
-                  }
-                  else if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  else if (curChar == 46)
-                     { jjCheckNAddTwoStates(945, 949); }
-                  else if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 22;
-                  else if (curChar == 60)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  if (curChar == 33)
-                     jjstateSet[jjnewStateCnt++] = 19;
-                  else if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 410:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 929:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 372:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 468:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 634:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 881:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 966:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 315:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 450:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 478:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 906:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 32:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 52:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 332:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 377:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 587:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 794:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 45:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 547:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 345:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 424:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 416:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 440:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 378:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 667:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 302:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 856:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 798:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 910:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 396:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 897:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 436:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 666:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 653:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 479:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 546:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 963:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 488:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 905:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 427:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 264:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 451:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 964:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 113:
-                  if ((0x83ff001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x8000001a00000000L & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 1:
-                  if (curChar == 10 && kind > 1)
-                     kind = 1;
-                  break;
-               case 2:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 17:
-                  if (curChar == 62 && kind > 14)
-                     kind = 14;
-                  break;
-               case 18:
-                  if (curChar == 60)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  break;
-               case 19:
-                  if (curChar == 61 && kind > 14)
-                     kind = 14;
-                  break;
-               case 20:
-                  if (curChar == 33)
-                     jjstateSet[jjnewStateCnt++] = 19;
-                  break;
-               case 21:
-                  if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 22;
-                  break;
-               case 22:
-                  if (curChar != 45)
-                     break;
-                  if (kind > 91)
-                     kind = 91;
-                  { jjCheckNAddStates(9, 11); }
-                  break;
-               case 23:
-                  if ((0xffffffffffffdbffL & l) == 0L)
-                     break;
-                  if (kind > 91)
-                     kind = 91;
-                  { jjCheckNAddStates(9, 11); }
-                  break;
-               case 24:
-                  if ((0x2400L & l) != 0L && kind > 91)
-                     kind = 91;
-                  break;
-               case 25:
-                  if (curChar == 10 && kind > 91)
-                     kind = 91;
-                  break;
-               case 26:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 25;
-                  break;
-               case 27:
-                  if ((0x8000001a00000000L & l) == 0L)
-                     break;
-                  if (kind > 102)
-                     kind = 102;
-                  { jjCheckNAddTwoStates(27, 28); }
-                  break;
-               case 28:
-                  if ((0x83ff001a00000000L & l) == 0L)
-                     break;
-                  if (kind > 102)
-                     kind = 102;
-                  { jjCheckNAdd(28); }
-                  break;
-               case 255:
-                  if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 254;
-                  break;
-               case 944:
-                  if (curChar == 46)
-                     { jjCheckNAddTwoStates(945, 949); }
-                  break;
-               case 945:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     { jjCheckNAddTwoStates(945, 946); }
-                  break;
-               case 947:
-                  if ((0x280000000000L & l) != 0L)
-                     { jjCheckNAdd(948); }
-                  break;
-               case 948:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 95)
-                     kind = 95;
-                  { jjCheckNAdd(948); }
-                  break;
-               case 949:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 96)
-                     kind = 96;
-                  { jjCheckNAdd(949); }
-                  break;
-               case 950:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 97)
-                     kind = 97;
-                  { jjCheckNAddStates(0, 8); }
-                  break;
-               case 951:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     { jjCheckNAddTwoStates(951, 946); }
-                  break;
-               case 952:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     { jjCheckNAddTwoStates(952, 953); }
-                  break;
-               case 953:
-                  if (curChar == 46)
-                     { jjCheckNAddTwoStates(954, 946); }
-                  break;
-               case 954:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     { jjCheckNAddTwoStates(954, 946); }
-                  break;
-               case 955:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     { jjCheckNAddTwoStates(955, 956); }
-                  break;
-               case 956:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 96)
-                     kind = 96;
-                  { jjCheckNAdd(957); }
-                  break;
-               case 957:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 96)
-                     kind = 96;
-                  { jjCheckNAdd(957); }
-                  break;
-               case 958:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 97)
-                     kind = 97;
-                  { jjCheckNAdd(958); }
-                  break;
-               case 959:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     { jjCheckNAddTwoStates(959, 960); }
-                  break;
-               case 960:
-                  if ((0x8000001a00000000L & l) == 0L)
-                     break;
-                  if (kind > 102)
-                     kind = 102;
-                  { jjCheckNAdd(961); }
-                  break;
-               case 961:
-                  if ((0x83ff001a00000000L & l) == 0L)
-                     break;
-                  if (kind > 102)
-                     kind = 102;
-                  { jjCheckNAdd(961); }
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 714:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 741;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 738;
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 729;
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 722;
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 713;
-                  break;
-               case 373:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 385;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 379;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 372;
-                  break;
-               case 810:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 899;
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 892;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 890;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 865;
-                  else if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 886;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 882;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 857;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 809;
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 874;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 851;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 847;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 841;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 833;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 828;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 823;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 818;
-                  break;
-               case 469:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  break;
-               case 420:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 419;
-                  break;
-               case 376:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 303:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 302;
-                  break;
-               case 5:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 4;
-                  break;
-               case 578:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x80000000800000L & l) != 0L)
-                     { jjCheckNAdd(156); }
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 577;
-                  break;
-               case 168:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 167;
-                  break;
-               case 428:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 430;
-                  else if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 427;
-                  break;
-               case 617:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x400000004000000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 137:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 173;
-                  else if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 168;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 162;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 144;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 152;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 136;
-                  break;
-               case 818:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 864;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 850;
-                  else if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 846;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 827;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 817;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 856;
-                  else if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 840;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 822;
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 832;
-                  break;
-               case 907:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 942;
-                  else if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 940;
-                  else if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 929;
-                  else if ((0x4000000040000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  else if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  else if ((0x1000000010L & l) != 0L)
-                     { jjCheckNAdd(53); }
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 910;
-                  else if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 906;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 920;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 917;
-                  break;
-               case 498:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 497;
-                  break;
-               case 767:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 766;
-                  break;
-               case 324:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 323;
-                  break;
-               case 435:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 440;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 434;
-                  break;
-               case 855:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 862;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 854;
-                  break;
-               case 295:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 312;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 303;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 300;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 297;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 294;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 309;
-                  if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  break;
-               case 421:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 431;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 424;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 420;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 428;
-                  break;
-               case 33:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 45;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 43;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 32;
-                  if ((0x20000000200L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 793:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 798;
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(30); }
-                  break;
-               case 423:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 422;
-                  break;
-               case 249:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 290;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 260;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 256;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 248;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 285;
-                  else if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(53); }
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 278;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 273;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 271;
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 264;
-                  break;
-               case 594:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 613;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 598;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 603;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 593;
-                  break;
-               case 965:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 404:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 416;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 413;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 405;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 410;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 403;
-                  break;
-               case 874:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 898;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 873;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 881;
-                  break;
-               case 749:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 769;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 764;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 757;
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 767;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 761;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 752;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 748;
-                  break;
-               case 449:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     { jjCheckNAdd(448); }
-                  break;
-               case 0:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAddStates(12, 22); }
-                  else if ((0x1000000010L & l) != 0L)
-                     { jjAddStates(23, 39); }
-                  else if ((0x80000000800000L & l) != 0L)
-                     { jjAddStates(40, 44); }
-                  else if ((0x40000000400000L & l) != 0L)
-                     { jjAddStates(45, 49); }
-                  else if ((0x20000000200000L & l) != 0L)
-                     { jjAddStates(50, 56); }
-                  else if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAddStates(57, 70); }
-                  else if ((0x8000000080000L & l) != 0L)
-                     { jjAddStates(71, 87); }
-                  else if ((0x4000000040000L & l) != 0L)
-                     { jjAddStates(88, 95); }
-                  else if ((0x1000000010000L & l) != 0L)
-                     { jjAddStates(96, 106); }
-                  else if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAddStates(107, 113); }
-                  else if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAddStates(114, 120); }
-                  else if ((0x200000002000L & l) != 0L)
-                     { jjAddStates(121, 124); }
-                  else if ((0x100000001000L & l) != 0L)
-                     { jjAddStates(125, 129); }
-                  else if ((0x20000000200L & l) != 0L)
-                     { jjAddStates(130, 142); }
-                  else if ((0x8000000080L & l) != 0L)
-                     { jjCheckNAddStates(143, 147); }
-                  else if ((0x4000000040L & l) != 0L)
-                     { jjAddStates(148, 154); }
-                  else if ((0x2000000020L & l) != 0L)
-                     { jjAddStates(155, 164); }
-                  else if ((0x800000008L & l) != 0L)
-                     { jjAddStates(165, 194); }
-                  else if ((0x400000004L & l) != 0L)
-                     { jjAddStates(195, 198); }
-                  else if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 15;
-                  else if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  else if ((0x80000000800L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 8;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 5;
-                  break;
-               case 410:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 412;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 409;
-                  break;
-               case 929:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 928;
-                  break;
-               case 372:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 384;
-                  else if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 371;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 378;
-                  break;
-               case 468:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 485;
-                  else if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 479;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 475;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 469;
-                  else if ((0x4000000040L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 467;
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 471;
-                  break;
-               case 634:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 645;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 639;
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 633;
-                  if ((0x100000001000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 881:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 897;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 880;
-                  break;
-               case 966:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 315:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 324;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 321;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 318;
-                  else if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 450:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 449;
-                  break;
-               case 478:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 477;
-                  break;
-               case 906:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 905;
-                  break;
-               case 32:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 31;
-                  break;
-               case 52:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 245;
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 190;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 186;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 107;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 104;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 68;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 241;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 175;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 100;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 62;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 231;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 170;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 86;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 60;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 215;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 164;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 77;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 58;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 205;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 154;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 70;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 51;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 195;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 146;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 138;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 133;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 129;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 125;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 118;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 113;
-                  break;
-               case 332:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 396;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 389;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 338;
-                  else if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 331;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 387;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 381;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 374;
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 368;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 364;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 355;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 352;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 345;
-                  break;
-               case 377:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 376;
-                  break;
-               case 587:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 662;
-                  else if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 653;
-                  else if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 646;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 628;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 625;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 623;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 617;
-                  else if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 590;
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 640;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 614;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 586;
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 634;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 604;
-                  if ((0x2000000020000L & l) != 0L)
-                     { jjCheckNAdd(280); }
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 599;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 594;
-                  break;
-               case 794:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 806;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 803;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 801;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 799;
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 793;
-                  break;
-               case 45:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(36); }
-                  break;
-               case 547:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 580;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 572;
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 578;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 568;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 562;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 556;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 548;
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 546;
-                  break;
-               case 345:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(320); }
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 367;
-                  else if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 354;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 351;
-                  else if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 344;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 386;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 363;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 380;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 373;
-                  if ((0x10000000100000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 424:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 423;
-                  break;
-               case 416:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 415;
-                  break;
-               case 440:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 439;
-                  break;
-               case 378:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 383;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 377;
-                  break;
-               case 667:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 744;
-                  else if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 708;
-                  else if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 675;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 673;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 666;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 742;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 695;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 739;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 684;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 730;
-                  else if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 677;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 723;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 714;
-                  break;
-               case 302:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 856:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 863;
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 855;
-                  break;
-               case 798:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 797;
-                  if ((0x400000004000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 910:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 909;
-                  break;
-               case 396:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 395;
-                  break;
-               case 897:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 896;
-                  break;
-               case 436:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 456;
-                  else if ((0x800000008000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 446;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 444;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 441;
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 451;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 435;
-                  break;
-               case 666:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 665;
-                  break;
-               case 653:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 652;
-                  break;
-               case 479:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 478;
-                  break;
-               case 546:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 571;
-                  else if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 567;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 561;
-                  else if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 555;
-                  else if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(280); }
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(53); }
-                  break;
-               case 963:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  break;
-               case 488:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 543;
-                  else if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 539;
-                  else if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 498;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 492;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 532;
-                  else if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(53); }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 524;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 521;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 516;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 510;
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 505;
-                  break;
-               case 905:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 904;
-                  break;
-               case 427:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 426;
-                  break;
-               case 264:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 289;
-                  else if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 277;
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 270;
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 284;
-                  else if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(251); }
-                  else if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 263;
-                  break;
-               case 451:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 455;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 450;
-                  break;
-               case 964:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x200000002000000L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                  }
-                  break;
-               case 113:
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAdd(28); }
-                  }
-                  if ((0x6fffffffefffffffL & l) != 0L)
-                  {
-                     if (kind > 102)
-                        kind = 102;
-                     { jjCheckNAddTwoStates(27, 28); }
-                  }
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 185;
-                  else if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 174;
-                  else if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 132;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 128;
-                  else if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 112;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 169;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 124;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 163;
-                  else if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 117;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 153;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 145;
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 137;
-                  break;
-               case 3:
-                  if ((0x4000000040000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 4:
-               case 686:
-                  if ((0x20000000200000L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  break;
-               case 6:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 5;
-                  break;
-               case 7:
-                  if ((0x200000002000000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 8:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  break;
-               case 9:
-                  if ((0x80000000800L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 8;
-                  break;
-               case 10:
-               case 70:
-               case 443:
-               case 779:
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  break;
-               case 11:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 10;
-                  break;
-               case 12:
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  break;
-               case 13:
-                  if ((0x2000000020L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 14:
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 15:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 14;
-                  break;
-               case 16:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 15;
-                  break;
-               case 23:
-                  if (kind > 91)
-                     kind = 91;
-                  { jjAddStates(9, 11); }
-                  break;
-               case 27:
-                  if ((0x6fffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 102)
-                     kind = 102;
-                  { jjCheckNAddTwoStates(27, 28); }
-                  break;
-               case 28:
-                  if ((0x6fffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 102)
-                     kind = 102;
-                  { jjCheckNAdd(28); }
-                  break;
-               case 29:
-                  if ((0x400000004L & l) != 0L)
-                     { jjAddStates(195, 198); }
-                  break;
-               case 30:
-                  if ((0x400000004000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 31:
-               case 884:
-                  if ((0x20000000200L & l) != 0L)
-                     { jjCheckNAdd(30); }
-                  break;
-               case 34:
-                  if ((0x10000000100000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 35:
-               case 131:
-                  if ((0x20000000200L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 36:
-                  if ((0x10000000100L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 37:
-               case 79:
-               case 88:
-               case 430:
-               case 459:
-               case 801:
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(36); }
-                  break;
-               case 38:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 37;
-                  break;
-               case 39:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 38;
-                  break;
-               case 40:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 39;
-                  break;
-               case 41:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 40;
-                  break;
-               case 42:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 41;
-                  break;
-               case 43:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 42;
-                  break;
-               case 44:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 43;
-                  break;
-               case 46:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 45;
-                  break;
-               case 47:
-                  if ((0x800000008L & l) != 0L)
-                     { jjAddStates(165, 194); }
-                  break;
-               case 48:
-               case 631:
-                  if ((0x1000000010L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 49:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 48;
-                  break;
-               case 50:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 49;
-                  break;
-               case 51:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 50;
-                  break;
-               case 53:
-                  if ((0x1000000010L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 54:
-               case 843:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(53); }
-                  break;
-               case 55:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 54;
-                  break;
-               case 56:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 55;
-                  break;
-               case 57:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 56;
-                  break;
-               case 58:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 57;
-                  break;
-               case 59:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 58;
-                  break;
-               case 60:
-               case 106:
-               case 248:
-               case 293:
-                  if ((0x8000000080000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 61:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 60;
-                  break;
-               case 62:
-               case 299:
-               case 405:
-                  if ((0x8000000080000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 63:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 62;
-                  break;
-               case 64:
-                  if ((0x8000000080L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 65:
-                  if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAdd(64); }
-                  break;
-               case 66:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 65;
-                  break;
-               case 67:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 66;
-                  break;
-               case 68:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 67;
-                  break;
-               case 69:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 68;
-                  break;
-               case 71:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 70;
-                  break;
-               case 72:
-               case 233:
-               case 371:
-               case 606:
-               case 655:
-               case 763:
-               case 795:
-               case 919:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  break;
-               case 73:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 72;
-                  break;
-               case 74:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 73;
-                  break;
-               case 75:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 74;
-                  break;
-               case 76:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 75;
-                  break;
-               case 77:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 76;
-                  break;
-               case 78:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 77;
-                  break;
-               case 80:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 79;
-                  break;
-               case 81:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 80;
-                  break;
-               case 82:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 81;
-                  break;
-               case 83:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 82;
-                  break;
-               case 84:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 83;
-                  break;
-               case 85:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 84;
-                  break;
-               case 86:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 85;
-                  break;
-               case 87:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 86;
-                  break;
-               case 89:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 88;
-                  break;
-               case 90:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 89;
-                  break;
-               case 91:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 90;
-                  break;
-               case 92:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 91;
-                  break;
-               case 93:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 92;
-                  break;
-               case 94:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 93;
-                  break;
-               case 95:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 94;
-                  break;
-               case 96:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 95;
-                  break;
-               case 97:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 96;
-                  break;
-               case 98:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 97;
-                  break;
-               case 99:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 98;
-                  break;
-               case 100:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 99;
-                  break;
-               case 101:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 100;
-                  break;
-               case 102:
-                  if ((0x80000000800L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 103:
-               case 574:
-                  if ((0x800000008L & l) != 0L)
-                     { jjCheckNAdd(102); }
-                  break;
-               case 104:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 103;
-                  break;
-               case 105:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 104;
-                  break;
-               case 107:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 106;
-                  break;
-               case 108:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 107;
-                  break;
-               case 109:
-               case 627:
-                  if ((0x800000008L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 110:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 109;
-                  break;
-               case 111:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 110;
-                  break;
-               case 112:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 111;
-                  break;
-               case 114:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 113;
-                  break;
-               case 115:
-               case 188:
-               case 197:
-               case 275:
-               case 333:
-               case 422:
-               case 642:
-               case 697:
-               case 725:
-               case 759:
-               case 805:
-               case 809:
-               case 812:
-               case 849:
-               case 902:
-               case 913:
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 116:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 115;
-                  break;
-               case 117:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 116;
-                  break;
-               case 118:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 117;
-                  break;
-               case 119:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 118;
-                  break;
-               case 120:
-               case 140:
-               case 266:
-               case 391:
-               case 473:
-               case 494:
-               case 500:
-               case 596:
-               case 601:
-               case 716:
-               case 732:
-               case 747:
-               case 908:
-               case 924:
-               case 931:
-                  if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAdd(30); }
-                  break;
-               case 121:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 120;
-                  break;
-               case 122:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 121;
-                  break;
-               case 123:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 122;
-                  break;
-               case 124:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 123;
-                  break;
-               case 125:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 124;
-                  break;
-               case 126:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 125;
-                  break;
-               case 127:
-                  if ((0x200000002000L & l) != 0L)
-                     { jjCheckNAdd(30); }
-                  break;
-               case 128:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 127;
-                  break;
-               case 129:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 128;
-                  break;
-               case 130:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 129;
-                  break;
-               case 132:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 131;
-                  break;
-               case 133:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 132;
-                  break;
-               case 134:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 133;
-                  break;
-               case 135:
-               case 287:
-               case 564:
-               case 876:
-                  if ((0x800000008L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 136:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 135;
-                  break;
-               case 138:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 137;
-                  break;
-               case 139:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 138;
-                  break;
-               case 141:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 140;
-                  break;
-               case 142:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 141;
-                  break;
-               case 143:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 142;
-                  break;
-               case 144:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 143;
-                  break;
-               case 145:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 144;
-                  break;
-               case 146:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 145;
-                  break;
-               case 147:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 146;
-                  break;
-               case 148:
-               case 192:
-               case 323:
-               case 619:
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 149:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 148;
-                  break;
-               case 150:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 149;
-                  break;
-               case 151:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 150;
-                  break;
-               case 152:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 151;
-                  break;
-               case 153:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 152;
-                  break;
-               case 154:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 153;
-                  break;
-               case 155:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 154;
-                  break;
-               case 156:
-                  if ((0x8000000080000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 157:
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(156); }
-                  break;
-               case 158:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 157;
-                  break;
-               case 159:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 158;
-                  break;
-               case 160:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 159;
-                  break;
-               case 161:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 160;
-                  break;
-               case 162:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 161;
-                  break;
-               case 163:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 162;
-                  break;
-               case 164:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 163;
-                  break;
-               case 165:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 164;
-                  break;
-               case 166:
-               case 750:
-               case 772:
-                  if ((0x20000000200000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 167:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 166;
-                  break;
-               case 169:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 168;
-                  break;
-               case 170:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 169;
-                  break;
-               case 171:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 170;
-                  break;
-               case 172:
-               case 366:
-                  if ((0x4000000040000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 173:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 172;
-                  break;
-               case 174:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 173;
-                  break;
-               case 175:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 174;
-                  break;
-               case 176:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 175;
-                  break;
-               case 177:
-               case 407:
-               case 648:
-               case 710:
-               case 784:
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(64); }
-                  break;
-               case 178:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 177;
-                  break;
-               case 179:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 178;
-                  break;
-               case 180:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 179;
-                  break;
-               case 181:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 180;
-                  break;
-               case 182:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 181;
-                  break;
-               case 183:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 182;
-                  break;
-               case 184:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 183;
-                  break;
-               case 185:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 184;
-                  break;
-               case 186:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 185;
-                  break;
-               case 187:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 186;
-                  break;
-               case 189:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 188;
-                  break;
-               case 190:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 189;
-                  break;
-               case 191:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 190;
-                  break;
-               case 193:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 192;
-                  break;
-               case 194:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 193;
-                  break;
-               case 195:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 194;
-                  break;
-               case 196:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 195;
-                  break;
-               case 198:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 197;
-                  break;
-               case 199:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 198;
-                  break;
-               case 200:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 199;
-                  break;
-               case 201:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 200;
-                  break;
-               case 202:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 201;
-                  break;
-               case 203:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 202;
-                  break;
-               case 204:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 203;
-                  break;
-               case 205:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 204;
-                  break;
-               case 206:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 205;
-                  break;
-               case 207:
-               case 625:
-               case 677:
-                  if ((0x200000002000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 208:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 207;
-                  break;
-               case 209:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 208;
-                  break;
-               case 210:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 209;
-                  break;
-               case 211:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 210;
-                  break;
-               case 212:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 211;
-                  break;
-               case 213:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 212;
-                  break;
-               case 214:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 213;
-                  break;
-               case 215:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 214;
-                  break;
-               case 216:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 215;
-                  break;
-               case 217:
-                  if ((0x1000000010000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 218:
-               case 679:
-                  if ((0x200000002000L & l) != 0L)
-                     { jjCheckNAdd(217); }
-                  break;
-               case 219:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 218;
-                  break;
-               case 220:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 219;
-                  break;
-               case 221:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 220;
-                  break;
-               case 222:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 221;
-                  break;
-               case 223:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 222;
-                  break;
-               case 224:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 223;
-                  break;
-               case 225:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 224;
-                  break;
-               case 226:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 225;
-                  break;
-               case 227:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 226;
-                  break;
-               case 228:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 227;
-                  break;
-               case 229:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 228;
-                  break;
-               case 230:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 229;
-                  break;
-               case 231:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 230;
-                  break;
-               case 232:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 231;
-                  break;
-               case 234:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 233;
-                  break;
-               case 235:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 234;
-                  break;
-               case 236:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 235;
-                  break;
-               case 237:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 236;
-                  break;
-               case 238:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 237;
-                  break;
-               case 239:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 238;
-                  break;
-               case 240:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 239;
-                  break;
-               case 241:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 240;
-                  break;
-               case 242:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 241;
-                  break;
-               case 243:
-               case 340:
-               case 523:
-               case 636:
-               case 859:
-                  if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  break;
-               case 244:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 243;
-                  break;
-               case 245:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 244;
-                  break;
-               case 246:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 245;
-                  break;
-               case 247:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjAddStates(155, 164); }
-                  break;
-               case 250:
-               case 311:
-               case 592:
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(53); }
-                  break;
-               case 251:
-                  if ((0x800000008L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 252:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(251); }
-                  break;
-               case 253:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 252;
-                  break;
-               case 254:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 253;
-                  break;
-               case 256:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 255;
-                  break;
-               case 257:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 256;
-                  break;
-               case 258:
-                  if ((0x1000000010000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 259:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 258;
-                  break;
-               case 260:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 259;
-                  break;
-               case 261:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 260;
-                  break;
-               case 262:
-                  if ((0x1000000010000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 263:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 262;
-                  break;
-               case 265:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 264;
-                  break;
-               case 267:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 266;
-                  break;
-               case 268:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 267;
-                  break;
-               case 269:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 268;
-                  break;
-               case 270:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 269;
-                  break;
-               case 271:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 270;
-                  break;
-               case 272:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 271;
-                  break;
-               case 273:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(251); }
-                  break;
-               case 274:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 273;
-                  break;
-               case 276:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 275;
-                  break;
-               case 277:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 276;
-                  break;
-               case 278:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 277;
-                  break;
-               case 279:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 278;
-                  break;
-               case 280:
-                  if ((0x100000001000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 281:
-               case 316:
-               case 383:
-               case 415:
-               case 437:
-               case 489:
-               case 820:
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(280); }
-                  break;
-               case 282:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 281;
-                  break;
-               case 283:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 282;
-                  break;
-               case 284:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 283;
-                  break;
-               case 285:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 284;
-                  break;
-               case 286:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 285;
-                  break;
-               case 288:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 287;
-                  break;
-               case 289:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 288;
-                  break;
-               case 290:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 289;
-                  break;
-               case 291:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 290;
-                  break;
-               case 292:
-                  if ((0x4000000040L & l) != 0L)
-                     { jjAddStates(148, 154); }
-                  break;
-               case 294:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 293;
-                  break;
-               case 296:
-               case 419:
-                  if ((0x800000008L & l) != 0L)
-                     { jjCheckNAdd(36); }
-                  break;
-               case 297:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 296;
-                  break;
-               case 298:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 297;
-                  break;
-               case 300:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 299;
-                  break;
-               case 301:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 300;
-                  break;
-               case 304:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 303;
-                  break;
-               case 305:
-                  if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  break;
-               case 306:
-                  if ((0x8000000080L & l) != 0L)
-                     { jjCheckNAdd(30); }
-                  break;
-               case 307:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 306;
-                  break;
-               case 308:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 307;
-                  break;
-               case 309:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 308;
-                  break;
-               case 310:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 309;
-                  break;
-               case 312:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 311;
-                  break;
-               case 313:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 312;
-                  break;
-               case 314:
-                  if ((0x8000000080L & l) != 0L)
-                     { jjCheckNAddStates(143, 147); }
-                  break;
-               case 317:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 316;
-                  break;
-               case 318:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 317;
-                  break;
-               case 319:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 318;
-                  break;
-               case 320:
-                  if ((0x800000008000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 321:
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(320); }
-                  break;
-               case 322:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 321;
-                  break;
-               case 325:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 324;
-                  break;
-               case 326:
-                  if ((0x20000000200L & l) != 0L)
-                     { jjAddStates(130, 142); }
-                  break;
-               case 327:
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  break;
-               case 328:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 327;
-                  break;
-               case 329:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 328;
-                  break;
-               case 330:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 329;
-                  break;
-               case 331:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 330;
-                  break;
-               case 334:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 333;
-                  break;
-               case 335:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 334;
-                  break;
-               case 336:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 335;
-                  break;
-               case 337:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 336;
-                  break;
-               case 338:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 337;
-                  break;
-               case 339:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 338;
-                  break;
-               case 341:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 340;
-                  break;
-               case 342:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 341;
-                  break;
-               case 343:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 342;
-                  break;
-               case 344:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 343;
-                  break;
-               case 346:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 345;
-                  break;
-               case 347:
-                  if ((0x100000001000L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  break;
-               case 348:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 347;
-                  break;
-               case 349:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 348;
-                  break;
-               case 350:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 349;
-                  break;
-               case 351:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 350;
-                  break;
-               case 352:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 351;
-                  break;
-               case 353:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 352;
-                  break;
-               case 354:
-               case 477:
-                  if ((0x20000000200000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 355:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 354;
-                  break;
-               case 356:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 355;
-                  break;
-               case 357:
-               case 512:
-               case 558:
-                  if ((0x40000000400000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 358:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 357;
-                  break;
-               case 359:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 358;
-                  break;
-               case 360:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 359;
-                  break;
-               case 361:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 360;
-                  break;
-               case 362:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 361;
-                  break;
-               case 363:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 362;
-                  break;
-               case 364:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 363;
-                  break;
-               case 365:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 364;
-                  break;
-               case 367:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 366;
-                  break;
-               case 368:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 367;
-                  break;
-               case 369:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 368;
-                  break;
-               case 370:
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 374:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 373;
-                  break;
-               case 375:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 374;
-                  break;
-               case 379:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 378;
-                  break;
-               case 380:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 379;
-                  break;
-               case 381:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 380;
-                  break;
-               case 382:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 381;
-                  break;
-               case 384:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 383;
-                  break;
-               case 385:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 384;
-                  break;
-               case 386:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 385;
-                  break;
-               case 387:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 386;
-                  break;
-               case 388:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 387;
-                  break;
-               case 389:
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAdd(320); }
-                  break;
-               case 390:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 389;
-                  break;
-               case 392:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 391;
-                  break;
-               case 393:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 392;
-                  break;
-               case 394:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 393;
-                  break;
-               case 395:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 394;
-                  break;
-               case 397:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 396;
-                  break;
-               case 398:
-                  if ((0x100000001000L & l) != 0L)
-                     { jjAddStates(125, 129); }
-                  break;
-               case 399:
-               case 766:
-                  if ((0x8000000080L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 400:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 399;
-                  break;
-               case 401:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 400;
-                  break;
-               case 402:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 401;
-                  break;
-               case 403:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 402;
-                  break;
-               case 406:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 405;
-                  break;
-               case 408:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 407;
-                  break;
-               case 409:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 408;
-                  break;
-               case 411:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 410;
-                  break;
-               case 412:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(280); }
-                  break;
-               case 413:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 412;
-                  break;
-               case 414:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 413;
-                  break;
-               case 417:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 416;
-                  break;
-               case 418:
-                  if ((0x200000002000L & l) != 0L)
-                     { jjAddStates(121, 124); }
-                  break;
-               case 425:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 424;
-                  break;
-               case 426:
-               case 665:
-               case 835:
-               case 888:
-                  if ((0x100000001000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 429:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 428;
-                  break;
-               case 431:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 430;
-                  break;
-               case 432:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 431;
-                  break;
-               case 433:
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAddStates(114, 120); }
-                  break;
-               case 434:
-               case 526:
-               case 550:
-               case 775:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(156); }
-                  break;
-               case 438:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 437;
-                  break;
-               case 439:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 438;
-                  break;
-               case 441:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 440;
-                  break;
-               case 442:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 441;
-                  break;
-               case 444:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 443;
-                  break;
-               case 445:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 444;
-                  break;
-               case 446:
-                  if ((0x100000001000000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 447:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 446;
-                  break;
-               case 448:
-                  if ((0x4000000040L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 452:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 451;
-                  break;
-               case 453:
-               case 541:
-                  if ((0x20000000200L & l) != 0L)
-                     { jjCheckNAdd(251); }
-                  break;
-               case 454:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 453;
-                  break;
-               case 455:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 454;
-                  break;
-               case 456:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 455;
-                  break;
-               case 457:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 456;
-                  break;
-               case 458:
-                  if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAddStates(107, 113); }
-                  break;
-               case 460:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 459;
-                  break;
-               case 461:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 460;
-                  break;
-               case 462:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 461;
-                  break;
-               case 463:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 462;
-                  break;
-               case 464:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 463;
-                  break;
-               case 465:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 464;
-                  break;
-               case 466:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 465;
-                  break;
-               case 467:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 466;
-                  break;
-               case 470:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 469;
-                  break;
-               case 471:
-               case 675:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(30); }
-                  break;
-               case 472:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 471;
-                  break;
-               case 474:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 473;
-                  break;
-               case 475:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 474;
-                  break;
-               case 476:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 475;
-                  break;
-               case 480:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 479;
-                  break;
-               case 481:
-                  if ((0x1000000010000L & l) != 0L)
-                     { jjCheckNAdd(156); }
-                  break;
-               case 482:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 481;
-                  break;
-               case 483:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 482;
-                  break;
-               case 484:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 483;
-                  break;
-               case 485:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 484;
-                  break;
-               case 486:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 485;
-                  break;
-               case 487:
-                  if ((0x1000000010000L & l) != 0L)
-                     { jjAddStates(96, 106); }
-                  break;
-               case 490:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 489;
-                  break;
-               case 491:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 490;
-                  break;
-               case 492:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 491;
-                  break;
-               case 493:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 492;
-                  break;
-               case 495:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 494;
-                  break;
-               case 496:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 495;
-                  break;
-               case 497:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 496;
-                  break;
-               case 499:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 498;
-                  break;
-               case 501:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 500;
-                  break;
-               case 502:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 501;
-                  break;
-               case 503:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 502;
-                  break;
-               case 504:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 503;
-                  break;
-               case 505:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 504;
-                  break;
-               case 506:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 505;
-                  break;
-               case 507:
-               case 534:
-               case 825:
-                  if ((0x4000000040000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 508:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 507;
-                  break;
-               case 509:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 508;
-                  break;
-               case 510:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 509;
-                  break;
-               case 511:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 510;
-                  break;
-               case 513:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 512;
-                  break;
-               case 514:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 513;
-                  break;
-               case 515:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 514;
-                  break;
-               case 516:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 515;
-                  break;
-               case 517:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 516;
-                  break;
-               case 518:
-               case 668:
-                  if ((0x4000000040000L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  break;
-               case 519:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 518;
-                  break;
-               case 520:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 519;
-                  break;
-               case 521:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 520;
-                  break;
-               case 522:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 521;
-                  break;
-               case 524:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 523;
-                  break;
-               case 525:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 524;
-                  break;
-               case 527:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 526;
-                  break;
-               case 528:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 527;
-                  break;
-               case 529:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 528;
-                  break;
-               case 530:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 529;
-                  break;
-               case 531:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 530;
-                  break;
-               case 532:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 531;
-                  break;
-               case 533:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 532;
-                  break;
-               case 535:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 534;
-                  break;
-               case 536:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 535;
-                  break;
-               case 537:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 536;
-                  break;
-               case 538:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 537;
-                  break;
-               case 539:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 538;
-                  break;
-               case 540:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 539;
-                  break;
-               case 542:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 541;
-                  break;
-               case 543:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 542;
-                  break;
-               case 544:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 543;
-                  break;
-               case 545:
-                  if ((0x4000000040000L & l) != 0L)
-                     { jjAddStates(88, 95); }
-                  break;
-               case 548:
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(280); }
-                  break;
-               case 549:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 548;
-                  break;
-               case 551:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 550;
-                  break;
-               case 552:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 551;
-                  break;
-               case 553:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 552;
-                  break;
-               case 554:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 553;
-                  break;
-               case 555:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 554;
-                  break;
-               case 556:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 555;
-                  break;
-               case 557:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 556;
-                  break;
-               case 559:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 558;
-                  break;
-               case 560:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 559;
-                  break;
-               case 561:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 560;
-                  break;
-               case 562:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 561;
-                  break;
-               case 563:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 562;
-                  break;
-               case 565:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 564;
-                  break;
-               case 566:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 565;
-                  break;
-               case 567:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 566;
-                  break;
-               case 568:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 567;
-                  break;
-               case 569:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 568;
-                  break;
-               case 570:
-                  if ((0x80000000800L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 571:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 570;
-                  break;
-               case 572:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 571;
-                  break;
-               case 573:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 572;
-                  break;
-               case 575:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 574;
-                  break;
-               case 576:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 575;
-                  break;
-               case 577:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 576;
-                  break;
-               case 579:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 578;
-                  break;
-               case 580:
-                  if ((0x80000000800000L & l) != 0L)
-                     { jjCheckNAdd(156); }
-                  break;
-               case 581:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 580;
-                  break;
-               case 582:
-                  if ((0x8000000080000L & l) != 0L)
-                     { jjAddStates(71, 87); }
-                  break;
-               case 583:
-                  if ((0x200000002L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 584:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 583;
-                  break;
-               case 585:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 584;
-                  break;
-               case 586:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 585;
-                  break;
-               case 588:
-                  if ((0x100000001000L & l) != 0L)
-                     { jjCheckNAdd(280); }
-                  break;
-               case 589:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 588;
-                  break;
-               case 590:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 589;
-                  break;
-               case 591:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 590;
-                  break;
-               case 593:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 592;
-                  break;
-               case 595:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 594;
-                  break;
-               case 597:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 596;
-                  break;
-               case 598:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 597;
-                  break;
-               case 599:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 598;
-                  break;
-               case 600:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 599;
-                  break;
-               case 602:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 601;
-                  break;
-               case 603:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 602;
-                  break;
-               case 604:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 603;
-                  break;
-               case 605:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 604;
-                  break;
-               case 607:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 606;
-                  break;
-               case 608:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 607;
-                  break;
-               case 609:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 608;
-                  break;
-               case 610:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 609;
-                  break;
-               case 611:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 610;
-                  break;
-               case 612:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 611;
-                  break;
-               case 613:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 612;
-                  break;
-               case 614:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 613;
-                  break;
-               case 615:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 614;
-                  break;
-               case 616:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 618:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 617;
-                  break;
-               case 620:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 619;
-                  break;
-               case 621:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 620;
-                  break;
-               case 622:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 621;
-                  break;
-               case 623:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 622;
-                  break;
-               case 624:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 623;
-                  break;
-               case 626:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 625;
-                  break;
-               case 628:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 627;
-                  break;
-               case 629:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 628;
-                  break;
-               case 630:
-                  if ((0x2000000020000L & l) != 0L)
-                     { jjCheckNAdd(280); }
-                  break;
-               case 632:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 631;
-                  break;
-               case 633:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 632;
-                  break;
-               case 635:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 634;
-                  break;
-               case 637:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 636;
-                  break;
-               case 638:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 637;
-                  break;
-               case 639:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 638;
-                  break;
-               case 640:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 639;
-                  break;
-               case 641:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 640;
-                  break;
-               case 643:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 642;
-                  break;
-               case 644:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 643;
-                  break;
-               case 645:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 644;
-                  break;
-               case 646:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 645;
-                  break;
-               case 647:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 646;
-                  break;
-               case 649:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 648;
-                  break;
-               case 650:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 649;
-                  break;
-               case 651:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 650;
-                  break;
-               case 652:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 651;
-                  break;
-               case 654:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 653;
-                  break;
-               case 656:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 655;
-                  break;
-               case 657:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 656;
-                  break;
-               case 658:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 657;
-                  break;
-               case 659:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 658;
-                  break;
-               case 660:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 659;
-                  break;
-               case 661:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 660;
-                  break;
-               case 662:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 661;
-                  break;
-               case 663:
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 662;
-                  break;
-               case 664:
-                  if ((0x10000000100000L & l) != 0L)
-                     { jjCheckNAddStates(57, 70); }
-                  break;
-               case 669:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 668;
-                  break;
-               case 670:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 669;
-                  break;
-               case 671:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 670;
-                  break;
-               case 672:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 671;
-                  break;
-               case 673:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 672;
-                  break;
-               case 674:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 673;
-                  break;
-               case 676:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 675;
-                  break;
-               case 678:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 677;
-                  break;
-               case 680:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 679;
-                  break;
-               case 681:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 680;
-                  break;
-               case 682:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 681;
-                  break;
-               case 683:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 682;
-                  break;
-               case 684:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 683;
-                  break;
-               case 685:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 684;
-                  break;
-               case 687:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 686;
-                  break;
-               case 688:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 687;
-                  break;
-               case 689:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 688;
-                  break;
-               case 690:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 689;
-                  break;
-               case 691:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 690;
-                  break;
-               case 692:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 691;
-                  break;
-               case 693:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 692;
-                  break;
-               case 694:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 693;
-                  break;
-               case 695:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 694;
-                  break;
-               case 696:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 695;
-                  break;
-               case 698:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 697;
-                  break;
-               case 699:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 698;
-                  break;
-               case 700:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 699;
-                  break;
-               case 701:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 700;
-                  break;
-               case 702:
-                  if (curChar == 95)
-                     jjstateSet[jjnewStateCnt++] = 701;
-                  break;
-               case 703:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 702;
-                  break;
-               case 704:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 703;
-                  break;
-               case 705:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 704;
-                  break;
-               case 706:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 705;
-                  break;
-               case 707:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 706;
-                  break;
-               case 708:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 707;
-                  break;
-               case 709:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 708;
-                  break;
-               case 711:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 710;
-                  break;
-               case 712:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 711;
-                  break;
-               case 713:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 712;
-                  break;
-               case 715:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 714;
-                  break;
-               case 717:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 716;
-                  break;
-               case 718:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 717;
-                  break;
-               case 719:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 718;
-                  break;
-               case 720:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 719;
-                  break;
-               case 721:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 720;
-                  break;
-               case 722:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 721;
-                  break;
-               case 723:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 722;
-                  break;
-               case 724:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 723;
-                  break;
-               case 726:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 725;
-                  break;
-               case 727:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 726;
-                  break;
-               case 728:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 727;
-                  break;
-               case 729:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 728;
-                  break;
-               case 730:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 729;
-                  break;
-               case 731:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 730;
-                  break;
-               case 733:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 732;
-                  break;
-               case 734:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 733;
-                  break;
-               case 735:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 734;
-                  break;
-               case 736:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 735;
-                  break;
-               case 737:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 736;
-                  break;
-               case 738:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 737;
-                  break;
-               case 739:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 738;
-                  break;
-               case 740:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 739;
-                  break;
-               case 741:
-                  if ((0x200000002000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 742:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 741;
-                  break;
-               case 743:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 742;
-                  break;
-               case 744:
-                  if ((0x20000000200000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 745:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 744;
-                  break;
-               case 746:
-                  if ((0x20000000200000L & l) != 0L)
-                     { jjAddStates(50, 56); }
-                  break;
-               case 748:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 747;
-                  break;
-               case 751:
-                  if ((0x2000000020000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 750;
-                  break;
-               case 752:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 751;
-                  break;
-               case 753:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 752;
-                  break;
-               case 754:
-                  if ((0x80000000800000L & l) != 0L)
-                     { jjCheckNAdd(30); }
-                  break;
-               case 755:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 754;
-                  break;
-               case 756:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 755;
-                  break;
-               case 757:
-                  if ((0x80000000800L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 756;
-                  break;
-               case 758:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 757;
-                  break;
-               case 760:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 759;
-                  break;
-               case 761:
-                  if ((0x1000000010L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 760;
-                  break;
-               case 762:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 761;
-                  break;
-               case 764:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 763;
-                  break;
-               case 765:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 764;
-                  break;
-               case 768:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 767;
-                  break;
-               case 769:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjCheckNAdd(3); }
-                  break;
-               case 770:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 769;
-                  break;
-               case 771:
-                  if ((0x40000000400000L & l) != 0L)
-                     { jjAddStates(45, 49); }
-                  break;
-               case 773:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 772;
-                  break;
-               case 774:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 773;
-                  break;
-               case 776:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 775;
-                  break;
-               case 777:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 776;
-                  break;
-               case 778:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 777;
-                  break;
-               case 780:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 779;
-                  break;
-               case 781:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 780;
-                  break;
-               case 782:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 781;
-                  break;
-               case 783:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 782;
-                  break;
-               case 785:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 784;
-                  break;
-               case 786:
-                  if ((0x200000002000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 785;
-                  break;
-               case 787:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 786;
-                  break;
-               case 788:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 787;
-                  break;
-               case 789:
-                  if ((0x80000000800000L & l) != 0L && kind > 2)
-                     kind = 2;
-                  break;
-               case 790:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 789;
-                  break;
-               case 791:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 790;
-                  break;
-               case 792:
-                  if ((0x80000000800000L & l) != 0L)
-                     { jjAddStates(40, 44); }
-                  break;
-               case 796:
-                  if ((0x40000000400000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 795;
-                  break;
-               case 797:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 796;
-                  break;
-               case 799:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 798;
-                  break;
-               case 800:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 799;
-                  break;
-               case 802:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 801;
-                  break;
-               case 803:
-                  if ((0x4000000040000L & l) != 0L)
-                     { jjCheckNAdd(102); }
-                  break;
-               case 804:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 803;
-                  break;
-               case 806:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 805;
-                  break;
-               case 807:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 806;
-                  break;
-               case 808:
-                  if ((0x1000000010L & l) != 0L)
-                     { jjAddStates(23, 39); }
-                  break;
-               case 811:
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  break;
-               case 813:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 812;
-                  break;
-               case 814:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 813;
-                  break;
-               case 815:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 814;
-                  break;
-               case 816:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 815;
-                  break;
-               case 817:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 816;
-                  break;
-               case 819:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 818;
-                  break;
-               case 821:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 820;
-                  break;
-               case 822:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 821;
-                  break;
-               case 823:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 822;
-                  break;
-               case 824:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 823;
-                  break;
-               case 826:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 825;
-                  break;
-               case 827:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 826;
-                  break;
-               case 828:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 827;
-                  break;
-               case 829:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 828;
-                  break;
-               case 830:
-                  if ((0x100000001000L & l) != 0L)
-                     { jjCheckNAdd(34); }
-                  break;
-               case 831:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 830;
-                  break;
-               case 832:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 831;
-                  break;
-               case 833:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 832;
-                  break;
-               case 834:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 833;
-                  break;
-               case 836:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 835;
-                  break;
-               case 837:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 836;
-                  break;
-               case 838:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 837;
-                  break;
-               case 839:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 838;
-                  break;
-               case 840:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 839;
-                  break;
-               case 841:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 840;
-                  break;
-               case 842:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 841;
-                  break;
-               case 844:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 843;
-                  break;
-               case 845:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 844;
-                  break;
-               case 846:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 845;
-                  break;
-               case 847:
-                  if ((0x4000000040L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 846;
-                  break;
-               case 848:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 847;
-                  break;
-               case 850:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 849;
-                  break;
-               case 851:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 850;
-                  break;
-               case 852:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 851;
-                  break;
-               case 853:
-                  if ((0x400000004L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 854:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 853;
-                  break;
-               case 857:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 856;
-                  break;
-               case 858:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 857;
-                  break;
-               case 860:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 859;
-                  break;
-               case 861:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 860;
-                  break;
-               case 862:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 861;
-                  break;
-               case 863:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 862;
-                  break;
-               case 864:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 863;
-                  break;
-               case 865:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 864;
-                  break;
-               case 866:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 865;
-                  break;
-               case 867:
-                  if ((0x800000008L & l) != 0L)
-                     { jjCheckNAdd(156); }
-                  break;
-               case 868:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 867;
-                  break;
-               case 869:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 868;
-                  break;
-               case 870:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 869;
-                  break;
-               case 871:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 870;
-                  break;
-               case 872:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 871;
-                  break;
-               case 873:
-                  if ((0x8000000080L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 872;
-                  break;
-               case 875:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 874;
-                  break;
-               case 877:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 876;
-                  break;
-               case 878:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 877;
-                  break;
-               case 879:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 878;
-                  break;
-               case 880:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 879;
-                  break;
-               case 882:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 881;
-                  break;
-               case 883:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 882;
-                  break;
-               case 885:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 884;
-                  break;
-               case 886:
-                  if ((0x200000002000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 885;
-                  break;
-               case 887:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 886;
-                  break;
-               case 889:
-                  if ((0x400000004L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 888;
-                  break;
-               case 890:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 889;
-                  break;
-               case 891:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 890;
-                  break;
-               case 892:
-                  if ((0x800000008000L & l) != 0L)
-                     { jjCheckNAdd(217); }
-                  break;
-               case 893:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 892;
-                  break;
-               case 894:
-                  if ((0x10000000100000L & l) != 0L && kind > 20)
-                     kind = 20;
-                  break;
-               case 895:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 894;
-                  break;
-               case 896:
-                  if ((0x400000004000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 895;
-                  break;
-               case 898:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 897;
-                  break;
-               case 899:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 898;
-                  break;
-               case 900:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 899;
-                  break;
-               case 901:
-                  if ((0x200000002L & l) != 0L)
-                     { jjCheckNAddStates(12, 22); }
-                  break;
-               case 903:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 902;
-                  break;
-               case 904:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 903;
-                  break;
-               case 909:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 908;
-                  break;
-               case 911:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 910;
-                  break;
-               case 912:
-                  if ((0x1000000010L & l) != 0L)
-                     { jjCheckNAdd(53); }
-                  break;
-               case 914:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 913;
-                  break;
-               case 915:
-                  if ((0x800000008L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 914;
-                  break;
-               case 916:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 915;
-                  break;
-               case 917:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 916;
-                  break;
-               case 918:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 917;
-                  break;
-               case 920:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 919;
-                  break;
-               case 921:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 920;
-                  break;
-               case 922:
-                  if ((0x400000004000L & l) != 0L)
-                     { jjCheckNAdd(7); }
-                  break;
-               case 923:
-                  if ((0x4000000040000L & l) != 0L)
-                     { jjCheckNAdd(13); }
-                  break;
-               case 925:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 924;
-                  break;
-               case 926:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 925;
-                  break;
-               case 927:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 926;
-                  break;
-               case 928:
-                  if ((0x2000000020L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 927;
-                  break;
-               case 930:
-                  if ((0x8000000080000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 929;
-                  break;
-               case 932:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 931;
-                  break;
-               case 933:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 932;
-                  break;
-               case 934:
-                  if ((0x200000002L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 933;
-                  break;
-               case 935:
-                  if ((0x400000004000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 934;
-                  break;
-               case 936:
-                  if ((0x20000000200L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 935;
-                  break;
-               case 937:
-                  if ((0x4000000040000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 936;
-                  break;
-               case 938:
-                  if ((0x800000008000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 937;
-                  break;
-               case 939:
-                  if ((0x10000000100L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 938;
-                  break;
-               case 940:
-                  if ((0x10000000100000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 939;
-                  break;
-               case 941:
-                  if ((0x20000000200000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 940;
-                  break;
-               case 942:
-                  if ((0x100000001000L & l) != 0L && kind > 20)
-                     kind = 20;
-                  break;
-               case 943:
-                  if ((0x100000001000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 942;
-                  break;
-               case 946:
-                  if ((0x2000000020L & l) != 0L)
-                     { jjAddStates(199, 200); }
-                  break;
-               case 960:
-               case 961:
-                  if ((0x6fffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 102)
-                     kind = 102;
-                  { jjCheckNAdd(961); }
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 23:
-                  if ((jjbitVec0[i2] & l2) == 0L)
-                     break;
-                  if (kind > 91)
-                     kind = 91;
-                  { jjAddStates(9, 11); }
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 962 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1){
-   switch (pos)
-   {
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_1(int pos, long active0, long active1){
-   return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0, active1), pos + 1);
-}
-private int jjMoveStringLiteralDfa0_1(){
-   switch(curChar)
-   {
-      case 39:
-         return jjStartNfaWithStates_1(0, 94, 1);
-      default :
-         return jjMoveNfa_1(0, 0);
-   }
-}
-private int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_1(state, pos + 1);
-}
-private int jjMoveNfa_1(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 3;
-   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 0:
-                  if ((0xffffff7fffffffffL & l) != 0L)
-                  {
-                     if (kind > 93)
-                        kind = 93;
-                  }
-                  else if (curChar == 39)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 1:
-                  if (curChar == 39 && kind > 93)
-                     kind = 93;
-                  break;
-               case 2:
-                  if (curChar == 39)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  kind = 93;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((jjbitVec0[i2] & l2) != 0L && kind > 93)
-                     kind = 93;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-static final int[] jjnextStates = {
-   951, 952, 953, 946, 955, 956, 958, 959, 960, 23, 24, 26, 907, 911, 912, 918, 
-   921, 922, 923, 930, 34, 941, 943, 810, 811, 819, 824, 829, 834, 842, 848, 852, 
-   858, 866, 875, 883, 887, 891, 893, 900, 794, 800, 802, 804, 807, 774, 778, 783, 
-   788, 791, 749, 753, 758, 762, 765, 768, 770, 667, 674, 676, 678, 685, 696, 709, 
-   320, 715, 724, 731, 740, 743, 745, 587, 591, 595, 600, 605, 615, 616, 618, 624, 
-   626, 629, 630, 635, 641, 647, 654, 663, 547, 549, 557, 563, 569, 573, 579, 581, 
-   488, 493, 499, 506, 511, 517, 522, 525, 533, 540, 544, 468, 448, 470, 472, 476, 
-   480, 486, 436, 442, 445, 447, 320, 452, 457, 421, 425, 429, 432, 404, 406, 411, 
-   414, 417, 332, 339, 346, 353, 356, 365, 369, 370, 375, 382, 388, 390, 397, 315, 
-   319, 320, 322, 325, 295, 298, 301, 304, 305, 310, 313, 249, 250, 257, 261, 265, 
-   272, 274, 279, 286, 291, 52, 59, 61, 63, 69, 71, 78, 87, 101, 105, 108, 
-   114, 119, 126, 130, 134, 139, 147, 155, 165, 171, 176, 187, 191, 196, 206, 216, 
-   232, 242, 246, 33, 35, 44, 46, 947, 948, 
-};
-
-/** Token literal values. */
-public static final String[] jjstrLiteralImages = {
-"", null, null, "\50", "\51", "\56", "\54", "\73", "\174\174", "\53", "\55", 
-"\52", "\57", "\75", null, "\74", "\74\75", "\76", "\76\75", null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, };
-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;
-      jjmatchedPos = -1;
-      matchedToken = jjFillToken();
-      CommonTokenAction(matchedToken);
-      return matchedToken;
-   }
-   image = jjimage;
-   image.setLength(0);
-   jjimageLen = 0;
-
-   for (;;)
-   {
-     switch(curLexState)
-     {
-       case 0:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_0();
-         break;
-       case 1:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_1();
-         break;
-       case 2:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_2();
-         break;
-     }
-     if (jjmatchedKind != 0x7fffffff)
-     {
-        if (jjmatchedPos + 1 < curPos)
-           input_stream.backup(curPos - jjmatchedPos - 1);
-        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           matchedToken = jjFillToken();
-           TokenLexicalActions(matchedToken);
-       if (jjnewLexState[jjmatchedKind] != -1)
-         curLexState = jjnewLexState[jjmatchedKind];
-           CommonTokenAction(matchedToken);
-           return matchedToken;
-        }
-        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-         if (jjnewLexState[jjmatchedKind] != -1)
-           curLexState = jjnewLexState[jjmatchedKind];
-           continue EOFLoop;
-        }
-        jjimageLen += jjmatchedPos + 1;
-      if (jjnewLexState[jjmatchedKind] != -1)
-        curLexState = jjnewLexState[jjmatchedKind];
-        curPos = 0;
-        jjmatchedKind = 0x7fffffff;
-        try {
-           curChar = input_stream.readChar();
-           continue;
-        }
-        catch (java.io.IOException e1) { }
-     }
-     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);
-   }
-  }
-}
-
-void TokenLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      case 2 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-          matchedToken.sqlReserved = true;
-         break;
-      case 19 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                             matchedToken.adqlReserved = true;
-         break;
-      case 20 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                             matchedToken.adqlReserved = true;
-         break;
-      case 21 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                             matchedToken.adqlReserved = true;
-         break;
-      case 22 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 23 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 24 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 25 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 26 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 27 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 28 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 29 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 30 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 31 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 32 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 33 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 34 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 35 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 36 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 37 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 38 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 39 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 40 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 matchedToken.adqlReserved = true;
-         break;
-      case 41 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 42 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 43 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 44 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 45 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 46 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 47 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 48 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                               matchedToken.adqlReserved = true;
-         break;
-      case 49 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 50 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 51 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 52 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 53 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 54 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 55 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 56 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 57 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 58 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 59 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 60 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 61 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 62 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 63 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 64 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 65 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 66 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                       matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 67 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 68 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 69 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 70 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 71 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 72 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 73 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 74 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 75 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 76 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 77 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 78 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 79 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 80 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 81 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 82 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                   matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 83 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 84 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 85 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 86 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 87 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 88 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 89 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      case 90 :
-        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                             matchedToken.adqlReserved = matchedToken.isFunctionName = true;
-         break;
-      default :
-         break;
-   }
-}
-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);
-}
-
-    /** Constructor. */
-    public ADQLParser201TokenManager(SimpleCharStream stream){
-
-      if (SimpleCharStream.staticFlag)
-            throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-
-    input_stream = stream;
-  }
-
-  /** Constructor. */
-  public ADQLParser201TokenManager (SimpleCharStream stream, int lexState){
-    ReInit(stream);
-    SwitchTo(lexState);
-  }
-
-  /** Reinitialise parser. */
-  public void ReInit(SimpleCharStream stream)
-  {
-    jjmatchedPos = jjnewStateCnt = 0;
-    curLexState = defaultLexState;
-    input_stream = stream;
-    ReInitRounds();
-  }
-
-  private void ReInitRounds()
-  {
-    int i;
-    jjround = 0x80000001;
-    for (i = 962; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-  }
-
-  /** Reinitialise parser. */
-  public void ReInit(SimpleCharStream stream, int lexState)
-  {
-    ReInit(stream);
-    SwitchTo(lexState);
-  }
-
-  /** Switch to specified lex state. */
-  public void SwitchTo(int lexState)
-  {
-    if (lexState >= 3 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-    else
-      curLexState = lexState;
-  }
-
-/** Lexer state names. */
-public static final String[] lexStateNames = {
-   "DEFAULT",
-   "WithinString",
-   "WithinDelimitedId",
-};
-
-/** Lex State array. */
-public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 0, -1, -1, -1, -1, 2, 
-   -1, 0, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xfffffffffffffffdL, 0x63c7ffffffL, 
-};
-static final long[] jjtoSkip = {
-   0x2L, 0x8000000L, 
-};
-static final long[] jjtoMore = {
-   0x0L, 0x1830000000L, 
-};
-    protected SimpleCharStream  input_stream;
-
-    private final int[] jjrounds = new int[962];
-    private final int[] jjstateSet = new int[2 * 962];
-
-    private final StringBuilder jjimage = new StringBuilder();
-    private StringBuilder image = jjimage;
-    private int jjimageLen;
-    private int lengthOfMatch;
-    
-    protected char curChar;
-}
diff --git a/src/adql/parser/ADQLParserFactory.java b/src/adql/parser/ADQLParserFactory.java
deleted file mode 100644
index 735a370..0000000
--- a/src/adql/parser/ADQLParserFactory.java
+++ /dev/null
@@ -1,370 +0,0 @@
-package adql.parser;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import adql.db.exception.UnresolvedIdentifiersException;
-import adql.query.ADQLQuery;
-import adql.translator.PostgreSQLTranslator;
-import adql.translator.TranslationException;
-
-/**
- * Factory of ADQL parsers.
- *
- * <h3>ADQL versions</h3>
- *
- * <p>
- * 	It is able to deal with all versions of the ADQL grammar supported by this
- * 	library. All these versions are listed in the enumeration
- * 	{@link ADQLVersion}.
- * </p>
- *
- * <p>
- * 	To create a such factory, an ADQL version must be provided. If none is
- * 	given, the default one will be used (<i>see {@link #DEFAULT_VERSION}</i>).
- * </p>
- *
- * <h3>Runnable class</h3>
- *
- * <p>
- * 	This class includes a main function and thus, it can be executed directly.
- * 	Its execution allows to parse an ADQL query. Then, in function of the passed
- * 	parameters, it is possible to just check its syntax, translate it into SQL
- * 	or try to fix the query.
- * </p>
- * <p><i>
- * 	To get help about this program, just run it with the argument
- * 	<code>-h</code> or <code>--help</code>.
- * </i></p>
- *
- * @author Gr&eacute;gory Mantelet (CDS)
- * @version 2.0 (04/2019)
- * @since 2.0
- */
-public class ADQLParserFactory {
-
-	/* **********************************************************************
-	 *                         VERSION MANAGEMENT
-	 * ********************************************************************** */
-
-	/**
-	 * Enumeration of all supported versions of the ADQL grammar.
-	 *
-	 * @author Gr&eacute;gory Mantelet (CDS)
-	 * @version 2.0 (04/2019)
-	 * @since 2.0
-	 */
-	public static enum ADQLVersion {
-		/** Version REC-2.0 - <a href="http://www.ivoa.net/documents/cover/ADQL-20081030.html">http://www.ivoa.net/documents/cover/ADQL-20081030.html</a>. */
-		V2_0,
-		/** Version PR-2.1 - <a href="http://www.ivoa.net/documents/ADQL/20180112/index.html">http://www.ivoa.net/documents/ADQL/20180112/index.html</a>. */
-		V2_1; // TODO Move 2.1 as default when it becomes REC
-
-		@Override
-		public String toString() {
-			return name().toLowerCase().replace('_', '.');
-		}
-
-		/** TODO JUnit for ADQLVersion.parse(String)
-		 * Parse the given string as an ADQL version number.
-		 *
-		 * <p>This function should work with the following syntaxes:</p>
-		 * <ul>
-		 * 	<li><code>2.0</code></li>
-		 * 	<li><code>2_0</code></li>
-		 * 	<li><code>v2.0</code> or <code>V2.0</code></li>
-		 * 	<li><code>v2_0</code> or <code>V2_0</code></li>
-		 * </ul>
-		 *
-		 * @param str	String to parse as an ADQL version specification.
-		 *
-		 * @return	The identified ADQL version.
-		 */
-		public static ADQLVersion parse(String str) {
-			if (str == null)
-				return null;
-
-			str = str.trim().toUpperCase();
-
-			if (str.isEmpty())
-				return null;
-
-			if (str.charAt(0) != 'V')
-				str = 'V' + str;
-
-			try {
-				return ADQLVersion.valueOf(str.replaceAll("\\.", "_"));
-			} catch(IllegalArgumentException iae) {
-				return null;
-			}
-		}
-	}
-
-	/** Version of the ADQL grammar to use when none is specified:
-	 * {@link ADQLVersion#V2_0 2.0}. */
-	public final static ADQLVersion DEFAULT_VERSION = ADQLVersion.V2_0; // TODO Move 2.1 as default when it becomes REC
-
-	/**
-	 * Get the list of all supported ADQL grammar versions.
-	 *
-	 * @return	List of all supported ADQL versions.
-	 *
-	 * @see ADQLVersion#values()
-	 */
-	public static ADQLVersion[] getSupportedVersions() {
-		return ADQLVersion.values();
-	}
-
-	/**
-	 * Build on the fly a human list of all supported ADQL grammar versions.
-	 *
-	 * <p><i><b>Example:</b> <code>v2.0</code>, <code>v2.1</code>.</i></p>
-	 *
-	 * @return	List of all supported ADQL versions.
-	 */
-	public static String getSupportedVersionsAsString() {
-		StringBuilder buf = new StringBuilder();
-		for(ADQLVersion v : ADQLVersion.values()) {
-			if (buf.length() > 0)
-				buf.append(", ");
-			buf.append(v.toString());
-			if (v == DEFAULT_VERSION)
-				buf.append(" (default)");
-		}
-		return buf.toString();
-	}
-
-	/* **********************************************************************
-	 *                          PARSER CREATION
-	 * ********************************************************************** */
-
-	/**
-	 * Builds a parser whose the query to parse will have to be given as a
-	 * String in parameter of
-	 * {@link ADQLParser#parseQuery(java.lang.String) parseQuery(String)}.
-	 */
-	public final ADQLParser createParser() {
-		return createParser(DEFAULT_VERSION);
-	}
-
-	/**
-	 * Builds a parser whose the query to parse will have to be given as a
-	 * String in parameter of
-	 * {@link ADQLParser#parseQuery(java.lang.String) parseQuery(String)}.
-	 *
-	 * @param version	Version of the ADQL grammar that the parser must
-	 *               	implement.
-	 *               	<i>If NULL, the {@link #DEFAULT_VERSION} will be used.</i>
-	 */
-	public ADQLParser createParser(ADQLVersion version) {
-		// Prevent the NULL value by setting the default version if necessary:
-		if (version == null)
-			version = DEFAULT_VERSION;
-
-		// Create the appropriate parser in function of the specified version:
-		switch(version) {
-			case V2_0:
-				return new ADQLParser200();
-			case V2_1:
-			default:
-				return new ADQLParser201();
-		}
-	}
-
-	/* **********************************************************************
-	 *                       STATIC PARSER CREATION
-	 * ********************************************************************** */
-
-	/** Factory to use only when a default parser is asked without any
-	 * {@link ADQLParserFactory} instance.
-	 * @see #createDefaultParser() */
-	private static volatile ADQLParserFactory defaultFactory = null;
-
-	/**
-	 * Create an ADQL parser with the default ADQL grammar version (see
-	 * {@link #DEFAULT_VERSION}).
-	 *
-	 * @return	A new parser implementing the default version supported by this
-	 *        	library.
-	 */
-	public final static ADQLParser createDefaultParser() {
-		// Create the default factory, if not already done:
-		if (defaultFactory == null) {
-			synchronized (ADQLParserFactory.class) {
-				if (defaultFactory == null)
-					defaultFactory = new ADQLParserFactory();
-			}
-		}
-
-		// Create a parser implementing the default version of the ADQL grammar:
-		return defaultFactory.createParser(DEFAULT_VERSION);
-	}
-
-	/* **********************************************************************
-	 *                           MAIN FUNCTION
-	 * ********************************************************************** */
-
-	/**
-	* Parses the given ADQL query.
-	*
-	* <p>The result of the parsing depends of the parameters:</p>
-	*
-	* <p>
-	*     <b>ONLY the syntax is checked: the query is NOT EXECUTED !</b>
-	* </p>
-	*/
-	public static final void main(String[] args) throws Exception {
-		final String USAGE = "Usage:\n    adqlParser.jar [-version=...] [-h] [-d] [-v] [-e] [-a|-s] [-f] [<FILE>|<URL>]\n\nNOTE: If no file or URL is given, the ADQL query is expected in the standard\n      input. This query must end with a ';' or <Ctrl+D>!\n\nParameters:\n    -version=...    : Set the version of the ADQL grammar to follow.\n                      It must be one among: " + getSupportedVersionsAsString() + "\n    -h or --help    : Display this help.\n    -v or --verbose : Print the main steps of the parsing\n    -d or --debug   : Print stack traces when a grave error occurs\n    -e or --explain : Explain the ADQL parsing (or Expand the parsing tree)\n    -a or --adql    : Display the understood ADQL query\n    -s or --sql     : Ask the SQL translation of the given ADQL query\n                      (SQL compatible with PostgreSQL)\n    -f or --try-fix : Try fixing the most common ADQL query issues before\n                      attempting to parse the query.\n\nReturn:\n    By default: nothing if the query is correct. Otherwise a message explaining\n                why the query is not correct is displayed.\n    With the -s option, the SQL translation of the given ADQL query will be\n    returned.\n    With the -a option, the ADQL query is returned as it has been understood.\n\nExit status:\n    0  OK !\n    1  Parameter error (missing or incorrect parameter)\n    2  File error (incorrect file/url, reading error, ...)\n    3  Parsing error (syntactic or semantic error)\n    4  Translation error (a problem has occurred during the translation of the\n       given ADQL query in SQL).";
-		final String NEED_HELP_MSG = "Try -h or --help to get more help about the usage of this program.";
-		final String urlRegex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
-
-		ADQLParser parser;
-
-		short mode = -1;
-		String file = null;
-		ADQLVersion version = DEFAULT_VERSION;
-		boolean verbose = false, debug = false, explain = false, tryFix = false;
-
-		// Parameters reading:
-		for(int i = 0; i < args.length; i++) {
-			if (args[i].startsWith("-version=")) {
-				String[] parts = args[i].split("=");
-				if (parts.length <= 1) {
-					System.err.println("((!)) Missing ADQL version! It must be one among: " + getSupportedVersionsAsString() + ". ((!))\n" + NEED_HELP_MSG);
-					System.exit(1);
-				}
-				String strVersion = parts[1].replaceAll("\\.", "_");
-				version = ADQLVersion.parse(strVersion);
-				if (version == null) {
-					System.err.println("((!)) Incorrect ADQL version: \"" + args[i].split("=")[1] + "\"! It must be one among: " + getSupportedVersionsAsString() + ". ((!))\n" + NEED_HELP_MSG);
-					System.exit(1);
-				}
-			} else if (args[i].equalsIgnoreCase("-d") || args[i].equalsIgnoreCase("--debug"))
-				debug = true;
-			else if (args[i].equalsIgnoreCase("-v") || args[i].equalsIgnoreCase("--verbose"))
-				verbose = true;
-			else if (args[i].equalsIgnoreCase("-e") || args[i].equalsIgnoreCase("--explain"))
-				explain = true;
-			else if (args[i].equalsIgnoreCase("-a") || args[i].equalsIgnoreCase("--adql")) {
-				if (mode != -1) {
-					System.err.println("((!)) Too much parameter: you must choose between -s, -c, -a or nothing ((!))\n" + NEED_HELP_MSG);
-					System.exit(1);
-				} else
-					mode = 1;
-			} else if (args[i].equalsIgnoreCase("-s") || args[i].equalsIgnoreCase("--sql")) {
-				if (mode != -1) {
-					System.err.println("((!)) Too much parameter: you must choose between -s, -c, -a or nothing ((!))\n" + NEED_HELP_MSG);
-					System.exit(1);
-				} else
-					mode = 2;
-			} else if (args[i].equalsIgnoreCase("-f") || args[i].equalsIgnoreCase("--try-fix"))
-				tryFix = true;
-			else if (args[i].equalsIgnoreCase("-h") || args[i].equalsIgnoreCase("--help")) {
-				System.out.println(USAGE);
-				System.exit(0);
-			} else if (args[i].startsWith("-")) {
-				System.err.println("((!)) Unknown parameter: \"" + args[i] + "\" ((!))\u005cn" + NEED_HELP_MSG);
-				System.exit(1);
-			} else
-				file = args[i].trim();
-		}
-
-		try {
-
-			// Get the parser for the specified ADQL version:
-			parser = (new ADQLParserFactory()).createParser(version);
-
-			// Try fixing the query, if asked:
-			InputStream in = null;
-			if (tryFix) {
-				if (verbose)
-					System.out.println("((i)) Trying to automatically fix the query...");
-
-				String query;
-				try {
-					// get the input stream...
-					if (file == null || file.length() == 0)
-						in = System.in;
-					else if (file.matches(urlRegex))
-						in = (new java.net.URL(file)).openStream();
-					else
-						in = new java.io.FileInputStream(file);
-
-					// ...and try fixing the query:
-					query = parser.tryQuickFix(in);
-				} finally {
-					// close the stream (if opened):
-					if (in != null)
-						in.close();
-					in = null;
-				}
-
-				if (verbose)
-					System.out.println("((i)) SUGGESTED QUERY:\n" + query);
-
-				// Initialise the parser with this fixed query:
-				in = new java.io.ByteArrayInputStream(query.getBytes());
-			}
-			// Otherwise, take the query as provided:
-			else {
-				// Initialise the parser with the specified input:
-				if (file == null || file.length() == 0)
-					in = System.in;
-				else if (file.matches(urlRegex))
-					in = (new java.net.URL(file)).openStream();
-				else
-					in = new java.io.FileInputStream(file);
-			}
-
-			// Enable/Disable the debugging in function of the parameters:
-			parser.setDebug(explain);
-
-			// Query parsing:
-			try {
-				if (verbose)
-					System.out.print("((i)) Parsing ADQL query...");
-				ADQLQuery q = parser.parseQuery(in);
-				if (verbose)
-					System.out.println("((i)) CORRECT ADQL QUERY ((i))");
-				if (mode == 2) {
-					PostgreSQLTranslator translator = new PostgreSQLTranslator();
-					if (verbose)
-						System.out.print("((i)) Translating in SQL...");
-					String sql = translator.translate(q);
-					if (verbose)
-						System.out.println("ok");
-					System.out.println(sql);
-				} else if (mode == 1) {
-					System.out.println(q.toADQL());
-				}
-			} catch(UnresolvedIdentifiersException uie) {
-				System.err.println("((X)) " + uie.getNbErrors() + " unresolved identifiers:");
-				for(ParseException pe : uie)
-					System.err.println("\t - at " + pe.getPosition() + ": " + uie.getMessage());
-				if (debug)
-					uie.printStackTrace(System.err);
-				System.exit(3);
-			} catch(ParseException pe) {
-				System.err.println("((X)) Syntax error: " + pe.getMessage() + " ((X))");
-				if (debug)
-					pe.printStackTrace(System.err);
-				System.exit(3);
-			} catch(TranslationException te) {
-				if (verbose)
-					System.out.println("error");
-				System.err.println("((X)) Translation error: " + te.getMessage() + " ((X))");
-				if (debug)
-					te.printStackTrace(System.err);
-				System.exit(4);
-			}
-
-		} catch(IOException ioe) {
-			System.err.println("\n((X)) Error while reading the file \"" + file + "\": " + ioe.getMessage() + " ((X))");
-			if (debug)
-				ioe.printStackTrace(System.err);
-			System.exit(2);
-		}
-
-	}
-
-}
diff --git a/src/adql/parser/ADQLQueryFactory.java b/src/adql/parser/ADQLQueryFactory.java
index a75c3c4..936dff3 100644
--- a/src/adql/parser/ADQLQueryFactory.java
+++ b/src/adql/parser/ADQLQueryFactory.java
@@ -23,7 +23,7 @@ package adql.parser;
 import java.util.Collection;
 
 import adql.db.FunctionDef;
-import adql.parser.ADQLParserFactory.ADQLVersion;
+import adql.parser.ADQLParser.ADQLVersion;
 import adql.parser.IdentifierItems.IdentifierItem;
 import adql.query.ADQLOrder;
 import adql.query.ADQLQuery;
diff --git a/src/adql/parser/IdentifierItems.java b/src/adql/parser/IdentifierItems.java
index 2cd0ae1..fd71c21 100644
--- a/src/adql/parser/IdentifierItems.java
+++ b/src/adql/parser/IdentifierItems.java
@@ -20,6 +20,9 @@ package adql.parser;
  *                       Astronomisches Rechen Institut (ARI)
  */
 
+
+import adql.parser.grammar.Token;
+
 import adql.query.IdentifierField;
 import adql.query.TextPosition;
 
diff --git a/src/adql/parser/QueryChecker.java b/src/adql/parser/QueryChecker.java
index dec0c61..2ee116f 100644
--- a/src/adql/parser/QueryChecker.java
+++ b/src/adql/parser/QueryChecker.java
@@ -21,6 +21,7 @@ package adql.parser;
  */
 
 import adql.db.DBChecker;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLQuery;
 
 /**
diff --git a/src/adql/parser/QueryFixer.java b/src/adql/parser/QueryFixer.java
new file mode 100644
index 0000000..d6a887e
--- /dev/null
+++ b/src/adql/parser/QueryFixer.java
@@ -0,0 +1,258 @@
+package adql.parser;
+
+/*
+ * This file is part of ADQLLibrary.
+ *
+ * ADQLLibrary is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ADQLLibrary is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ */
+
+import java.util.HashMap;
+import java.util.Map;
+
+import adql.parser.grammar.ADQLGrammar;
+import adql.parser.grammar.ADQLGrammar.Tokenizer;
+import adql.parser.grammar.ParseException;
+import adql.parser.grammar.Token;
+import adql.parser.grammar.TokenMgrError;
+
+/**
+ * Tool able to fix some common errors in ADQL queries.
+ *
+ * <p><i>See {@link #fix(String)} for more details.</i></p>
+ *
+ * @author Gr&eacute;gory Mantelet (CDS)
+ * @version 2.0 (08/2019)
+ *
+ * @since 2.0
+ *
+ * @see ADQLParser
+ */
+public class QueryFixer {
+
+	/** The used internal ADQL grammar parser. */
+	protected final ADQLGrammar grammarParser;
+
+	/**
+	* All of the most common Unicode confusable characters and their
+	* ASCII/UTF-8 alternative.
+	*
+	* <p>
+	* 	Keys of this map represent the ASCII character while the values are the
+	* 	regular expression for all possible Unicode alternatives.
+	* </p>
+	*
+	* <p><i><b>Note:</b>
+	* 	All of them have been listed using
+	* 	<a href="https://unicode.org/cldr/utility/confusables.jsp">Unicode Utilities: Confusables</a>.
+	* </i></p>
+	*/
+	protected final Map<String, String> mapRegexUnicodeConfusable;
+
+	/** Regular expression matching all Unicode alternatives for <code>-</code>. */
+	protected final String REGEX_DASH = "[-\u02d7\u06d4\u2010\u2011\u2012\u2013\u2043\u2212\u2796\u2cba\ufe58\u2014\u2015\u207b\u208b\u0096\u058a\ufe63\uff0d]";
+	/** Regular expression matching all Unicode alternatives for <code>_</code>. */
+	protected final String REGEX_UNDERSCORE = "[_\u07fa\ufe4d\ufe4e\ufe4f]";
+	/** Regular expression matching all Unicode alternatives for <code>'</code>. */
+	protected final String REGEX_QUOTE = "['`\u00b4\u02b9\u02bb\u02bc\u02bd\u02be\u02c8\u02ca\u02cb\u02f4\u0374\u0384\u055a\u055d\u05d9\u05f3\u07f4\u07f5\u144a\u16cc\u1fbd\u1fbf\u1fef\u1ffd\u1ffe\u2018\u2019\u201b\u2032\u2035\ua78c\uff07\uff40]";
+	/** Regular expression matching all Unicode alternatives for <code>"</code>. */
+	protected final String REGEX_DOUBLE_QUOTE = "[\u02ba\u02dd\u02ee\u02f6\u05f2\u05f4\u1cd3\u201c\u201d\u201f\u2033\u2036\u3003\uff02]";
+	/** Regular expression matching all Unicode alternatives for <code>.</code>. */
+	protected final String REGEX_STOP = "[.\u0660\u06f0\u0701\u0702\u2024\ua4f8\ua60e]";
+	/** Regular expression matching all Unicode alternatives for <code>+</code>. */
+	protected final String REGEX_PLUS = "[+\u16ed\u2795]";
+	/** Regular expression matching all Unicode alternatives for <code> </code>. */
+	protected final String REGEX_SPACE = "[ \u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f]";
+	/** Regular expression matching all Unicode alternatives for <code>&lt;</code>. */
+	protected final String REGEX_LESS_THAN = "[<\u02c2\u1438\u16b2\u2039\u276e]";
+	/** Regular expression matching all Unicode alternatives for <code>&gt;</code>. */
+	protected final String REGEX_GREATER_THAN = "[>\u02c3\u1433\u203a\u276f]";
+	/** Regular expression matching all Unicode alternatives for <code>=</code>. */
+	protected final String REGEX_EQUAL = "[=\u1400\u2e40\u30a0\ua4ff]";
+
+	public QueryFixer(final ADQLGrammar grammar) throws NullPointerException {
+		if (grammar == null)
+			throw new NullPointerException("Missing ADQL grammar parser!");
+		grammarParser = grammar;
+
+		mapRegexUnicodeConfusable = new HashMap<String, String>(10);
+		mapRegexUnicodeConfusable.put("-", REGEX_DASH);
+		mapRegexUnicodeConfusable.put("_", REGEX_UNDERSCORE);
+		mapRegexUnicodeConfusable.put("'", REGEX_QUOTE);
+		mapRegexUnicodeConfusable.put("\u005c"", REGEX_DOUBLE_QUOTE);
+		mapRegexUnicodeConfusable.put(".", REGEX_STOP);
+		mapRegexUnicodeConfusable.put("+", REGEX_PLUS);
+		mapRegexUnicodeConfusable.put(" ", REGEX_SPACE);
+		mapRegexUnicodeConfusable.put("<", REGEX_LESS_THAN);
+		mapRegexUnicodeConfusable.put(">", REGEX_GREATER_THAN);
+		mapRegexUnicodeConfusable.put("=", REGEX_EQUAL);
+	}
+
+	/**
+	* Try fixing tokens/terms of the given ADQL query.
+	*
+	* <p>
+	* 	<b>This function does not try to fix syntactical or semantical errors.</b>
+	*  It just try to fix the most common issues in ADQL queries, such as:
+	* </p>
+	* <ul>
+	* 	<li>some Unicode characters confusable with ASCII characters (like a
+	* 		space, a dash, ...) ; this function replace them by their ASCII
+	* 		alternative,</li>
+	* 	<li>any of the following are double quoted:
+	* 		<ul>
+	* 			<li>non regular ADQL identifiers
+	* 				(e.g. <code>_RAJ2000</code>),</li>
+	* 			<li>ADQL function names used as identifiers
+	* 				(e.g. <code>distance</code>)</li>
+	* 			<li>and SQL reserved keywords
+	* 				(e.g. <code>public</code>).</li>
+	* 		</ul>
+	* 	</li>
+	* </ul>
+	*
+	* <p><i><b>Note:</b>
+	* 	This function does not use any instance variable of this parser
+	* 	(especially the InputStream or Reader provided at initialisation or
+	* 	ReInit).
+	* </i></p>
+	*
+	* @param adqlQuery	The input ADQL query to fix.
+	*
+	* @return	The suggested correction of the given ADQL query.
+	*
+	* @throws ParseException	If any unrecognised character is encountered,
+	*                       	or if anything else prevented the tokenization
+	*                       	   of some characters/words/terms.
+	*/
+	public String fix(String adqlQuery) throws ParseException {
+		StringBuffer suggestedQuery = new StringBuffer();
+
+		// 1. Replace all Unicode confusable characters:
+		adqlQuery = replaceUnicodeConfusables(adqlQuery);
+
+		/* 1.bis. Normalise new lines and tabulations
+		*        (to simplify the column counting): */
+		adqlQuery = adqlQuery.replaceAll("(\u005cr\u005cn|\u005cr|\u005cn)", System.getProperty("line.separator")).replaceAll("\u005ct", "    ");
+
+		// 2. Analyse the query token by token:
+		Tokenizer tokenizer = grammarParser.getTokenizer(adqlQuery);
+
+		final String[] lines = adqlQuery.split(System.getProperty("line.separator"));
+
+		try {
+			String suggestedToken;
+			int lastLine = 1, lastCol = 1;
+
+			Token token = null, nextToken = tokenizer.nextToken();
+			// for all tokens until the EOF or EOQ:
+			do {
+				// get the next token:
+				token = nextToken;
+				nextToken = (grammarParser.isEnd(token) ? null : tokenizer.nextToken());
+
+				// 3. Double quote any suspect token:
+				if (mustEscape(token, nextToken)) {
+					suggestedToken = "\u005c"" + token.image + "\u005c"";
+				} else
+					suggestedToken = token.image;
+
+				/* 4. Append all space characters (and comments) before the
+				*    token: */
+				/* same line, just get the space characters between the last
+				* token and the one to append: */
+				if (lastLine == token.beginLine) {
+					if (grammarParser.isEOF(token))
+						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1));
+					else
+						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - (grammarParser.isEnd(token) ? 0 : 1)));
+					lastCol = token.endColumn + 1;
+				}
+				// not the same line...
+				else {
+					/* append all remaining space characters until the position
+					* of the token to append: */
+					do {
+						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1)).append('\u005cn');
+						lastLine++;
+						lastCol = 1;
+					} while(lastLine < token.beginLine);
+					/* if there are still space characters before the token,
+					* append them as well: */
+					if (lastCol < token.beginColumn)
+						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - 1));
+					// finally, set the correct column position:
+					lastCol = token.endColumn + 1;
+				}
+
+				// 5. Append the suggested token:
+				suggestedQuery.append(suggestedToken);
+
+			} while(!grammarParser.isEnd(token));
+
+		} catch(TokenMgrError err) {
+			// wrap such errors and propagate them:
+			throw new ParseException(err);
+		}
+
+		return suggestedQuery.toString();
+	}
+
+	/**
+	* Replace all Unicode characters that can be confused with other ASCI/UTF-8
+	* characters (e.g. different spaces, dashes, ...) in their ASCII version.
+	*
+	* @param adqlQuery	The ADQL query string in which Unicode confusable
+	*                 	characters must be replaced.
+	*
+	* @return	The same query without the most common Unicode confusable
+	*        	characters.
+	*/
+	protected String replaceUnicodeConfusables(final String adqlQuery) {
+		String newAdqlQuery = adqlQuery;
+		for(java.util.Map.Entry<String, String> confusable : mapRegexUnicodeConfusable.entrySet())
+			newAdqlQuery = newAdqlQuery.replaceAll(confusable.getValue(), confusable.getKey());
+		return newAdqlQuery;
+	}
+
+	/**
+	* Tell whether the given token must be double quoted.
+	*
+	* <p>
+	* 	This function considers all the following as terms to double quote:
+	* </p>
+	* <ul>
+	* 	<li>SQL reserved keywords</li>,
+	* 	<li>unrecognised regular identifiers (e.g. neither a delimited nor a
+	* 		valid ADQL regular identifier)</li>
+	* 	<li>and ADQL function name without a parameters list.</li>
+	* </ul>
+	*
+	* @param token		The token to analyze.
+	* @param nextToken	The following token. (useful to detect the start of a
+	*                 	function's parameters list)
+	*
+	* @return	<code>true</code> if the given token must be double quoted,
+	*        	<code>false</code> to keep it as provided.
+	*/
+	protected boolean mustEscape(final Token token, final Token nextToken) {
+		if (grammarParser.isSQLReservedWord(token))
+			return true;
+		else if (grammarParser.isRegularIdentifierCandidate(token))
+			return !grammarParser.isRegularIdentifier(token.image);
+		else
+			return token.isFunctionName && !grammarParser.isLeftPar(nextToken);
+	}
+}
diff --git a/src/adql/parser/grammar/ADQLGrammar.java b/src/adql/parser/grammar/ADQLGrammar.java
new file mode 100644
index 0000000..ff90da8
--- /dev/null
+++ b/src/adql/parser/grammar/ADQLGrammar.java
@@ -0,0 +1,438 @@
+package adql.parser.grammar;
+
+/*
+ * This file is part of ADQLLibrary.
+ *
+ * ADQLLibrary is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ADQLLibrary is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ */
+
+import java.io.InputStream;
+
+import adql.parser.ADQLParser;
+import adql.parser.ADQLParser.ADQLVersion;
+import adql.parser.ADQLQueryFactory;
+import adql.query.ADQLQuery;
+import adql.query.operand.ADQLOperand;
+import adql.query.operand.StringConstant;
+
+/**
+ * API of a specific ADQL grammar's parser.
+ *
+ * <p>
+ * 	A concrete implementation of this interface lets parsing a full or partial
+ * 	ADQL query. It MUST follow ONLY ONE VERSION of an ADQL standard grammar.
+ * </p>
+ *
+ * <h3>Usage</h3>
+ *
+ * <p>Here is how to proceed in order to parse an ADQL expression:</p>
+ * <ol>
+ * 	<li>(Re-)Set the parser with the expression to parse,</li>
+ * 	<li>Call the appropriate parsing in function of what should be parsed
+ * 		(e.g. {@link #Query()} for a full ADQL query, {@link #Where()} for a
+ * 		WHERE clause),</li>
+ * 	<li>Get the result with {@link #getQuery()}.</li>
+ * </ol>
+ *
+ * <i>
+ * <p><b>Example 1:</b> Parse a full ADQL query</p>
+ * <pre> // 1. (Re-)Set the parser with the expression to parse:
+ * grammarParser.<b>reset(</b>new ByteArrayInputStream("SELECT foo FROM bar WHERE stuff = 1 ORDER BY 1 DESC LIMIT 10".getBytes()));
+ *
+ * // 2. Call the appropriate parsing:
+ * grammarParser.<b>Query()</b>;
+ *
+ * // 3. Get the result:
+ * System.out.println("RESULT: `" + <b>grammarParser.getQuery()</b>.toADQL() + "`")</pre>
+ *
+ * <p><b>Example 2:</b> Parse just a WHERE clause</p>
+ * <pre> // 1. (Re-)Set the parser with the expression to parse:
+ * grammarParser.<b>reset(</b>new ByteArrayInputStream("WHERE foo = 'bar' AND stuff = 1".getBytes()));
+ *
+ * // 2. Call the appropriate parsing:
+ * grammarParser.<b>Where()</b>;
+ *
+ * // 3. Get the result:
+ * System.out.println("RESULT: `" + <b>grammarParser.getQuery().getWhere()</b>.toADQL() + "`")</pre>
+ * </i>
+ *
+ * <h3>{@link ADQLGrammar} VS {@link ADQLParser}</h3>
+ *
+ * <p>
+ * 	Implementations of {@link ADQLGrammar} should not be used directly. These
+ * 	classes are generally generated by another tool from a grammar (e.g. JavaCC,
+ * 	PEG) which makes them quite difficult to use without knowledges on the used
+ * 	tool. Thus, this interface aims to simplify use of these grammar parsers.
+ * </p>
+ *
+ * <p>
+ * 	ADQL-Lib users should use {@link ADQLParser} instead of direct use of
+ * 	{@link ADQLGrammar} implementations. {@link ADQLParser} wraps the
+ * 	appropriate {@link ADQLGrammar} implementation in function of the specified
+ * 	ADQL Grammar version. It also includes additional tests (e.g. optional
+ * 	language features, UDFs, types) as well as some useful tool functions
+ * 	(e.g. tokenization, quick fix).
+ * </p>
+ *
+ * @see ADQLParser
+ *
+ * @author Gr&eacute;gory Mantelet (CDS)
+ * @version 2.0 (08/2019)
+ * @since 2.0
+ */
+public interface ADQLGrammar {
+
+	/* **********************************************************************
+	   *                         GETTERS/SETTERS                            *
+	   ********************************************************************** */
+
+	/**
+	 * Get the version of the ADQL Grammar implemented by this parser.
+	 *
+	 * @return	Implemented ADQL Grammar version. <i>Never NULL</i>
+	 */
+	public ADQLVersion getVersion();
+
+	/**
+	 * Get the result of the last ADQL query parsing.
+	 *
+	 * <p>
+	 * 	This function returns something only if the ADQL expression parsing
+	 * 	succeeded. Otherwise, NULL will be returned.
+	 * </p>
+	 *
+	 * <p>
+	 * 	Even if the parsed expression was not a full ADQL query, a full ADQL
+	 * 	query tree is always returned as an instance of {@link ADQLQuery}. In
+	 * 	case the parsed expression is an ADQL clause, the result will be set in
+	 * 	the corresponding part of the ADQL tree.
+	 * </p>
+	 *
+	 * <p><i><b>Example:</b>
+	 * 	if {@link #Select()} has been successfully executed, an
+	 * 	{@link ADQLQuery} with only the part corresponding to the
+	 * 	<code>SELECT</code> will be filled ; this can then be got thanks to
+	 * 	{@link ADQLQuery#getSelect()}. The same applies for all the individual
+	 * 	parsing of the other ADQL clauses.
+	 * </i></p>
+	 *
+	 * @return	An ADQL query tree filled with the parsing result,
+	 *        	or NULL if no ADQL query or clause has been parsed or if this
+	 *        	parsing failed.
+	 */
+	public ADQLQuery getQuery();
+
+	/**
+	 * Get the {@link ADQLQueryFactory} used by this Grammar Parser to create
+	 * ADQL object representations (e.g. SELECT, column, string, constraint)
+	 * while building the ADQL query tree
+	 *
+	 * @return	The used {@link ADQLQueryFactory}. <i>Never NULL</i>
+	 */
+	public ADQLQueryFactory getQueryFactory();
+
+	/**
+	 * Set the {@link ADQLQueryFactory} to use in order to create ADQL object
+	 * representations (e.g. SELECT, column, string, constraint) while building
+	 * the ADQL query tree.
+	 *
+	 * @param factory	The {@link ADQLQueryFactory} to use.
+	 *
+	 * @throws NullPointerException	If the given factory is NULL.
+	 */
+	public void setQueryFactory(final ADQLQueryFactory factory) throws NullPointerException;
+
+	/* **********************************************************************
+	   *                      PARSER INITIALIZATION                         *
+	   ********************************************************************** */
+
+	/**
+	 * (Re-)Set the ADQL expression to parse.
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called BEFORE calling any parsing function.
+	 * </i></p>
+	 *
+	 * @param inputADQLExpression	ADQL expression to parse.
+	 *
+	 * @throws NullPointerException	If the given stream is NULL.
+	 * @throws Exception			If any error occurs while initializing the
+	 *                  			parser.
+	 */
+	public void reset(final InputStream inputADQLExpression) throws Exception;
+
+	/* **********************************************************************
+	   *                        PARSING FUNCTIONS                           *
+	   ********************************************************************** */
+
+	/**
+	 * Parse the ADQL expression as a single full ADQL query.
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called AFTER {@link #reset(InputStream)}
+	 * 	with the ADQL expression to parse.
+	 * </i></p>
+	 *
+	 * @return	The corresponding ADQL tree.
+	 *
+	 * @throws ParseException	If the parsing failed.
+	 */
+	public ADQLQuery Query() throws ParseException;
+
+	/**
+	 * Parse the ADQL expression as a single <code>SELECT</code> clause.
+	 *
+	 * <p>To get the result:</p>
+	 * <pre>grammarParser.{@link #getQuery()}.{@link ADQLQuery#getSelect() getSelect()}</pre>
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called AFTER {@link #reset(InputStream)}
+	 * 	with the ADQL expression to parse.
+	 * </i></p>
+	 *
+	 * @throws ParseException	If the parsing failed.
+	 */
+	public void Select() throws ParseException;
+
+	/**
+	 * Parse the ADQL expression as a single <code>FROM</code> clause.
+	 *
+	 * <p>To get the result:</p>
+	 * <pre>grammarParser.{@link #getQuery()}.{@link ADQLQuery#getFrom() getFrom()}</pre>
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called AFTER {@link #reset(InputStream)}
+	 * 	with the ADQL expression to parse.
+	 * </i></p>
+	 *
+	 * @throws ParseException	If the parsing failed.
+	 */
+	public void From() throws ParseException;
+
+	/**
+	 * Parse the ADQL expression as a single <code>WHERE</code> clause.
+	 *
+	 * <p>To get the result:</p>
+	 * <pre>grammarParser.{@link #getQuery()}.{@link ADQLQuery#getWhere() getWhere()}</pre>
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called AFTER {@link #reset(InputStream)}
+	 * 	with the ADQL expression to parse.
+	 * </i></p>
+	 *
+	 * @throws ParseException	If the parsing failed.
+	 */
+	public void Where() throws ParseException;
+
+	/**
+	 * Parse the ADQL expression as a single <code>ORDER BY</code> clause.
+	 *
+	 * <p>To get the result:</p>
+	 * <pre>grammarParser.{@link #getQuery()}.{@link ADQLQuery#getOrderBy() getOrderBy()}</pre>
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called AFTER {@link #reset(InputStream)}
+	 * 	with the ADQL expression to parse.
+	 * </i></p>
+	 *
+	 * @throws ParseException	If the parsing failed.
+	 */
+	public void OrderBy() throws ParseException;
+
+	/**
+	 * Parse the ADQL expression as a single <code>GROUP BY</code> clause.
+	 *
+	 * <p>To get the result:</p>
+	 * <pre>grammarParser.{@link #getQuery()}.{@link ADQLQuery#getGroupBy() getGroupBy()}</pre>
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called AFTER {@link #reset(InputStream)}
+	 * 	with the ADQL expression to parse.
+	 * </i></p>
+	 *
+	 * @throws ParseException	If the parsing failed.
+	 */
+	public void GroupBy() throws ParseException;
+
+	/**
+	 * Parse the ADQL expression as a single string constant.
+	 *
+	 * <p><i><b>Important note:</b>
+	 * 	This function MUST always be called AFTER {@link #reset(InputStream)}
+	 * 	with the ADQL expression to parse.
+	 * </i></p>
+	 *
+	 * <p><i><b>Implementation note:</b>
+	 * 	This function is available here just for Unitary Test purpose.
+	 * </i></p>
+	 *
+	 * @return	The parsed {@link StringConstant}.
+	 *
+	 * @throws ParseException	If the parsing failed.
+	 */
+	public ADQLOperand StringExpression() throws ParseException;
+
+	/* **********************************************************************
+	   *                         TOKEN KIND TESTS                           *
+	   ********************************************************************** */
+
+	public boolean isEOF(final Token token);
+
+	public boolean isEOQ(final Token token);
+
+	public boolean isRegularIdentifierCandidate(final Token token);
+
+	public boolean isSQLReservedWord(final Token token);
+
+	public boolean isLeftPar(final Token token);
+
+	/**
+	* Tell whether the given token represents the end of an ADQL query.
+	*
+	* <p><i><b>Implementation note:</b>
+	* 	NULL is considered as a last token of a set. So, by extension it should
+	* 	also be considered as the end of an ADQL query. But this method should
+	* 	rely on the ADQL grammar. Consequently, at least the token for the
+	* 	semi-colon (;) and the token for the End-Of-File (EOF) should be
+	* 	considered as the correct one to use to indicate the end of an ADQL
+	* 	query.
+	* </i></p>
+	*
+	* @param token	Token to analyze. <i>Might be NULL.</i>
+	*
+	* @return	<code>true</code> if the given token represents a query end,
+	*        	<code>false</code> otherwise.
+	*/
+	public boolean isEnd(final Token token);
+
+	/* **********************************************************************
+	   *                        TOKENIZATION HELPER                         *
+	   ********************************************************************** */
+
+	/**
+	 * Get an API giving access to the result of the tokenization of the given
+	 * ADQL expression.
+	 *
+	 * @param expr	The ADQL expression to tokenize.
+	 *
+	 * @return	A {@link Tokenizer} object helping to iterate over the tokens of
+	 *        	the given ADQL expression.
+	 *
+	 * @throws NullPointerException	If the given ADQL expression is NULL.
+	 */
+	public Tokenizer getTokenizer(final String expr) throws NullPointerException;
+
+	/**
+	 * API helping to iterate over a set of {@link Token}s.
+	 *
+	 * @author Gr&eacute;gory Mantelet (CDS)
+	 * @version 2.0 (08/2019)
+	 * @since 2.0
+	 */
+	public static interface Tokenizer {
+		/**
+		 * Get the next available token.
+		 *
+		 * <p>
+		 * 	The last available {@link Token} should
+		 *
+		 * @return	The next token.
+		 */
+		public Token nextToken();
+	}
+
+	/* **********************************************************************
+	   *                     REGULAR IDENTIFIER TEST                        *
+	   ********************************************************************** */
+
+	/**
+	 * Tell whether the given string is a valid ADQL regular identifier.
+	 *
+	 * <p>
+	 * 	According to the ADQL-2.0's BNF, a regular identifier (i.e. not
+	 * 	delimited ; not between double quotes) must be a letter followed by a
+	 * 	letter, digit or underscore. So, the following regular expression:
+	 * </p>
+	 *
+	 * <pre>[a-zA-Z]+[a-zA-Z0-9_]*</pre>
+	 *
+	 * <p>
+	 * 	This is what this function tests on the given string.
+	 * </p>
+	 *
+	 * <p><i><b>Warning:</b>
+	 * 	This function may return a different result for different versions of
+	 * 	the ADQL grammar.
+	 * </i></p>
+	 *
+	 * @param idCandidate	The string to test.
+	 *
+	 * @return	<code>true</code> if the given string is a valid regular
+	 *        	identifier,
+	 *        	<code>false</code> otherwise.
+	 *
+	 * @see #testRegularIdentifier(Token)
+	 */
+	public boolean isRegularIdentifier(final String idCandidate);
+
+	/**
+	 * Test the given token as an ADQL's regular identifier.
+	 *
+	 * <p><i><b>Implementation note:</b>
+	 * 	This function uses {@link #isRegularIdentifier(String)} to test the
+	 * 	given token's image. If the test fails, a {@link ParseException} is
+	 * 	thrown.
+	 * </i></p>
+	 *
+	 * @param token	The token to test.
+	 *
+	 * @throws ParseException	If the given token is not a valid ADQL regular
+	 *                       	identifier.
+	 *
+	 * @see #isRegularIdentifier(String)
+	 */
+	public void testRegularIdentifier(final Token token) throws ParseException;
+
+	/* **********************************************************************
+	   *                     DEBUG & ERRORS MANAGEMENT                      *
+	   ********************************************************************** */
+
+	/**
+	 * Generate a {@link ParseException} instance representing the given
+	 * {@link Exception}.
+	 *
+	 * <p><i><b>Implementation note:</b>
+	 * 	If the given {@link Exception} is already a {@link ParseException} this
+	 * 	function should do nothing else than returning it as such.
+	 * </i></p>
+	 *
+	 * @param ex	The exception to represent as a {@link ParseException}.
+	 *
+	 * @return	The corresponding ParseException.
+	 */
+	public ParseException generateParseException(final Exception ex);
+
+	/**
+	 * Enable the deep tracing of the Grammar Parser.
+	 */
+	public void enable_tracing();
+
+	/**
+	 * Disable the deep tracing of the Grammar Parser.
+	 */
+	public void disable_tracing();
+
+}
diff --git a/src/adql/parser/grammar/ADQLGrammarBase.java b/src/adql/parser/grammar/ADQLGrammarBase.java
new file mode 100644
index 0000000..7bf92ed
--- /dev/null
+++ b/src/adql/parser/grammar/ADQLGrammarBase.java
@@ -0,0 +1,135 @@
+package adql.parser.grammar;
+
+/*
+ * This file is part of ADQLLibrary.
+ *
+ * ADQLLibrary is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ADQLLibrary is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ */
+
+import java.io.InputStream;
+import java.util.Stack;
+
+import adql.parser.ADQLQueryFactory;
+import adql.query.ADQLQuery;
+import adql.query.TextPosition;
+
+/**
+ * Common partial implementation of an {@link ADQLGrammar}.
+ *
+ * @author Gr&eacute;gory Mantelet (CDS)
+ * @version 2.0 (08/2019)
+ * @since 2.0
+ */
+public abstract class ADQLGrammarBase implements ADQLGrammar {
+
+	/** Tool to build the object representation of the ADQL query. */
+	protected ADQLQueryFactory queryFactory = new ADQLQueryFactory();
+
+	/** The object representation of the ADQL query to parse.
+	 * (ONLY USED DURING THE PARSING, otherwise it is always NULL). */
+	protected ADQLQuery query = null;
+
+	/** The stack of queries (in order to deal with sub-queries). */
+	protected Stack<ADQLQuery> stackQuery = new Stack<ADQLQuery>();
+
+	/* **********************************************************************
+	   *                         GETTERS/SETTERS                            *
+	   ********************************************************************** */
+
+	@Override
+	public final ADQLQuery getQuery() {
+		return query;
+	}
+
+	@Override
+	public final ADQLQueryFactory getQueryFactory() {
+		return queryFactory;
+	}
+
+	@Override
+	public final void setQueryFactory(final ADQLQueryFactory factory) throws NullPointerException {
+		if (factory == null)
+			throw new NullPointerException("Missing new ADQLQueryFactory! An ADQLGrammar can not work without a query factory.");
+		this.queryFactory = factory;
+	}
+
+	/* **********************************************************************
+	   *                      PARSER INITIALIZATION                         *
+	   ********************************************************************** */
+
+	@Override
+	public final void reset(final InputStream inputADQLExpression) throws Exception {
+		// Error if no input:
+		if (inputADQLExpression == null)
+			throw new NullPointerException("Missing ADQL expression to parse!");
+
+		// Empty the stack:
+		stackQuery.clear();
+
+		// Create a new and empty ADQL query tree:
+		query = queryFactory.createQuery(getVersion());
+
+		// Finally re-initialize the parser with the expression to parse:
+		ReInit(inputADQLExpression);
+	}
+
+	/**
+	 * Re-initialize the input of the ADQL grammar parser.
+	 *
+	 * @param stream	The new input stream to parse.
+	 */
+	public abstract void ReInit(InputStream stream);
+
+	/* **********************************************************************
+	   *                     REGULAR IDENTIFIER TEST                        *
+	   ********************************************************************** */
+
+	@Override
+	public final boolean isRegularIdentifier(final String idCandidate) {
+		return idCandidate != null && idCandidate.matches("[a-zA-Z]+[a-zA-Z0-9_]*");
+	}
+
+	@Override
+	public final void testRegularIdentifier(final Token token) throws ParseException {
+		if (token == null)
+			throw new ParseException("Impossible to test whether NULL is a valid ADQL regular identifier!");
+		else if (!isRegularIdentifier(token.image))
+			throw new ParseException("Invalid ADQL regular identifier: \u005c"" + token.image + "\u005c"! If it aims to be a column/table name/alias, you should write it between double quotes.", new TextPosition(token));
+	}
+
+	/* **********************************************************************
+	   *                        TOKEN KIND TESTS                            *
+	   ********************************************************************** */
+
+	@Override
+	public boolean isEnd(final Token token) {
+		return token == null || token.kind == ADQLGrammar200Constants.EOF || token.kind == ADQLGrammar200Constants.EOQ;
+	}
+
+	/* **********************************************************************
+	   *                     DEBUG & ERRORS MANAGEMENT                      *
+	   ********************************************************************** */
+
+	@Override
+	public final ParseException generateParseException(Exception ex) {
+		if (!(ex instanceof ParseException)) {
+			ParseException pex = new ParseException("[" + ex.getClass().getName() + "] " + ex.getMessage());
+			pex.setStackTrace(ex.getStackTrace());
+			return pex;
+		} else
+			return (ParseException)ex;
+	}
+}
diff --git a/src/adql/parser/ParseException.java b/src/adql/parser/grammar/ParseException.java
similarity index 98%
rename from src/adql/parser/ParseException.java
rename to src/adql/parser/grammar/ParseException.java
index 96370d8..87a6388 100644
--- a/src/adql/parser/ParseException.java
+++ b/src/adql/parser/grammar/ParseException.java
@@ -25,12 +25,16 @@
  *     - change the way ADQL and SQL reserved keywords are identified for the
  *       generation of the appropriate HINT in the error message
  *
+ * Modified by Gr&eacute;gory Mantelet (CDS), on Aug. 2019
+ * Modifications:
+ *     - change the package name
+ *
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by ParseException.java.backup (but maybe
  * after a diff in case of significant modifications have been done by a new
  * version of JavaCC).
  */
-package adql.parser;
+package adql.parser.grammar;
 
 import adql.query.TextPosition;
 
diff --git a/src/adql/parser/ParseException.java.backup b/src/adql/parser/grammar/ParseException.java.backup
similarity index 98%
rename from src/adql/parser/ParseException.java.backup
rename to src/adql/parser/grammar/ParseException.java.backup
index 96370d8..87a6388 100644
--- a/src/adql/parser/ParseException.java.backup
+++ b/src/adql/parser/grammar/ParseException.java.backup
@@ -25,12 +25,16 @@
  *     - change the way ADQL and SQL reserved keywords are identified for the
  *       generation of the appropriate HINT in the error message
  *
+ * Modified by Gr&eacute;gory Mantelet (CDS), on Aug. 2019
+ * Modifications:
+ *     - change the package name
+ *
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by ParseException.java.backup (but maybe
  * after a diff in case of significant modifications have been done by a new
  * version of JavaCC).
  */
-package adql.parser;
+package adql.parser.grammar;
 
 import adql.query.TextPosition;
 
diff --git a/src/adql/parser/SimpleCharStream.java b/src/adql/parser/grammar/SimpleCharStream.java
similarity index 99%
rename from src/adql/parser/SimpleCharStream.java
rename to src/adql/parser/grammar/SimpleCharStream.java
index 617d73e..341e9b4 100644
--- a/src/adql/parser/SimpleCharStream.java
+++ b/src/adql/parser/grammar/SimpleCharStream.java
@@ -1,6 +1,6 @@
 /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 6.0 */
 /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-package adql.parser;
+package adql.parser.grammar;
 
 /**
  * An implementation of interface CharStream, where the stream is assumed to
diff --git a/src/adql/parser/SimpleCharStream.java.backup b/src/adql/parser/grammar/SimpleCharStream.java.backup
similarity index 99%
rename from src/adql/parser/SimpleCharStream.java.backup
rename to src/adql/parser/grammar/SimpleCharStream.java.backup
index 617d73e..341e9b4 100644
--- a/src/adql/parser/SimpleCharStream.java.backup
+++ b/src/adql/parser/grammar/SimpleCharStream.java.backup
@@ -1,6 +1,6 @@
 /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 6.0 */
 /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-package adql.parser;
+package adql.parser.grammar;
 
 /**
  * An implementation of interface CharStream, where the stream is assumed to
diff --git a/src/adql/parser/Token.java b/src/adql/parser/grammar/Token.java
similarity index 95%
rename from src/adql/parser/Token.java
rename to src/adql/parser/grammar/Token.java
index afd7271..704d2fa 100644
--- a/src/adql/parser/Token.java
+++ b/src/adql/parser/grammar/Token.java
@@ -1,19 +1,20 @@
 /* Generated By:JavaCC: Do not edit this line. Token.java Version 6.0 */
 /* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true
  *
- * Modified by Gr&eacute;gory Mantelet (CDS), on April 2019
+ * Modified by Gr&eacute;gory Mantelet (CDS), on Aug. 2019
  * Modifications:
- *     - addition of  the attributes: `adqlReserved`, `sqlReserved`,
+ *     - addition of the attributes: `adqlReserved`, `sqlReserved`,
  *       `adqlVersion` and `isFunctionName`
+ *     - change the package name
  *
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by Token.java.backup (but maybe
  * after a diff in case of significant modifications have been done by a new
  * version of JavaCC).
  */
-package adql.parser;
+package adql.parser.grammar;
 
-import adql.parser.ADQLParserFactory.ADQLVersion;
+import adql.parser.ADQLParser.ADQLVersion;
 
 /**
  * Describes the input token stream.
diff --git a/src/adql/parser/Token.java.backup b/src/adql/parser/grammar/Token.java.backup
similarity index 97%
rename from src/adql/parser/Token.java.backup
rename to src/adql/parser/grammar/Token.java.backup
index afd7271..a48d532 100644
--- a/src/adql/parser/Token.java.backup
+++ b/src/adql/parser/grammar/Token.java.backup
@@ -1,19 +1,20 @@
 /* Generated By:JavaCC: Do not edit this line. Token.java Version 6.0 */
 /* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true
  *
- * Modified by Gr&eacute;gory Mantelet (CDS), on April 2019
+ * Modified by Gr&eacute;gory Mantelet (CDS), on Aug. 2019
  * Modifications:
  *     - addition of  the attributes: `adqlReserved`, `sqlReserved`,
  *       `adqlVersion` and `isFunctionName`
+ *     - change the package name
  *
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by Token.java.backup (but maybe
  * after a diff in case of significant modifications have been done by a new
  * version of JavaCC).
  */
-package adql.parser;
+package adql.parser.grammar;
 
-import adql.parser.ADQLParserFactory.ADQLVersion;
+import adql.parser.ADQLParser.ADQLVersion;
 
 /**
  * Describes the input token stream.
diff --git a/src/adql/parser/TokenMgrError.java b/src/adql/parser/grammar/TokenMgrError.java
similarity index 89%
rename from src/adql/parser/TokenMgrError.java
rename to src/adql/parser/grammar/TokenMgrError.java
index fa5d8aa..626068e 100644
--- a/src/adql/parser/TokenMgrError.java
+++ b/src/adql/parser/grammar/TokenMgrError.java
@@ -7,13 +7,17 @@
  *     - adapt the error message so that being more explicit for humans
  *       and display the incorrect character as a character instead of an
  *       integer value
- * 
+ *
+ * Modified by Gr&eacute;gory Mantelet (CDS), on Aug. 2019
+ * Modifications:
+ *     - change the package name
+ *
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by TokenMgrError.java.backup (but maybe
  * after a diff in case of significant modifications have been done by a new
  * version of JavaCC).
  */
-package adql.parser;
+package adql.parser.grammar;
 
 /** Token Manager Error. */
 public class TokenMgrError extends Error {
@@ -65,11 +69,11 @@ public class TokenMgrError extends Error {
 	 * Replaces unprintable characters by their escaped (or unicode escaped)
 	 * equivalents in the given string
 	 */
-	protected static final String addEscapes(String str){
+	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)){
+		for(int i = 0; i < str.length(); i++) {
+			switch(str.charAt(i)) {
 				case 0:
 					continue;
 				case '\b':
@@ -97,10 +101,10 @@ public class TokenMgrError extends Error {
 					retval.append("\\\\");
 					continue;
 				default:
-					if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e){
+					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{
+					} else {
 						retval.append(ch);
 					}
 					continue;
@@ -121,7 +125,7 @@ public class TokenMgrError extends Error {
 	 *    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){
+	protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
 		return ("Incorrect character encountered at l." + errorLine + ", c." + errorColumn + ": " + (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " ('" + curChar + "'), ") + "after : \"" + addEscapes(errorAfter) + "\"");
 	}
 
@@ -135,25 +139,25 @@ public class TokenMgrError extends Error {
 	 * from this method for such cases in the release version of your parser.
 	 */
 	@Override
-	public String getMessage(){
+	public String getMessage() {
 		return super.getMessage();
 	}
 
 	/**
 	 * Gets the line at which this error occurs.
-	 * 
+	 *
 	 * @return	Error line or <code>-1</code> if unknown.
 	 */
-	public final int getErrorLine(){
+	public final int getErrorLine() {
 		return errorLine;
 	}
 
 	/**
 	 * Gets the column at which this error occurs.
-	 * 
+	 *
 	 * @return	Error column or <code>-1</code> if unknown.
 	 */
-	public final int getErrorColumn(){
+	public final int getErrorColumn() {
 		return errorColumn;
 	}
 
@@ -162,16 +166,17 @@ public class TokenMgrError extends Error {
 	 */
 
 	/** No arg constructor. */
-	public TokenMgrError(){}
+	public TokenMgrError() {
+	}
 
 	/** Constructor with message and reason. */
-	public TokenMgrError(String message, int 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){
+	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);
 		this.errorLine = errorLine;
 		this.errorColumn = errorColumn;
diff --git a/src/adql/parser/TokenMgrError.java.backup b/src/adql/parser/grammar/TokenMgrError.java.backup
similarity index 96%
rename from src/adql/parser/TokenMgrError.java.backup
rename to src/adql/parser/grammar/TokenMgrError.java.backup
index fa5d8aa..7934ce2 100644
--- a/src/adql/parser/TokenMgrError.java.backup
+++ b/src/adql/parser/grammar/TokenMgrError.java.backup
@@ -8,12 +8,16 @@
  *       and display the incorrect character as a character instead of an
  *       integer value
  * 
+ * Modified by Gr&eacute;gory Mantelet (CDS), on Aug. 2019
+ * Modifications:
+ *     - change the package name
+ *
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by TokenMgrError.java.backup (but maybe
  * after a diff in case of significant modifications have been done by a new
  * version of JavaCC).
  */
-package adql.parser;
+package adql.parser.grammar;
 
 /** Token Manager Error. */
 public class TokenMgrError extends Error {
@@ -162,7 +166,8 @@ public class TokenMgrError extends Error {
 	 */
 
 	/** No arg constructor. */
-	public TokenMgrError(){}
+	public TokenMgrError() {
+	}
 
 	/** Constructor with message and reason. */
 	public TokenMgrError(String message, int reason){
diff --git a/src/adql/parser/adqlGrammar200.jj b/src/adql/parser/grammar/adqlGrammar200.jj
similarity index 60%
rename from src/adql/parser/adqlGrammar200.jj
rename to src/adql/parser/grammar/adqlGrammar200.jj
index 360d0b8..3a16e9b 100644
--- a/src/adql/parser/adqlGrammar200.jj
+++ b/src/adql/parser/grammar/adqlGrammar200.jj
@@ -25,9 +25,9 @@
 * successfully tested with JavaCC 6.0.
 * 
 * The generated parser checks the syntax of the given ADQL query and generates
-* an object representation but no coherence with any database is done.
-* If the syntax is not conform to the ADQL definition an error message is
-* printed else it will be the message "Correct syntax".
+* an object representation but no consistency with any database is checked.
+* If the syntax is not conform to the ADQL definition a TokenMgrError or a
+* ParseException is thrown.
 *
 *  Author:  Gr&eacute;gory Mantelet (CDS)
 *  Version: 2.0 (10/2020)
@@ -47,9 +47,9 @@ options {
 							/* ########## */
 							/* # PARSER # */
 							/* ########## */
-PARSER_BEGIN(ADQLParser200)
+PARSER_BEGIN(ADQLGrammar200)
 
-package adql.parser;
+package adql.parser.grammar;
 
 /*
  * This file is part of ADQLLibrary.
@@ -67,29 +67,19 @@ package adql.parser;
  * You should have received a copy of the GNU Lesser General Public License
  * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
  * 
- * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ * Copyright 2019-2020 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
  */
 
-import java.util.Stack;
 import java.util.Vector;
 import java.util.ArrayList;
-import java.util.Collection;
-
-import java.io.FileReader;
-import java.io.IOException;
-
-import adql.db.exception.UnresolvedIdentifiersException;
-import adql.db.exception.UnsupportedFeatureException;
 
-import adql.parser.ADQLParserFactory.ADQLVersion;
+import adql.parser.ADQLParser.ADQLVersion;
 
+import adql.parser.IdentifierItems;
 import adql.parser.IdentifierItems.IdentifierItem;
 
 import adql.parser.ADQLQueryFactory.JoinType;
 
-import adql.parser.feature.FeatureSet;
-import adql.parser.feature.LanguageFeature;
-
 import adql.query.*;
 import adql.query.from.*;
 import adql.query.constraint.*;
@@ -101,895 +91,88 @@ import adql.query.operand.function.*;
 import adql.query.operand.function.geometry.*;
 import adql.query.operand.function.geometry.GeometryFunction.GeometryValue;
 
-import adql.search.SearchOptionalFeaturesHandler;
-
-import adql.translator.PostgreSQLTranslator;
-import adql.translator.TranslationException;
-
 /**
-* Parses an ADQL-2.0 query thanks to the {@link ADQLParser200#Query() Query()} function.
+ * Parser of ADQL expressions following the ADQL-2.0 grammar.
 * 
-* <p>
-*   This parser is able, thanks to a {@link QueryChecker} object, to check each
-*   {@link ADQLQuery} just after its generation. It could be used to check the
-*   consistency between the ADQL query to parse and the "database" on which the
-*   query must be executed. By default, there is no {@link QueryChecker}. Thus
-*   you must extend {@link QueryChecker} to check semantically all generated
-*   ADQLQuery objects.
-* </p>
+ * <p><i><b>Note:</b>
+ * 	It is strongly recommended to not use this class directly in order to parse
+ * 	an ADQL expression. Instead, you should use
+ * 	{@link adql.parser.ADQLParser ADQLParser}. It provides a more user-friendly
+ * 	interface and provides additional features.
+ * </i></p>
 * 
-* <p>
-*   To create an object representation of the given ADQL query, this parser uses
-*   a {@link ADQLQueryFactory} object. So if you want customize some object
-*   (ie. CONTAINS) of this representation you just have to extend the
-*   corresponding default object (ie. ContainsFunction) and to extend the
-*   corresponding function of {@link ADQLQueryFactory}
-*   (ie. createContains(...)).
-* </p>
-*
-* <p>Here are the key functions to use:</p>
-* <ul>
-* 	<li>{@link #parseQuery(java.lang.String)} (or any of its alternatives)
-* 		to parse an input ADQL query String and get its corresponding ADQL tree
-*   </li>
-*   <li>{@link #tryQuickFix(java.lang.String)} to try fixing the most common
-* 		issues with ADQL queries (e.g. Unicode confusable characters,
-* 		unescaped ADQL identifiers, SQL reserved keywords, ...)</li>
-* </ul>
-* 
-* <p><b><u>WARNING:</u>
-*   To modify this class it's strongly encouraged to modify the .jj file in the
-*   section between <i>PARSER_BEGIN</i> and <i>PARSER_END</i> and to re-compile
-*   it with JavaCC.
-* </b></p>
-*
-* @see QueryChecker
-* @see ADQLQueryFactory
+ * @see ADQLParser
 *
 * @author Gr&eacute;gory Mantelet (CDS)
 * @version 2.0 (10/2020)
 * @since 2.0
 */
-public class ADQLParser200 implements ADQLParser {
-	
-	/** Tools to build the object representation of the ADQL query. */
-	private ADQLQueryFactory queryFactory = new ADQLQueryFactory();
+public class ADQLGrammar200 extends ADQLGrammarBase {
 
-	/** Default set of supported language features.
-	 * <p><i><b>Note:</b>
-	 * 	By default, all optional features are supported.
-	 * </i></p> */
-	private FeatureSet supportedFeatures = new FeatureSet(false, true);
+	/* **********************************************************************
+	   *                         GETTERS/SETTERS                            *
+	   ********************************************************************** */
 
-	/** The stack of queries (because there may be some sub-queries). */
-	private Stack<ADQLQuery> stackQuery = new Stack<ADQLQuery>();
-	
-	/** The object representation of the ADQL query to parse.
-	 * (ONLY USED DURING THE PARSING, else it is always <i>null</i>). */
-	private ADQLQuery query = null;
-	
-	/** Checks each {@link ADQLQuery} (sub-query or not) just after their
-	 * generation. */
-	private QueryChecker queryChecker = null;
-	
-	/** The first token of a table/column name. This token is extracted by
-	 * {@link #Identifier()}. */
-	private Token currentIdentifierToken = null;
-	
-	/**
-	* Builds an ADQL parser without a query to parse.
-	*/
-	public ADQLParser200(){
-		this(new java.io.ByteArrayInputStream("".getBytes()));
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-		setDebug(false);
-	}
-	
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker} and a {@link ADQLQueryFactory}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(QueryChecker checker, ADQLQueryFactory factory) {
-		this();
-		
-		queryChecker = checker;
-			
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(QueryChecker checker) {
-		this(checker, null);
-	}
-	
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link ADQLQueryFactory}.
-	*
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(ADQLQueryFactory factory) {
-		this((QueryChecker)null, factory);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream);
-		
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
-		
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(java.io.InputStream stream, QueryChecker checker) {
-		this(stream, checker, null);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, ADQLQueryFactory factory) {
-		this(stream, (QueryChecker)null, factory);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, String encoding, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream, encoding);
-		
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
-		
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(java.io.InputStream stream, String encoding, QueryChecker checker) {
-		this(stream, encoding, checker, null);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.InputStream stream, String encoding, ADQLQueryFactory factory) {
-		this(stream, encoding, null, factory);
-	}
-	
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.Reader reader, QueryChecker checker, ADQLQueryFactory factory) {
-		this(reader);
-		
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
+	/** Implemented version of the ADQL Standard. */
+  	public final static ADQLVersion VERSION = ADQLVersion.V2_0;
 
-		if (factory != null)
-			queryFactory = factory;
+	public final ADQLVersion getVersion() {
+		return VERSION;
 	}
-	
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(java.io.Reader reader, QueryChecker checker) {
-		this(reader, checker, null);
-	}
-	
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(java.io.Reader reader, ADQLQueryFactory factory) {
-		this(reader, null, factory);
-	}
-	
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery }.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser200(ADQLParser200TokenManager tm, QueryChecker checker, ADQLQueryFactory factory) {
-		this(tm);
-		
-		supportedFeatures.supportAll(LanguageFeature.TYPE_ADQL_GEO);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
 
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser200(ADQLParser200TokenManager tm, QueryChecker checker) {
-		this(tm, checker, null);
-	}
-	
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser200(ADQLParser200TokenManager tm, ADQLQueryFactory factory) {
-		this(tm, null, factory);
-	}
+	/* **********************************************************************
+	   *                         TOKEN KIND TESTS                           *
+	   ********************************************************************** */
 
-	/* ADDITIONAL GETTERS & SETTERS */
-	
-	public final ADQLVersion getADQLVersion() {
-		return ADQLVersion.V2_0;
-	}
-	
-	public final void setDebug(boolean debug){
-		if (debug) enable_tracing();
-		else       disable_tracing();
-	}
-	
-	public final QueryChecker getQueryChecker(){
-		return queryChecker;
-	}
-	
-	public final void setQueryChecker(QueryChecker checker){
-		queryChecker = checker;
-	}
-	
-	public final ADQLQueryFactory getQueryFactory(){
-		return queryFactory;
-	}
-	
-	public final void setQueryFactory(ADQLQueryFactory factory){
-		queryFactory = (factory!=null)?factory:(new ADQLQueryFactory());
+	public final boolean isEOF(final Token token) {
+		return token != null && token.kind == ADQLGrammar200Constants.EOF;
 	}
 
-	public final FeatureSet getSupportedFeatures() {
-		return supportedFeatures;
+	public final boolean isEOQ(final Token token) {
+		return token != null && token.kind == ADQLGrammar200Constants.EOQ;
 	}
 
-	public void setSupportedFeatures(final FeatureSet features) {
-		if (features != null)
-			supportedFeatures = features;
+	public final boolean isRegularIdentifierCandidate(final Token token) {
+		return token != null && token.kind == ADQLGrammar200Constants.REGULAR_IDENTIFIER_CANDIDATE;
 	}
 
-	/* EXCEPTION HELPER FUNCTION */
-	
-	private final ParseException generateParseException(Exception ex){
-		if (!(ex instanceof ParseException)){
-			ParseException pex = new ParseException("["+ex.getClass().getName()+"] "+ex.getMessage());
-			pex.setStackTrace(ex.getStackTrace());
-			return pex;
-		}else
-			return (ParseException)ex;
+	public final boolean isSQLReservedWord(final Token token) {
+		return token != null && token.kind == ADQLGrammar200Constants.SQL_RESERVED_WORD;
 	}
 
-	/* QUERY PARSING FUNCTIONS */
-
-	/**
-	 * Tell whether the given string is a valid ADQL regular identifier.
-	 *
-	 * <p>
-	 * 	According to the ADQL-2.0's BNF, a regular identifier (i.e. not delimited
-	 * 	; not between double quotes) must be a letter followed by a letter, digit
-	 * 	or underscore. So, the following regular expression:
-	 * </p>
-	 * <pre>[a-zA-Z]+[a-zA-Z0-9_]*</pre>
-	 *
-	 * <p>This is what this function tests on the given string.</p>
-	 *
-	 * @param idCandidate	The string to test.
-	 *
-	 * @return	<code>true</code> if the given string is a valid regular
-	 *        	identifier,
-	 *        	<code>false</code> otherwise.
-	 *
-	 * @see #testRegularIdentifier(adql.parser.Token)
-	 *
-	 * @since 1.5
-	 */
-	public final boolean isRegularIdentifier(final String idCandidate) {
-		return idCandidate.matches("[a-zA-Z]+[a-zA-Z0-9_]*");
+	public final boolean isLeftPar(final Token token) {
+		return token != null && token.kind == ADQLGrammar200Constants.LEFT_PAR;
 	}
 
-	/**
-	 * Test the given token as an ADQL's regular identifier.
-	 *
-	 * <p>
-	 * 	This function uses {@link #isRegularIdentifier(java.lang.String)} to
-	 * 	test the given token's image. If the test fails, a
-	 * 	{@link adql.parser.ParseException} is thrown.
-	 * </p>
-	 *
-	 * @param token	The token to test.
-	 *
-	 * @throws ParseException	If the given token is not a valid ADQL regular
-	 *                       	identifier.
-	 *
-	 * @see #isRegularIdentifier(java.lang.String)
-	 *
-	 * @since 1.5
-	 */
-	public final void testRegularIdentifier(final Token token) throws ParseException {
-		if (!isRegularIdentifier(token.image))
-			throw new ParseException("Invalid ADQL regular identifier: \""+token.image+"\"! If it aims to be a column/table name/alias, you should write it between double quotes.", new TextPosition(token));
-	}
-	
-	/**
-	* Parses the query given at the creation of this parser or in the
-	* <i>ReInit</i> functions.
-	*
-	* @return 	The object representation of the given ADQL query.
-	* 
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser200#Query()
-	*/
-	public final ADQLQuery parseQuery() throws ParseException {
-		stackQuery.clear();
-		query = null;
-		try { 
-			return Query();
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-	
-	/**
-	* Parses the query given in parameter.
-	*
-	* @param q	The ADQL query to parse.
-	* 
-	* @return	The object representation of the given ADQL query.
-	* 
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser200#ReInit(java.io.InputStream)
-	* @see ADQLParser200#setDebug(boolean)
-	* @see ADQLParser200#Query()
-	*/
-	public final ADQLQuery parseQuery(String q) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(new java.io.ByteArrayInputStream(q.getBytes()));
-		try { 
-			return Query();
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-	
-	/**
-	* Parses the query contained in the stream given in parameter.
-	*
-	* @param stream		The stream which contains the ADQL query to parse.
-	* 
-	* @return	The object representation of the given ADQL query.
-	* 
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser200#ReInit(java.io.InputStream)
-	* @see ADQLParser200#setDebug(boolean)
-	* @see ADQLParser200#Query()
-	*/
-	public final ADQLQuery parseQuery(java.io.InputStream stream) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(stream);
-		try { 
-			return Query();
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
+	/* **********************************************************************
+	   *                        TOKENIZATION HELPER                         *
+	   ********************************************************************** */
 
-	@Override
-	public final ClauseSelect parseSelect(java.lang.String adql) throws ParseException {
-	    // Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
+	public final Tokenizer getTokenizer(final String expr) throws NullPointerException {
+		// Error if no expression to tokenize:
+	  	if (expr == null)
+	  		throw new NullPointerException("Missing ADQL expression to tokenize!");
 
-			// Parse the string as a SELECT clause:
-			Select();
-
-			// Return what's just got parsed:
-			return query.getSelect();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
-	}
-	
-	@Override
-	public final FromContent parseFrom(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a FROM clause:
-			From();
-
-			// Return what's just got parsed:
-			return query.getFrom();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
-	}
-	
-	@Override
-	public final ClauseConstraints parseWhere(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a WHERE clause:
-			Where();
-
-			// Return what's just got parsed:
-			return query.getWhere();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
-	}
-	
-	@Override
-	public final ClauseADQL<ADQLOrder> parseOrderBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a ORDER BY clause:
-			OrderBy();
-
-			// Return what's just got parsed:
-			return query.getOrderBy();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
-	}
-	
-	@Override
-	public final ClauseADQL<ADQLColumn> parseGroupBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
-
-			// Parse the string as a GROUP BY clause:
-			GroupBy();
-
-			// Return what's just got parsed:
-			return query.getGroupBy();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
-	}
-
-	/* TOKENIZATION FUNCTION */
-
-	public Token[] tokenize(final String expr) throws ParseException {
-		ADQLParser200TokenManager parser = new ADQLParser200TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(expr.getBytes())));
-		try{
-			ArrayList<Token> tokens = new ArrayList<Token>();
-			Token token;
-			while(!isEnd((token=parser.getNextToken()))){
-				tokens.add(token);
-			}
-			return tokens.toArray(new Token[tokens.size()]);
-		}catch(TokenMgrError err){
-		    // wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
-	}
-
-	/* CORRECTION SUGGESTION */
-
-	/**
-	 * Try fixing tokens/terms of the input ADQL query.
-	 *
-	 * <p>
-	 * 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	 *  It just try to fix the most common issues in ADQL queries, such as:
-	 * </p>
-	 * <ul>
-	 * 	<li>some Unicode characters confusable with ASCII characters (like a
-	 * 		space, a dash, ...) ; this function replace them by their ASCII
-	 * 		alternative,</li>
-	 * 	<li>any of the following are double quoted:
-	 * 		<ul>
-	 * 			<li>non regular ADQL identifiers
-	 * 				(e.g. <code>_RAJ2000</code>),</li>
-	 * 			<li>ADQL function names used as identifiers
-	 * 				(e.g. <code>distance</code>)</li>
-	 * 			<li>and SQL reserved keywords
-	 * 				(e.g. <code>public</code>).</li>
-	 * 		</ul>
-	 * 	</li>
-	 * </ul>
-	 *
-	 * <p><i><b>Note 1:</b>
-	 * 	The given stream is NOT closed by this function even if the EOF is
-	 * 	reached. It is the responsibility of the caller to close it.
-	 * </i></p>
-	 *
-	 * <p><i><b>Note 2:</b>
-	 * 	This function does not use any instance variable of this parser
-	 * 	(especially the InputStream or Reader provided at initialisation or
-	 * 	ReInit).
-	 * </i></p>
-	 *
-	 * @param input	Stream containing the input ADQL query to fix.
-	 *
-	 * @return	The suggested correction of the input ADQL query.
-	 *
-	 * @throws java.io.IOException	If there is any error while reading from the
-	 *                            	given input stream.
-	 * @throws ParseException	If any unrecognised character is encountered,
-	 *                       	or if anything else prevented the tokenization
-	 *                       	   of some characters/words/terms.
-	 *
-	 * @see #tryQuickFix(java.lang.String)
-	 *
-	 * @since 1.5
-	 */
-	public final String tryQuickFix(final java.io.InputStream input) throws java.io.IOException, ParseException {
-		// Fetch everything into a single string:
-		StringBuffer buf = new StringBuffer();
-		byte[] cBuf = new byte[1024];
-		int nbChar;
-		while((nbChar = input.read(cBuf)) > -1){
-			buf.append(new String(cBuf, 0, nbChar));
-		}
-		
-		// Convert the buffer into a String and now try to fix it:
-		return tryQuickFix(buf.toString());
-	}
-
-	/**
-	 * Try fixing tokens/terms of the given ADQL query.
-	 *
-	 * <p>
-	 * 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	 *  It just try to fix the most common issues in ADQL queries, such as:
-	 * </p>
-	 * <ul>
-	 * 	<li>some Unicode characters confusable with ASCII characters (like a
-	 * 		space, a dash, ...) ; this function replace them by their ASCII
-	 * 		alternative,</li>
-	 * 	<li>any of the following are double quoted:
-	 * 		<ul>
-	 * 			<li>non regular ADQL identifiers
-	 * 				(e.g. <code>_RAJ2000</code>),</li>
-	 * 			<li>ADQL function names used as identifiers
-	 * 				(e.g. <code>distance</code>)</li>
-	 * 			<li>and SQL reserved keywords
-	 * 				(e.g. <code>public</code>).</li>
-	 * 		</ul>
-	 * 	</li>
-	 * </ul>
-	 *
-	 * <p><i><b>Note:</b>
-	 * 	This function does not use any instance variable of this parser
-	 * 	(especially the InputStream or Reader provided at initialisation or
-	 * 	ReInit).
-	 * </i></p>
-	 *
-	 * @param adqlQuery	The input ADQL query to fix.
-	 *
-	 * @return	The suggested correction of the given ADQL query.
-	 *
-	 * @throws ParseException	If any unrecognised character is encountered,
-	 *                       	or if anything else prevented the tokenization
-	 *                       	   of some characters/words/terms.
-	 *
-	 * @since 1.5
-	 */
-	public String tryQuickFix(String adqlQuery) throws ParseException {
-		StringBuffer suggestedQuery = new StringBuffer();
-
-		// 1. Replace all Unicode confusable characters:
-		adqlQuery = replaceUnicodeConfusables(adqlQuery);
-
-		/* 1.bis. Normalise new lines and tabulations
-		 *        (to simplify the column counting): */
-		adqlQuery = adqlQuery.replaceAll("(\r\n|\r|\n)", System.getProperty("line.separator")).replaceAll("\t", "    ");
-
-		// 2. Analyse the query token by token:
-		ADQLParser200TokenManager parser = new ADQLParser200TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(adqlQuery.getBytes())));
-		
-		final String[] lines = adqlQuery.split(System.getProperty("line.separator"));
-
-		try{
-			String suggestedToken;
-			int lastLine = 1, lastCol = 1;
-
-			Token token = null, nextToken = parser.getNextToken();
-			// for all tokens until the EOF or EOQ:
-			do{
-				// get the next token:
-				token = nextToken;
-				nextToken = (isEnd(token) ? null : parser.getNextToken());
-
-				// 3. Double quote any suspect token:
-				if (mustEscape(token, nextToken)){
-					suggestedToken = "\"" + token.image + "\"";
-				}else
-					suggestedToken = token.image;
-
-				/* 4. Append all space characters (and comments) before the
-				 *    token: */
-				/* same line, just get the space characters between the last
-				 * token and the one to append: */
-				if (lastLine == token.beginLine){
-					if (token.kind == ADQLParser200Constants.EOF)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1));
-					else
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - (isEnd(token) ? 0 : 1)));
-					lastCol = token.endColumn + 1;
+	  	// Return a Tokenizer: instance
+		return new Tokenizer() {
+		  	private final ADQLGrammar200TokenManager tokenManager = new ADQLGrammar200TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(expr.getBytes())));
+		  	private boolean eof = false;
+			@Override
+			public Token nextToken() {
+				if (eof)
+					return null;
+				else {
+					Token tok = tokenManager.getNextToken();
+					eof = (tok.kind == ADQLGrammar200Constants.EOF);
+					return tok;
 				}
-				// not the same line...
-				else{
-				    /* append all remaining space characters until the position
-				     * of the token to append: */
-					do{
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1)).append('\n');
-						lastLine++;
-						lastCol = 1;
-					}while(lastLine < token.beginLine);
-					/* if there are still space characters before the token,
-					 * append them as well: */
-					if (lastCol < token.beginColumn)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - 1));
-					// finally, set the correct column position:
-					lastCol = token.endColumn + 1;
-				}
-
-				// 5. Append the suggested token:
-				suggestedQuery.append(suggestedToken);
-
-			}while(!isEnd(token));
-
-		}catch(TokenMgrError err){
-		    // wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
-
-		return suggestedQuery.toString();
-	}
-
-	/**
-	 * All of the most common Unicode confusable characters and their
-	 * ASCII/UTF-8 alternative.
-	 *
-	 * <p>
-	 * 	Keys of this map represent the ASCII character while the values are the
-	 * 	regular expression for all possible Unicode alternatives.
-	 * </p>
-	 *
-	 * <p><i><b>Note:</b>
-	 * 	All of them have been listed using
-	 * 	<a href="https://unicode.org/cldr/utility/confusables.jsp">Unicode Utilities: Confusables</a>.
-	 * </i></p>
-	 *
-	 * @since 1.5
-	 */
-	protected final static java.util.Map<String, String> REGEX_UNICODE_CONFUSABLES = new java.util.HashMap<String, String>(10);
-	/** Regular expression matching all Unicode alternatives for <code>-</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_DASH         = "[\u002D\u02D7\u06D4\u2010\u2011\u2012\u2013\u2043\u2212\u2796\u2CBA\uFE58\u2014\u2015\u207B\u208B\u0096\u058A\uFE63\uFF0D]";
-	/** Regular expression matching all Unicode alternatives for <code>_</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_UNDERSCORE   = "[\u005F\u07FA\uFE4D\uFE4E\uFE4F]";
-	/** Regular expression matching all Unicode alternatives for <code>'</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_QUOTE        = "[\u0027\u0060\u00B4\u02B9\u02BB\u02BC\u02BD\u02BE\u02C8\u02CA\u02CB\u02F4\u0374\u0384\u055A\u055D\u05D9\u05F3\u07F4\u07F5\u144A\u16CC\u1FBD\u1FBF\u1FEF\u1FFD\u1FFE\u2018\u2019\u201B\u2032\u2035\uA78C\uFF07\uFF40]";
-	/** Regular expression matching all Unicode alternatives for <code>"</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_DOUBLE_QUOTE = "[\u02BA\u02DD\u02EE\u02F6\u05F2\u05F4\u1CD3\u201C\u201D\u201F\u2033\u2036\u3003\uFF02]";
-	/** Regular expression matching all Unicode alternatives for <code>.</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_STOP         = "[\u002E\u0660\u06F0\u0701\u0702\u2024\uA4F8\uA60E]";
-	/** Regular expression matching all Unicode alternatives for <code>+</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_PLUS         = "[\u002B\u16ED\u2795]";
-	/** Regular expression matching all Unicode alternatives for <code> </code>.
-	 * @since 1.5 */
-	protected final static String REGEX_SPACE        = "[\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F]";
-	/** Regular expression matching all Unicode alternatives for <code>&lt;</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_LESS_THAN    = "[\u003C\u02C2\u1438\u16B2\u2039\u276E]";
-	/** Regular expression matching all Unicode alternatives for <code>&gt;</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_GREATER_THAN = "[\u003E\u02C3\u1433\u203A\u276F]";
-	/** Regular expression matching all Unicode alternatives for <code>=</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_EQUAL        = "[\u003D\u1400\u2E40\u30A0\uA4FF]";
-	static {
-		REGEX_UNICODE_CONFUSABLES.put("-", REGEX_DASH);
-		REGEX_UNICODE_CONFUSABLES.put("_", REGEX_UNDERSCORE);
-		REGEX_UNICODE_CONFUSABLES.put("'", REGEX_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put("\"", REGEX_DOUBLE_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put(".", REGEX_STOP);
-		REGEX_UNICODE_CONFUSABLES.put("+", REGEX_PLUS);
-		REGEX_UNICODE_CONFUSABLES.put(" ", REGEX_SPACE);
-		REGEX_UNICODE_CONFUSABLES.put("<", REGEX_LESS_THAN);
-		REGEX_UNICODE_CONFUSABLES.put(">", REGEX_GREATER_THAN);
-		REGEX_UNICODE_CONFUSABLES.put("=", REGEX_EQUAL);
-	}
-
-	/**
-	 * Replace all Unicode characters that can be confused with other ASCI/UTF-8
-	 * characters (e.g. different spaces, dashes, ...) in their ASCII version.
-	 *
-	 * @param adqlQuery	The ADQL query string in which Unicode confusable
-	 *                 	characters must be replaced.
-	 *
-	 * @return	The same query without the most common Unicode confusable
-	 *        	characters.
-	 *
-	 * @since 1.5
-	 */
-	protected String replaceUnicodeConfusables(final String adqlQuery){
-		String newAdqlQuery = adqlQuery;
-		for(java.util.Map.Entry<String, String> confusable : REGEX_UNICODE_CONFUSABLES.entrySet())
-			newAdqlQuery = newAdqlQuery.replaceAll(confusable.getValue(), confusable.getKey());
-		return newAdqlQuery;
-	}
-
-	/**
-	 * Tell whether the given token represents the end of an ADQL query.
-	 *
-	 * @param token	Token to analyze.
-	 *
-	 * @return	<code>true</code> if the given token represents a query end,
-	 *        	<code>false</code> otherwise.
-	 *
-	 * @since 1.5
-	 */
-	protected boolean isEnd(final Token token){
-		return token.kind == ADQLParser200Constants.EOF || token.kind == ADQLParser200Constants.EOQ;
-	}
-
-	/**
-	 * Tell whether the given token must be double quoted.
-	 *
-	 * <p>
-	 * 	This function considers all the following as terms to double quote:
-	 * </p>
-	 * <ul>
-	 * 	<li>SQL reserved keywords</li>,
-	 * 	<li>unrecognised regular identifiers (e.g. neither a delimited nor a
-	 * 		valid ADQL regular identifier)</li>
-	 * 	<li>and ADQL function name without a parameters list.</li>
-	 * </ul>
-	 *
-	 * @param token		The token to analyze.
-	 * @param nextToken	The following token. (useful to detect the start of a
-	 *                 	function's parameters list)
-	 *
-	 * @return	<code>true</code> if the given token must be double quoted,
-	 *        	<code>false</code> to keep it as provided.
-	 *
-	 * @since 1.5
-	 */
-	protected boolean mustEscape(final Token token, final Token nextToken){
-		switch(token.kind){
-			case ADQLParser200Constants.SQL_RESERVED_WORD:
-				return true;
-			case ADQLParser200Constants.REGULAR_IDENTIFIER_CANDIDATE:
-				return !isRegularIdentifier(token.image);
-			default:
-				return token.isFunctionName && (nextToken == null || nextToken.kind != ADQLParser200Constants.LEFT_PAR);
-		}
+			}
+		};
 	}
+	
 }
 
-PARSER_END(ADQLParser200)
+PARSER_END(ADQLGrammar200)
 
 				/* ################################### */
 				/* # CUSTOMIZATION OF TOKEN CREATION # */
@@ -997,7 +180,7 @@ PARSER_END(ADQLParser200)
 
 TOKEN_MGR_DECLS: {
 	protected void CommonTokenAction(final Token t) {
-		t.adqlVersion = ADQLParserFactory.ADQLVersion.V2_0;
+		t.adqlVersion = ADQLGrammar200.VERSION;
 	} 
 }
 
@@ -1223,42 +406,17 @@ TOKEN : {
 /* ******************* */
 /* GENERAL ADQL SYNTAX */
 /* ******************* */
-/**
-* Parses the ADQL query given at the parser creation or in the {@link ADQLParser200#ReInit(java.io.InputStream)}
-* or in the <i>parseQuery</i> functions.
-*
-* @return					The object representation of the query.
-* @throws ParseException	If the query syntax is incorrect.
-*/
+
 ADQLQuery Query(): {ADQLQuery q = null;}{
 	q=QueryExpression() (<EOF> | <EOQ>)
-	{
-		/* check the optional features before any other check:
-		 * (note: this check is very close to grammar check...hence its higher
-		 *        priority) */
-		UnresolvedIdentifiersException exUnsupportedFeatures = new UnresolvedIdentifiersException("unsupported expression");
-		SearchOptionalFeaturesHandler sFeaturesHandler = new SearchOptionalFeaturesHandler(true, false);
-		sFeaturesHandler.search(q);
-		for(ADQLObject obj : sFeaturesHandler) {
-			if (!supportedFeatures.isSupporting(obj.getFeatureDescription()))
-				exUnsupportedFeatures.addException(new UnsupportedFeatureException(obj));
-		}
-		if (exUnsupportedFeatures.getNbErrors() > 0)
-			throw exUnsupportedFeatures;
-	  
-		// check the query:
-		if (queryChecker != null)
-			queryChecker.check(q);
-			
-		return q;
-	}
+	{ return q; }
 }
 
 ADQLQuery QueryExpression(): {TextPosition endPos = null;} {
 	{
 		try{
 			// create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_0);
+			query = queryFactory.createQuery(VERSION);
 			stackQuery.push(query);
 		}catch(Exception ex){
 			throw generateParseException(ex);
@@ -2193,8 +1351,6 @@ UserDefinedFunction UserDefinedFunction(): {Token fct, end; Vector<ADQLOperand>
 		if (!isRegularIdentifier(fct.image))
 			throw new ParseException("Invalid (User Defined) Function name: \""+fct.image+"\"!", new TextPosition(fct));
 		
-		//System.out.println("INFO [ADQLParser200]: \""+fct.image+"\" (from line "+fct.beginLine+" and column "+fct.beginColumn+" to line "+token.endLine+" and column "+(token.endColumn+1)+") is considered as an user defined function !");
-		
 		try{
 			//  Build the parameters list:
 			ADQLOperand[] parameters = new ADQLOperand[params.size()];
diff --git a/src/adql/parser/adqlGrammar201.jj b/src/adql/parser/grammar/adqlGrammar201.jj
similarity index 61%
rename from src/adql/parser/adqlGrammar201.jj
rename to src/adql/parser/grammar/adqlGrammar201.jj
index 98a75d6..5276df3 100644
--- a/src/adql/parser/adqlGrammar201.jj
+++ b/src/adql/parser/grammar/adqlGrammar201.jj
@@ -26,12 +26,12 @@
 * successfully tested with JavaCC 6.0.
 * 
 * The generated parser checks the syntax of the given ADQL query and generates
-* an object representation but no coherence with any database is done.
-* If the syntax is not conform to the ADQL definition an error message is
-* printed else it will be the message "Correct syntax".
+* an object representation but no consistency with any database is checked.
+* If the syntax is not conform to the ADQL definition a TokenMgrError or a
+* ParseException is thrown.
 *
-*  Author:  Gr&eacute;gory Mantelet (CDS)
-*  Version: 2.0 (07/2019)
+* Author:  Gr&eacute;gory Mantelet (CDS)
+* Version: 2.0 (08/2019)
 */
 
 							/* ########### */
@@ -48,9 +48,9 @@ options {
 							/* ########## */
 							/* # PARSER # */
 							/* ########## */
-PARSER_BEGIN(ADQLParser201)
+PARSER_BEGIN(ADQLGrammar201)
 
-package adql.parser;
+package adql.parser.grammar;
 
 /*
  * This file is part of ADQLLibrary.
@@ -71,26 +71,16 @@ package adql.parser;
  * Copyright 2019 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
  */
 
-import java.util.Stack;
 import java.util.Vector;
 import java.util.ArrayList;
-import java.util.Collection;
 
-import java.io.FileReader;
-import java.io.IOException;
-
-import adql.db.exception.UnsupportedFeatureException;
-import adql.db.exception.UnresolvedIdentifiersException;
-
-import adql.parser.ADQLParserFactory.ADQLVersion;
+import adql.parser.ADQLParser.ADQLVersion;
 
+import adql.parser.IdentifierItems;
 import adql.parser.IdentifierItems.IdentifierItem;
 
 import adql.parser.ADQLQueryFactory.JoinType;
 
-import adql.parser.feature.FeatureSet;
-import adql.parser.feature.LanguageFeature;
-
 import adql.query.*;
 import adql.query.from.*;
 import adql.query.constraint.*;
@@ -104,886 +94,87 @@ import adql.query.operand.function.string.*;
 import adql.query.operand.function.geometry.*;
 import adql.query.operand.function.geometry.GeometryFunction.GeometryValue;
 
-import adql.search.SearchOptionalFeaturesHandler;
-
-import adql.translator.PostgreSQLTranslator;
-import adql.translator.TranslationException;
-
 /**
-* Parses an ADQL-2.1 query thanks to the {@link ADQLParser201#Query() Query()} function.
-* 
-* <p>
-*   This parser is able, thanks to a {@link QueryChecker} object, to check each
-*   {@link ADQLQuery} just after its generation. It could be used to check the
-*   consistency between the ADQL query to parse and the "database" on which the
-*   query must be executed. By default, there is no {@link QueryChecker}. Thus
-*   you must extend {@link QueryChecker} to check semantically all generated
-*   ADQLQuery objects.
-* </p>
-* 
-* <p>
-*   To create an object representation of the given ADQL query, this parser uses
-*   a {@link ADQLQueryFactory} object. So if you want customize some object
-*   (ie. CONTAINS) of this representation you just have to extend the
-*   corresponding default object (ie. ContainsFunction) and to extend the
-*   corresponding function of {@link ADQLQueryFactory}
-*   (ie. createContains(...)).
-* </p>
-*
-* <p>Here are the key functions to use:</p>
-* <ul>
-* 	<li>{@link #parseQuery(java.lang.String)} (or any of its alternatives)
-* 		to parse an input ADQL query String and get its corresponding ADQL tree
-*   </li>
-*   <li>{@link #tryQuickFix(java.lang.String)} to try fixing the most common
-* 		issues with ADQL queries (e.g. Unicode confusable characters,
-* 		unescaped ADQL identifiers, SQL reserved keywords, ...)</li>
-*   <li>{@link #setSupportedFeatures(FeatureSet)} to set which optional ADQL
-* 		features are supported or not ; all optional features used in the query
-* 		while being declared as un-supported will throw an error at the end of
-* 		the parsing</li>
-* </ul>
-* 
-* <p><b><u>WARNING:</u>
-*   To modify this class it's strongly encouraged to modify the .jj file in the
-*   section between <i>PARSER_BEGIN</i> and <i>PARSER_END</i> and to re-compile
-*   it with JavaCC.
-* </b></p>
-*
-* @see QueryChecker
-* @see ADQLQueryFactory
-*
-* @author Gr&eacute;gory Mantelet (CDS)
-* @version 2.0 (07/2019)
-* @since 2.0
-*/
-public class ADQLParser201 implements ADQLParser {
-	
-	/** Tools to build the object representation of the ADQL query. */
-	private ADQLQueryFactory queryFactory = new ADQLQueryFactory();
-
-	/** Default set of supported language features.
-	 * <p><i><b>Note:</b>
-	 * 	By default, all optional features are supported.
-	 * </i></p> */
-	private FeatureSet supportedFeatures = new FeatureSet(true, true);
-	
-	/** The stack of queries (because there may be some sub-queries). */
-	private Stack<ADQLQuery> stackQuery = new Stack<ADQLQuery>();
-	
-	/** The object representation of the ADQL query to parse.
-	 * (ONLY USED DURING THE PARSING, else it is always <i>null</i>). */
-	private ADQLQuery query = null;
-	
-	/** Checks each {@link ADQLQuery} (sub-query or not) just after their
-	 * generation. */
-	private QueryChecker queryChecker = null;
-	
-	/**
-	* Builds an ADQL parser without a query to parse.
-	*/
-	public ADQLParser201(){
-		this(new java.io.ByteArrayInputStream("".getBytes()));
-		setDebug(false);
-	}
-	
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker} and a {@link ADQLQueryFactory}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(QueryChecker checker, ADQLQueryFactory factory) {
-		this();
-		
-		queryChecker = checker;
-			
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link QueryChecker}.
-	*
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(QueryChecker checker) {
-		this(checker, null);
-	}
-	
-	/**
-	* Builds an ADQL parser without a query to parse but with a
-	* {@link ADQLQueryFactory}.
-	*
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(ADQLQueryFactory factory) {
-		this((QueryChecker)null, factory);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
-		
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(java.io.InputStream stream, QueryChecker checker) {
-		this(stream, checker, null);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, ADQLQueryFactory factory) {
-		this(stream, (QueryChecker)null, factory);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, String encoding, QueryChecker checker, ADQLQueryFactory factory) {
-		this(stream, encoding);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
-		
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(java.io.InputStream stream, String encoding, QueryChecker checker) {
-		this(stream, encoding, checker, null);
-	}
-	
-	/**
-	* Builds a parser with a stream containing the query to parse.
-	*
-	* @param stream		The stream in which the ADQL query to parse is given.
-	* @param encoding	The supplied encoding.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.InputStream stream, String encoding, ADQLQueryFactory factory) {
-		this(stream, encoding, null, factory);
-	}
-	
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.Reader reader, QueryChecker checker, ADQLQueryFactory factory) {
-		this(reader);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(java.io.Reader reader, QueryChecker checker) {
-		this(reader, checker, null);
-	}
-	
-	/**
-	* Builds a parser with a reader containing the query to parse.
-	*
-	* @param reader		The reader in which the ADQL query to parse is given.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(java.io.Reader reader, ADQLQueryFactory factory) {
-		this(reader, null, factory);
-	}
-	
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery }.
-	* @param factory	The object to use to build an object representation
-	*               	of the given ADQL query.
-	*/
-	public ADQLParser201(ADQLParser201TokenManager tm, QueryChecker checker, ADQLQueryFactory factory) {
-		this(tm);
-		
-		setDebug(false);
-		
-		queryChecker = checker;
-
-		if (factory != null)
-			queryFactory = factory;
-	}
-	
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param checker	The object to use to check each {@link ADQLQuery}.
-	*/
-	public ADQLParser201(ADQLParser201TokenManager tm, QueryChecker checker) {
-		this(tm, checker, null);
-	}
-	
-	/**
-	* Builds a parser with another token manager.
-	*
-	* @param tm			The manager which associates a token to a numeric code.
-	* @param factory	The object to use to build an object representation of
-	*               	the given ADQL query.
-	*/
-	public ADQLParser201(ADQLParser201TokenManager tm, ADQLQueryFactory factory) {
-		this(tm, null, factory);
-	}
-
-	/* ADDITIONAL GETTERS & SETTERS */
-
-	public final ADQLVersion getADQLVersion() {
-		return ADQLVersion.V2_1;
-	}
-	
-	public final void setDebug(boolean debug){
-		if (debug) enable_tracing();
-		else       disable_tracing();
-	}
-	
-	public final QueryChecker getQueryChecker(){
-		return queryChecker;
-	}
-	
-	public final void setQueryChecker(QueryChecker checker){
-		queryChecker = checker;
-	}
-	
-	public final ADQLQueryFactory getQueryFactory(){
-		return queryFactory;
-	}
-	
-	public final void setQueryFactory(ADQLQueryFactory factory){
-		queryFactory = (factory!=null)?factory:(new ADQLQueryFactory());
-	}
-
-	public final FeatureSet getSupportedFeatures() {
-		return supportedFeatures;
-	}
-
-	public void setSupportedFeatures(final FeatureSet features) {
-		if (features != null)
-			supportedFeatures = features;
-	}
-
-	/* EXCEPTION HELPER FUNCTION */
-	
-	private final ParseException generateParseException(Exception ex){
-		if (!(ex instanceof ParseException)){
-			ParseException pex = new ParseException("["+ex.getClass().getName()+"] "+ex.getMessage());
-			pex.setStackTrace(ex.getStackTrace());
-			return pex;
-		}else
-			return (ParseException)ex;
-	}
-
-	/* QUERY PARSING FUNCTIONS */
-
-	/**
-	 * Tell whether the given string is a valid ADQL regular identifier.
-	 *
-	 * <p>
-	 * 	According to the ADQL-2.0's BNF, a regular identifier (i.e. not delimited
-	 * 	; not between double quotes) must be a letter followed by a letter, digit
-	 * 	or underscore. So, the following regular expression:
-	 * </p>
-	 * <pre>[a-zA-Z]+[a-zA-Z0-9_]*</pre>
-	 *
-	 * <p>This is what this function tests on the given string.</p>
-	 *
-	 * @param idCandidate	The string to test.
-	 *
-	 * @return	<code>true</code> if the given string is a valid regular
-	 *        	identifier,
-	 *        	<code>false</code> otherwise.
-	 *
-	 * @see #testRegularIdentifier(adql.parser.Token)
-	 *
-	 * @since 1.5
-	 */
-	public final boolean isRegularIdentifier(final String idCandidate) {
-		return idCandidate.matches("[a-zA-Z]+[a-zA-Z0-9_]*");
-	}
+ * Parser of ADQL expressions following the ADQL-2.1 grammar.
+ *
+ * <p><i><b>Note:</b>
+ * 	It is strongly recommended to not use this class directly in order to parse
+ * 	an ADQL expression. Instead, you should use
+ * 	{@link adql.parser.ADQLParser ADQLParser}. It provides a more user-friendly
+ * 	interface and provides additional features.
+ * </i></p>
+ *
+ * @see ADQLParser
+ *
+ * @author Gr&eacute;gory Mantelet (CDS)
+ * @version 2.0 (08/2019)
+ * @since 2.0
+ */
+public class ADQLGrammar201 extends ADQLGrammarBase {
 
-	/**
-	 * Test the given token as an ADQL's regular identifier.
-	 *
-	 * <p>
-	 * 	This function uses {@link #isRegularIdentifier(java.lang.String)} to
-	 * 	test the given token's image. If the test fails, a
-	 * 	{@link adql.parser.ParseException} is thrown.
-	 * </p>
-	 *
-	 * @param token	The token to test.
-	 *
-	 * @throws ParseException	If the given token is not a valid ADQL regular
-	 *                       	identifier.
-	 *
-	 * @see #isRegularIdentifier(java.lang.String)
-	 *
-	 * @since 1.5
-	 */
-	public final void testRegularIdentifier(final Token token) throws ParseException {
-		if (!isRegularIdentifier(token.image))
-			throw new ParseException("Invalid ADQL regular identifier: \""+token.image+"\"! If it aims to be a column/table name/alias, you should write it between double quotes.", new TextPosition(token));
-	}
-	
-	/**
-	* Parses the query given at the creation of this parser or in the
-	* <i>ReInit</i> functions.
-	*
-	* @return 	The object representation of the given ADQL query.
-	* 
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser201#Query()
-	*/
-	public final ADQLQuery parseQuery() throws ParseException {
-		stackQuery.clear();
-		query = null;
-		try { 
-			return Query();
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-	
-	/**
-	* Parses the query given in parameter.
-	*
-	* @param q	The ADQL query to parse.
-	* 
-	* @return	The object representation of the given ADQL query.
-	* 
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser201#ReInit(java.io.InputStream)
-	* @see ADQLParser201#setDebug(boolean)
-	* @see ADQLParser201#Query()
-	*/
-	public final ADQLQuery parseQuery(String q) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(new java.io.ByteArrayInputStream(q.getBytes()));
-		try { 
-			return Query();
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
+	/* **********************************************************************
+	   *                         GETTERS/SETTERS                            *
+	   ********************************************************************** */
 	
-	/**
-	* Parses the query contained in the stream given in parameter.
-	*
-	* @param stream		The stream which contains the ADQL query to parse.
-	* 
-	* @return	The object representation of the given ADQL query.
-	* 
-	* @throws ParseException	If there is at least one syntactic error.
-	*
-	* @see ADQLParser201#ReInit(java.io.InputStream)
-	* @see ADQLParser201#setDebug(boolean)
-	* @see ADQLParser201#Query()
-	*/
-	public final ADQLQuery parseQuery(java.io.InputStream stream) throws ParseException {
-		stackQuery.clear();
-		query = null;
-		ReInit(stream);
-		try { 
-			return Query();
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}
-	}
-
-	@Override
-	public final ClauseSelect parseSelect(java.lang.String adql) throws ParseException {
-	    // Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a SELECT clause:
-			Select();
+	/** Implemented version of the ADQL Standard. */
+  	public final static ADQLVersion VERSION = ADQLVersion.V2_1;
 
-			// Return what's just got parsed:
-			return query.getSelect();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
+	public final ADQLVersion getVersion() {
+		return VERSION;
 	}
-	
-	@Override
-	public final FromContent parseFrom(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
 
-			// Parse the string as a FROM clause:
-			From();
+	/* **********************************************************************
+	   *                         TOKEN KIND TESTS                           *
+	   ********************************************************************** */
 
-			// Return what's just got parsed:
-			return query.getFrom();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
+	public final boolean isEOF(final Token token) {
+		return token != null && token.kind == ADQLGrammar201Constants.EOF;
 	}
-	
-	@Override
-	public final ClauseConstraints parseWhere(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a WHERE clause:
-			Where();
 
-			// Return what's just got parsed:
-			return query.getWhere();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
+	public final boolean isEOQ(final Token token) {
+		return token != null && token.kind == ADQLGrammar201Constants.EOQ;
 	}
-	
-	@Override
-	public final ClauseADQL<ADQLOrder> parseOrderBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a ORDER BY clause:
-			OrderBy();
 
-			// Return what's just got parsed:
-			return query.getOrderBy();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
+	public final boolean isRegularIdentifierCandidate(final Token token) {
+		return token != null && token.kind == ADQLGrammar201Constants.REGULAR_IDENTIFIER_CANDIDATE;
 	}
-	
-	@Override
-	public final ClauseADQL<ADQLColumn> parseGroupBy(java.lang.String adql) throws ParseException {
-		// Set the string to parse:
-		ReInit(new java.io.ByteArrayInputStream(adql.getBytes()));
-		
-		try {
-			// Create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
-
-			// Parse the string as a GROUP BY clause:
-			GroupBy();
 
-			// Return what's just got parsed:
-			return query.getGroupBy();
-			
-		}catch(TokenMgrError tme) {
-			throw new ParseException(tme);
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
+	public final boolean isSQLReservedWord(final Token token) {
+		return token != null && token.kind == ADQLGrammar201Constants.SQL_RESERVED_WORD;
 	}
 
-	/* TOKENIZATION FUNCTION */
-
-	public Token[] tokenize(final String expr) throws ParseException {
-		ADQLParser201TokenManager parser = new ADQLParser201TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(expr.getBytes())));
-		try{
-			ArrayList<Token> tokens = new ArrayList<Token>();
-			Token token;
-			while(!isEnd((token=parser.getNextToken()))){
-				tokens.add(token);
-			}
-			return tokens.toArray(new Token[tokens.size()]);
-		}catch(TokenMgrError err){
-		    // wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
+	public final boolean isLeftPar(final Token token) {
+		return token != null && token.kind == ADQLGrammar201Constants.LEFT_PAR;
 	}
 
-	/* CORRECTION SUGGESTION */
-
-	/**
-	 * Try fixing tokens/terms of the input ADQL query.
-	 *
-	 * <p>
-	 * 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	 *  It just try to fix the most common issues in ADQL queries, such as:
-	 * </p>
-	 * <ul>
-	 * 	<li>some Unicode characters confusable with ASCII characters (like a
-	 * 		space, a dash, ...) ; this function replace them by their ASCII
-	 * 		alternative,</li>
-	 * 	<li>any of the following are double quoted:
-	 * 		<ul>
-	 * 			<li>non regular ADQL identifiers
-	 * 				(e.g. <code>_RAJ2000</code>),</li>
-	 * 			<li>ADQL function names used as identifiers
-	 * 				(e.g. <code>distance</code>)</li>
-	 * 			<li>and SQL reserved keywords
-	 * 				(e.g. <code>public</code>).</li>
-	 * 		</ul>
-	 * 	</li>
-	 * </ul>
-	 *
-	 * <p><i><b>Note 1:</b>
-	 * 	The given stream is NOT closed by this function even if the EOF is
-	 * 	reached. It is the responsibility of the caller to close it.
-	 * </i></p>
-	 *
-	 * <p><i><b>Note 2:</b>
-	 * 	This function does not use any instance variable of this parser
-	 * 	(especially the InputStream or Reader provided at initialisation or
-	 * 	ReInit).
-	 * </i></p>
-	 *
-	 * @param input	Stream containing the input ADQL query to fix.
-	 *
-	 * @return	The suggested correction of the input ADQL query.
-	 *
-	 * @throws java.io.IOException	If there is any error while reading from the
-	 *                            	given input stream.
-	 * @throws ParseException	If any unrecognised character is encountered,
-	 *                       	or if anything else prevented the tokenization
-	 *                       	   of some characters/words/terms.
-	 *
-	 * @see #tryQuickFix(java.lang.String)
-	 *
-	 * @since 1.5
-	 */
-	public final String tryQuickFix(final java.io.InputStream input) throws java.io.IOException, ParseException {
-		// Fetch everything into a single string:
-		StringBuffer buf = new StringBuffer();
-		byte[] cBuf = new byte[1024];
-		int nbChar;
-		while((nbChar = input.read(cBuf)) > -1){
-			buf.append(new String(cBuf, 0, nbChar));
-		}
-		
-		// Convert the buffer into a String and now try to fix it:
-		return tryQuickFix(buf.toString());
-	}
+	/* **********************************************************************
+	   *                        TOKENIZATION HELPER                         *
+	   ********************************************************************** */
 
-	/**
-	 * Try fixing tokens/terms of the given ADQL query.
-	 *
-	 * <p>
-	 * 	<b>This function does not try to fix syntactical or semantical errors.</b>
-	 *  It just try to fix the most common issues in ADQL queries, such as:
-	 * </p>
-	 * <ul>
-	 * 	<li>some Unicode characters confusable with ASCII characters (like a
-	 * 		space, a dash, ...) ; this function replace them by their ASCII
-	 * 		alternative,</li>
-	 * 	<li>any of the following are double quoted:
-	 * 		<ul>
-	 * 			<li>non regular ADQL identifiers
-	 * 				(e.g. <code>_RAJ2000</code>),</li>
-	 * 			<li>ADQL function names used as identifiers
-	 * 				(e.g. <code>distance</code>)</li>
-	 * 			<li>and SQL reserved keywords
-	 * 				(e.g. <code>public</code>).</li>
-	 * 		</ul>
-	 * 	</li>
-	 * </ul>
-	 *
-	 * <p><i><b>Note:</b>
-	 * 	This function does not use any instance variable of this parser
-	 * 	(especially the InputStream or Reader provided at initialisation or
-	 * 	ReInit).
-	 * </i></p>
-	 *
-	 * @param adqlQuery	The input ADQL query to fix.
-	 *
-	 * @return	The suggested correction of the given ADQL query.
-	 *
-	 * @throws ParseException	If any unrecognised character is encountered,
-	 *                       	or if anything else prevented the tokenization
-	 *                       	   of some characters/words/terms.
-	 *
-	 * @since 1.5
-	 */
-	public String tryQuickFix(String adqlQuery) throws ParseException {
-		StringBuffer suggestedQuery = new StringBuffer();
-
-		// 1. Replace all Unicode confusable characters:
-		adqlQuery = replaceUnicodeConfusables(adqlQuery);
-
-		/* 1.bis. Normalise new lines and tabulations
-		 *        (to simplify the column counting): */
-		adqlQuery = adqlQuery.replaceAll("(\r\n|\r|\n)", System.getProperty("line.separator")).replaceAll("\t", "    ");
-
-		// 2. Analyse the query token by token:
-		ADQLParser201TokenManager parser = new ADQLParser201TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(adqlQuery.getBytes())));
-		
-		final String[] lines = adqlQuery.split(System.getProperty("line.separator"));
+	public final Tokenizer getTokenizer(final String expr) throws NullPointerException {
+		// Error if no expression to tokenize:
+	  	if (expr == null)
+	  		throw new NullPointerException("Missing ADQL expression to tokenize!");
 
-		try{
-			String suggestedToken;
-			int lastLine = 1, lastCol = 1;
-
-			Token token = null, nextToken = parser.getNextToken();
-			// for all tokens until the EOF or EOQ:
-			do{
-				// get the next token:
-				token = nextToken;
-				nextToken = (isEnd(token) ? null : parser.getNextToken());
-
-				// 3. Double quote any suspect token:
-				if (mustEscape(token, nextToken)){
-					suggestedToken = "\"" + token.image + "\"";
-				}else
-					suggestedToken = token.image;
-
-				/* 4. Append all space characters (and comments) before the
-				 *    token: */
-				/* same line, just get the space characters between the last
-				 * token and the one to append: */
-				if (lastLine == token.beginLine){
-					if (token.kind == ADQLParser201Constants.EOF)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1));
-					else
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - (isEnd(token) ? 0 : 1)));
-					lastCol = token.endColumn + 1;
-				}
-				// not the same line...
-				else{
-				    /* append all remaining space characters until the position
-				     * of the token to append: */
-					do{
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1)).append('\n');
-						lastLine++;
-						lastCol = 1;
-					}while(lastLine < token.beginLine);
-					/* if there are still space characters before the token,
-					 * append them as well: */
-					if (lastCol < token.beginColumn)
-						suggestedQuery.append(lines[lastLine - 1].substring(lastCol - 1, token.beginColumn - 1));
-					// finally, set the correct column position:
-					lastCol = token.endColumn + 1;
+	  	// Return a Tokenizer: instance
+		return new Tokenizer() {
+		  	private final ADQLGrammar201TokenManager tokenManager = new ADQLGrammar201TokenManager(new SimpleCharStream(new java.io.ByteArrayInputStream(expr.getBytes())));
+		  	private boolean eof = false;
+			@Override
+			public Token nextToken() {
+				if (eof)
+					return null;
+				else {
+					Token tok = tokenManager.getNextToken();
+					eof = (tok.kind == ADQLGrammar201Constants.EOF);
+					return tok;
 				}
-
-				// 5. Append the suggested token:
-				suggestedQuery.append(suggestedToken);
-
-			}while(!isEnd(token));
-
-		}catch(TokenMgrError err){
-		    // wrap such errors and propagate them:
-			throw new ParseException(err);
-		}
-
-		return suggestedQuery.toString();
-	}
-
-	/**
-	 * All of the most common Unicode confusable characters and their
-	 * ASCII/UTF-8 alternative.
-	 *
-	 * <p>
-	 * 	Keys of this map represent the ASCII character while the values are the
-	 * 	regular expression for all possible Unicode alternatives.
-	 * </p>
-	 *
-	 * <p><i><b>Note:</b>
-	 * 	All of them have been listed using
-	 * 	<a href="https://unicode.org/cldr/utility/confusables.jsp">Unicode Utilities: Confusables</a>.
-	 * </i></p>
-	 *
-	 * @since 1.5
-	 */
-	protected final static java.util.Map<String, String> REGEX_UNICODE_CONFUSABLES = new java.util.HashMap<String, String>(10);
-	/** Regular expression matching all Unicode alternatives for <code>-</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_DASH         = "[\u002D\u02D7\u06D4\u2010\u2011\u2012\u2013\u2043\u2212\u2796\u2CBA\uFE58\u2014\u2015\u207B\u208B\u0096\u058A\uFE63\uFF0D]";
-	/** Regular expression matching all Unicode alternatives for <code>_</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_UNDERSCORE   = "[\u005F\u07FA\uFE4D\uFE4E\uFE4F]";
-	/** Regular expression matching all Unicode alternatives for <code>'</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_QUOTE        = "[\u0027\u0060\u00B4\u02B9\u02BB\u02BC\u02BD\u02BE\u02C8\u02CA\u02CB\u02F4\u0374\u0384\u055A\u055D\u05D9\u05F3\u07F4\u07F5\u144A\u16CC\u1FBD\u1FBF\u1FEF\u1FFD\u1FFE\u2018\u2019\u201B\u2032\u2035\uA78C\uFF07\uFF40]";
-	/** Regular expression matching all Unicode alternatives for <code>"</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_DOUBLE_QUOTE = "[\u02BA\u02DD\u02EE\u02F6\u05F2\u05F4\u1CD3\u201C\u201D\u201F\u2033\u2036\u3003\uFF02]";
-	/** Regular expression matching all Unicode alternatives for <code>.</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_STOP         = "[\u002E\u0660\u06F0\u0701\u0702\u2024\uA4F8\uA60E]";
-	/** Regular expression matching all Unicode alternatives for <code>+</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_PLUS         = "[\u002B\u16ED\u2795]";
-	/** Regular expression matching all Unicode alternatives for <code> </code>.
-	 * @since 1.5 */
-	protected final static String REGEX_SPACE        = "[\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F]";
-	/** Regular expression matching all Unicode alternatives for <code>&lt;</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_LESS_THAN    = "[\u003C\u02C2\u1438\u16B2\u2039\u276E]";
-	/** Regular expression matching all Unicode alternatives for <code>&gt;</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_GREATER_THAN = "[\u003E\u02C3\u1433\u203A\u276F]";
-	/** Regular expression matching all Unicode alternatives for <code>=</code>.
-	 * @since 1.5 */
-	protected final static String REGEX_EQUAL        = "[\u003D\u1400\u2E40\u30A0\uA4FF]";
-	static {
-		REGEX_UNICODE_CONFUSABLES.put("-", REGEX_DASH);
-		REGEX_UNICODE_CONFUSABLES.put("_", REGEX_UNDERSCORE);
-		REGEX_UNICODE_CONFUSABLES.put("'", REGEX_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put("\"", REGEX_DOUBLE_QUOTE);
-		REGEX_UNICODE_CONFUSABLES.put(".", REGEX_STOP);
-		REGEX_UNICODE_CONFUSABLES.put("+", REGEX_PLUS);
-		REGEX_UNICODE_CONFUSABLES.put(" ", REGEX_SPACE);
-		REGEX_UNICODE_CONFUSABLES.put("<", REGEX_LESS_THAN);
-		REGEX_UNICODE_CONFUSABLES.put(">", REGEX_GREATER_THAN);
-		REGEX_UNICODE_CONFUSABLES.put("=", REGEX_EQUAL);
-	}
-
-	/**
-	 * Replace all Unicode characters that can be confused with other ASCI/UTF-8
-	 * characters (e.g. different spaces, dashes, ...) in their ASCII version.
-	 *
-	 * @param adqlQuery	The ADQL query string in which Unicode confusable
-	 *                 	characters must be replaced.
-	 *
-	 * @return	The same query without the most common Unicode confusable
-	 *        	characters.
-	 *
-	 * @since 1.5
-	 */
-	protected String replaceUnicodeConfusables(final String adqlQuery){
-		String newAdqlQuery = adqlQuery;
-		for(java.util.Map.Entry<String, String> confusable : REGEX_UNICODE_CONFUSABLES.entrySet())
-			newAdqlQuery = newAdqlQuery.replaceAll(confusable.getValue(), confusable.getKey());
-		return newAdqlQuery;
-	}
-
-	/**
-	 * Tell whether the given token represents the end of an ADQL query.
-	 *
-	 * @param token	Token to analyze.
-	 *
-	 * @return	<code>true</code> if the given token represents a query end,
-	 *        	<code>false</code> otherwise.
-	 *
-	 * @since 1.5
-	 */
-	protected boolean isEnd(final Token token){
-		return token.kind == ADQLParser201Constants.EOF || token.kind == ADQLParser201Constants.EOQ;
-	}
-
-	/**
-	 * Tell whether the given token must be double quoted.
-	 *
-	 * <p>
-	 * 	This function considers all the following as terms to double quote:
-	 * </p>
-	 * <ul>
-	 * 	<li>SQL reserved keywords</li>,
-	 * 	<li>unrecognised regular identifiers (e.g. neither a delimited nor a
-	 * 		valid ADQL regular identifier)</li>
-	 * 	<li>and ADQL function name without a parameters list.</li>
-	 * </ul>
-	 *
-	 * @param token		The token to analyze.
-	 * @param nextToken	The following token. (useful to detect the start of a
-	 *                 	function's parameters list)
-	 *
-	 * @return	<code>true</code> if the given token must be double quoted,
-	 *        	<code>false</code> to keep it as provided.
-	 *
-	 * @since 1.5
-	 */
-	protected boolean mustEscape(final Token token, final Token nextToken){
-		switch(token.kind){
-			case ADQLParser201Constants.SQL_RESERVED_WORD:
-				return true;
-			case ADQLParser201Constants.REGULAR_IDENTIFIER_CANDIDATE:
-				return !isRegularIdentifier(token.image);
-			default:
-				return token.isFunctionName && (nextToken == null || nextToken.kind != ADQLParser201Constants.LEFT_PAR);
-		}
+			}
+		};
 	}
 }
 
-PARSER_END(ADQLParser201)
+PARSER_END(ADQLGrammar201)
 
 				/* ################################### */
 				/* # CUSTOMIZATION OF TOKEN CREATION # */
@@ -991,7 +182,7 @@ PARSER_END(ADQLParser201)
 
 TOKEN_MGR_DECLS: {
 	protected void CommonTokenAction(final Token t) {
-		t.adqlVersion = ADQLParserFactory.ADQLVersion.V2_1;
+		t.adqlVersion = ADQLGrammar201.VERSION;
 	} 
 }
 
@@ -1008,7 +199,7 @@ SKIP : { < " " | "\t" | "\n" | "\r" | "\r\n" > }
 /* Reserved SQL words                                                         */
 /*                                                                            */
 /* NOTE:                                                                      */
-/*   This list is the one provided by the ADQL-2.0 standard after removal of  */
+/*   This list is the one provided by the ADQL-2.1 standard after removal of  */
 /*   all ADQL used words (e.g. SELECT, AS, LIKE, AVG, ABS, COS, POINT).       */
 /*   (see ParseException.initialise(Token, int[][], String[]) for more        */
 /*   details)                                                                 */
@@ -1225,42 +416,17 @@ TOKEN : {
 /* ******************* */
 /* GENERAL ADQL SYNTAX */
 /* ******************* */
-/**
-* Parses the ADQL query given at the parser creation or in the {@link ADQLParser201#ReInit(java.io.InputStream)}
-* or in the <i>parseQuery</i> functions.
-*
-* @return					The object representation of the query.
-* @throws ParseException	If the query syntax is incorrect.
-*/
+
 ADQLQuery Query(): {ADQLQuery q = null;}{
 	q=QueryExpression() (<EOF> | <EOQ>)
-	{
-		/* check the optional features before any other check:
-		 * (note: this check is very close to grammar check...hence its higher
-		 *        priority) */
-		UnresolvedIdentifiersException exUnsupportedFeatures = new UnresolvedIdentifiersException("unsupported expression");
-		SearchOptionalFeaturesHandler sFeaturesHandler = new SearchOptionalFeaturesHandler(true, false);
-		sFeaturesHandler.search(q);
-		for(ADQLObject obj : sFeaturesHandler) {
-			if (!supportedFeatures.isSupporting(obj.getFeatureDescription()))
-				exUnsupportedFeatures.addException(new UnsupportedFeatureException(obj));
-		}
-		if (exUnsupportedFeatures.getNbErrors() > 0)
-			throw exUnsupportedFeatures;
-	  
-		// check the query:
-		if (queryChecker != null)
-			queryChecker.check(q);
-			
-		return q;
-	}
+	{ return q; }
 }
 
 ADQLQuery QueryExpression(): {TextPosition endPos = null;} {
 	{
 		try{
 			// create the query:
-			query = queryFactory.createQuery(ADQLVersion.V2_1);
+			query = queryFactory.createQuery(VERSION);
 			stackQuery.push(query);
 		}catch(Exception ex){
 			throw generateParseException(ex);
@@ -2214,8 +1380,6 @@ UserDefinedFunction UserDefinedFunction(): {Token fct, end; Vector<ADQLOperand>
 		if (!isRegularIdentifier(fct.image))
 			throw new ParseException("Invalid (User Defined) Function name: \""+fct.image+"\"!", new TextPosition(fct));
 		
-		//System.out.println("INFO [ADQLParser201]: \""+fct.image+"\" (from line "+fct.beginLine+" and column "+fct.beginColumn+" to line "+token.endLine+" and column "+(token.endColumn+1)+") is considered as an user defined function !");
-		
 		try{
 			//  Build the parameters list:
 			ADQLOperand[] parameters = new ADQLOperand[params.size()];
diff --git a/src/adql/query/ADQLQuery.java b/src/adql/query/ADQLQuery.java
index 1d28033..eb230f8 100644
--- a/src/adql/query/ADQLQuery.java
+++ b/src/adql/query/ADQLQuery.java
@@ -29,10 +29,9 @@ import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.db.DefaultDBColumn;
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ADQLParserFactory.ADQLVersion;
-import adql.parser.ParseException;
+import adql.parser.ADQLParser.ADQLVersion;
 import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ParseException;
 import adql.query.from.FromContent;
 import adql.query.operand.ADQLColumn;
 import adql.query.operand.ADQLOperand;
@@ -92,7 +91,7 @@ public class ADQLQuery implements ADQLObject {
 	 * Builds an empty ADQL query.
 	 */
 	public ADQLQuery() {
-		this(ADQLParserFactory.DEFAULT_VERSION);
+		this(ADQLParser.DEFAULT_VERSION);
 	}
 
 	/**
@@ -106,7 +105,7 @@ public class ADQLQuery implements ADQLObject {
 	 * @since 2.0
 	 */
 	public ADQLQuery(final ADQLVersion version) {
-		this.adqlVersion = (version == null ? ADQLParserFactory.DEFAULT_VERSION : version);
+		this.adqlVersion = (version == null ? ADQLParser.DEFAULT_VERSION : version);
 		select = new ClauseSelect();
 		from = null;
 		where = new ClauseConstraints("WHERE");
diff --git a/src/adql/query/TextPosition.java b/src/adql/query/TextPosition.java
index 5324eba..a74a434 100644
--- a/src/adql/query/TextPosition.java
+++ b/src/adql/query/TextPosition.java
@@ -20,7 +20,7 @@ package adql.query;
  *                       Astronomisches Rechen Institute (ARI)
  */
 
-import adql.parser.Token;
+import adql.parser.grammar.Token;
 
 /**
  * Indicates a simple position or a token/string position in a text.
diff --git a/src/adql/query/operand/function/DefaultUDF.java b/src/adql/query/operand/function/DefaultUDF.java
index aebb564..ddf5fd6 100644
--- a/src/adql/query/operand/function/DefaultUDF.java
+++ b/src/adql/query/operand/function/DefaultUDF.java
@@ -26,8 +26,8 @@ import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.db.FunctionDef;
 import adql.db.FunctionDef.FunctionParam;
-import adql.parser.ParseException;
 import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLList;
 import adql.query.ADQLObject;
 import adql.query.ClauseADQL;
diff --git a/src/adql/query/operand/function/geometry/GeometryFunction.java b/src/adql/query/operand/function/geometry/GeometryFunction.java
index 6b1c305..6669a04 100644
--- a/src/adql/query/operand/function/geometry/GeometryFunction.java
+++ b/src/adql/query/operand/function/geometry/GeometryFunction.java
@@ -20,8 +20,8 @@ package adql.query.operand.function.geometry;
  *                       Astronomisches Rechen Institut (ARI)
  */
 
-import adql.parser.ParseException;
 import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLIterator;
 import adql.query.ADQLObject;
 import adql.query.TextPosition;
diff --git a/src/adql/translator/JDBCTranslator.java b/src/adql/translator/JDBCTranslator.java
index e494eac..0baa58c 100644
--- a/src/adql/translator/JDBCTranslator.java
+++ b/src/adql/translator/JDBCTranslator.java
@@ -28,7 +28,7 @@ import adql.db.DBTableAlias;
 import adql.db.DBType;
 import adql.db.STCS.Region;
 import adql.db.exception.UnresolvedJoinException;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLList;
 import adql.query.ADQLObject;
 import adql.query.ADQLOrder;
diff --git a/src/adql/translator/MySQLTranslator.java b/src/adql/translator/MySQLTranslator.java
index 0973de6..6d2b3ce 100644
--- a/src/adql/translator/MySQLTranslator.java
+++ b/src/adql/translator/MySQLTranslator.java
@@ -3,7 +3,7 @@ package adql.translator;
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.db.STCS.Region;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.IdentifierField;
 import adql.query.operand.ADQLOperand;
 import adql.query.operand.Concatenation;
diff --git a/src/adql/translator/PgSphereTranslator.java b/src/adql/translator/PgSphereTranslator.java
index afc5a89..7c34e1a 100644
--- a/src/adql/translator/PgSphereTranslator.java
+++ b/src/adql/translator/PgSphereTranslator.java
@@ -28,7 +28,7 @@ import org.postgresql.util.PGobject;
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.db.STCS.Region;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.TextPosition;
 import adql.query.constraint.Comparison;
 import adql.query.constraint.ComparisonOperator;
diff --git a/src/adql/translator/PostgreSQLTranslator.java b/src/adql/translator/PostgreSQLTranslator.java
index 68d740a..da27125 100644
--- a/src/adql/translator/PostgreSQLTranslator.java
+++ b/src/adql/translator/PostgreSQLTranslator.java
@@ -23,7 +23,7 @@ package adql.translator;
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.db.STCS.Region;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.IdentifierField;
 import adql.query.operand.StringConstant;
 import adql.query.operand.function.ADQLFunction;
diff --git a/src/adql/translator/SQLServerTranslator.java b/src/adql/translator/SQLServerTranslator.java
index 1790061..79990dd 100644
--- a/src/adql/translator/SQLServerTranslator.java
+++ b/src/adql/translator/SQLServerTranslator.java
@@ -28,8 +28,8 @@ import adql.db.DBType.DBDatatype;
 import adql.db.STCS.Region;
 import adql.db.SearchColumnList;
 import adql.db.exception.UnresolvedJoinException;
-import adql.parser.ParseException;
 import adql.parser.SQLServer_ADQLQueryFactory;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLQuery;
 import adql.query.ClauseSelect;
 import adql.query.IdentifierField;
diff --git a/src/tap/ADQLExecutor.java b/src/tap/ADQLExecutor.java
index 75fc644..72b0b87 100644
--- a/src/tap/ADQLExecutor.java
+++ b/src/tap/ADQLExecutor.java
@@ -26,9 +26,8 @@ import java.io.OutputStream;
 import javax.servlet.http.HttpServletResponse;
 
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
 import adql.parser.ADQLQueryFactory;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLQuery;
 import tap.data.DataReadException;
 import tap.data.TableIterator;
@@ -540,7 +539,7 @@ public class ADQLExecutor {
 		ADQLParser parser = service.getFactory().createADQLParser();
 		if (parser == null) {
 			logger.logTAP(LogLevel.WARNING, null, "PARSING", "No ADQL parser returned by the TAPFactory! The default implementation is used instead.", null);
-			parser = ADQLParserFactory.createDefaultParser();
+			parser = new ADQLParser();
 		}
 
 		// Set the ADQL factory:
diff --git a/src/tap/AbstractTAPFactory.java b/src/tap/AbstractTAPFactory.java
index c9899fd..6d5956d 100644
--- a/src/tap/AbstractTAPFactory.java
+++ b/src/tap/AbstractTAPFactory.java
@@ -30,10 +30,9 @@ import javax.servlet.http.HttpServletRequest;
 
 import adql.db.DBChecker;
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
 import adql.parser.ADQLQueryFactory;
-import adql.parser.ParseException;
 import adql.parser.QueryChecker;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLQuery;
 import tap.db.DBConnection;
 import tap.error.DefaultTAPErrorWriter;
@@ -56,18 +55,13 @@ import uws.service.error.ServiceErrorWriter;
  * Only the functions related with the database connection stay abstract.
  *
  * @author Gr&eacute;gory Mantelet (CDS;ARI)
- * @version 3.0 (04/2019)
+ * @version 3.0 (08/2019)
  */
 public abstract class AbstractTAPFactory extends TAPFactory {
 
 	/** The error writer to use when any error occurs while executing a resource or to format an error occurring while executing an asynchronous job. */
 	protected final ServiceErrorWriter errorWriter;
 
-	/** Factory of ADQL parsers. This factory can be configured to work with a
-	 * different version of the ADQL grammar.
-	 * @since 3.0 */
-	protected ADQLParserFactory parserFactory;
-
 	/**
 	 * Build a basic TAPFactory.
 	 * Nothing is done except setting the service connection.
@@ -98,7 +92,6 @@ public abstract class AbstractTAPFactory extends TAPFactory {
 	protected AbstractTAPFactory(final ServiceConnection service, final ServiceErrorWriter errorWriter) throws NullPointerException {
 		super(service);
 		this.errorWriter = errorWriter;
-		this.parserFactory = new ADQLParserFactory();
 	}
 
 	@Override
@@ -128,7 +121,7 @@ public abstract class AbstractTAPFactory extends TAPFactory {
 	 */
 	@Override
 	public ADQLParser createADQLParser() throws TAPException {
-		return parserFactory.createParser();
+		return new ADQLParser();
 	}
 
 	/**
diff --git a/src/tap/config/ConfigurableServiceConnection.java b/src/tap/config/ConfigurableServiceConnection.java
index 8540f73..1cac6b6 100644
--- a/src/tap/config/ConfigurableServiceConnection.java
+++ b/src/tap/config/ConfigurableServiceConnection.java
@@ -101,7 +101,7 @@ import java.util.regex.Pattern;
 
 import adql.db.FunctionDef;
 import adql.db.STCS;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.operand.function.UserDefinedFunction;
 import tap.ServiceConnection;
 import tap.TAPException;
diff --git a/src/tap/data/ResultSetTableIterator.java b/src/tap/data/ResultSetTableIterator.java
index 0dc3012..8b693be 100644
--- a/src/tap/data/ResultSetTableIterator.java
+++ b/src/tap/data/ResultSetTableIterator.java
@@ -35,7 +35,7 @@ import adql.db.DBColumn;
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.db.STCS.Region;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.translator.JDBCTranslator;
 import tap.db.DBConnection;
 import tap.metadata.TAPColumn;
diff --git a/src/tap/db/JDBCConnection.java b/src/tap/db/JDBCConnection.java
index ff7ce7c..4e4f17e 100644
--- a/src/tap/db/JDBCConnection.java
+++ b/src/tap/db/JDBCConnection.java
@@ -2486,7 +2486,7 @@ public class JDBCConnection implements DBConnection {
 							// parse the region as an STC-S expression:
 							try{
 								region = STCS.parseRegion(val.toString());
-							}catch(adql.parser.ParseException e){
+							}catch(adql.parser.grammar.ParseException e){
 								if (logger != null)
 									logger.logDB(LogLevel.ERROR, this, "UPLOAD", "[l. " + nbRows + ", c. " + c + "] Incorrect STC-S syntax for the geometrical value \"" + val + "\"! " + e.getMessage(), e);
 								throw new DataReadException("[l. " + nbRows + ", c. " + c + "] Incorrect STC-S syntax for the geometrical value \"" + val + "\"! " + e.getMessage(), e);
@@ -2494,7 +2494,7 @@ public class JDBCConnection implements DBConnection {
 							// translate this STC region into the corresponding column value:
 							try{
 								val = translator.translateGeometryToDB(region);
-							}catch(adql.parser.ParseException e){
+							}catch(adql.parser.grammar.ParseException e){
 								if (logger != null)
 									logger.logDB(LogLevel.ERROR, this, "UPLOAD", "[l. " + nbRows + ", c. " + c + "] Impossible to import the ADQL geometry \"" + val + "\" into the database! " + e.getMessage(), e);
 								throw new DataReadException("[l. " + nbRows + ", c. " + c + "] Impossible to import the ADQL geometry \"" + val + "\" into the database! " + e.getMessage(), e);
diff --git a/test/adql/db/TestDBChecker.java b/test/adql/db/TestDBChecker.java
index 7555e5d..f0ab7ec 100644
--- a/test/adql/db/TestDBChecker.java
+++ b/test/adql/db/TestDBChecker.java
@@ -22,9 +22,8 @@ import adql.db.DBType.DBDatatype;
 import adql.db.FunctionDef.FunctionParam;
 import adql.db.exception.UnresolvedIdentifiersException;
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ParseException;
 import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLObject;
 import adql.query.ADQLQuery;
 import adql.query.operand.ADQLColumn;
@@ -43,8 +42,6 @@ import adql.translator.TranslationException;
 
 public class TestDBChecker {
 
-	ADQLParserFactory parserFactory = new ADQLParserFactory();
-
 	private static List<DBTable> tables;
 
 	@BeforeClass
@@ -115,7 +112,7 @@ public class TestDBChecker {
 		 *
 		 * This issue can be tested by creating a ConstraintsGroup (i.e. in a constraints location like WHERE or JOIN...ON,
 		 * a constraint (or more) between parenthesis). */
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables, new ArrayList<FunctionDef>(0)));
 		try {
 			parser.parseQuery("SELECT * FROM foo WHERE (colI BETWEEN 1 AND 10)");
@@ -127,7 +124,7 @@ public class TestDBChecker {
 
 	@Test
 	public void testGroupByWithQualifiedColName() {
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables, new ArrayList<FunctionDef>(0)));
 		try {
 			// Not qualified column name:
@@ -146,7 +143,7 @@ public class TestDBChecker {
 
 	@Test
 	public void testQualifiedName() {
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables, new ArrayList<FunctionDef>(0)));
 		try {
 			// Tests with a table whose the schema is specified:
@@ -189,7 +186,7 @@ public class TestDBChecker {
 
 	@Test
 	public void testColRefWithDottedAlias() {
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables));
 		try {
 			// ORDER BY
@@ -212,7 +209,7 @@ public class TestDBChecker {
 
 	@Test
 	public void testNumericOrStringValueExpressionPrimary() {
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		try {
 			assertNotNull(parser.parseQuery("SELECT 'toto' FROM foo;"));
 			assertNotNull(parser.parseQuery("SELECT ('toto') FROM foo;"));
@@ -266,7 +263,7 @@ public class TestDBChecker {
 	@Test
 	public void testUDFManagement() {
 		// UNKNOWN FUNCTIONS ARE NOT ALLOWED:
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.getSupportedFeatures().allowAnyUdf(true);
 		parser.setQueryChecker(new DBChecker(tables, new ArrayList<FunctionDef>(0)));
 
@@ -293,7 +290,7 @@ public class TestDBChecker {
 		FunctionDef[] udfs;
 		try {
 			udfs = new FunctionDef[]{ new FunctionDef("toto", new DBType(DBDatatype.VARCHAR)), new FunctionDef("tata", new DBType(DBDatatype.INTEGER)) };
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.getSupportedFeatures().allowAnyUdf(true);
 			parser.setQueryChecker(new DBChecker(tables, Arrays.asList(udfs)));
 		} catch(ParseException pe) {
@@ -349,7 +346,7 @@ public class TestDBChecker {
 		try {
 			udfs = new FunctionDef[]{ new FunctionDef("toto", new DBType(DBDatatype.VARCHAR), new FunctionParam[]{ new FunctionParam("txt", new DBType(DBDatatype.VARCHAR)) }) };
 			udfs[0].setUDFClass(UDFToto.class);
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.getSupportedFeatures().allowAnyUdf(true);
 			parser.setQueryChecker(new DBChecker(tables, Arrays.asList(udfs)));
 		} catch(ParseException pe) {
@@ -389,7 +386,7 @@ public class TestDBChecker {
 		try {
 			udfs = new FunctionDef[]{ new FunctionDef("toto", new DBType(DBDatatype.VARCHAR), new FunctionParam[]{ new FunctionParam("txt", new DBType(DBDatatype.VARCHAR)) }) };
 			udfs[0].setUDFClass(WrongUDFToto.class);
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.getSupportedFeatures().allowAnyUdf(true);
 			parser.setQueryChecker(new DBChecker(tables, Arrays.asList(udfs)));
 		} catch(ParseException pe) {
@@ -411,7 +408,7 @@ public class TestDBChecker {
 	@Test
 	public void testGeometry() {
 		// DECLARE A SIMPLE PARSER where all geometries are allowed by default:
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables));
 
 		// Test with several geometries while all are allowed:
@@ -424,7 +421,7 @@ public class TestDBChecker {
 
 		// Test with several geometries while only the allowed ones:
 		try {
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.getSupportedFeatures().unsupportAll(LanguageFeature.TYPE_ADQL_GEO);
 			parser.getSupportedFeatures().support(ContainsFunction.FEATURE);
 			parser.getSupportedFeatures().support(PointFunction.FEATURE);
@@ -447,7 +444,7 @@ public class TestDBChecker {
 
 		// Test by adding REGION:
 		try {
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.getSupportedFeatures().unsupportAll(LanguageFeature.TYPE_ADQL_GEO);
 			parser.getSupportedFeatures().support(ContainsFunction.FEATURE);
 			parser.getSupportedFeatures().support(PointFunction.FEATURE);
@@ -472,7 +469,7 @@ public class TestDBChecker {
 
 		// Test with several geometries while none geometry is allowed:
 		try {
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.getSupportedFeatures().unsupportAll(LanguageFeature.TYPE_ADQL_GEO);
 
 			parser.parseQuery("SELECT * FROM foo WHERE CONTAINS(POINT('', 12.3, 45.6), CIRCLE('', 1.2, 2.3, 5)) = 1;");
@@ -491,7 +488,7 @@ public class TestDBChecker {
 	@Test
 	public void testCoordSys() {
 		// DECLARE A SIMPLE PARSER where all coordinate systems are allowed by default:
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables));
 
 		// Test with several coordinate systems while all are allowed:
@@ -517,7 +514,7 @@ public class TestDBChecker {
 
 		// Test with several coordinate systems while only some allowed:
 		try {
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables, new ArrayList<FunctionDef>(0), null, Arrays.asList(new String[]{ "icrs * *", "fk4 geocenter *", "galactic * spherical2" })));
 			assertNotNull(parser.parseQuery("SELECT * FROM foo WHERE CONTAINS(POINT('', 12.3, 45.6), CIRCLE('', 1.2, 2.3, 5)) = 1;"));
 			assertNotNull(parser.parseQuery("SELECT * FROM foo WHERE CONTAINS(POINT('icrs', 12.3, 45.6), CIRCLE('cartesian3', 1.2, 2.3, 5)) = 1;"));
@@ -552,7 +549,7 @@ public class TestDBChecker {
 
 		// Test with a coordinate system while none is allowed:
 		try {
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables, new ArrayList<FunctionDef>(0), null, new ArrayList<String>(0)));
 			assertNotNull(parser.parseQuery("SELECT * FROM foo WHERE CONTAINS(POINT('', 12.3, 45.6), CIRCLE('', 1.2, 2.3, 5)) = 1;"));
 			assertNotNull(parser.parseQuery("SELECT * FROM foo WHERE CONTAINS(REGION('position 12.3 45.6'), REGION('circle 1.2 2.3 5')) = 1;"));
@@ -586,7 +583,7 @@ public class TestDBChecker {
 	@Test
 	public void testTypesChecking() {
 		// DECLARE A SIMPLE PARSER:
-		ADQLParser parser = parserFactory.createParser();
+		ADQLParser parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables));
 
 		// Test the type of columns generated by the parser:
@@ -694,7 +691,7 @@ public class TestDBChecker {
 		FunctionDef[] udfs;
 		try {
 			udfs = new FunctionDef[]{ new FunctionDef("toto", new DBType(DBDatatype.VARCHAR)), new FunctionDef("tata", new DBType(DBDatatype.INTEGER)), new FunctionDef("titi", new DBType(DBDatatype.REGION)) };
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables, Arrays.asList(udfs)));
 		} catch(ParseException pe) {
 			pe.printStackTrace();
@@ -811,7 +808,7 @@ public class TestDBChecker {
 			complexFcts[0] = new FunctionDef("fct1", new DBType(DBDatatype.VARCHAR), new FunctionParam[]{ new FunctionParam("str", new DBType(DBDatatype.VARCHAR)), new FunctionParam("num", new DBType(DBDatatype.INTEGER)) });
 			complexFcts[1] = new FunctionDef("fct2", new DBType(DBDatatype.INTEGER), new FunctionParam[]{ new FunctionParam("str", new DBType(DBDatatype.VARCHAR)) });
 			complexFcts[2] = new FunctionDef("fct3", new DBType(DBDatatype.VARCHAR), new FunctionParam[]{ new FunctionParam("str", new DBType(DBDatatype.VARCHAR)) });
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables, Arrays.asList(complexFcts)));
 		} catch(ParseException pe) {
 			pe.printStackTrace();
@@ -837,7 +834,7 @@ public class TestDBChecker {
 		}
 
 		// CLEAR ALL UDFs AND ALLOW UNKNOWN FUNCTION:
-		parser = parserFactory.createParser();
+		parser = new ADQLParser();
 		parser.setQueryChecker(new DBChecker(tables, null));
 
 		// Test again:
@@ -863,7 +860,7 @@ public class TestDBChecker {
 
 		// DECLARE THE UDF (while unknown functions are allowed):
 		try {
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables, Arrays.asList(new FunctionDef[]{ new FunctionDef("toto", new DBType(DBDatatype.VARCHAR)) })));
 		} catch(ParseException pe) {
 			pe.printStackTrace();
@@ -886,7 +883,7 @@ public class TestDBChecker {
 		// DECLARE UDFs WITH SAME NAMES BUT DIFFERENT TYPE OF ARGUMENT:
 		try {
 			udfs = new FunctionDef[]{ new FunctionDef("toto", new DBType(DBDatatype.VARCHAR), new FunctionParam[]{ new FunctionParam("attr", new DBType(DBDatatype.VARCHAR)) }), new FunctionDef("toto", new DBType(DBDatatype.INTEGER), new FunctionParam[]{ new FunctionParam("attr", new DBType(DBDatatype.INTEGER)) }), new FunctionDef("toto", new DBType(DBDatatype.INTEGER), new FunctionParam[]{ new FunctionParam("attr", new DBType(DBDatatype.POINT)) }) };
-			parser = parserFactory.createParser();
+			parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables, Arrays.asList(udfs)));
 		} catch(ParseException pe) {
 			pe.printStackTrace();
diff --git a/test/adql/db/TestFunctionDef.java b/test/adql/db/TestFunctionDef.java
index e0fe91b..571d7c3 100644
--- a/test/adql/db/TestFunctionDef.java
+++ b/test/adql/db/TestFunctionDef.java
@@ -11,9 +11,9 @@ import org.junit.Test;
 
 import adql.db.DBType.DBDatatype;
 import adql.db.FunctionDef.FunctionParam;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ADQLParserFactory.ADQLVersion;
-import adql.parser.ParseException;
+import adql.parser.ADQLParser;
+import adql.parser.ADQLParser.ADQLVersion;
+import adql.parser.grammar.ParseException;
 import adql.query.operand.ADQLColumn;
 import adql.query.operand.ADQLOperand;
 import adql.query.operand.NumericConstant;
@@ -501,7 +501,7 @@ public class TestFunctionDef {
 			fail("LOWER is supposed to be a reserved keyword!");
 		} catch(Exception e) {
 			assertEquals(ParseException.class, e.getClass());
-			switch(ADQLParserFactory.DEFAULT_VERSION) {
+			switch(ADQLParser.DEFAULT_VERSION) {
 				case V2_0:
 					assertEquals(MSG_LOWER_2_0, e.getMessage());
 					break;
diff --git a/test/adql/db/TestSTCS.java b/test/adql/db/TestSTCS.java
index e9c25f7..5f39a2e 100644
--- a/test/adql/db/TestSTCS.java
+++ b/test/adql/db/TestSTCS.java
@@ -6,8 +6,6 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.io.StringBufferInputStream;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -21,8 +19,7 @@ import adql.db.STCS.RefPos;
 import adql.db.STCS.Region;
 import adql.db.STCS.RegionType;
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.operand.ADQLColumn;
 import adql.query.operand.ADQLOperand;
 import adql.query.operand.NegativeOperand;
@@ -268,9 +265,8 @@ public class TestSTCS {
 			assertEquals("Unknown STC region type: \"MYREGION\"!", e.getMessage());
 		}
 		try {
-			ADQLParser parser = ADQLParserFactory.createDefaultParser();
-			parser.ReInit(new StringBufferInputStream("'POSITION ' || coordinateSys || ' ' || ra || ' ' || dec"));
-			new Region(new RegionFunction(parser.StringExpression()));
+			ADQLOperand concat = (new ADQLParser()).parseSelect("SELECT 'POSITION ' || coordinateSys || ' ' || ra || ' ' || dec").get(0).getOperand();
+			new Region(new RegionFunction(concat));
 			fail("String concatenation can not be managed!");
 		} catch(Exception e) {
 			assertTrue(e instanceof ParseException);
diff --git a/test/adql/db/TestSubQueries.java b/test/adql/db/TestSubQueries.java
index e6f675e..afc58cb 100644
--- a/test/adql/db/TestSubQueries.java
+++ b/test/adql/db/TestSubQueries.java
@@ -11,7 +11,6 @@ import org.junit.Before;
 import org.junit.Test;
 
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
 import adql.query.ADQLQuery;
 import adql.translator.PostgreSQLTranslator;
 import tap.metadata.TAPMetadata;
@@ -20,8 +19,6 @@ import tap.metadata.TableSetParser;
 
 public class TestSubQueries {
 
-	ADQLParserFactory adqlParserFactory = new ADQLParserFactory();
-
 	@Before
 	public void setUp() throws Exception {
 	}
@@ -36,7 +33,7 @@ public class TestSubQueries {
 			while(itTables.hasNext())
 				esaTables.add(itTables.next());
 
-			ADQLParser adqlParser = adqlParserFactory.createParser();
+			ADQLParser adqlParser = new ADQLParser();
 			adqlParser.setQueryChecker(new DBChecker(esaTables));
 			ADQLQuery query = adqlParser.parseQuery("SELECT sel2.*,t1.h_m, t1.j_m, t1.k_m\nFROM (\n  SELECT sel1.*, t3.*\n  FROM (\n  	SELECT *\n    FROM table2 AS t2\n	WHERE 1=CONTAINS(POINT('ICRS', t2.ra, t2.dec), CIRCLE('ICRS', 56.75, 24.1167, 15.))\n  ) AS sel1 JOIN table3 AS t3 ON t3.oid2=sel1.oid2\n) AS sel2 JOIN table1 AS t1 ON sel2.oid=t1.oid");
 			assertEquals("SELECT sel2.* , t1.h_m , t1.j_m , t1.k_m\nFROM (SELECT sel1.* , t3.*\nFROM (SELECT *\nFROM table2 AS t2\nWHERE 1 = CONTAINS(POINT('ICRS', t2.ra, t2.dec), CIRCLE('ICRS', 56.75, 24.1167, 15.))) AS sel1 INNER JOIN table3 AS t3 ON ON t3.oid2 = sel1.oid2) AS sel2 INNER JOIN table1 AS t1 ON ON sel2.oid = t1.oid", query.toADQL());
@@ -57,7 +54,7 @@ public class TestSubQueries {
 			while(itTables.hasNext())
 				esaTables.add(itTables.next());
 
-			ADQLParser adqlParser = adqlParserFactory.createParser();
+			ADQLParser adqlParser = new ADQLParser();
 			adqlParser.setQueryChecker(new DBChecker(esaTables));
 
 			ADQLQuery query = adqlParser.parseQuery("SELECT oid FROM table1 as MyAlias WHERE oid IN (SELECT oid2 FROM table2 WHERE oid2 = myAlias.oid)");
@@ -78,7 +75,7 @@ public class TestSubQueries {
 			while(itTables.hasNext())
 				esaTables.add(itTables.next());
 
-			ADQLParser adqlParser = adqlParserFactory.createParser();
+			ADQLParser adqlParser = new ADQLParser();
 			adqlParser.setQueryChecker(new DBChecker(esaTables));
 
 			ADQLQuery query = adqlParser.parseQuery("SELECT t.* FROM (SELECT (ra+ra_error) AS x, (dec+dec_error) AS Y, pmra AS \"ProperMotion\" FROM table2) AS t");
diff --git a/test/adql/parser/TestADQLParser.java b/test/adql/parser/TestADQLParser.java
index 1e6893c..423b9c3 100644
--- a/test/adql/parser/TestADQLParser.java
+++ b/test/adql/parser/TestADQLParser.java
@@ -13,8 +13,11 @@ import org.junit.Test;
 
 import adql.db.exception.UnresolvedIdentifiersException;
 import adql.db.exception.UnsupportedFeatureException;
-import adql.parser.ADQLParserFactory.ADQLVersion;
+import adql.parser.ADQLParser.ADQLVersion;
 import adql.parser.feature.LanguageFeature;
+import adql.parser.grammar.ADQLGrammar200Constants;
+import adql.parser.grammar.ParseException;
+import adql.parser.grammar.Token;
 import adql.query.ADQLQuery;
 import adql.query.from.ADQLJoin;
 import adql.query.from.ADQLTable;
@@ -24,8 +27,6 @@ import adql.query.operand.function.string.LowerFunction;
 
 public class TestADQLParser {
 
-	ADQLParserFactory parserFactory = new ADQLParserFactory();
-
 	@BeforeClass
 	public static void setUpBeforeClass() throws Exception {
 	}
@@ -43,9 +44,9 @@ public class TestADQLParser {
 	}
 
 	@Test
-	public void testColumnReference(){
-		ADQLParser parser = parserFactory.createParser();
-		try{
+	public void testColumnReference() {
+		ADQLParser parser = new ADQLParser();
+		try {
 			// ORDER BY
 			parser.parseQuery("SELECT * FROM cat ORDER BY oid;");
 			parser.parseQuery("SELECT * FROM cat ORDER BY oid ASC;");
@@ -110,9 +111,9 @@ public class TestADQLParser {
 	}
 
 	@Test
-	public void testDelimitedIdentifiersWithDot(){
-		ADQLParser parser = parserFactory.createParser();
-		try{
+	public void testDelimitedIdentifiersWithDot() {
+		ADQLParser parser = new ADQLParser();
+		try {
 			ADQLQuery query = parser.parseQuery("SELECT * FROM \"B/avo.rad/catalog\";");
 			assertEquals("B/avo.rad/catalog", query.getFrom().getTables().get(0).getTableName());
 		} catch(Exception e) {
@@ -122,9 +123,9 @@ public class TestADQLParser {
 	}
 
 	@Test
-	public void testJoinTree(){
-		ADQLParser parser = parserFactory.createParser();
-		try{
+	public void testJoinTree() {
+		ADQLParser parser = new ADQLParser();
+		try {
 			String[] queries = new String[]{ "SELECT * FROM aTable A JOIN aSecondTable B ON A.id = B.id JOIN aThirdTable C ON B.id = C.id;", "SELECT * FROM aTable A NATURAL JOIN aSecondTable B NATURAL JOIN aThirdTable C;" };
 			for(String q : queries) {
 				ADQLQuery query = parser.parseQuery(q);
@@ -149,9 +150,9 @@ public class TestADQLParser {
 	}
 
 	@Test
-	public void test(){
-		ADQLParser parser = parserFactory.createParser();
-		try{
+	public void test() {
+		ADQLParser parser = new ADQLParser();
+		try {
 			ADQLQuery query = parser.parseQuery("SELECT 'truc''machin'  	'bidule' --- why not a comment now ^^\n'FIN' FROM foo;");
 			assertNotNull(query);
 			assertEquals("truc'machinbiduleFIN", ((StringConstant)(query.getSelect().get(0).getOperand())).getValue());
@@ -174,37 +175,37 @@ public class TestADQLParser {
 	public void testIncorrectCharacter() {
 		/* An identifier must be written only with digits, an underscore or
 		 * regular latin characters: */
-		try{
-			(parserFactory.createParser()).parseQuery("select gr\u00e9gory FROM aTable");
-		}catch(Throwable t){
+		try {
+			(new ADQLParser()).parseQuery("select gr\u00e9gory FROM aTable");
+		} catch(Throwable t) {
 			assertEquals(ParseException.class, t.getClass());
 			assertTrue(t.getMessage().startsWith("Incorrect character encountered at l.1, c.10: "));
 			assertTrue(t.getMessage().endsWith("Possible cause: a non-ASCI/UTF-8 character (solution: remove/replace it)."));
 		}
 
 		/* Un-finished double/single quoted string: */
-		try{
-			(parserFactory.createParser()).parseQuery("select \"stuff FROM aTable");
-		}catch(Throwable t){
+		try {
+			(new ADQLParser()).parseQuery("select \"stuff FROM aTable");
+		} catch(Throwable t) {
 			assertEquals(ParseException.class, t.getClass());
 			assertTrue(t.getMessage().startsWith("Incorrect character encountered at l.1, c.26: <EOF>"));
 			assertTrue(t.getMessage().endsWith("Possible cause: a string between single or double quotes which is never closed (solution: well...just close it!)."));
 		}
 
 		// But in a string, delimited identifier or a comment, it is fine:
-		try{
-			(parserFactory.createParser()).parseQuery("select 'gr\u00e9gory' FROM aTable");
-			(parserFactory.createParser()).parseQuery("select \"gr\u00e9gory\" FROM aTable");
-			(parserFactory.createParser()).parseQuery("select * FROM aTable -- a comment by Gr\u00e9gory");
-		}catch(Throwable t){
+		try {
+			(new ADQLParser()).parseQuery("select 'gr\u00e9gory' FROM aTable");
+			(new ADQLParser()).parseQuery("select \"gr\u00e9gory\" FROM aTable");
+			(new ADQLParser()).parseQuery("select * FROM aTable -- a comment by Gr\u00e9gory");
+		} catch(Throwable t) {
 			fail("This error should never occurs because all these queries have an accentuated character but at a correct place.");
 		}
 	}
 
 	@Test
-	public void testMultipleSpacesInOrderAndGroupBy(){
-		try{
-			ADQLParser parser = parserFactory.createParser();
+	public void testMultipleSpacesInOrderAndGroupBy() {
+		try {
+			ADQLParser parser = new ADQLParser();
 
 			// Single space:
 			parser.parseQuery("select * from aTable ORDER BY aCol");
@@ -229,8 +230,8 @@ public class TestADQLParser {
 	}
 
 	@Test
-	public void testADQLReservedWord(){
-		ADQLParser parser = parserFactory.createParser();
+	public void testADQLReservedWord() {
+		ADQLParser parser = new ADQLParser();
 
 		final String hintAbs = ".*\n\\(HINT: \"abs\" is a reserved ADQL word in v[0-9]+\\.[0-9]+\\. To use it as a column/table/schema name/alias, write it between double quotes\\.\\)";
 		final String hintPoint = ".*\n\\(HINT: \"point\" is a reserved ADQL word in v[0-9]+\\.[0-9]+\\. To use it as a column/table/schema name/alias, write it between double quotes\\.\\)";
@@ -307,8 +308,8 @@ public class TestADQLParser {
 	}
 
 	@Test
-	public void testSQLReservedWord(){
-		ADQLParser parser = parserFactory.createParser();
+	public void testSQLReservedWord() {
+		ADQLParser parser = new ADQLParser();
 
 		try {
 			parser.parseQuery("SELECT rows FROM aTable");
@@ -328,8 +329,8 @@ public class TestADQLParser {
 	}
 
 	@Test
-	public void testUDFName(){
-		ADQLParser parser = parserFactory.createParser();
+	public void testUDFName() {
+		ADQLParser parser = new ADQLParser();
 		// TODO [ADQL-2.1] Add the support for this specific UDF in the the FeatureSet!
 
 		// CASE: Valid UDF name => OK
@@ -353,47 +354,9 @@ public class TestADQLParser {
 		}
 	}
 
-	@Test
-	public void testTryQuickFix(){
-		ADQLParser parser = parserFactory.createParser();
-
-		try {
-			/* CASE: Nothing to fix => exactly the same as provided */
-			// raw ASCII query with perfectly regular ADQL identifiers:
-			assertEquals("SELECT foo, bar FROM aTable", parser.tryQuickFix("SELECT foo, bar FROM aTable"));
-			// same with \n, \r and \t (replaced by 4 spaces):
-			assertEquals("SELECT foo," + System.getProperty("line.separator") + "    bar" + System.getProperty("line.separator") + "FROM aTable", parser.tryQuickFix("SELECT foo,\r\n\tbar\nFROM aTable"));
-			// still ASCII query with delimited identifiers and ADQL functions:
-			assertEquals("SELECT \"foo\"," + System.getProperty("line.separator") + "    \"_bar\", AVG(col1)" + System.getProperty("line.separator") + "FROM \"public\".aTable", parser.tryQuickFix("SELECT \"foo\",\r\n\t\"_bar\", AVG(col1)\nFROM \"public\".aTable"));
-
-			/* CASE: Unicode confusable characters => replace by their ASCII alternative */
-			assertEquals("SELECT \"_bar\" FROM aTable", parser.tryQuickFix("SELECT \"\uFE4Dbar\" FROM aTable"));
-
-			/* CASE: incorrect regular identifier */
-			assertEquals("SELECT \"_bar\" FROM aTable", parser.tryQuickFix("SELECT _bar FROM aTable"));
-			assertEquals("SELECT \"_bar\" FROM aTable", parser.tryQuickFix("SELECT \uFE4Dbar FROM aTable"));
-			assertEquals("SELECT \"2mass_id\" FROM aTable", parser.tryQuickFix("SELECT 2mass_id FROM aTable"));
-			assertEquals("SELECT \"col?\" FROM aTable", parser.tryQuickFix("SELECT col? FROM aTable"));
-			assertEquals("SELECT \"col[2]\" FROM aTable", parser.tryQuickFix("SELECT col[2] FROM aTable"));
-
-			/* CASE: SQL reserved keyword */
-			assertEquals("SELECT \"date\", \"year\", \"user\" FROM \"public\".aTable", parser.tryQuickFix("SELECT date, year, user FROM public.aTable"));
-
-			/* CASE: ADQL function name without parameters list */
-			assertEquals("SELECT \"count\", \"distance\" FROM \"schema\".aTable", parser.tryQuickFix("SELECT count, distance FROM schema.aTable"));
-
-			/* CASE: a nice combination of everything (with comments at beginning, middle and end) */
-			assertEquals("-- begin comment" + System.getProperty("line.separator") + "SELECT id, \"_raj2000\", \"distance\", (\"date\")," + System.getProperty("line.separator") + "    \"min\",min(mag), \"_dej2000\" -- in-between commment" + System.getProperty("line.separator") + "FROM \"public\".mytable -- end comment", parser.tryQuickFix("-- begin comment\r\nSELECT id, \uFE4Draj2000, distance, (date),\r\tmin,min(mag), \"_dej2000\" -- in-between commment\nFROM public.mytable -- end comment"));
-
-		} catch(ParseException pe) {
-			pe.printStackTrace();
-			fail("Unexpected parsing error! This query should have passed. (see console for more details)");
-		}
-	}
-
 	@Test
 	public void testOptionalFeatures() {
-		ADQLParser parser = parserFactory.createParser(ADQLVersion.V2_0);
+		ADQLParser parser = new ADQLParser(ADQLVersion.V2_0);
 
 		// CASE: No support for the ADQL-2.1 function - LOWER => ERROR
 		try {
@@ -405,7 +368,7 @@ public class TestADQLParser {
 		}
 
 		// CASE: LOWER supported by default in ADQL-2.1 => OK
-		parser = parserFactory.createParser(ADQLVersion.V2_1);
+		parser = new ADQLParser(ADQLVersion.V2_1);
 		try {
 			ADQLQuery q = parser.parseQuery("SELECT LOWER(foo) FROM aTable");
 			assertNotNull(q);
@@ -433,7 +396,7 @@ public class TestADQLParser {
 		/* NOTE: Geometrical functions are the only optional features in 2.0 */
 		/* ***************************************************************** */
 
-		parser = parserFactory.createParser(ADQLVersion.V2_0);
+		parser = new ADQLParser(ADQLVersion.V2_0);
 
 		// CASE: By default all geometries are supported so if one is used => OK
 		try {
@@ -469,4 +432,66 @@ public class TestADQLParser {
 		}
 	}
 
+	@Test
+	public void testTokenize() {
+		ADQLParser parser = new ADQLParser(ADQLVersion.V2_0);
+
+		final String[] EMPTY_STRINGS = new String[]{ null, "", "  ", " 	 " };
+
+		// TEST: NULL or empty string with end at EOF => only one token=EOF
+		try {
+			for(String str : EMPTY_STRINGS) {
+				Token[] tokens = parser.tokenize(str, false);
+				assertEquals(1, tokens.length);
+				assertEquals(ADQLGrammar200Constants.EOF, tokens[0].kind);
+			}
+		} catch(Exception e) {
+			e.printStackTrace();
+			fail("Unexpected error when providing a NULL or empty string to tokenize! (see console for more details)");
+		}
+
+		// TEST: NULL or empty string with truncation at EOQ/EOF => empty array
+		try {
+			for(String str : EMPTY_STRINGS)
+				assertEquals(0, parser.tokenize(str, true).length);
+		} catch(Exception e) {
+			e.printStackTrace();
+			fail("Unexpected error when providing a NULL or empty string to tokenize! (see console for more details)");
+		}
+
+		// TEST: unknown token => ParseException
+		try {
+			parser.tokenize("grégory", false);
+			fail("No known token is provided. A ParseException was expected.");
+		} catch(Exception ex) {
+			assertEquals(ParseException.class, ex.getClass());
+			assertEquals("Incorrect character encountered at l.1, c.3: \"\\u00e9\" ('é'), after : \"\"! Possible cause: a non-ASCI/UTF-8 character (solution: remove/replace it).", ex.getMessage());
+		}
+
+		// TEST: correct list of token => ok
+		final String TEST_STR = "SELECT FROM Where foo; join";
+		try {
+			Token[] tokens = parser.tokenize(TEST_STR, false);
+			assertEquals(7, tokens.length);
+			int[] expected = new int[]{ ADQLGrammar200Constants.SELECT, ADQLGrammar200Constants.FROM, ADQLGrammar200Constants.WHERE, ADQLGrammar200Constants.REGULAR_IDENTIFIER_CANDIDATE, ADQLGrammar200Constants.EOQ, ADQLGrammar200Constants.JOIN, ADQLGrammar200Constants.EOF };
+			for(int i = 0; i < tokens.length; i++)
+				assertEquals(expected[i], tokens[i].kind);
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail("Unexpected error! All ADQL expressions were composed of correct tokens. (see console for more details)");
+		}
+
+		// TEST: same with truncation at EOQ/EOF => same but truncated from EOQ
+		try {
+			Token[] tokens = parser.tokenize(TEST_STR, true);
+			assertEquals(4, tokens.length);
+			int[] expected = new int[]{ ADQLGrammar200Constants.SELECT, ADQLGrammar200Constants.FROM, ADQLGrammar200Constants.WHERE, ADQLGrammar200Constants.REGULAR_IDENTIFIER_CANDIDATE };
+			for(int i = 0; i < tokens.length; i++)
+				assertEquals(expected[i], tokens[i].kind);
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail("Unexpected error! All ADQL expressions were composed of correct tokens. (see console for more details)");
+		}
+	}
+
 }
diff --git a/test/adql/parser/TestADQLVersion.java b/test/adql/parser/TestADQLVersion.java
new file mode 100644
index 0000000..d6f22b2
--- /dev/null
+++ b/test/adql/parser/TestADQLVersion.java
@@ -0,0 +1,45 @@
+package adql.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+import adql.parser.ADQLParser.ADQLVersion;
+
+public class TestADQLVersion {
+
+	@Test
+	public void testToString() {
+		assertEquals("v2.0", ADQLVersion.V2_0.toString());
+		assertEquals("v2.1", ADQLVersion.V2_1.toString());
+	}
+
+	@Test
+	public void testParse() {
+		// TEST: NULL or empty strings => NULL
+		String[] strings = new String[]{ null, "", "  ", " 	 " };
+		for(String str : strings)
+			assertNull(ADQLVersion.parse(str));
+
+		// TEST: unknown version => NULL
+		strings = new String[]{ "foo", "v0.1", "V1.0" };
+		for(String str : strings)
+			assertNull(ADQLVersion.parse(str));
+
+		// TEST: Expected version strings => OK
+		assertEquals(ADQLVersion.V2_0, ADQLVersion.parse("2.0"));
+		assertEquals(ADQLVersion.V2_0, ADQLVersion.parse("2_0"));
+		assertEquals(ADQLVersion.V2_0, ADQLVersion.parse("v2.0"));
+		assertEquals(ADQLVersion.V2_0, ADQLVersion.parse("V2.0"));
+		assertEquals(ADQLVersion.V2_0, ADQLVersion.parse("v2_0"));
+		assertEquals(ADQLVersion.V2_0, ADQLVersion.parse("V2_0"));
+
+		// TEST: it MUST work with all available versions
+		for(ADQLVersion v : ADQLVersion.values()) {
+			assertEquals(v, ADQLVersion.parse(v.name()));
+			assertEquals(v, ADQLVersion.parse(v.toString()));
+		}
+	}
+
+}
diff --git a/test/adql/parser/TestIdentifierItem.java b/test/adql/parser/TestIdentifierItem.java
index 46e0bf9..84627a7 100644
--- a/test/adql/parser/TestIdentifierItem.java
+++ b/test/adql/parser/TestIdentifierItem.java
@@ -1,7 +1,7 @@
 package adql.parser;
 
-import static adql.parser.ADQLParser201Constants.DELIMITED_IDENTIFIER;
-import static adql.parser.ADQLParser201Constants.REGULAR_IDENTIFIER_CANDIDATE;
+import static adql.parser.grammar.ADQLGrammar201Constants.DELIMITED_IDENTIFIER;
+import static adql.parser.grammar.ADQLGrammar201Constants.REGULAR_IDENTIFIER_CANDIDATE;
 import static org.junit.Assert.assertEquals;
 
 import org.junit.Before;
@@ -9,19 +9,20 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 import adql.parser.IdentifierItems.IdentifierItem;
+import adql.parser.grammar.Token;
 
 public class TestIdentifierItem {
 
 	@BeforeClass
-	public static void setUpBeforeClass() throws Exception{
+	public static void setUpBeforeClass() throws Exception {
 	}
 
 	@Before
-	public void setUp() throws Exception{
+	public void setUp() throws Exception {
 	}
 
 	@Test
-	public void testIdentifierItem(){
+	public void testIdentifierItem() {
 		/* A regular identifier (with no special characters) should be returned
 		 * as provided: */
 		IdentifierItem identifier = new IdentifierItem(new Token(REGULAR_IDENTIFIER_CANDIDATE, "m50"), false);
diff --git a/test/adql/parser/TestQuickFixer.java b/test/adql/parser/TestQuickFixer.java
new file mode 100644
index 0000000..8549eb5
--- /dev/null
+++ b/test/adql/parser/TestQuickFixer.java
@@ -0,0 +1,51 @@
+package adql.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+
+import adql.parser.grammar.ParseException;
+
+public class TestQuickFixer {
+
+	@Test
+	public void testFix() {
+		final ADQLParser parser = new ADQLParser();
+		QueryFixer fixer = parser.getQuickFixer();
+
+		try {
+			/* CASE: Nothing to fix => exactly the same as provided */
+			// raw ASCII query with perfectly regular ADQL identifiers:
+			assertEquals("SELECT foo, bar FROM aTable", fixer.fix("SELECT foo, bar FROM aTable"));
+			// same with \n, \r and \t (replaced by 4 spaces):
+			assertEquals("SELECT foo," + System.getProperty("line.separator") + "    bar" + System.getProperty("line.separator") + "FROM aTable", fixer.fix("SELECT foo,\r\n\tbar\nFROM aTable"));
+			// still ASCII query with delimited identifiers and ADQL functions:
+			assertEquals("SELECT \"foo\"," + System.getProperty("line.separator") + "    \"_bar\", AVG(col1)" + System.getProperty("line.separator") + "FROM \"public\".aTable", fixer.fix("SELECT \"foo\",\r\n\t\"_bar\", AVG(col1)\nFROM \"public\".aTable"));
+
+			/* CASE: Unicode confusable characters => replace by their ASCII alternative */
+			assertEquals("SELECT \"_bar\" FROM aTable", fixer.fix("SELECT \"\uFE4Dbar\" FROM aTable"));
+
+			/* CASE: incorrect regular identifier */
+			assertEquals("SELECT \"_bar\" FROM aTable", fixer.fix("SELECT _bar FROM aTable"));
+			assertEquals("SELECT \"_bar\" FROM aTable", fixer.fix("SELECT \uFE4Dbar FROM aTable"));
+			assertEquals("SELECT \"2mass_id\" FROM aTable", fixer.fix("SELECT 2mass_id FROM aTable"));
+			assertEquals("SELECT \"col?\" FROM aTable", fixer.fix("SELECT col? FROM aTable"));
+			assertEquals("SELECT \"col[2]\" FROM aTable", fixer.fix("SELECT col[2] FROM aTable"));
+
+			/* CASE: SQL reserved keyword */
+			assertEquals("SELECT \"date\", \"year\", \"user\" FROM \"public\".aTable", fixer.fix("SELECT date, year, user FROM public.aTable"));
+
+			/* CASE: ADQL function name without parameters list */
+			assertEquals("SELECT \"count\", \"distance\" FROM \"schema\".aTable", fixer.fix("SELECT count, distance FROM schema.aTable"));
+
+			/* CASE: a nice combination of everything (with comments at beginning, middle and end) */
+			assertEquals("-- begin comment" + System.getProperty("line.separator") + "SELECT id, \"_raj2000\", \"distance\", (\"date\")," + System.getProperty("line.separator") + "    \"min\",min(mag), \"_dej2000\" -- in-between commment" + System.getProperty("line.separator") + "FROM \"public\".mytable -- end comment", fixer.fix("-- begin comment\r\nSELECT id, \uFE4Draj2000, distance, (date),\r\tmin,min(mag), \"_dej2000\" -- in-between commment\nFROM public.mytable -- end comment"));
+
+		} catch(ParseException pe) {
+			pe.printStackTrace();
+			fail("Unexpected parsing error! This query should have passed. (see console for more details)");
+		}
+	}
+
+}
diff --git a/test/adql/parser/TestUnknownTypes.java b/test/adql/parser/TestUnknownTypes.java
index c29f256..373e260 100644
--- a/test/adql/parser/TestUnknownTypes.java
+++ b/test/adql/parser/TestUnknownTypes.java
@@ -28,8 +28,6 @@ import adql.query.ADQLQuery;
 
 public class TestUnknownTypes {
 
-	ADQLParserFactory parserFactory = new ADQLParserFactory();
-
 	@BeforeClass
 	public static void setUpBeforeClass() throws Exception {
 	}
@@ -81,7 +79,7 @@ public class TestUnknownTypes {
 
 		try {
 			// Create the parser:
-			ADQLParser parser = parserFactory.createParser();
+			ADQLParser parser = new ADQLParser();
 
 			// Create table/column metadata:
 			DefaultDBTable table1 = new DefaultDBTable("T1");
diff --git a/test/adql/parser/feature/TestFeatureSet.java b/test/adql/parser/feature/TestFeatureSet.java
index 78e050a..fa1d4c4 100644
--- a/test/adql/parser/feature/TestFeatureSet.java
+++ b/test/adql/parser/feature/TestFeatureSet.java
@@ -14,8 +14,8 @@ import org.junit.Test;
 
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
+import adql.parser.grammar.ParseException;
 import adql.db.FunctionDef;
-import adql.parser.ParseException;
 import adql.query.ColumnReference;
 import adql.query.operand.function.geometry.BoxFunction;
 import adql.query.operand.function.geometry.PolygonFunction;
diff --git a/test/adql/query/TestADQLObjectPosition.java b/test/adql/query/TestADQLObjectPosition.java
index 8ec064d..133caf7 100644
--- a/test/adql/query/TestADQLObjectPosition.java
+++ b/test/adql/query/TestADQLObjectPosition.java
@@ -9,8 +9,8 @@ import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 
-import adql.parser.ADQLParserFactory;
-import adql.parser.ParseException;
+import adql.parser.ADQLParser;
+import adql.parser.grammar.ParseException;
 import adql.query.constraint.Comparison;
 import adql.query.from.ADQLJoin;
 import adql.query.from.ADQLTable;
@@ -21,8 +21,6 @@ import adql.search.SimpleSearchHandler;
 
 public class TestADQLObjectPosition {
 
-	private ADQLParserFactory parserFactory = new ADQLParserFactory();
-
 	@Before
 	public void setUp() {
 
@@ -31,7 +29,7 @@ public class TestADQLObjectPosition {
 	@Test
 	public void testPositionInAllClauses() {
 		try {
-			ADQLQuery query = parserFactory.createParser().parseQuery("SELECT truc, bidule.machin, toto(truc, chose) AS \"super\" FROM foo JOIN bidule USING(id) WHERE truc > 12.5 AND bidule.machin < 5 GROUP BY chose HAVING try > 0 ORDER BY chouetteAlors");
+			ADQLQuery query = new ADQLParser().parseQuery("SELECT truc, bidule.machin, toto(truc, chose) AS \"super\" FROM foo JOIN bidule USING(id) WHERE truc > 12.5 AND bidule.machin < 5 GROUP BY chose HAVING try > 0 ORDER BY chouetteAlors");
 
 			Iterator<ADQLObject> results = query.search(new SimpleSearchHandler(true) {
 				@Override
@@ -61,7 +59,7 @@ public class TestADQLObjectPosition {
 	@Test
 	public void testPositionAccuracy() {
 		try {
-			ADQLQuery query = parserFactory.createParser().parseQuery("SELECT TOP 1000 oid FROM foo JOIN bar USING(oid)\nWHERE foo || toto = 'truc'\n      AND 2 > 1+0 GROUP BY oid HAVING COUNT(oid) > 10\n\tORDER BY 1 DESC");
+			ADQLQuery query = new ADQLParser().parseQuery("SELECT TOP 1000 oid FROM foo JOIN bar USING(oid)\nWHERE foo || toto = 'truc'\n      AND 2 > 1+0 GROUP BY oid HAVING COUNT(oid) > 10\n\tORDER BY 1 DESC");
 			// Test SELECT
 			assertEquality(new TextPosition(1, 1, 1, 20), query.getSelect().getPosition());
 			// Test ADQLColumn (here: "oid")
diff --git a/test/adql/query/TestADQLQuery.java b/test/adql/query/TestADQLQuery.java
index 6478cb1..6098767 100644
--- a/test/adql/query/TestADQLQuery.java
+++ b/test/adql/query/TestADQLQuery.java
@@ -13,8 +13,8 @@ import org.junit.Test;
 
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
+import adql.parser.grammar.ParseException;
 import adql.db.FunctionDef;
-import adql.parser.ParseException;
 import adql.query.constraint.Comparison;
 import adql.query.constraint.ComparisonOperator;
 import adql.query.constraint.ConstraintsGroup;
diff --git a/test/adql/search/TestSimpleReplaceHandler.java b/test/adql/search/TestSimpleReplaceHandler.java
index 8495676..dfcfff5 100644
--- a/test/adql/search/TestSimpleReplaceHandler.java
+++ b/test/adql/search/TestSimpleReplaceHandler.java
@@ -6,7 +6,7 @@ import static org.junit.Assert.fail;
 import org.junit.Before;
 import org.junit.Test;
 
-import adql.parser.ADQLParserFactory;
+import adql.parser.ADQLParser;
 import adql.query.ADQLObject;
 import adql.query.ADQLQuery;
 import adql.query.operand.function.DefaultUDF;
@@ -15,8 +15,6 @@ import adql.query.operand.function.MathFunctionType;
 
 public class TestSimpleReplaceHandler {
 
-	ADQLParserFactory parserFactory = new ADQLParserFactory();
-
 	@Before
 	public void setUp() throws Exception {
 	}
@@ -37,7 +35,7 @@ public class TestSimpleReplaceHandler {
 		String testQuery = "SELECT SQRT(ABS(81)) FROM myTable";
 		try {
 			// Parse the query:
-			ADQLQuery query = parserFactory.createParser().parseQuery(testQuery);
+			ADQLQuery query = new ADQLParser().parseQuery(testQuery);
 
 			// Check it is as expected, before the replacements:
 			assertEquals(testQuery, query.toADQL().replaceAll("\\n", " "));
@@ -85,7 +83,7 @@ public class TestSimpleReplaceHandler {
 		String testQuery = "SELECT foo(bar(123)) FROM myTable";
 		try {
 			// Parse the query:
-			ADQLQuery query = parserFactory.createParser().parseQuery(testQuery);
+			ADQLQuery query = new ADQLParser().parseQuery(testQuery);
 
 			// Check it is as expected, before the replacements:
 			assertEquals(testQuery, query.toADQL().replaceAll("\\n", " "));
diff --git a/test/adql/translator/TestJDBCTranslator.java b/test/adql/translator/TestJDBCTranslator.java
index c83dc56..1df654f 100644
--- a/test/adql/translator/TestJDBCTranslator.java
+++ b/test/adql/translator/TestJDBCTranslator.java
@@ -9,7 +9,7 @@ import org.junit.Test;
 import adql.db.DBType;
 import adql.db.FunctionDef;
 import adql.db.STCS.Region;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.IdentifierField;
 import adql.query.operand.ADQLColumn;
 import adql.query.operand.ADQLOperand;
diff --git a/test/adql/translator/TestMySQLTranslator.java b/test/adql/translator/TestMySQLTranslator.java
index 9c1327a..cb794ce 100644
--- a/test/adql/translator/TestMySQLTranslator.java
+++ b/test/adql/translator/TestMySQLTranslator.java
@@ -6,8 +6,7 @@ import static org.junit.Assert.fail;
 import org.junit.Test;
 
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLQuery;
 
 public class TestMySQLTranslator {
@@ -15,7 +14,7 @@ public class TestMySQLTranslator {
 	@Test
 	public void testConcat() {
 		try {
-			ADQLParser parser = ADQLParserFactory.createDefaultParser();
+			ADQLParser parser = new ADQLParser();
 			MySQLTranslator translator = new MySQLTranslator();
 
 			// Test with an easy translation:
diff --git a/test/adql/translator/TestPgSphereTranslator.java b/test/adql/translator/TestPgSphereTranslator.java
index 2d09fc3..825f21a 100644
--- a/test/adql/translator/TestPgSphereTranslator.java
+++ b/test/adql/translator/TestPgSphereTranslator.java
@@ -19,7 +19,7 @@ import org.postgresql.util.PGobject;
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.db.STCS.Region;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.operand.NumericConstant;
 import adql.query.operand.StringConstant;
 import adql.query.operand.function.geometry.CentroidFunction;
diff --git a/test/adql/translator/TestSQLServerTranslator.java b/test/adql/translator/TestSQLServerTranslator.java
index f700142..7a523ee 100644
--- a/test/adql/translator/TestSQLServerTranslator.java
+++ b/test/adql/translator/TestSQLServerTranslator.java
@@ -14,15 +14,12 @@ import adql.db.DBTable;
 import adql.db.DefaultDBColumn;
 import adql.db.DefaultDBTable;
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ParseException;
 import adql.parser.SQLServer_ADQLQueryFactory;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLQuery;
 
 public class TestSQLServerTranslator {
 
-	ADQLParserFactory parserFactory = new ADQLParserFactory();
-
 	private List<DBTable> tables = null;
 
 	@Before
@@ -45,7 +42,7 @@ public class TestSQLServerTranslator {
 		final String adqlquery = "SELECT id, name, aColumn, anotherColumn FROM aTable A NATURAL JOIN anotherTable B;";
 
 		try {
-			ADQLParser parser = parserFactory.createParser();
+			ADQLParser parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables));
 			parser.setQueryFactory(new SQLServer_ADQLQueryFactory());
 			ADQLQuery query = parser.parseQuery(adqlquery);
@@ -71,7 +68,7 @@ public class TestSQLServerTranslator {
 		final String adqlquery = "SELECT B.id, name, aColumn, anotherColumn FROM aTable A JOIN anotherTable B USING(name);";
 
 		try {
-			ADQLParser parser = parserFactory.createParser();
+			ADQLParser parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables));
 			parser.setQueryFactory(new SQLServer_ADQLQueryFactory());
 			ADQLQuery query = parser.parseQuery(adqlquery);
@@ -97,7 +94,7 @@ public class TestSQLServerTranslator {
 		try {
 			SQLServerTranslator translator = new SQLServerTranslator();
 
-			ADQLParser parser = parserFactory.createParser();
+			ADQLParser parser = new ADQLParser();
 			parser.setQueryFactory(new SQLServer_ADQLQueryFactory());
 
 			// Test with an easy translation:
diff --git a/test/tap/data/TestResultSetTableIterator.java b/test/tap/data/TestResultSetTableIterator.java
index e2bbeda..9a20e28 100644
--- a/test/tap/data/TestResultSetTableIterator.java
+++ b/test/tap/data/TestResultSetTableIterator.java
@@ -13,7 +13,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 import adql.db.DBType;
-import adql.parser.ADQLParserFactory;
+import adql.parser.ADQLParser;
 import adql.query.ADQLQuery;
 import adql.translator.AstroH2Translator;
 import tap.db_testtools.DBTools;
@@ -23,8 +23,6 @@ public class TestResultSetTableIterator {
 
 	private static Connection conn;
 
-	ADQLParserFactory parserFactory = new ADQLParserFactory();
-
 	@BeforeClass
 	public static void setUpBeforeClass() throws Exception {
 		DBTools.createTestDB();
@@ -182,7 +180,7 @@ public class TestResultSetTableIterator {
 	public void testGeometryColumns() {
 		ResultSet rs = null;
 		try {
-			ADQLQuery query = (parserFactory.createParser()).parseQuery("SELECT TOP 1 POINT('', ra, dec), CENTROID(CIRCLE('', ra, dec, 2)), BOX('', ra-1, dec-2, ra+1, dec+2), CIRCLE('', ra, dec, 2) FROM hipparcos;");
+			ADQLQuery query = (new ADQLParser()).parseQuery("SELECT TOP 1 POINT('', ra, dec), CENTROID(CIRCLE('', ra, dec, 2)), BOX('', ra-1, dec-2, ra+1, dec+2), CIRCLE('', ra, dec, 2) FROM hipparcos;");
 
 			// create a valid ResultSet:
 			rs = DBTools.select(conn, (new AstroH2Translator()).translate(query));
@@ -220,7 +218,7 @@ public class TestResultSetTableIterator {
 	public void testSQLFunctions() {
 		ResultSet rs = null;
 		try {
-			ADQLQuery query = (parserFactory.createParser()).parseQuery("SELECT COUNT(*), MIN(vmag), AVG(plx) FROM hipparcos;");
+			ADQLQuery query = (new ADQLParser()).parseQuery("SELECT COUNT(*), MIN(vmag), AVG(plx) FROM hipparcos;");
 
 			// create a valid ResultSet:
 			rs = DBTools.select(conn, (new AstroH2Translator()).translate(query));
diff --git a/test/tap/db/TestJDBCConnection.java b/test/tap/db/TestJDBCConnection.java
index b2da3eb..0ac40f7 100644
--- a/test/tap/db/TestJDBCConnection.java
+++ b/test/tap/db/TestJDBCConnection.java
@@ -28,8 +28,7 @@ import adql.db.DBTable;
 import adql.db.DBType;
 import adql.db.DBType.DBDatatype;
 import adql.parser.ADQLParser;
-import adql.parser.ADQLParserFactory;
-import adql.parser.ParseException;
+import adql.parser.grammar.ParseException;
 import adql.query.ADQLQuery;
 import adql.query.IdentifierField;
 import adql.translator.AstroH2Translator;
@@ -65,14 +64,19 @@ public class TestJDBCConnection {
 
 		uploadExamplePath = "./test/tap/db/upload_example.vot";
 
-		DBTools.createTestDB();
-		h2Connection = DBTools.createConnection("h2", null, null, DBTools.DB_TEST_PATH, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD);
-		h2JDBCConnection = new JDBCConnection(h2Connection, new AstroH2Translator(false), "H2", null);
-		sensH2JDBCConnection = new JDBCConnection(h2Connection, new AstroH2Translator(true, true, true, true), "SensitiveH2", null);
-
-		sqliteConnection = DBTools.createConnection("sqlite", null, null, sqliteDbFile, null, null);
-		sqliteJDBCConnection = new JDBCConnection(sqliteConnection, new PostgreSQLTranslator(false), "SQLITE", null);
-		sensSqliteJDBCConnection = new JDBCConnection(sqliteConnection, new PostgreSQLTranslator(true), "SensitiveSQLite", null);
+		try {
+			DBTools.createTestDB();
+			h2Connection = DBTools.createConnection("h2", null, null, DBTools.DB_TEST_PATH, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD);
+			h2JDBCConnection = new JDBCConnection(h2Connection, new AstroH2Translator(false), "H2", null);
+			sensH2JDBCConnection = new JDBCConnection(h2Connection, new AstroH2Translator(true, true, true, true), "SensitiveH2", null);
+
+			sqliteConnection = DBTools.createConnection("sqlite", null, null, sqliteDbFile, null, null);
+			sqliteJDBCConnection = new JDBCConnection(sqliteConnection, new PostgreSQLTranslator(false), "SQLITE", null);
+			sensSqliteJDBCConnection = new JDBCConnection(sqliteConnection, new PostgreSQLTranslator(true), "SensitiveSQLite", null);
+		} catch(Throwable t) {
+			t.printStackTrace();
+			fail(t.getMessage());
+		}
 	}
 
 	@AfterClass
@@ -524,7 +528,7 @@ public class TestJDBCConnection {
 			for(TAPTable t : schema)
 				tables.add(t);
 
-			ADQLParser parser = (new ADQLParserFactory()).createParser();
+			ADQLParser parser = new ADQLParser();
 			parser.setQueryChecker(new DBChecker(tables));
 			parser.setDebug(false);
 
-- 
GitLab