BNF for JOPFJ.jj

NON-TERMINALS

Goal ::= TypeDeclaration <EOF>
TypeDeclaration ::= "class" Identifier "extends" ExtendedType "{" ( VarDeclaration )* ClassConstructor ( MethodDeclaration )* "}"
ExtendedType ::= Identifier
| ObjectIdentifier
VarDeclaration ::= Type Identifier ";"
ClassConstructor ::= Identifier "(" ( FormalParameterList )? ")" "{" "super" "(" ( ExpressionList )? ")" ";" ( FieldAssign )* "}"
FieldAssign ::= ThisIdentifier "." Identifier "=" Identifier ";"
MethodDeclaration ::= BinaryOpOverloadDeclaration
| DefaultMethodDeclaration
DefaultMethodDeclaration ::= Type Identifier "(" ( FormalParameterList )? ")" "{" "return" Expression ";" "}"
BinaryOpOverloadDeclaration ::= "static" Type "operator " BinaryOperator "(" Type Identifier "," Type Identifier ")" "{" "return" Expression ";" "}"
BinaryOperator ::= "+"
| "-"
| "*"
| "/"
FormalParameterList ::= FormalParameter ( FormalParameterRest )*
FormalParameter ::= Type Identifier
FormalParameterRest ::= "," FormalParameter
Type ::= IntegerType
| Identifier
| ObjectIdentifier
IntegerType ::= "int"
Expression ::= Term ( PlusExpressionRest | MinusExpressionRest )*
PlusExpressionRest ::= "+" Term
MinusExpressionRest ::= "-" Term
Term ::= PrimaryExpression ( TimesExpressionRest | DivideExpressionRest )*
TimesExpressionRest ::= "*" PrimaryExpression
DivideExpressionRest ::= "/" PrimaryExpression
PrimaryExpression ::= IntegerLiteral
| MethodInvoke
| FieldInvoke
| Identifier
| AllocationExpression
| CastExpression
| NestedExpression
MethodInvoke ::= ( AllocationExpression | NestedExpression | Identifier ) "." Identifier "(" ( ExpressionList )? ")"
FieldInvoke ::= ( AllocationExpression | NestedExpression | Identifier ) "." Identifier
AllocationExpression ::= "new" Identifier "(" ( ExpressionList )? ")"
CastExpression ::= "(" Type ")" PrimaryExpression
NestedExpression ::= "(" Expression ")"
ExpressionList ::= Expression ( ExpressionRest )*
ExpressionRest ::= "," Expression
IntegerLiteral ::= <INTEGER_LITERAL>
Identifier ::= <IDENTIFIER>
ThisIdentifier ::= "this"
ObjectIdentifier ::= "Object"