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