BNF for FELParser

NON-TERMINALS


Input ::= Expression <EOF>

Expression ::= OrExpression

OrExpression ::= AndExpression ( ( <OR> | <OR2> ) AndExpression )*

AndExpression ::= EqualityExpression ( ( <AND> | <AND2> ) EqualityExpression )*

EqualityExpression ::= RelationalExpression ( ( <EQUALS> | <DOUBLE_EQUALS> | <NOT_EQUALS> ) RelationalExpression )?

RelationalExpression ::= RangeExpression ( ( <GT> | <GTE> | <LT> | <LTE> | <ALT_GT> | <ALT_GTE> | <ALT_LTE> | <ALT_LT> ) RangeExpression )?

RangeExpression ::= AdditiveExpression ( <DOT_DOT> ( AdditiveExpression )? )?

AdditiveExpression ::= MultiplicativeExpression ( ( <PLUS> | <MINUS> ) MultiplicativeExpression )*

MultiplicativeExpression ::= UnaryExpression ( ( <TIMES> | <DIVIDE> | <PERCENT> ) UnaryExpression )*


UnaryExpression ::= UnaryPlusMinusExpression | NotExpression | DefaultToExpression

UnaryPlusMinusExpression ::= ( <PLUS> | <MINUS> ) DefaultToExpression

NotExpression ::= <EXCLAM> DefaultToExpression

BuiltinVariable ::= <DOT> <IDENTIFIER>

DefaultToExpression ::= PrimaryExpression ( <EXCLAM> PrimaryExpression )* ( <EXCLAM> )?

PrimaryExpression ::= BaseExpression ( ( DotKey | DynamicKey | MethodInvoke | BuiltIn | Exists ))*

BaseExpression ::= <IDENTIFIER> | NumberLiteral | HashLiteral | StringLiteral | BooleanLiteral | NullLiteral | ListLiteral | Parenthesis | BuiltinVariable


DotKey ::= <DOT> ( <IDENTIFIER> | <TIMES> )

DynamicKey ::= <OPEN_BRACKET> Expression <CLOSE_BRACKET>

MethodInvoke ::= <OPEN_PAREN> ( ArgsList )? <CLOSE_PAREN>

BuiltIn ::= <BUILT_IN> <IDENTIFIER>

Exists ::= <EXISTS_OPERATOR>

ListLiteral ::= <OPEN_BRACKET> ( Expression ( ( <COMMA> )? Expression )* )? <CLOSE_BRACKET>

StringLiteral ::= <STRING_LITERAL> | <RAW_STRING>


HashLiteral ::= <OPEN_BRACE> ( Expression <COLON> Expression ( <COMMA> Expression <COLON> Expression )* )? <CLOSE_BRACE>

NumberLiteral ::= <INTEGER> | <DECIMAL>

BooleanLiteral ::= <TRUE> | <FALSE>

NullLiteral ::= <NULL>

Parenthesis ::= <OPEN_PAREN> Expression <CLOSE_PAREN>

ArgsList ::= ( NamedArgsList | PositionalArgsList )

NamedArgsList ::= <IDENTIFIER> <EQUALS> Expression ( ( <COMMA> )? <IDENTIFIER> <EQUALS> Expression )*

PositionalArgsList ::= Expression ( ( <COMMA> )? Expression )*

TOKENS

<FTL_EXPRESSION> SKIP : { 
<EXP_WHITE_SPACE: (" " | "\t" | "\n" | "\r")+>
}

<FTL_EXPRESSION> MORE : { 
"<#--"
|"<!--"
|"[#--"
}

<EXPRESSION_COMMENT> MORE : { 
<~[]>
}

<EXPRESSION_COMMENT> SPECIAL_TOKEN : { 
"-->"
|"--]"
}

<FTL_EXPRESSION> TOKEN : { 
<OPEN_PAREN: "(">
|<CLOSE_PAREN: ")">
|<OPEN_BRACKET: "[">
|<CLOSE_BRACKET: "]">
|<OPEN_BRACE: "{">
|<CLOSE_BRACE: "}">
|<EQUALS: "=">
|<DOT: ".">
|<PLUS: "+">
|<MINUS: "-">
|<TIMES: "*">
|<DIVIDE: "/">
|<PERCENT: "%">
|<OR: "|">
|<AND: "&">
|<LT: "<">
|<GT: ">">
|<COMMA: ",">
|<COLON: ":">
|<SEMICOLON: ";">
|<EXCLAM: "!">
|<BUILT_IN: "?">
|<DOUBLE_EQUALS: "==">
|<NOT_EQUALS: "!=">
|<EXISTS_OPERATOR: "??">
|<LTE: "<=">
|<GTE: ">=">
|<OR2: "||">
|<AND2: "&&">
|<DOT_DOT: "..">
|<ALT_GT: "gt">
|<ALT_LT: "lt">
|<AS: "as">
|<IN: "in">
|<ALT_GTE: "gte">
|<ALT_LTE: "lte">
|<ELLIPSIS: "...">
|<NULL: "null">
|<TRUE: "true">
|<FALSE: "false">
|<USING: "using">
|<INTEGER: (["0"-"9"])+>
|<DECIMAL: <INTEGER> "." <INTEGER>>
|<IDENTIFIER: <LETTER> (<LETTER> | <DIGIT>)*>
|<STRING_LITERAL: "\"" (~["\\","\""] | "\\" ~[])* "\"" | "\'" (~["\\","\'"] | "\\" ~[])* "\'">
|<RAW_STRING: "r" ("\"" (~["\""])* "\"" | "\'" (~["\'"])* "\'")>
}