Project 2: The MiniJava Parser

Due: Wednesday, October 19, 12:30 pm, by email.

In this assignment you will extend the initial MiniJava parser and AST representation with the extensions described in the course project description handout.


You should extend MiniJava's syntax to allow the following (all of which are legal in full Java too):

You should follow the precedence and associativity rules of regular Java for these extensions (except that == and != should be non-associative rather than left-associative as in Java).  It's OK to use CUP's predecence declarations to achieve this, for unary and binary operators only.

It's OK to have one shift/reduce conflict in your CUP grammar, for the "dangling else" problem.  Set the CUP_FLAGS variable in the Makefile to -expect 1 if you decide to accept this shift/reduce conflict.  (FYI, in making my sample solution, I couldn't find a way to revise the CUP grammar specification to avoid this conflict, which greatly irks me.)

You should add new AST classes and/or modify existing AST classes so that you can represent the new MiniJava constructs.  You should define the appropriate toString operations on these classes so that they can be pretty-printed in a form that is syntactically legal and produces the same AST if it is parsed back in again.  The other operations required of AST nodes, e.g. typechecking, evaluating, and lowering, you should implement by throwing UnimplementedError exceptions.

You only need to get the parser to work (and keep the extended scanner working). You do not need to do anything to enforce typechecking rules or other semantic-analysis constraints on the input program.


Do the following:

  1. Extend this specification of MiniJava's syntactic structure to describe the extended language, in the same style. (You can assume precedence and associativity is specified separately, and it is OK to define a grammar that is ambiguous with respect to the "dangling else" problem.)
  2. Add and/or modify classes in the AST subdirectory to represent the extended language.
  3. Extend Parser/minijava.cup to parse the extended language and construct the abstract syntax tree representing the parsed program.
  4. Develop test cases that demonstrate that your extended parser and AST classes work, both in cases that should now be syntactically legal and in cases that should still be syntactically illegal. (Since the parser quits at the first error, you'll likely need several illegal test case files to test the different illegal cases.) You do not need to check for lexical errors, just syntactic errors. The SamplePrograms directory contains some files that should parse after you make your changes; some of the files should parse successfully with the initial version of the MiniJava compiler.

You can use the -parse -printAST options to the MiniJava compiler to just run the parsing phase and print out the AST that it builds.  See the test_parser target in the Makefile for an example, and feel free to make your own target(s) to make running the tests you like easier and more mechanical.


Turn in the following:

  1. Your extended MiniJava syntax specification.
  2. Your modified minijava.cup file. Clearly identify your changes using comments.
  3. Your modified Makefile file, if you changed CUP_FLAGS.
  4. Your new and/or modified AST/*.java files. Clearly identify any modifications using comments.
  5. Your test cases, with names of the form name.legal.java for test cases that should parse successfully and name.illegal.java for test cases that should trigger syntax errors.
  6. A transcript of running your parser and printing out the resulting AST on each of your test cases (at least).

Create a single tar or zip file containing these files, and email this file as an attachment to marius at cs.washington.edu by the due date.


chambers@cs.washington.edu