blob: 5beecb94d42d4128812e636e071d660b74f60c7d [file] [log] [blame]
compilationUnit ::= packageStatement? ( statement ";"? )*
packageStatement ::= "package" qualifiedIdentifier ";"?
statement ::= importStatement
| globalStatement
| declare
| rule
| ruleAttribute
| function
| query
importStatement ::= "import" ("function"|"static")? qualifiedIdentifier ("." "*")?
globalStatement ::= "global" type ID
declare ::= "declare" (entryPointDeclaration | windowDeclaration | enumDeclaration | typeDeclaration) "end"
entryPointDeclaration ::= "entry-point" stringId annotation* "end"
windowDeclaration ::= "window" ID annotation* lhsPatternBind "end"
enumDeclaration ::= "enum" qualifiedIdentifier annotation* enumerative+ field* "end"
typeDeclaration ::= "type" qualifiedIdentifier ("extends" qualifiedIdentifier)? annotation* field* "end"
enumerative ::= ID ( "(" expression ("," expression)* ")" )?
field ::= label fieldType (EQUALS_ASSIGN conditionalExpr)? annotation* ";"?
function ::= "function" type? ID parameters block
parameters ::= "(" ( parameter ( "," parameter )* )? ")"
parameter ::= type? ID ("[" "]")*
query ::= "query" stringId parameters? annotation* lhsExpression "end"
rule ::= "rule" stringId ("extends" stringId)? annotation* attributes? lhs? rhs
stringId ::= ( ID | stringLiteral )
attributes ::= ("attributes" ":"?)? attribute ( ","? attribute )*
attribute ::=
salience
| enabled
|
(
"no-loop"
| "auto-focus"
| "lock-on-active"
| "refract"
)
booleanLiteral?
|
(
"agenda-group"
| "activation-group"
| "ruleflow-group"
| "date-effective"
| "date-expires"
| "dialect"
)
stringLiteral
| "calendars" stringLiteral ( "," stringLiteral )*
| "timer" ( decimal | chunk )
| "duration" ( decimal | chunk )
salience ::= "salience" conditionalExpr
enabled ::= "enabled" conditionalExpr
booleanAttribute ::= attributeKey (booleanLiteral)?
stringAttribute ::= attributeKey stringLiteral
stringListAttribute ::= attributeKey stringLiteral ( "," stringLiteral )*
lhs ::= "when" ":"? lhsExpression
lhsExpression ::= lhsOr*
lhsOr ::= "(" "or" lhsAnd+ ")" | lhsAnd ("or" lhsAnd)*
lhsAnd ::= "(" "and" lhsUnary+ ")" | lhsUnary ("and" lhsUnary)*
lhsUnary ::=
( lhsExists
| lhsNot
| lhsEval
| lhsForall
| lhsAccumulate
| "(" lhsOr ")"
| lhsPatternBind
)
";"?
lhsExists ::= "exists" ( "(" lhsOr ")" | lhsPatternBind )
lhsNot ::= "not" ( "(" lhsOr ")" | lhsPatternBind )
lhsForall ::= "forall" "(" lhsPatternBind+ ")"
lhsEval ::= "eval" "(" conditionalExpr ")"
lhsParen ::= "(" lhsOr ")"
lhsPatternBind ::= label? ( "(" lhsPattern ("or" lhsPattern)* ")" | lhsPattern )
lhsAccumulate ::= "accumulate" "(" lhsAnd (","|";") accumulateFunctionBinding ("," accumulateFunctionBinding)* (";" constraints)? ")" ";"?
lhsPattern ::= "?"? qualifiedIdentifier "(" positionalConstraints? constraints? ")" ("over" patternFilter)? ("from" patternSource)?
label ::= ID ":"
positionalConstraints ::= constraint ("," constraint)* ";"
constraints ::= constraint ("," constraint)*
constraint ::= conditionalOrExpr
patternFilter ::= "over" filterDef
filterDef ::= label ID "(" parameters ")"
patternSource ::= "from" ( fromAccumulate | fromCollect | fromEntryPoint | fromWindow | fromExpression )
fromExpression ::= conditionalOrExpr
fromEntryPoint ::= "entry-point" stringId
fromWindow ::= "window" ID
fromCollect ::= "collect" "(" lhsPatternBind ")"
fromAccumulate ::= "accumulate" "(" lhsAnd "," ( "init" chunk "," "action" chunk "," ( "reverse" chunk ",")? "result" chunk | accumulateFunction ) ")"
accumulateFunctionBinding ::= label accumulateFunction
accumulateFunction ::= label? ID parameters
parameters ::= "(" (conditionalExpr ("," conditionalExpr)* )? ")"
rhs ::= "then" rhsStatement* "end"
rhsStatement ::= javaStatement | mvelStatement | modifyStatement | updateStatement | retractStatement | deleteStatement
modifyStatement ::= "modify" parExpression "{" ( expression ( "," expression )* )? "}"
updateStatement ::= "update" "(" expression ")"
retractStatement ::= "retract" "(" expression ")"
deleteStatement ::= "delete" "(" expression ")"
annotation ::= "@" ID (elementValuePairs | chunk )?
elementValuePairs ::= "(" elementValuePair ("," elementValuePair)* ")"
elementValuePair ::= ID "=" elementValue
elementValue ::= elementValueArrayInitializer | conditionalExpr
elementValueArrayInitializer ::= "{" (elementValue ("," elementValue )*)? "}"
type ::= ID typeArguments? ( "." ID typeArguments? )* ("[" "]")*
typeArguments ::= "<" typeArgument ("," typeArgument)* ">"
typeArgument ::= "?" (( "extends" | "super" ) type )? | type
qualifiedIdentifier ::= ID ( "." ID )*
chunk ::= "(" .* ")"
block ::= "{" .* "}"
ID ::= identifierStart identifierPart*
stringId ::= '"' ID '"'
identifierStart ::= letter | "_" | "$"
identifierPart ::= identifierStart | digit
assignmentOperator ::= "=" | "+=" | "-=" | "*=" | "/=" | "&=" | "|=" | "^=" | "%=" | "<<=" | ">>>=" | ">>="
operator ::= "==" | "!=" | relationalOperator
relationalOperator ::= "<=" | ">=" | "<" | ">" | ( "not"? ID squareArguments )
expression ::= conditionalExpr ( assignmentOperator expression )?
conditionalExpr ::= conditionalOrExpr ternaryExpression?
ternaryExpression ::= "?" expression ":" expression
conditionalOrExpr ::= conditionalAndExpression ( "||" conditionalAndExpression )*
conditionalAndExpression ::= inclusiveOrExpression ( "&&" inclusiveOrExpression )*
inclusiveOrExpression ::= exclusiveOrExpression ( "|" exclusiveOrExpression )*
exclusiveOrExpression ::= andExpression ( "^" andExpression )*
andExpression ::= equalityExpression ( "&" equalityExpression )*
equalityExpression ::= instanceOfExpression ( ( "==" | "!=" ) instanceOfExpression )*
instanceOfExpression ::= inExpression ( "instanceof" type )?
inExpression ::= relationalExpression ( "not"? "in" "(" expression ( "," expression )* ")" )?
relationalExpression ::= shiftExpression orRestriction*
orRestriction ::= andRestriction ( "||" andRestriction )*
andRestriction ::= singleRestriction ( "&&" singleRestriction )*
singleRestriction ::= ( operator shiftExpression ) | "(" orRestriction ")"
shiftExpression ::= additiveExpression ( shiftOp additiveExpression )*
shiftOp ::= "<<" | ">>>" | ">>"
additiveExpression ::= multiplicativeExpression ( ("+" | "-") multiplicativeExpression )*
multiplicativeExpression ::= unaryExpression ( ("/" | "%" | "*") unaryExpression )*
unaryExpression ::= ( "+" unaryExpression ) | ( "-" unaryExpression ) | ( "++" primary ) | ( "--" primary ) | unaryExpressionNotPlusMinus
unaryExpressionNotPlusMinus ::= ( "~" unaryExpression ) | ( "!" unaryExpression ) | castExpression |
ID ( ":" | ":=" ) primary selector* ( "++" | "--" )?
castExpression ::= ( "(" primitiveType ")" unaryExpression ) | ( "(" type ")" unaryExpressionNotPlusMinus )
primitiveType ::= "boolean" | "char" | "byte" | "short" | "int" | "long" | "float" | "double"
primary ::= parExpression |
nonWildcardTypeArguments ( explicitGenericInvocationSuffix | ( "this" arguments ) ) |
literal |
"super" superSuffix |
"new" creator |
primitiveType ( "[" "]" )* "." "class" |
inlineMapExpression |
inlineListExpression |
ID ( "." ID )* identifierSuffix
inlineListExpression ::= "[" expressionList? "]"
inlineMapExpression ::= "[" mapExpressionList "]"
mapExpressionList ::= mapEntry ( "," mapEntry )*
mapEntry ::= expression ":" expression
parExpression ::= "(" expression ")"
identifierSuffix ::= ( "[" "]" )* "." "class" | "[" expression "]" | arguments
creator ::= nonWildcardTypeArguments? createdName ( arrayCreatorRest | classCreatorRest )
createdName ::= ( ID typeArguments? ( "." ID typeArguments? )* ) | primitiveType
innerCreator ::= ID classCreatorRest
arrayCreatorRest ::= "[" ( "]" ( "[" "]" )* arrayInitializer ) | ( expression "]" ( "[" expression "]" )* ( "[" "]" )* )
variableInitializer ::= arrayInitializer | expression
arrayInitializer ::= "{" ( variableInitializer ( "," variableInitializer )* ","? )? "}"
classCreatorRest ::= arguments
explicitGenericInvocation ::= nonWildcardTypeArguments arguments
nonWildcardTypeArguments ::= "<" typeList ">"
explicitGenericInvocationSuffix ::= ( "super" superSuffix ) | ID arguments
selector ::= ( "." "super" superSuffix ) |
( "." "new" nonWildcardTypeArguments? innerCreator ) |
( "." ID arguments? ) |
( "[" expression "]" )
superSuffix ::= arguments | ( "." ID arguments? )
squareArguments ::= "[" expressionList? "]"
arguments ::= "(" expressionList? ")"
expressionList ::= expression ( "," expression )*
decimal ::= digit+ integerTypeSuffix?
literal ::= intLiteral | realLiteral | booleanLiteral | stringLiteral | "null"
booleanLiteral ::= "true" | "false"
stringLiteral ::= '"' .* '"'
intLiteral ::= ( "+" | "-" )? ( Digit+ | "0x" ( hexDigit+ ) )
realLiteral ::= ( "+" | "-" )? ( ( ( fraction exponent? | digit+ exponent ) realTypeSuffix? ) | Digit+ realTypeSuffix )
fraction ::= digit* "." digit+
exponent ::= ( "e" | "E" ) ( "+" | "-" ) digit+
realTypeSuffix ::= "f" | "F" | "d" | "D"
integerTypeSuffix ::= "l" | "L" | "I"
digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
hexDigit ::= digit | "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f"
letter ::= "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U"
| "V" | "W" | "X" | "Y" | "Z"
| "a" | "b" | "c" | "d" | "e" | "f" | "g"
| "h" | "i" | "j" | "k" | "l" | "m" | "n"
| "o" | "p" | "q" | "r" | "s" | "t" | "u"
| "v" | "w" | "x" | "y" | "z"