| 
 Goal  | 
 ::=  | 
 MainClass ( TypeDeclaration )* <EOF>  | 
| 
 MainClass  | 
 ::=  | 
 "class" Identifier "{" "public" "static" "void" "main" "(" "String" "[" "]" Identifier ")" "{" PrintStatement "}" "}"  | 
| 
 TypeDeclaration  | 
 ::=  | 
 ClassDeclaration  | 
| 
    | 
 |  | 
 ClassExtendsDeclaration  | 
| 
 ClassDeclaration  | 
 ::=  | 
 "class" Identifier "{" ( VarDeclaration )* ( MethodDeclaration )* "}"  | 
| 
 ClassExtendsDeclaration  | 
 ::=  | 
 "class" Identifier "extends" Identifier "{" ( VarDeclaration )* ( MethodDeclaration )* "}"  | 
| 
 VarDeclaration  | 
 ::=  | 
 Type Identifier ";"  | 
| 
 MethodDeclaration  | 
 ::=  | 
 "public" Type Identifier "(" ( FormalParameterList )? ")" "{" ( VarDeclaration )* ( Statement )* "return" Expression ";" "}"  | 
| 
 FormalParameterList  | 
 ::=  | 
 FormalParameter ( FormalParameterRest )*  | 
| 
 FormalParameter  | 
 ::=  | 
 Type Identifier  | 
| 
 FormalParameterRest  | 
 ::=  | 
 "," FormalParameter  | 
| 
 Type  | 
 ::=  | 
 ArrayType  | 
| 
    | 
 |  | 
 BooleanType  | 
| 
    | 
 |  | 
 IntegerType  | 
| 
    | 
 |  | 
 Identifier  | 
| 
 ArrayType  | 
 ::=  | 
 "int" "[" "]"  | 
| 
 BooleanType  | 
 ::=  | 
 "boolean"  | 
| 
 IntegerType  | 
 ::=  | 
 "int"  | 
| 
 Statement  | 
 ::=  | 
 Block  | 
| 
    | 
 |  | 
 AssignmentStatement  | 
| 
    | 
 |  | 
 ArrayAssignmentStatement  | 
| 
    | 
 |  | 
 IfStatement  | 
| 
    | 
 |  | 
 WhileStatement  | 
| 
    | 
 |  | 
 PrintStatement  | 
| 
 Block  | 
 ::=  | 
 "{" ( Statement )* "}"  | 
| 
 AssignmentStatement  | 
 ::=  | 
 Identifier "=" Expression ";"  | 
| 
 ArrayAssignmentStatement  | 
 ::=  | 
 Identifier "[" Expression "]" "=" Expression ";"  | 
| 
 IfStatement  | 
 ::=  | 
 "if" "(" Expression ")" Statement "else" Statement  | 
| 
 WhileStatement  | 
 ::=  | 
 "while" "(" Expression ")" Statement  | 
| 
 PrintStatement  | 
 ::=  | 
 "System.out.println" "(" Expression ")" ";"  | 
| 
 Expression  | 
 ::=  | 
 AndExpression  | 
| 
    | 
 |  | 
 CompareExpression  | 
| 
    | 
 |  | 
 PlusExpression  | 
| 
    | 
 |  | 
 MinusExpression  | 
| 
    | 
 |  | 
 TimesExpression  | 
| 
    | 
 |  | 
 ArrayLookup  | 
| 
    | 
 |  | 
 ArrayLength  | 
| 
    | 
 |  | 
 MessageSend  | 
| 
    | 
 |  | 
 PrimaryExpression  | 
| 
 AndExpression  | 
 ::=  | 
 PrimaryExpression "&&" PrimaryExpression  | 
| 
 CompareExpression  | 
 ::=  | 
 PrimaryExpression "<" PrimaryExpression  | 
| 
 PlusExpression  | 
 ::=  | 
 PrimaryExpression "+" PrimaryExpression  | 
| 
 MinusExpression  | 
 ::=  | 
 PrimaryExpression "-" PrimaryExpression  | 
| 
 TimesExpression  | 
 ::=  | 
 PrimaryExpression "*" PrimaryExpression  | 
| 
 ArrayLookup  | 
 ::=  | 
 PrimaryExpression "[" PrimaryExpression "]"  | 
| 
 ArrayLength  | 
 ::=  | 
 PrimaryExpression "." "length"  | 
| 
 MessageSend  | 
 ::=  | 
 PrimaryExpression "." Identifier "(" ( ExpressionList )? ")"  | 
| 
 ExpressionList  | 
 ::=  | 
 Expression ( ExpressionRest )*  | 
| 
 ExpressionRest  | 
 ::=  | 
 "," Expression  | 
| 
 PrimaryExpression  | 
 ::=  | 
 IntegerLiteral  | 
| 
    | 
 |  | 
 TrueLiteral  | 
| 
    | 
 |  | 
 FalseLiteral  | 
| 
    | 
 |  | 
 Identifier  | 
| 
    | 
 |  | 
 ThisExpression  | 
| 
    | 
 |  | 
 ArrayAllocationExpression  | 
| 
    | 
 |  | 
 AllocationExpression  | 
| 
    | 
 |  | 
 NotExpression  | 
| 
    | 
 |  | 
 BracketExpression  | 
| 
 IntegerLiteral  | 
 ::=  | 
 <INTEGER_LITERAL>  | 
| 
 TrueLiteral  | 
 ::=  | 
 "true"  | 
| 
 FalseLiteral  | 
 ::=  | 
 "false"  | 
| 
 Identifier  | 
 ::=  | 
 <IDENTIFIER>  | 
| 
 ThisExpression  | 
 ::=  | 
 "this"  | 
| 
 ArrayAllocationExpression  | 
 ::=  | 
 "new" "int" "[" Expression "]"  | 
| 
 AllocationExpression  | 
 ::=  | 
 "new" Identifier "(" ")"  | 
| 
 NotExpression  | 
 ::=  | 
 "!" Expression  | 
| 
 BracketExpression  | 
 ::=  | 
 "(" Expression ")"  |