minijava spec

Goal ::= MainClass ( TypeDeclaration )* <EOF>
MainClass ::= class Identifier { public static void main ( String [] Identifier ) { System.out.println ( Expression ); } }
TypeDeclaration ::= class Identifier { ( Type Identifier ;)* ( MethodDeclaration )* }
| class Identifier extends Identifier { ( Type Identifier;)* ( MethodDeclaration )* }
MethodDeclaration ::= public Type Identifier ( ( Type Identifier (, Type Identifier)*)? ) { ( Type Identifier ;)* ( Statement )* return Expression ; }
Type ::= int [ ]
| boolean
| int
| Identifier
Statement ::= { ( Statement )* }
| Identifier = Expression ;
| Identifier [ Expression ] = Expression ;
| if ( Expression ) Statement
| if ( Expression ) Statement else Statement
| while ( Expression ) Statement
Expression ::= PrimaryExpression & PrimaryExpression
| PrimaryExpression < PrimaryExpression
| PrimaryExpression + PrimaryExpression
| PrimaryExpression - PrimaryExpression
| PrimaryExpression * PrimaryExpression
| PrimaryExpression / PrimaryExpression
| PrimaryExpression [ PrimaryExpression ]
| PrimaryExpression . length
| PrimaryExpression . Identifier ( (Expression (, Expression )*)? )
PrimaryExpression ::= <INTEGER_LITERAL>
| true
| false
| <IDENTIFIER>
| this
| new int [ Expression ]
| new Identifier ( )
| ! Expression
| ( Expression )