BNF for Pnuts.jj

NON-TERMINALS

Eol ::= ( <EOL> )*
StartSet ::= Eol ( ExpressionList ( ( <EOL> ( ExpressionList )? )+ | <EOF> ) | <EOF> )
Start ::= ( ExpressionList ( <EOL> | <EOF> ) | <EOL> | <EOF> )
ExpressionList ::= Expression ( ";" ( Expression )? )*
Expression ::= ConditionalExpression ( Assignment )?
| StatementExpression
PrimaryExpression ::= PrimaryPrefix ( PrimarySuffix )*
IdNode ::= "::" <IDENTIFIER>
| <IDENTIFIER>
PrimaryPrefix ::= Literal
| IdNode
| List
| Class
| "(" Expression ")"
List ::= "[" Eol ( ListElements )? "]"
ListElements ::= Expression ( "," Eol Expression )* Eol
Class ::= "class" <IDENTIFIER> ( "." Package )*
Package ::= <IDENTIFIER>
MethodNode ::= "." <IDENTIFIER> "(" Eol ( ListElements )? ")"
StaticMethodNode ::= "::" <IDENTIFIER> "(" Eol ( ListElements )? ")"
MemberNode ::= "." <IDENTIFIER>
StaticMemberNode ::= "::" <IDENTIFIER>
ApplicationNode ::= "(" Eol ( ListElements )? ")"
PrimarySuffix ::= "[" Eol ( "]" | Expression Eol ( ".." Eol ( "]" | Expression Eol "]" ) | "]" ) )
| MethodNode
| StaticMethodNode
| MemberNode
| StaticMemberNode
| ApplicationNode
Literal ::= <INTEGER_LITERAL>
| <FLOATING_POINT_LITERAL>
| <CHARACTER_LITERAL>
| <STRING_LITERAL>
| BooleanLiteral
| NullLiteral
BooleanLiteral ::= "true"
| "false"
NullLiteral ::= "null"
Assignment ::= ( "=" Eol Expression | "*=" Eol Expression | "%=" Eol Expression | "/=" Eol Expression | "+=" Eol Expression | "-=" Eol Expression | "<<=" Eol Expression | ">>=" Eol Expression | ">>>=" Eol Expression | "&=" Eol Expression | "^=" Eol Expression | "|=" Eol Expression )
ConditionalExpression ::= ConditionalAndExpression ( "||" Eol ConditionalAndExpression )*
ConditionalAndExpression ::= InclusiveOrExpression ( "&&" Eol InclusiveOrExpression )*
InclusiveOrExpression ::= ExclusiveOrExpression ( "|" Eol ExclusiveOrExpression )*
ExclusiveOrExpression ::= AndExpression ( "^" Eol AndExpression )*
AndExpression ::= EqualityExpression ( "&" Eol EqualityExpression )*
EqualityExpression ::= InstanceofExpression ( "==" Eol InstanceofExpression | "!=" Eol InstanceofExpression )*
InstanceofExpression ::= RelationalExpression ( "instanceof" RelationalExpression )?
RelationalExpression ::= ShiftExpression ( "<" Eol ShiftExpression | ">" Eol ShiftExpression | "<=" Eol ShiftExpression | ">=" Eol ShiftExpression )*
ShiftExpression ::= AdditiveExpression ( "<<" Eol AdditiveExpression | ">>" Eol AdditiveExpression | ">>>" Eol AdditiveExpression )*
AdditiveExpression ::= MultiplicativeExpression ( "+" Eol MultiplicativeExpression | "-" Eol MultiplicativeExpression )*
MultiplicativeExpression ::= UnaryExpression ( "*" Eol UnaryExpression | "/" Eol UnaryExpression | "%" Eol UnaryExpression )*
UnaryExpression ::= "+" UnaryExpression
| "-" UnaryExpression
| "++" PrimaryExpression
| "--" PrimaryExpression
| UnaryExpressionNotPlusMinus
UnaryExpressionNotPlusMinus ::= "~" UnaryExpression
| "!" UnaryExpression
| CastExpression
| PostOpe
CastLookAhead ::= "(" <IDENTIFIER> ( "[" "]" )* ")" ( <IDENTIFIER> | "::" | Literal | "++" | "--" | "~" | "!" | "[" | "(" | "class" )
CastExpression ::= "(" PrimaryExpression ")" UnaryExpressionNotPlusMinus
PostOpe ::= PrimaryExpression ( "++" | "--" )?
StatementExpression ::= IfStatement
| WhileStatement
| ForeachStatement
| ForStatement
| SwitchStatement
| Break
| Continue
| Return
| FunctionStatement
Break ::= <BREAK> ( Expression )?
Continue ::= <CONTINUE>
Return ::= <RETURN> ( Expression )?
Block ::= ( "{" Eol ( Expression ( ( ";" | <EOL> ) ( Expression )? )* )? "}" | Expression )
IfStatement ::= <IF> "(" Expression ")" Eol Block ( ( ElseIfNode ) )* ( ElseNode )?
ElseIfNode ::= <ELSE> <IF> "(" Expression ")" Eol Block
ElseNode ::= <ELSE> Eol Block
WhileStatement ::= <WHILE> "(" Expression ")" Eol Block
ForStatement ::= <FOR> "(" ( ForInit )? ";" Eol ( Expression )? ";" Eol ( ForUpdate )? ")" Eol Block
ForInit ::= Local ( "," Eol Local )*
ForUpdate ::= Expression ( "," Eol Expression )*
Local ::= <IDENTIFIER> "=" Eol Expression
ForeachStatement ::= <FOREACH> <IDENTIFIER> ( List | "(" Expression ")" ) Eol Block
SwitchStatement ::= <SWITCH> "(" Expression ")" Eol "{" Eol ( SwitchLabel SwitchBlock )* "}"
SwitchBlock ::= Eol ( Expression ( ";" | <EOL> ) Eol )*
SwitchLabel ::= ( "case" Expression ":" | "default" ":" )
FunctionStatement ::= <FUNCTION> ( <IDENTIFIER> )? "(" ( ParamList )? ")" Eol Block
ParamList ::= Param ( "[" "]" | ( "," Param )* )
Param ::= Eol <IDENTIFIER> Eol