BNF for AQL.jj

TOKENS

<DEFAULT,IN_DBL_BRACE> TOKEN : {
<ASC: "asc">
| <AT: "at">
| <BY: "by">
| <DATASET: "dataset">
| <DECOR: "decor">
| <DESC: "desc">
| <DISTINCT: "distinct">
| <ELSE: "else">
| <EVERY: "every">
| <FOR: "for">
| <FROM: "from">
| <GROUP: "group">
| <IF: "if">
| <IN: "in">
| <LET: "let">
| <LIMIT: "limit">
| <OFFSET: "offset">
| <ORDER: "order">
| <RETURN: "return">
| <SATISFIES: "satisfies">
| <SELECT: "select">
| <SOME: "some">
| <THEN: "then">
| <UNION: "union">
| <WHERE: "where">
| <WITH: "with">
| <KEEPING: "keeping">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<CARET: "^">
| <DIV: "/">
| <IDIV: "idiv">
| <MINUS: "-">
| <MOD: "%">
| <MUL: "*">
| <PLUS: "+">
| <LEFTPAREN: "(">
| <RIGHTPAREN: ")">
| <LEFTBRACKET: "[">
| <RIGHTBRACKET: "]">
| <COLON: ":">
| <COMMA: ",">
| <DOT: ".">
| <QUES: "?">
| <LT: "<">
| <GT: ">">
| <LE: "<=">
| <GE: ">=">
| <EQ: "=">
| <NE: "!=">
| <SIMILAR: "~=">
| <ASSIGN: ":=">
| <AND: "and">
| <OR: "or">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<LEFTBRACE: "{"> : DEFAULT
}

   
<DEFAULT> TOKEN : {
<RIGHTBRACE: "}"> : {
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<LEFTDBLBRACE: "{{"> : IN_DBL_BRACE
}

   
<IN_DBL_BRACE> TOKEN : {
<RIGHTDBLBRACE: "}}"> : {
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<INTEGER_LITERAL: (<DIGIT>)+>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<NULL: "null">
| <TRUE: "true">
| <FALSE: "false">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<#DIGIT: ["0"-"9"]>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<DOUBLE_LITERAL: <DIGITS> | <DIGITS> ("." <DIGITS>)? | "." <DIGITS>>
| <FLOAT_LITERAL: <DIGITS> ("f" | "F") | <DIGITS> ("." <DIGITS> ("f" | "F"))? | "." <DIGITS> ("f" | "F")>
| <DIGITS: (<DIGIT>)+>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<#LETTER: ["A"-"Z","a"-"z"]>
| <SPECIALCHARS: ["$","_","-"]>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<STRING_LITERAL: "\"" (<EscapeQuot> | <EscapeBslash> | <EscapeSlash> | <EscapeBspace> | <EscapeFormf> | <EscapeNl> | <EscapeCr> | <EscapeTab> | ~["\"","\\"])* "\"" | "\'" (<EscapeApos> | <EscapeBslash> | <EscapeSlash> | <EscapeBspace> | <EscapeFormf> | <EscapeNl> | <EscapeCr> | <EscapeTab> | ~["\'","\\"])* "\'">
| <#EscapeQuot: "\\\"">
| <#EscapeApos: "\\\'">
| <#EscapeBslash: "\\\\">
| <#EscapeSlash: "\\/">
| <#EscapeBspace: "\\b">
| <#EscapeFormf: "\\f">
| <#EscapeNl: "\\n">
| <#EscapeCr: "\\r">
| <#EscapeTab: "\\t">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<IDENTIFIER: <LETTER> (<LETTER> | <DIGIT> | <SPECIALCHARS>)*>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<VARIABLE: "$" <LETTER> (<LETTER> | <DIGIT> | "_")*>
}

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

   
<DEFAULT,IN_DBL_BRACE> SKIP : {
<"//" (~["\n"])* "\n">
}

   
<DEFAULT,IN_DBL_BRACE> SKIP : {
<"//" (~["\n","\r"])* ("\n" | "\r" | "\r\n")?>
}

   
<DEFAULT,IN_DBL_BRACE> SKIP : {
"/*" : INSIDE_COMMENT
}

   
<INSIDE_COMMENT> SPECIAL : {
<"+" (" ")* (~["*"])*>
}

   
<INSIDE_COMMENT> SKIP : {
"/*" : {
}

   
<INSIDE_COMMENT> SKIP : {
"*/" : {
| <~[]>
}

   

NON-TERMINALS

Statement ::= ( SingleStatement ( ";" )? )* <EOF>
SingleStatement ::= ( DataverseDeclaration | FunctionDeclaration | CreateStatement | LoadStatement | DropStatement | WriteStatement | SetStatement | InsertStatement | DeleteStatement | UpdateStatement | FeedStatement | CompactStatement | Query | RefreshExternalDatasetStatement | RunStatement )
DataverseDeclaration ::= "use" "dataverse" Identifier
CreateStatement ::= "create" ( TypeSpecification | NodegroupSpecification | DatasetSpecification | IndexSpecification | DataverseSpecification | FunctionSpecification | FeedSpecification )
TypeSpecification ::= "type" TypeName IfNotExists "as" TypeExpr
NodegroupSpecification ::= "nodegroup" Identifier IfNotExists "on" Identifier ( <COMMA> Identifier )*
DatasetSpecification ::= ( "external" <DATASET> QualifiedName <LEFTPAREN> Identifier <RIGHTPAREN> IfNotExists "using" AdapterName Configuration ( "on" Identifier )? ( "hints" Properties )? ( "using" "compaction" "policy" CompactionPolicy ( Configuration )? )? | ( "internal" | "temporary" )? <DATASET> QualifiedName <LEFTPAREN> Identifier <RIGHTPAREN> IfNotExists PrimaryKey ( "autogenerated" )? ( "on" Identifier )? ( "hints" Properties )? ( "using" "compaction" "policy" CompactionPolicy ( Configuration )? )? ( "with filter on" FilterField )? )
RefreshExternalDatasetStatement ::= "refresh external" <DATASET> QualifiedName
RunStatement ::= "run" Identifier <LEFTPAREN> ( Identifier ( <COMMA> )? )* <RIGHTPAREN> <FROM> <DATASET> QualifiedName "to" <DATASET> QualifiedName
IndexSpecification ::= "index" Identifier IfNotExists "on" QualifiedName <LEFTPAREN> ( Identifier ) ( <COMMA> Identifier )* <RIGHTPAREN> ( "type" IndexType )?
CompactionPolicy ::= Identifier
FilterField ::= Identifier
IndexType ::= ( "btree" | "rtree" | "keyword" | "ngram" <LEFTPAREN> <INTEGER_LITERAL> <RIGHTPAREN> )
DataverseSpecification ::= "dataverse" Identifier IfNotExists ( "with format" StringLiteral )?
FunctionSpecification ::= "function" FunctionName IfNotExists ParameterList <LEFTBRACE> Expression <RIGHTBRACE>
FeedSpecification ::= ( "feed" QualifiedName IfNotExists "using" AdapterName Configuration ( ApplyFunction )? )
ParameterList ::= <LEFTPAREN> ( <VARIABLE> ( <COMMA> <VARIABLE> )* )? <RIGHTPAREN>
IfNotExists ::= ( "if not exists" )?
ApplyFunction ::= "apply" "function" FunctionName
GetPolicy ::= "using" "policy" Identifier
FunctionSignature ::= FunctionName "@" <INTEGER_LITERAL>
PrimaryKey ::= "primary" "key" Identifier ( <COMMA> Identifier )*
DropStatement ::= "drop" ( <DATASET> QualifiedName IfExists | "index" DoubleQualifiedName IfExists | "nodegroup" Identifier IfExists | "type" TypeName IfExists | "dataverse" Identifier IfExists | "function" FunctionSignature IfExists | "feed" QualifiedName IfExists )
IfExists ::= ( <IF> "exists" )?
InsertStatement ::= "insert" "into" <DATASET> QualifiedName Query
DeleteStatement ::= "delete" Variable <FROM> <DATASET> QualifiedName ( <WHERE> Expression )?
UpdateStatement ::= "update" Variable <IN> Expression <WHERE> Expression <LEFTPAREN> ( UpdateClause ( <COMMA> UpdateClause )* ) <RIGHTPAREN>
UpdateClause ::= "set" Expression <ASSIGN> Expression
| InsertStatement
| DeleteStatement
| UpdateStatement
| <IF> <LEFTPAREN> Expression <RIGHTPAREN> <THEN> UpdateClause ( <ELSE> UpdateClause )?
SetStatement ::= "set" Identifier StringLiteral
WriteStatement ::= "write" "output" "to" Identifier <COLON> StringLiteral ( "using" StringLiteral )?
LoadStatement ::= "load" <DATASET> QualifiedName "using" AdapterName Configuration ( "pre-sorted" )?
AdapterName ::= Identifier
CompactStatement ::= "compact" <DATASET> QualifiedName
FeedStatement ::= ( "connect" "feed" QualifiedName "to" <DATASET> QualifiedName ( GetPolicy )? | "disconnect" "feed" QualifiedName <FROM> <DATASET> QualifiedName )
Configuration ::= <LEFTPAREN> ( KeyValuePair ( <COMMA> KeyValuePair )* )? <RIGHTPAREN>
KeyValuePair ::= <LEFTPAREN> StringLiteral <EQ> StringLiteral <RIGHTPAREN>
Properties ::= ( <LEFTPAREN> Property ( <COMMA> Property )* <RIGHTPAREN> )?
Property ::= Identifier <EQ> ( StringLiteral | <INTEGER_LITERAL> )
TypeExpr ::= ( RecordTypeDef | TypeReference | OrderedListTypeDef | UnorderedListTypeDef )
RecordTypeDef ::= ( "closed" | "open" )? <LEFTBRACE> ( RecordField ( <COMMA> RecordField )* )? <RIGHTBRACE>
RecordField ::= Identifier <COLON> TypeExpr ( <QUES> )?
TypeReference ::= Identifier
OrderedListTypeDef ::= <LEFTBRACKET> ( TypeExpr ) <RIGHTBRACKET>
UnorderedListTypeDef ::= <LEFTDBLBRACE> ( TypeExpr ) <RIGHTDBLBRACE>
FunctionName ::= Identifier ( <DOT> Identifier ( "#" Identifier )? | "#" Identifier )?
TypeName ::= QualifiedName
Identifier ::= <IDENTIFIER>
| StringLiteral
StringLiteral ::= <STRING_LITERAL>
QualifiedName ::= Identifier ( <DOT> Identifier )?
DoubleQualifiedName ::= Identifier <DOT> Identifier ( <DOT> Identifier )?
FunctionDeclaration ::= "declare" "function" Identifier ParameterList <LEFTBRACE> Expression <RIGHTBRACE>
Query ::= Expression
Expression ::= ( OperatorExpr | IfThenElse | FLWOGR | QuantifiedExpression )
OperatorExpr ::= AndExpr ( <OR> AndExpr )*
AndExpr ::= RelExpr ( <AND> RelExpr )*
RelExpr ::= AddExpr ( ( <LT> | <GT> | <LE> | <GE> | <EQ> | <NE> | <SIMILAR> ) AddExpr )?
AddExpr ::= MultExpr ( ( <PLUS> | <MINUS> ) MultExpr )*
MultExpr ::= UnionExpr ( ( <MUL> | <DIV> | <MOD> | <CARET> | <IDIV> ) UnionExpr )*
UnionExpr ::= UnaryExpr ( <UNION> ( UnaryExpr ) )*
UnaryExpr ::= ( ( <PLUS> | <MINUS> ) )? ValueExpr
ValueExpr ::= PrimaryExpr ( Field | Index )*
Field ::= <DOT> Identifier
Index ::= <LEFTBRACKET> ( Expression | <QUES> ) <RIGHTBRACKET>
PrimaryExpr ::= ( FunctionCallExpr | Literal | DatasetAccessExpression | VariableRef | ListConstructor | RecordConstructor | ParenthesizedExpression )
Literal ::= ( StringLiteral | <INTEGER_LITERAL> | <FLOAT_LITERAL> | <DOUBLE_LITERAL> | <NULL> | <TRUE> | <FALSE> )
VariableRef ::= <VARIABLE>
Variable ::= <VARIABLE>
ListConstructor ::= ( OrderedListConstructor | UnorderedListConstructor )
OrderedListConstructor ::= <LEFTBRACKET> ( Expression ( <COMMA> Expression )* )? <RIGHTBRACKET>
UnorderedListConstructor ::= <LEFTDBLBRACE> ( Expression ( <COMMA> Expression )* )? <RIGHTDBLBRACE>
RecordConstructor ::= <LEFTBRACE> ( FieldBinding ( <COMMA> FieldBinding )* )? <RIGHTBRACE>
FieldBinding ::= Expression <COLON> Expression
FunctionCallExpr ::= FunctionName <LEFTPAREN> ( Expression ( <COMMA> Expression )* )? <RIGHTPAREN>
DatasetAccessExpression ::= <DATASET> ( ( Identifier ( <DOT> Identifier )? ) | ( <LEFTPAREN> Expression <RIGHTPAREN> ) )
ParenthesizedExpression ::= <LEFTPAREN> Expression <RIGHTPAREN>
IfThenElse ::= <IF> <LEFTPAREN> Expression <RIGHTPAREN> <THEN> Expression <ELSE> Expression
FLWOGR ::= ( ForClause | LetClause ) ( Clause )* ( <RETURN> | <SELECT> ) Expression
Clause ::= ( ForClause | LetClause | WhereClause | OrderbyClause | GroupClause | LimitClause | DistinctClause )
ForClause ::= ( <FOR> | <FROM> ) Variable ( <AT> Variable )? <IN> ( Expression )
LetClause ::= ( <LET> | <WITH> ) Variable <ASSIGN> Expression
WhereClause ::= <WHERE> Expression
OrderbyClause ::= ( <ORDER> <BY> Expression ( ( <ASC> ) | ( <DESC> ) )? ( <COMMA> Expression ( ( <ASC> ) | ( <DESC> ) )? )* )
GroupClause ::= <GROUP> <BY> ( Variable <ASSIGN> )? Expression ( <COMMA> ( Variable <ASSIGN> )? Expression )* ( <DECOR> Variable <ASSIGN> Expression ( <COMMA> <DECOR> Variable <ASSIGN> Expression )* )? ( <WITH> | <KEEPING> ) VariableRef ( <COMMA> VariableRef )*
LimitClause ::= <LIMIT> Expression ( <OFFSET> Expression )?
DistinctClause ::= <DISTINCT> <BY> Expression ( <COMMA> Expression )*
QuantifiedExpression ::= ( ( <SOME> ) | ( <EVERY> ) ) Variable <IN> Expression ( <COMMA> Variable <IN> Expression )* <SATISFIES> Expression