BNF for RqlParser.jj

TOKENS

<DEFAULT> SKIP : {
" "
| "\t"
| "\r"
| "\n"
}

   
<DEFAULT> TOKEN : {
<SELECT: "select">
| <WHERE: "where">
| <ORDER: "order">
| <PARAMETERS: "parameters">
| <DESC: "desc:">
| <DEFAULTVALUE: "default:">
| <NAME: "name:">
| <BY: "by">
| <AND: "and">
| <IN: "in">
| <OUT: "out">
| <ALL: "all">
| <IS: "is">
| <MATCHES: "matches">
| <BINOP: "=" | "!=" | ">" | ">=" | "<" | "<=">
| <LINKS: "links">
| <DIRECTIONAL: "directional">
| <DEPTH: "depth">
| <CONSTRAIN: "constrain">
| <IF: "if">
| <THEN: "then">
| <ENDIF: "endif">
| <ROLES: "roles">
| <MEMBER: "member">
| <EXISTS: "exists">
| <BETWEEN: "between">
| <NOT: "not">
| <FORMAT: "format">
| <BO: "(">
| <BC: ")">
| <SEP: ",">
| <ORDERING: "asc" | "desc">
| <URI: "<htt" (~[">"])* ">">
| <INTEGER: (("-")? ["0"-"9"])+>
| <FLOAT: (("-")? ["0"-"9"])+ "." (["0"-"9"])+>
| <BOOLEAN: "true" | "false">
| <STRING: "\"" (<CHAR>)* "\"">
| <#CHAR: ~["\""] | <ESCAPEDCHAR>>
| <#ESCAPEDCHAR: "\\" ["t","n","r","b","f","\\","\'","\""] | <UNICODEPOINT>>
| <#UNICODEPOINT: "\\u" <HEX> <HEX> <HEX> <HEX> | "\\U" <HEX> <HEX> <HEX> <HEX> <HEX> <HEX> <HEX> <HEX>>
| <#HEX: ["0"-"9"] | ["A"-"F"] | ["a"-"f"]>
| <DATETIME: <YEAR> "-" <MONTH> "-" <DAY> "T" <HOUR> ":" <MINUTE> ":" <SECOND> (<FRACSECOND>)? (<TZ>)?>
| <DATE: <YEAR> "-" <MONTH> "-" <DAY> (<TZ>)?>
| <TIME: <HOUR> ":" <MINUTE> ":" <SECOND> (<FRACSECOND>)? (<TZ>)?>
| <#YEAR: ("-")? (["0"-"9"]){4}>
| <#MONTH: (["0"-"9"]){2}>
| <#DAY: (["0"-"9"]){2}>
| <#HOUR: (["0"-"9"]){2}>
| <#MINUTE: (["0"-"9"]){2}>
| <#SECOND: (["0"-"9"]){2}>
| <#FRACSECOND: "." (["0"-"9"])+>
| <#TZ: ("+" | "-") <HOUR> ":" <MINUTE> | "Z">
| <DURATION: ("-")? "P" <DUR_DATE> (<DUR_TIME>)?>
| <#DUR_DATE: (<DUR_YEAR>)? (<DUR_MONTH>)? (<DUR_DAY>)?>
| <#DUR_YEAR: (["0"-"9"])+ "Y">
| <#DUR_MONTH: (["0"-"9"])+ "M">
| <#DUR_DAY: (["0"-"9"])+ "D">
| <#DUR_TIME: "T" (<DUR_HOUR>)? (<DUR_MIN>)? (<DUR_SEC>)?>
| <#DUR_HOUR: (["0"-"9"])+ "H">
| <#DUR_MIN: (["0"-"9"])+ "M">
| <#DUR_SEC: (["0"-"9"])+ "." ((["0"-"9"])*)? "S">
| <PARAMVAR: "${" (~["}"])* "}">
| <NEW_LINE: (["\r","\n"])+>
| <COLON: ":">
| <DOT: ".">
| <SBO: "[">
| <SBC: "]">
| <PERCENT: "%">
| <ID: (["A"-"Z","a"-"z","_"])+ (["0"-"9","A"-"Z","a"-"z","_"])*>
| <WILDCARD: "*">
}

   

NON-TERMINALS

readQuery ::= ( query )? <EOF>
query ::= ( <SELECT> select )? <WHERE> where ( sort )? ( <PARAMETERS> parameters )?
where ::= ( op )? ( <AND> op )*
op ::= ( <NOT> ( op ) | object <FORMAT> ( valueList ) | object <IS> objectTypeList | objectOrObjectField <IN> ( <ALL> )? valueList | objectField <MATCHES> <BO> string ( <SEP> string )? <BC> | objectField <BINOP> value | object <LINKS> object ( linkOptions )? | <MEMBER> <BO> object <SEP> uri <BC> | <EXISTS> objectOrObjectField | <BETWEEN> <BO> objectField <SEP> value <SEP> value <BC> )
linkOptions ::= linkOption ( <SEP> linkOption )*
linkOption ::= <DIRECTIONAL>
| <DEPTH> integer
| <CONSTRAIN> linkConstraint
linkConstraint ::= rolesConstraint
| <IF> object <IS> objectTypeList ( <AND> object <IS> objectTypeList )? <THEN> rolesConstraint <ENDIF>
rolesConstraint ::= <ROLES> <BO> roleList <BC>
select ::= objectOrObjectField ( <SEP> objectOrObjectField )*
objectOrObjectField ::= ( objectField | object )
object ::= ( <ID> )
objectField ::= ( <ID> ( <PERCENT> objectType )? <DOT> ( ( fieldType ) | ( <WILDCARD> ) ) )
valueList ::= value ( <SEP> value )*
objectTypeList ::= objectType ( <SEP> objectType )*
objectType ::= ( uri | paramvar )
fieldType ::= ( uri | paramvar )
sort ::= <ORDER> <BY> sortedObjectFieldList
sortedObjectFieldList ::= sortedObjectField ( <SEP> sortedObjectField )*
sortedObjectField ::= objectOrObjectField <ORDERING>
parameters ::= ( parameter )+
parameter ::= <NAME> value <DESC> value <DEFAULTVALUE> valueList
value ::= ( integer | real | bool | uri | string | paramvar | datetime | date | time | duration )
integer ::= <INTEGER>
real ::= <FLOAT>
bool ::= <BOOLEAN>
string ::= <STRING>
paramvar ::= <PARAMVAR>
duration ::= <DURATION>
time ::= <TIME>
date ::= <DATE>
datetime ::= <DATETIME>
uriList ::= uri ( <SEP> uri )*
uri ::= <URI>
roleList ::= role ( <SEP> role )*
role ::= <URI> <DOT> dir
dir ::= <IN>
| <OUT>