/* ADQLParser.java */ /* Generated By:JavaCC: Do not edit this line. ADQLParser.java */ package adql.parser; 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.parser.IdentifierItems.IdentifierItem; import adql.parser.ADQLQueryFactory.JoinType; 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.translator.PostgreSQLTranslator; import adql.translator.TranslationException; /** * Parses an ADQL query thanks to the {@link ADQLParser#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égory Mantelet (CDS;ARI) * @version 1.5-2 (10/2020) */ public class ADQLParser implements ADQLParserConstants { /** Tools to build the object representation of the ADQL query. */ private ADQLQueryFactory queryFactory = new ADQLQueryFactory(); /** 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 ADQLParser(){ 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 ADQLParser(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 ADQLParser(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 ADQLParser(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 ADQLParser(java.io.InputStream stream, QueryChecker checker, ADQLQueryFactory factory) { this(stream); setDebug(false); 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 ADQLParser(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 ADQLParser(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 ADQLParser(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 ADQLParser(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 ADQLParser(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 ADQLParser(java.io.Reader reader, QueryChecker checker, ADQLQueryFactory factory) { this(reader); setDebug(false); 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 ADQLParser(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 ADQLParser(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 ADQLParser(ADQLParserTokenManager tm, QueryChecker checker, ADQLQueryFactory factory) { this(tm); setDebug(false); 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 ADQLParser(ADQLParserTokenManager 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 ADQLParser(ADQLParserTokenManager tm, ADQLQueryFactory factory) { this(tm, null, factory); } /* ADDITIONAL GETTERS & SETTERS */ 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()); } /* 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_]*"); } /** * 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: \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 ADQLParser#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 ADQLParser#ReInit(java.io.InputStream) * @see ADQLParser#setDebug(boolean) * @see ADQLParser#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 ADQLParser#ReInit(java.io.InputStream) * @see ADQLParser#setDebug(boolean) * @see ADQLParser#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); } } /* 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("(\u005cr\u005cn|\u005cr|\u005cn)", System.getProperty("line.separator")).replaceAll("\u005ct", " "); // 2. Analyse the query token by token: ADQLParserTokenManager parser = new ADQLParserTokenManager(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 == ADQLParserConstants.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><</code>. * @since 1.5 */ protected final static String REGEX_LESS_THAN = "[<\u02c2\u1438\u16b2\u2039\u276e]"; /** Regular expression matching all Unicode alternatives for <code>></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 == ADQLParserConstants.EOF || token.kind == ADQLParserConstants.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 ADQLParserConstants.SQL_RESERVED_WORD: return true; case ADQLParserConstants.REGULAR_IDENTIFIER_CANDIDATE: return !isRegularIdentifier(token.image); default: return isFunctionName(token) && (nextToken == null || nextToken.kind != ADQLParserConstants.LEFT_PAR); } } /** * Tell whether the given token matches to an ADQL function name. * * @param token The token to analyze. * * @return <code>true</code> if the given token is an ADQL function name, * <code>false</code> otherwise. * * @since 1.5 */ protected boolean isFunctionName(final Token token){ switch(token.kind){ case ADQLParserConstants.COUNT: case ADQLParserConstants.EXISTS: case ADQLParserConstants.AVG: case ADQLParserConstants.MAX: case ADQLParserConstants.MIN: case ADQLParserConstants.SUM: case ADQLParserConstants.BOX: case ADQLParserConstants.CENTROID: case ADQLParserConstants.CIRCLE: case ADQLParserConstants.POINT: case ADQLParserConstants.POLYGON: case ADQLParserConstants.REGION: case ADQLParserConstants.CONTAINS: case ADQLParserConstants.INTERSECTS: case ADQLParserConstants.AREA: case ADQLParserConstants.COORD1: case ADQLParserConstants.COORD2: case ADQLParserConstants.COORDSYS: case ADQLParserConstants.DISTANCE: case ADQLParserConstants.ABS: case ADQLParserConstants.CEILING: case ADQLParserConstants.DEGREES: case ADQLParserConstants.EXP: case ADQLParserConstants.FLOOR: case ADQLParserConstants.LOG: case ADQLParserConstants.LOG10: case ADQLParserConstants.MOD: case ADQLParserConstants.PI: case ADQLParserConstants.POWER: case ADQLParserConstants.RADIANS: case ADQLParserConstants.RAND: case ADQLParserConstants.ROUND: case ADQLParserConstants.SQRT: case ADQLParserConstants.TRUNCATE: case ADQLParserConstants.ACOS: case ADQLParserConstants.ASIN: case ADQLParserConstants.ATAN: case ADQLParserConstants.ATAN2: case ADQLParserConstants.COS: case ADQLParserConstants.COT: case ADQLParserConstants.SIN: case ADQLParserConstants.TAN: case ADQLParserConstants.USING: return true; default: return false; } } /* MAIN PROGRAM */ /** * Gets the specified ADQL query and parses the given ADQL query. The SQL * translation is then printed if the syntax is correct. * * <p> * <b>ONLY the syntax is checked: the query is NOT EXECUTED !</b> * </p> * * @param args * @throws Exception */ public static final void main(String[] args) throws Exception { final String USAGE = "Usage:\u005cn adqlParser.jar [-d] [-v] [-e] [-a|-s] [-f] [<FILE>|<URL>]\u005cn\u005cnNOTE: If no file or URL is given, the ADQL query is expected in the standard\u005cn input. This query must end with a ';' or <Ctrl+D>!\u005cn\u005cnParameters:\u005cn -v or --verbose : Print the main steps of the parsing\u005cn -d or --debug : Print stack traces when a grave error occurs\u005cn -e or --explain : Explain the ADQL parsing (or Expand the parsing tree)\u005cn -a or --adql : Display the understood ADQL query\u005cn -s or --sql : Ask the SQL translation of the given ADQL query\u005cn (SQL compatible with PostgreSQL)\u005cn -f or --try-fix : Try fixing the most common ADQL query issues before\u005cn attempting to parse the query.\u005cn\u005cnReturn:\u005cn By default: nothing if the query is correct. Otherwise a message explaining\u005cn why the query is not correct is displayed.\u005cn With the -s option, the SQL translation of the given ADQL query will be\u005cn returned.\u005cn With the -a option, the ADQL query is returned as it has been understood.\u005cn\u005cnExit status:\u005cn 0 OK !\u005cn 1 Parameter error (missing or incorrect parameter)\u005cn 2 File error (incorrect file/url, reading error, ...)\u005cn 3 Parsing error (syntactic or semantic error)\u005cn 4 Translation error (a problem has occurred during the translation of the\u005cn given ADQL query in SQL)."; ADQLParser parser; final String urlRegex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; String file = null, metaFile = null; short mode = -1; boolean verbose=false, debug=false, explain=false, tryFix=false; // Parameters reading: for(int i=0; i<args.length; i++){ 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 ((!))\u005cn"+USAGE); 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 ((!))\u005cn"+USAGE); 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: \u005c""+args[i]+"\u005c" ((!))\u005cn"+USAGE); System.exit(1); }else file = args[i].trim(); } try{ // Try fixing the query, if asked: if (tryFix) { if (verbose) System.out.println("((i)) Trying to automatically fix the query..."); String query; java.io.InputStream in = null; 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 = (new ADQLParser()).tryQuickFix(in); } finally { // close the stream (if opened): if (in != null) in.close(); in = null; } if (verbose) System.out.println("((i)) SUGGESTED QUERY:\u005cn" + query); // Initialise the parser with this fixed query: parser = new ADQLParser(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) parser = new ADQLParser(System.in); else if (file.matches(urlRegex)) parser = new ADQLParser((new java.net.URL(file)).openStream()); else parser = new ADQLParser(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(); 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("\u005ct - 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("\u005cn((X)) Error while reading the file \u005c""+file+"\u005c": "+ioe.getMessage()+" ((X))"); if (debug) ioe.printStackTrace(System.err); System.exit(2); } } /* ########## */ /* # SYNTAX # */ /* ########## */ /* ******************* */ /* GENERAL ADQL SYNTAX */ /* ******************* */ /** * Parses the ADQL query given at the parser creation or in the {@link ADQLParser#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 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(); 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; ; } switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { case OFFSET:{ jj_consume_token(OFFSET); t = jj_consume_token(UNSIGNED_INTEGER); try{ select.setOffset(Integer.parseInt(t.image)); }catch(NumberFormatException nfe){ {if (true) throw new ParseException("[l."+t.beginLine+";c."+t.beginColumn+"] The OFFSET limit (\u005c""+t.image+"\u005c") isn't a regular unsigned integer !");} } break; } default: jj_la1[7] = 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[8] = 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[13] = 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[9] = jj_gen; ; } break; } default: jj_la1[10] = 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[11] = jj_gen; ; } label = Identifier(); break; } default: jj_la1[12] = jj_gen; ; } break; } default: jj_la1[14] = 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[15] = 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[16] = 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[17] = 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[18] = 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[19] = 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[20] = 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[21] = 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[22] = 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[23] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; } default: jj_la1[24] = 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[25] = jj_gen; ; } alias = Identifier(); break; } default: jj_la1[26] = 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[28] = 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[27] = 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[29] = 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[30] = 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[31] = 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[32] = jj_gen; ; } break; } default: jj_la1[33] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; } default: jj_la1[34] = 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[35] = 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[36] = jj_gen; ; } break; } default: jj_la1[37] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; } default: jj_la1[38] = 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[39] = 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[40] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; } default: jj_la1[41] = 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[42] = 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[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("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[44] = 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[45] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; } default: jj_la1[46] = 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[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("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[48] = 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[49] = 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[50] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rightOp = NumericExpression(); break; } default: jj_la1[51] = 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[52] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rightOp = NumericTerm(); break; } default: jj_la1[53] = 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[54] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; } default: jj_la1[55] = 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[56] = 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"); } } 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[57] = 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[58] = 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[59] = 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[60] = 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[61] = 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[62] = 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[63] = 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[64] = 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[65] = 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[70] = 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[66] = 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[67] = 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[68] = 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[69] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } } break; } default: jj_la1[71] = 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[72] = 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[73] = 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[74] = 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[75] = jj_gen; break label_11; } jj_consume_token(COMMA); item = ValueExpression(); items.add(item); } jj_consume_token(RIGHT_PAR); break; } default: jj_la1[76] = 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[77] = 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[78] = 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[79] = 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[80] = 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[81] = 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[82] = 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[83] = 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[84] = 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[85] = 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[86] = 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[87] = 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[88] = 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[89] = 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[90] = 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[91] = 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[92] = 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[93] = jj_gen; ; } end = jj_consume_token(RIGHT_PAR); break; } default: jj_la1[94] = 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[95] = 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[96] = jj_gen; break label_13; } jj_consume_token(COMMA); op = ValueExpression(); params.add(op); } break; } default: jj_la1[97] = 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 [ADQLParser]: \""+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(43)) { 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(66)) { 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_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_121() { if (jj_3R_23()) return true; return false; } private boolean jj_3R_53() { if (jj_scan_token(SELECT)) 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_16() { if (jj_scan_token(LEFT_PAR)) return true; if (jj_3R_33()) 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(61)) { jj_scanpos = xsp; if (jj_scan_token(62)) 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(50)) { jj_scanpos = xsp; if (jj_scan_token(51)) { jj_scanpos = xsp; if (jj_scan_token(52)) { jj_scanpos = xsp; if (jj_scan_token(53)) 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(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_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(26)) { 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(27)) 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(26)) { 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(37)) 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(37)) 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 ADQLParserTokenManager 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[98]; 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,0x400000,0x40,0x0,0x0,0x1000000,0x1000000,0x800,0x608,0x40,0x40,0x40,0x0,0x20,0x20,0x20,0x0,0x0,0x0,0x1000000,0x1000000,0x1000000,0x0,0x8,0xf6000000,0x70000000,0x8000000,0x74000000,0x74000000,0x70000000,0x8000000,0x74000000,0x74000000,0x40,0x0,0xf6000000,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,0x4,0x2000,0x4000,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfffc0000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x30000,0x30000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x7c0000,0x7c0000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7c0000,0x0,0x0,0x7c0000,0x1f800000,0x20,0x18,0x18,0x20,0x0,0x20,0x20,0x0,0x420,0x800,0xfffc0000,0x0,0x20,0x20,0x0,0x0,0x0,0xfffc0000,0x3c0000,0x0,0x7c0000,0x60000000,0x4000000,0x4000000,0x4000000,0x4000000,0xe0000000,0x0,0x1f800000,0xe0000000,0xe07c0000,0x0,0x0,0x0,0x0,0x0,0xfffc0000,}; } 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,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,0x4,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,0xb,0x0,0x0,0x7fffffb,0x87fffffb,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,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 ADQLParser(java.io.InputStream stream) { this(stream, (String) null); } /** Constructor with InputStream and supplied encoding */ public ADQLParser(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 ADQLParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 98; 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(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 < 98; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } /** Constructor. */ public ADQLParser(java.io.Reader stream) { jj_input_stream = new SimpleCharStream(stream, 1, 1); token_source = new ADQLParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 98; 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(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 < 98; 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 ADQLParser(ADQLParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 98; 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(ADQLParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 98; 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 < 98; 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; } }