BNF for the Object Query Language

SelectStatement
::=
"SELECT" SelectList FromClause ( WhereClause )? ( UnionClause )?
SelectList
::=
(( "DISTINCT" | "AS RETAINED SET" )? ( "*" | "OBJECTS" SelectItem | SelectItem ( "," SelectItem )* ))
SelectItem
::=
( PathExpression | EnvVarPathExpression ) ( "AS" ( <STRING_LITERAL> | <IDENTIFIER> ) )?</IDENTIFIER></STRING_LITERAL>
PathExpression
::=
( ObjectFacet | BuildInFunction ) ( "." ObjectFacet )*
EnvVarPathExpression
::=
( "$" <IDENTIFIER> ) ( "." ObjectFacet )*
ObjectFacet
::=
( ( "@" )? <IDENTIFIER> ( ParameterList )? )
ParameterList
::=
"(" ( ( PrimaryExpression ( "," PrimaryExpression )* ) )? ")"
FromClause
::=
"FROM" ( "OBJECTS" )? ( "INSTANCEOF" )? ( FromItem | "(" SelectStatement ")" ) ( <IDENTIFIER> )?
FromItem
::=
( ClassName | <STRING_LITERAL> | ObjectAddress ( "," ObjectAddress )* | ObjectId ( "," ObjectId )* | EnvVarPathExpression )
ClassName
::=
( <IDENTIFIER> ( "." <IDENTIFIER> )* ( "[]" )* )
ObjectAddress
::=
<HEX_LITERAL>
ObjectId
::=
<INTEGER_LITERAL>
WhereClause
::=
"WHERE" ConditionalOrExpression
ConditionalOrExpression
::=
ConditionalAndExpression ( "or" ConditionalAndExpression )*
ConditionalAndExpression
::=
EqualityExpression ( "and" EqualityExpression )*
EqualityExpression
::=
RelationalExpression ( ( "=" RelationalExpression | "!=" RelationalExpression ) )*
RelationalExpression
::=
( PrimaryExpression ( ( "<" PrimaryExpression | ">" PrimaryExpression | "<=" PrimaryExpression | ">=" PrimaryExpression | ( LikeClause | InClause ) | "implements" ClassName ) )? )
LikeClause
::=
( "NOT" )? "LIKE" <STRING_LITERAL>
InClause
::=
( "NOT" )? "IN" PrimaryExpression
PrimaryExpression
::=
Literal
 
|
"(" ( ConditionalOrExpression | SubQuery ) ")
 
|
PathExpression
 
|
EnvVarPathExpression
SubQuery
::=
SelectStatement
Function
::=
( ( "toHex" | "toString" | "dominators" | "outbounds" | "inbounds" | "classof" | "dominatorof" ) "(" ConditionalOrExpression ")" )
Literal
::=
( <INTEGER_LITERAL> | <LONG_LITERAL> | <FLOATING_POINT_LITERAL> | <CHARACTER_LITERAL> | <STRING_LITERAL> | BooleanLiteral | NullLiteral )
BooleanLiteral
::=
"true"
 
|
"false"
NullLiteral
::=
<NULL>
UnionClause
::=
( "UNION" "(" SelectStatement ")" )+