condition : orExpression ( '?' orExpression ':' orExpression )? ; orExpression : andExpression ( '||' andExpression )* ; andExpression : binaryExpression ( '&&' binaryExpression )* ; binaryExpression : notExpression ( op notExpression )?; op : '=' | '!=' | '>' | '>=' | '<' | '<=' | '~=' ; notExpression : '!' notExpression | collectionExpression ; collectionExpression : memberExpression ( '.' collectionFunction )* ; memberExpression : constructor ( ( '.' ID ) | ( '[' memberExpression ']' ) )* ; constructor : ( filter | version | range | class ) '(' unaryExpression ')' | set '(' ( collectionExpression ( ',' collectionExpression )* )? ')' | unaryExpression ; collectionFunction : ( select | reject | exists | all | traverse ) '(' lambdaDefinition ')' | limit '(' memberExpression ')' | unique '(' memberExpression? ')' | latest '(' lambdaDefinition? ')' ; lambdaDefinition : initializer ( ',' initializer )* ( ',' '{' lambda '}' )? | '{' lambda '}' | lambda ; initializer : '_' | condition ; lambda : ( ID ( ',' ID )* )? '|' condition ; unaryExpression : '(' condition ')' | '[' condition ( ',' condition )* ']' // #array construct | '/' regexpPattern '/' | STRING | INT | parameter | 'null' | 'true' | 'false' | ID ; parameter : '$' INT | ID ;