## BNF for ExpressionParser.jj

    NON-TERMINALS
    expression 	::= 	orCondition <EOF>
    orCondition 	::= 	andCondition ( "or" andCondition )*
    andCondition 	::= 	notCondition ( "and" notCondition )*
    notCondition 	::= 	( "not" | "!" ) simpleCondition
                     | 	simpleCondition
    simpleCondition 	::= 	scalarExpression ( simpleNotCondition | ( "=" | "==" ) scalarExpression | ( "!=" | "<>" ) scalarExpression | "<=" scalarExpression | "<" scalarExpression | ">" scalarExpression | ">=" scalarExpression | "like" scalarExpression | "likeIgnoreCase" scalarExpression | "in" ( namedParameter | "(" scalarCommaList ")" ) | "between" scalarExpression "and" scalarExpression )?
    simpleNotCondition 	::= 	( "not" | "!" ) ( "like" scalarExpression | "likeIgnoreCase" scalarExpression | "in" ( namedParameter | "(" scalarCommaList ")" ) | "between" scalarExpression "and" scalarExpression )
    scalarCommaList 	::= 	( scalarConstExpression ( "," scalarConstExpression )* )
    scalarExpression 	::= 	scalarNumericExpression
                     | 	<SINGLE_QUOTED_STRING>
                     | 	<DOUBLE_QUOTED_STRING>
                     | 	<NULL>
    scalarConstExpression 	::= 	<SINGLE_QUOTED_STRING>
                     | 	<DOUBLE_QUOTED_STRING>
                     | 	namedParameter
                     | 	<INT_LITERAL>
                     | 	<FLOAT_LITERAL>
    scalarNumericExpression 	::= 	multiplySubtractExp ( "+" multiplySubtractExp | "-" multiplySubtractExp )*
    multiplySubtractExp 	::= 	numericTerm ( "*" numericTerm | "/" numericTerm )*
    numericTerm 	::= 	( "+" )? numericPrimary
                     | 	"-" numericPrimary
    numericPrimary 	::= 	"(" orCondition ")"
                     | 	pathExpression
                     | 	namedParameter
                     | 	<INT_LITERAL>
                     | 	<FLOAT_LITERAL>
    namedParameter 	::= 	"$" <PROPERTY_PATH>
    pathExpression 	::= 	( <PROPERTY_PATH> | "obj:" <PROPERTY_PATH> | "db:" <PROPERTY_PATH> )