/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *  
 * http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.   
 */

/**
 *  An JP QL grammar parser.
 * 
 *  Samples:
 *	  SELECT COUNT(p) FROM Person AS p
 *	  SELECT OBJECT(identifier) FROM schema identifier
 *	  SELECT identifier FROM schema AS identifier
 *	
 *	@author Patrick Linskey
 *	@author Marc Prud'hommeaux
 */
options {
	NODE_PREFIX = "JPQL";
	NODE_PACKAGE = "org.apache.openjpa.kernel.jpql";
	MULTI = false;
	NODE_DEFAULT_VOID = true;
	JAVA_UNICODE_ESCAPE = true;
	STATIC = false;
	NODE_USES_PARSER = true;

	LOOKAHEAD = 1;


	// debugging variables
	// DEBUG_PARSER = true; 		// simple parser debug
	// DEBUG_TOKEN_MANAGER = true; 	// more verbose token manager debug
	// DEBUG_LOOKAHEAD = true; 		// more verbose lookahead debug

	SANITY_CHECK = true; // check for left-recursion, etc (must always be true)


	// FORCE_LA_CHECK = true;
}

PARSER_BEGIN(JPQL)
package org.apache.openjpa.kernel.jpql;

import java.io.*;



/**
 *	@nojavadoc
 */
public class JPQL
{
	String jpql;


	public JPQL (String jpql)
	{
		this (new StringReader (jpql));

		this.jpql = jpql;
	}


	public static void main (String[] args)
		throws Exception
	{
		if (args.length > 0)
		{
			for (int i = 0; i < args.length; i++)
			{
				JPQL parser = new JPQL (args[i]);
				SimpleNode ast = (SimpleNode) parser.parseQuery ();
				ast.dump (System.out, "");
			}
		}
		else
		{
			JPQL parser = new JPQL (System.in);
			while (true)
			{
				System.out.print ("Enter Expression: ");
				System.out.flush ();
				try
				{
					SimpleNode ast = (SimpleNode) parser.parseQuery ();
					if (ast == null)
						return;
					else
						ast.dump (System.out, "");
				}
				catch (Throwable x)
				{
					x.printStackTrace ();
					return;
				}
			}
		}
	}
}

PARSER_END(JPQL)


SKIP :
{
 	" "
    | "\n"
	| "\r"
	| "\t"
}


TOKEN [ IGNORE_CASE ]: /* basics */
{
	< COMMA: "," >

	|	< DOT: "." >

	|	< EQ: "=" >
	|	< NE: "<>" >
	|	< GT: ">" >
	|	< GE: ">=" >
	|	< LT: "<" >
	|	< LE: "<=" >

	|	< PLUS: "+" >
	|	< MINUS: "-" >

	|	< TIMES: "*" >
	|	< DIV: "/" >

	|	< NEW: "NEW" >

	|	< ALL: "ALL" >
	|	< ANY: "ANY" >
	|	< EXISTS: "EXISTS" >
	|	< SOME: "SOME" >
	|	< EMPTY: "EMPTY" >

	|	< ASC: "ASC" >
	|	< DESC: "DESC" >
	|	< ORDER: "ORDER" >
	|	< BY: "BY" >

	|	< IS: "IS" >
	|	< MEMBER: "MEMBER" >
	|	< OF: "OF" >
	|	< LIKE: "LIKE" >
	|	< ESCAPE: "ESCAPE" >
	|	< BETWEEN: "BETWEEN" >

	|	< NULL: "NULL" >
}

TOKEN [ IGNORE_CASE ]: /* aggregates */
{
	< AVG: "AVG" >
	|	< MIN: "MIN" >
	|	< MAX: "MAX" >
	|	< SUM: "SUM" >
	|	< COUNT: "COUNT" >
}

TOKEN [ IGNORE_CASE ]: /* boolean arithmetic */
{
	< OR: "OR" >
	|	< AND: "AND" >
	|	< NOT: "NOT" >
}

TOKEN [ IGNORE_CASE ]: /* functions returning strings */
{
	< CONCAT: "CONCAT" >
	|	< SUBSTRING: "SUBSTRING" >
	|	< TRIM: "TRIM" >
	|	< LOWER: "LOWER" >
	|	< UPPER: "UPPER" >
}

TOKEN [ IGNORE_CASE ]: /* trim specification */
{
	< LEADING: "LEADING" >
	|	< TRAILING: "TRAILING" >
	|	< BOTH: "BOTH" >
}


TOKEN [ IGNORE_CASE ]: /* functions returning numerics */
{
	< LENGTH: "LENGTH" >
	|	< LOCATE: "LOCATE" >
	|	< ABS: "ABS" >
	|	< SQRT: "SQRT" >
	|	< MOD: "MOD" >
	|	< SIZE: "SIZE" >
}


TOKEN [ IGNORE_CASE ]: /* functions returning datetime */
{
	< CURRENT_DATE: "CURRENT_DATE" >
	|	< CURRENT_TIME: "CURRENT_TIME" >
	|	< CURRENT_TIMESTAMP: "CURRENT_TIMESTAMP" >
}

TOKEN [ IGNORE_CASE ]: /* type of query */
{
	< SELECT: "SELECT" >
	|	< DISTINCT: "DISTINCT" >
	|	< FROM: "FROM" >

	|	< UPDATE: "UPDATE" >
	|	< DELETE: "DELETE" >

	|	< WHERE: "WHERE" >
	|	< GROUP: "GROUP" >
	|	< HAVING: "HAVING" >

	|	< AS: "AS" >
	|	< LEFT: "LEFT" >
	|	< OUTER: "OUTER" >
	|	< INNER: "INNER" >
	|	< JOIN: "JOIN" >
	|	< FETCH: "FETCH" >
	|	< IN: "IN" >
	|	< SET: "SET" >

	|	< OBJECT: "OBJECT" >
}


/* inspired by the Java 1.0.2 specification */
/* ### should we limit this to the length that is valid in java? */
TOKEN : /* literals */
{
	< INTEGER_LITERAL: ((["0"-"9"])+) (["l","L"])? >
	| < DECIMAL_LITERAL:
		(((["0"-"9"])* "." (["0"-"9"])+) (<EXPONENT>)? (["f","F","d","D"])?
		| ((["0"-"9"])+ ".") (<EXPONENT>)? (["f","F","d","D"])?
		| ((["0"-"9"])+) (<EXPONENT>) (["f","F","d","D"])?
		| ((["0"-"9"])+) (<EXPONENT>)? (["f","F","d","D"])?) >
	| < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
	| < STRING_LITERAL: "'"
	  (("''" | ~["'"])
		/*
	  (("''" | ~["'","\\","\n","\r"])
		| ("\\"
			( ["n","t","b","r","f","\\","'"]
			| ["0"-"7"] ( ["0"-"7"] )?
			| ["0"-"3"] ["0"-"7"] ["0"-"7"]
			)
		  )
		*/
	  )*
	  "'"
	>
	| < CHARACTER_LITERAL: "'"
	  (   (~["'","\\","\n","\r"])
		| ("\\"
			( ["n","t","b","r","f","\\","'"]
			| ["0"-"7"] ( ["0"-"7"] )?
			| ["0"-"3"] ["0"-"7"] ["0"-"7"]
			)
		  )
	  )
	  "'"
	>
}

TOKEN [ IGNORE_CASE ]: /* boolean literals can be case-insensitive */
{
	< BOOLEAN_LITERAL: "TRUE" | "FALSE" >
}

/* From the Java 1.0.2 specification */
TOKEN : /* IDENTIFIERS */
{
  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
	|
  < #LETTER:
	  [
	   "\u0024", 			// $
	   "\u0041"-"\u005a", 	// A-Z
	   "\u005f", 			// _
	   "\u0061"-"\u007a", 	// a-z
	   "\u00c0"-"\u00d6",
	   "\u00d8"-"\u00f6",
	   "\u00f8"-"\u00ff",
	   "\u0100"-"\u1fff",
	   "\u3040"-"\u318f",
	   "\u3300"-"\u337f",
	   "\u3400"-"\u3d2d",
	   "\u4e00"-"\u9fff",
	   "\uf900"-"\ufaff"
	  ]
  >
	|
  < #DIGIT:
	  [
	   "\u0030"-"\u0039", 	// 0-9
	   "\u0660"-"\u0669",
	   "\u06f0"-"\u06f9",
	   "\u0966"-"\u096f",
	   "\u09e6"-"\u09ef",
	   "\u0a66"-"\u0a6f",
	   "\u0ae6"-"\u0aef",
	   "\u0b66"-"\u0b6f",
	   "\u0be7"-"\u0bef",
	   "\u0c66"-"\u0c6f",
	   "\u0ce6"-"\u0cef",
	   "\u0d66"-"\u0d6f",
	   "\u0e50"-"\u0e59",
	   "\u0ed0"-"\u0ed9",
	   "\u1040"-"\u1049"
	  ]
  >
}


Node parseQuery() : { }
{
	(select_statement() | update_statement() | delete_statement()) <EOF>
	{
		return jjtree.rootNode();
	}
}


void select_statement() #SELECT : { }
{
	select_clause()
		from_clause()
		[where_clause()]
		[groupby_clause()]
		[having_clause()]
		[orderby_clause()]
}


void update_statement() #UPDATE : { }
{
	update_clause() [ where_clause() ]
}


void delete_statement() #DELETE : { }
{
	<DELETE> <FROM> (from_item() #FROM) [where_clause()]
}


void from_clause() #FROM : { }
{
	<FROM> identification_variable_declaration()
	(LOOKAHEAD(1) <COMMA> (LOOKAHEAD(collection_member_declaration()) collection_member_declaration() | LOOKAHEAD(identification_variable_declaration())identification_variable_declaration()))*
}


void identification_variable_declaration(): { }
{
	from_item() (LOOKAHEAD(fetch_join()) fetch_join() | LOOKAHEAD(inner_join()) inner_join() | LOOKAHEAD(outer_join()) outer_join())*
}


void from_item() #FROMITEM : { }
{
	abstract_schema_name() [LOOKAHEAD(1)<AS>] [LOOKAHEAD(identification_variable())identification_variable()]
}


void subquery_from_clause() #FROM : { }
{
	<FROM> subquery_from_item()
		( LOOKAHEAD(1) <COMMA> subquery_from_item() )*
}

void subquery_from_item() : { }
{
        LOOKAHEAD(collection_member_declaration()) collection_member_declaration()
	| LOOKAHEAD(identification_variable_declaration()) identification_variable_declaration()
}

void inner_join() #INNERJOIN : { }
{
	[<INNER>] <JOIN> path() [<AS>] identification_variable()
}


void collection_member_declaration() #INNERJOIN : { }
{
	// synonymous with "INNER JOIN path AS identifier" (InnerJoin)
	<IN> "(" path() ")" [ LOOKAHEAD(1)<AS>] identification_variable()
}

void outer_join() #OUTERJOIN : { }
{
	<LEFT> [ <OUTER>] <JOIN> path() [ LOOKAHEAD(1)<AS>] identification_variable()
}


void fetch_join() : { }
{
	outer_fetch_join() | inner_fetch_join()
}


void outer_fetch_join() #OUTERFETCHJOIN : { }
{
	<LEFT> [<OUTER>] <JOIN> <FETCH> path()
}


void inner_fetch_join() #INNERFETCHJOIN : { }
{
	[<INNER>] <JOIN> <FETCH> path()
}


void path() #PATH : { }
{
	// a path is any dot-separated path expression starting with a
	// non-reserved word
	identification_variable() (<DOT> path_component())+
}


void update_clause() : { }
{
	<UPDATE> from_item() #FROM set_clause()
}


void set_clause() : { }
{
	<SET> update_item() (<COMMA> update_item())*
}


void update_item() #UPDATEITEM : { }
{
	path() EQ() new_value()
}


void new_value() #UPDATEVALUE : { }
{
	LOOKAHEAD(arithmetic_expression()) arithmetic_expression() |
	LOOKAHEAD(string_primary()) string_primary() |
	LOOKAHEAD(datetime_primary()) datetime_primary() |
	LOOKAHEAD(boolean_primary()) boolean_primary() |
	LOOKAHEAD(enum_primary()) enum_primary() |
	LOOKAHEAD(simple_entity_expression()) simple_entity_expression() |
	<NULL>
}


void simple_entity_expression() : { }
{
	identification_variable() | input_parameter()
}


void select_clause() #SELECTCLAUSE : { }
{
	<SELECT> [distinct()] select_expressions()
}


void simple_select_clause() #SELECTCLAUSE : { }
{
	<SELECT> [distinct()] subselect_expressions() 
}


void select_expressions() #SELECTEXPRESSIONS : { }
{
	select_expression() (<COMMA> select_expression())*
}


void select_expression() #SELECTEXPRESSION : { }
{
	aggregate_select_expression()
		| LOOKAHEAD(path()) path()
		| identification_variable()
		| (<OBJECT> "(" identification_variable() ")")
		| constructor_expression()
}


void subselect_expressions() #SELECTEXPRESSIONS : { }
{
	subselect_expression() (<COMMA> subselect_expression())*
}

void subselect_expression() #SELECTEXPRESSION : { }
{
	LOOKAHEAD(path()) path() 
		| aggregate_select_expression()
		| LOOKAHEAD(1) identification_variable()

}


void constructor_expression() #CONSTRUCTOR : { }
{
	<NEW> classname() constructor_parameters()
}


void classname() #CLASSNAME :
{ Token t; }
{
	identification_variable() (<DOT> identification_variable())*
}


void constructor_parameters() #CONSTRUCTORPARAMS : { }
{
	"(" (constructor_parameter()) (<COMMA> (constructor_parameter()))* ")" 
}


void constructor_parameter() #CONSTRUCTORPARAM : { }
{
	(path() | aggregate_select_expression())
}


/* rewritten to reduce lookaheads */
void aggregate_select_expression() #AGGREGATE : { }
{
	(avg() | max() | min() | sum() | count())
}


void distinct() #DISTINCT : { }
{
	<DISTINCT>
}


void aggregate_path() : { }
{
	"(" (
		LOOKAHEAD(arithmetic_expression()) arithmetic_expression() |
		LOOKAHEAD(distinct_path()) distinct_path() |
		LOOKAHEAD(path()) path() |
		LOOKAHEAD(identification_variable()) identification_variable()
	) ")"
}


void distinct_path() #DISTINCTPATH : { }
{
	<DISTINCT> (LOOKAHEAD(path()) path() | identification_variable())
}


void count() #COUNT : { }
{
	<COUNT> aggregate_path()
}


void avg() #AVERAGE : { }
{
	<AVG> aggregate_path()
}


void max() #MAX : { }
{
	<MAX> aggregate_path()
}


void min() #MIN : { }
{
	<MIN> aggregate_path()
}


void sum() #SUM : { }
{
	<SUM> aggregate_path()
}


void where_clause() #WHERE : { }
{
	<WHERE> conditional_expression() 
}


void groupby_clause() #GROUPBY : { }
{
	<GROUP> <BY> groupby_item()
		(LOOKAHEAD(2) <COMMA> (groupby_item()))* 
}


void groupby_item() : { }
{
	LOOKAHEAD(path()) path() | identification_variable()
}


void having_clause() #HAVING : { }
{
	<HAVING> conditional_expression() 
}


void subquery() #SUBSELECT : { }
{
	simple_select_clause()
		subquery_from_clause() 
		[LOOKAHEAD(where_clause()) where_clause()] 
		[LOOKAHEAD(groupby_clause()) groupby_clause()] 
		[LOOKAHEAD(having_clause()) having_clause()] 
}


/* changed to eliminate left recursion */
void conditional_expression() : { }
{
	conditional_term() (LOOKAHEAD(2) <OR> (conditional_expression() #OR(2)))*
}


/* changed to eliminate left recursion */
void conditional_term() : { }
{
	conditional_factor() (LOOKAHEAD(2) <AND> (conditional_term() #AND(2)))*
}


void conditional_factor() : { }
{
	LOOKAHEAD(<NOT> conditional_primary())
	(<NOT> conditional_primary() #NOT) | conditional_primary()
}


void conditional_primary() : { }
{
	LOOKAHEAD(simple_cond_expression())
	simple_cond_expression() | "(" conditional_expression() ")" 
}


void simple_cond_expression() : { }
{
	//LOOKAHEAD(all_or_any_expression()) all_or_any_expression() |
	LOOKAHEAD(exists_expression()) exists_expression() |
	LOOKAHEAD(comparison_expression()) comparison_expression() | 
	LOOKAHEAD(between_expression()) between_expression() | 
	LOOKAHEAD(like_expression()) like_expression() | 
	LOOKAHEAD(in_expression()) in_expression() | 
	LOOKAHEAD(null_comparison_expression()) null_comparison_expression() | 
	LOOKAHEAD(empty_collection_comparison_expression()) empty_collection_comparison_expression() | 
	LOOKAHEAD(collection_member_expression()) collection_member_expression()
}


void between_expression() #BETWEEN : { }
{
	LOOKAHEAD(6) arithmetic_expression()
		[<NOT> { jjtThis.not = true; }] <BETWEEN> arithmetic_expression()
		<AND> arithmetic_expression()
	| LOOKAHEAD(6) string_expression()
		[<NOT> { jjtThis.not = true; }] <BETWEEN> string_expression() <AND> string_expression()
	| LOOKAHEAD(6) datetime_expression()
		[<NOT> { jjtThis.not = true; }] <BETWEEN> datetime_expression() <AND> datetime_expression()
}


void in_expression() #IN : { }
{
	path() [ LOOKAHEAD(1) <NOT> { jjtThis.not = true; }] <IN>
		"(" (literal_or_param()
			(<COMMA> (literal_or_param()))* | subquery())
		")" 
}


void literal_or_param() : { }
{
	(numeric_literal()
	| string_literal()
	| boolean_literal()
	| input_parameter())
}


void like_expression() #LIKE : { }
{
	string_expression() [<NOT> { jjtThis.not = true; }] <LIKE> pattern_value() 
}


void null_comparison_expression() #ISNULL : { }
{
	(input_parameter() | path())
	<IS> [<NOT> { jjtThis.not = true; }] <NULL> 
}


void empty_collection_comparison_expression() #ISEMPTY : { }
{
	path() <IS> [<NOT> { jjtThis.not = true; }] <EMPTY> 
}


void collection_member_expression() #MEMBEROF : { }
{
	(LOOKAHEAD(path()) path() | input_parameter() | path_component()) 
	[<NOT> { jjtThis.not = true; }] <MEMBER> [<OF>] path()
}


void exists_expression() #EXISTS : { }
{
	[<NOT> { jjtThis.not = true; }] <EXISTS> "(" subquery() ")" 
}


void all_or_any_expression() : { }
{
	any_expression() | some_expression() | all_expression()
}


void any_expression() #ANY : { }
{
	<ANY> "(" subquery() ")" 
}


void some_expression() #ANY : { }
{
	// SOME and ANY are synonymous
	<SOME> "(" subquery() ")" 
}


void all_expression() #ALL : { }
{
	<ALL> "(" subquery() ")" 
}


void comparison_expression() : { }
{
	// comparison_expression ::= string_value comparison_operator {string_expression | all_or_any_expression} | boolean_value { =|<>} {boolean_expression | all_or_any_expression} | datetime_primary comparison_operator {datetime_expression | all_or_any_expression} | entity_bean_value { = | <> } {entity_bean_expression | all_or_any_expression} | arithmetic_value comparison_operator {arithmetic_expression | all_or_any_expression

	LOOKAHEAD(arithmetic_comp()) arithmetic_comp() |
	LOOKAHEAD(string_comp()) string_comp() |
	LOOKAHEAD(boolean_comp()) boolean_comp() | 
	LOOKAHEAD(enum_comp()) enum_comp() | 
	LOOKAHEAD(datetime_comp()) datetime_comp() |
	LOOKAHEAD(entity_comp()) entity_comp()
}


void string_comp() : { }
{
	string_expression() (
		(<EQ> (string_expression()|all_or_any_expression()) #EQUALS(2))
		| (<NE> (string_expression()|all_or_any_expression()) #NOTEQUALS(2))
		| (<GT> (string_expression() | all_or_any_expression()) #GREATERTHAN(2))
		| (<GE> (string_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
		| (<LT> (string_expression() | all_or_any_expression()) #LESSTHAN(2))
		| (<LE> (string_expression() | all_or_any_expression()) #LESSOREQUAL(2))
		)
}


void boolean_comp() : { }
{
	boolean_expression() (
	(<EQ> (boolean_expression() | all_or_any_expression()) #EQUALS(2))
	| (<NE> (boolean_expression() | all_or_any_expression()) #NOTEQUALS(2))
	)
}

void enum_comp() : { }
{
	enum_expression() (
	(<EQ> (enum_expression() | all_or_any_expression()) #EQUALS(2))
	| (<NE> (enum_expression() | all_or_any_expression()) #NOTEQUALS(2))
	)
}

void entity_comp() : { }
{
	entity_bean_expression() (
	(<EQ> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #EQUALS(2)))
	| (<NE> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #NOTEQUALS(2)))
	)
}


void arithmetic_comp() : { }
{
	// arithmetic_value() (
	arithmetic_expression() (
	(<EQ> (arithmetic_expression() | all_or_any_expression()) #EQUALS(2))
	| (<GT> (arithmetic_expression() | all_or_any_expression()) #GREATERTHAN(2))
	| (<GE> (arithmetic_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
	| (<LT> (arithmetic_expression() | all_or_any_expression()) #LESSTHAN(2))
	| (<LE> (arithmetic_expression() | all_or_any_expression()) #LESSOREQUAL(2))
	| (<NE> (arithmetic_expression() | all_or_any_expression()) #NOTEQUALS(2))
	)
}


void datetime_comp() : { }
{
	datetime_expression() (
	(<EQ> (datetime_expression() | all_or_any_expression()) #EQUALS(2))
	| (<GT> (datetime_expression() | all_or_any_expression()) #GREATERTHAN(2))
	| (<GE> (datetime_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
	| (<LT> (datetime_expression() | all_or_any_expression()) #LESSTHAN(2))
	| (<LE> (datetime_expression() | all_or_any_expression()) #LESSOREQUAL(2))
	| (<NE> (datetime_expression() | all_or_any_expression()) #NOTEQUALS(2))
	)
}


void arithmetic_value() : { }
{
	path() | functions_returning_numerics() | "(" subquery() ")"
}


/* changed to eliminate left recursion */
void arithmetic_expression() : { }
{
	arithmetic_term()
		((<PLUS> arithmetic_expression() #ADD(2))
		| (<MINUS> arithmetic_expression() #SUBTRACT(2)))*
}


/* changed to eliminate left recursion */
void arithmetic_term() : { }
{
	arithmetic_factor()
		((<TIMES> arithmetic_term() #MULTIPLY(2))
		| (<DIV> arithmetic_term() #DIVIDE(2)))*
}


void arithmetic_factor() : { }
{
	numeric_literal() | 
	input_parameter() | 
	path() |
	LOOKAHEAD(2) "(" arithmetic_expression() ")" | 
	functions_returning_numerics() | 
	aggregate_select_expression() |	
	subquery()
}


void negative() #NEGATIVE : { }
{
	<MINUS>
}


void string_value() : { }
{
	path() | functions_returning_strings() | "(" subquery() ")"
}


void string_expression() : { }
{
	input_parameter() | string_primary()
}


void string_primary() : { }
{
	string_literal() | path() | LOOKAHEAD(2) "(" string_expression() ")" | 
	functions_returning_strings() | LOOKAHEAD(2)  "(" subquery() ")"
}


void datetime_expression() : { }
{
	datetime_primary() | "(" subquery() ")"
}


void datetime_primary() : { }
{
	path() | functions_returning_datetime() | input_parameter()
}


void boolean_value() : { }
{
	path() | "(" subquery() ")"
}


void boolean_expression() : { }
{
	boolean_primary() | "(" subquery() ")"
}


void boolean_primary() : { }
{
	LOOKAHEAD(2) path() | boolean_literal() | input_parameter()
}


void enum_expression() : { }
{
	enum_primary() | "(" subquery() ")"
}


void enum_primary() : { }
{
	LOOKAHEAD(2) path()
	| LOOKAHEAD(enum_literal()) enum_literal()
	| LOOKAHEAD(input_parameter()) input_parameter()
}


void enum_literal() : { }
{
	path()
}


void entity_bean_value() : { }
{
	LOOKAHEAD(path()) path() | path_component()
}


void entity_bean_expression() : { }
{
	input_parameter() | entity_bean_value()
}


void functions_returning_strings() : { }
{
	concat() | substring() | trim() | lower() | upper()
}


void concat() #CONCAT : { }
{
	<CONCAT> "(" string_expression() <COMMA> string_expression() ")"
}


void substring() #SUBSTRING : { }
{
	<SUBSTRING> "(" string_expression() <COMMA> arithmetic_expression() <COMMA> arithmetic_expression() ")"
}


void trim() #TRIM : { }
{
	<TRIM> "(" [LOOKAHEAD(2)[trim_specification()] [trim_character()] <FROM>]
		string_expression() ")"
}


void lower() #LOWER : { }
{
	<LOWER> "(" string_expression() ")"
}


void upper() #UPPER : { }
{
	<UPPER> "(" string_expression() ")"
}



void trim_specification() : { }
{
	LOOKAHEAD(2) (<LEADING> #TRIMLEADING) | (<TRAILING> #TRIMTRAILING) | (<BOTH> #TRIMBOTH)
}


void functions_returning_numerics() : { }
{
	length() | locate() | abs() | sqrt() | mod() | size()
}


void length() #LENGTH : { }
{
	<LENGTH> "(" string_expression() ")"

}


void locate() #LOCATE : { }
{
	<LOCATE> "(" string_expression() <COMMA> string_expression()
		[<COMMA> arithmetic_expression()] ")"

}


void abs() #ABS : { }
{
	<ABS> "(" arithmetic_expression() ")"

}


void sqrt() #SQRT : { }
{
	<SQRT> "(" arithmetic_expression() ")"

}


void mod() #MOD : { }
{
	<MOD> "(" arithmetic_expression() <COMMA> arithmetic_expression() ")"

}


void size() #SIZE : { }
{
	<SIZE> "(" path() ")"
}


void functions_returning_datetime() : { }
{
	(<CURRENT_DATE> #CURRENTDATE)
	| (<CURRENT_TIME> #CURRENTTIME)
	| (<CURRENT_TIMESTAMP> #CURRENTTIMESTAMP)
}


void orderby_clause() #ORDERBY : { }
{
	<ORDER> <BY> orderby_item() (<COMMA> orderby_item())* 
}


void orderby_item() #ORDERBYITEM : { }
{
	path() [ <ASC> #ASCENDING | <DESC> #DESCENDING ]
}


void abstract_schema_name() #ABSTRACTSCHEMANAME : { }
{
	path_component() (<DOT> path_component())*
}


void tok() #TOK :
{ Token t; }
{
	t = <IDENTIFIER> { jjtThis.setToken (t); }
}


void identification_variable() #IDENTIFIER :
{ Token t; }
{
	t = <IDENTIFIER> { jjtThis.setToken (t); }
}


void path_component() #IDENTIFICATIONVARIABLE :
{ Token t; }
{
	// unlike the identifier(), the path_component() *can* be a
	// reserved word. E.g., Order.group.length is a perfectly
	// valid path expression
	(
	t = <NEW>
	| t = <ALL>
	| t = <ANY>
	| t = <EXISTS>
	| t = <SOME>
	| t = <EMPTY>
	| t = <ASC>
	| t = <DESC>
	| t = <ORDER>
	| t = <IS>
	| t = <MEMBER>
	| t = <OF>
	| t = <LIKE>
	| t = <ESCAPE>
	| t = <BETWEEN>
	| t = <NULL>
	| t = <AVG>
	| t = <MIN>
	| t = <MAX>
	| t = <SUM>
	| t = <COUNT>
	| t = <OR>
	| t = <AND>
	| t = <NOT>
	| t = <CONCAT>
	| t = <SUBSTRING>
	| t = <TRIM>
	| t = <LOWER>
	| t = <UPPER>
	| t = <LEADING>
	| t = <TRAILING>
	| t = <BOTH>
	| t = <LENGTH>
	| t = <LOCATE>
	| t = <ABS>
	| t = <SQRT>
	| t = <MOD>
	| t = <SIZE>
	| t = <CURRENT_DATE>
	| t = <CURRENT_TIME>
	| t = <CURRENT_TIMESTAMP>
	| t = <SELECT>
	| t = <DISTINCT>
	| t = <FROM>
	| t = <UPDATE>
	| t = <DELETE>
	| t = <WHERE>
	| t = <GROUP>
	| t = <BY>
	| t = <HAVING>
	| t = <AS>
	| t = <LEFT>
	| t = <OUTER>
	| t = <INNER>
	| t = <JOIN>
	| t = <FETCH>
	| t = <IN>
	| t = <SET>
	| t = <OBJECT>
	| t = <IDENTIFIER>
    ) { jjtThis.setToken (t); }
}


void numeric_literal() : { }
{
	LOOKAHEAD(decimal_literal()) decimal_literal() | integer_literal()
}


void integer_literal() #INTEGERLITERAL :
{ Token t; }
{
	[<PLUS> | negative()] t = <INTEGER_LITERAL> { jjtThis.setToken (t); }
}


void decimal_literal() #DECIMALLITERAL :
{ Token t; }
{
	 [<PLUS> | negative()] t = <DECIMAL_LITERAL> { jjtThis.setToken (t); }
}


void boolean_literal() #BOOLEANLITERAL :
{ Token t; }
{
	t = <BOOLEAN_LITERAL> { jjtThis.setToken (t); }
}


void string_literal() #STRINGLITERAL :
{ Token t; }
{
	t = <STRING_LITERAL> { jjtThis.setToken (t); }
}


void input_parameter() : { }
{
	named_input_parameter() | positional_input_parameter()
}


void named_input_parameter() #NAMEDINPUTPARAMETER :
{ Token t; }
{
	":" t = <IDENTIFIER> { jjtThis.setToken (t); }
}


void positional_input_parameter() #POSITIONALINPUTPARAMETER :
{ Token t; }
{
	"?" t = <INTEGER_LITERAL> { jjtThis.setToken (t); }
}


void pattern_value() #PATTERNVALUE : { }
{
	input_parameter() | string_literal()
	[(<ESCAPE> escape_character() #ESCAPECHARACTER)]
}


void escape_character() #ESCAPECHARACTER :
{ Token t; }
{
	t = <STRING_LITERAL> { jjtThis.setToken (t); }
}


void trim_character() #TRIMCHARACTER :
{ Token t; }
{
	t = <STRING_LITERAL> { jjtThis.setToken (t); }
}


void EQ() #EQUALS : { }
{
	<EQ>
}


void NE() #NOTEQUALS : { }
{
	<NE>
}


void GT() #GREATERTHAN : { }
{
	<GT>
}


void GE() #GREATEROREQUAL : { }
{
	<GE>
}


void LT() #LESSTHAN : { }
{
	<LT>
}


void LE() #LESSOREQUAL : { }
{
	<LE>
}
