Title: BNF for ExpressionParser
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> )