CSE 401/M501 24au MiniJava

Overview

The course project is to implement the MiniJava language specified in the Appendix of Appel's Modern Compiler Implementation in Java, 2nd edition and described on the MiniJava web site. MiniJava is (almost exactly) a subset of Java and the meaning of a MiniJava program is given by its meaning as a Java program.

The MiniJava subset of Java has the following characteristics:

The full MiniJava grammar is given on the project web site and in the Appendix of Appel's Modern Compiler Implementation in Java (2nd ed). Look at the grammar carefully to see what is and is not included in the language subset. One difference from full Java is that any string in double quotes appearing in the grammar, like "true", should be treated as a reserved word for our MiniJava project, even if it can be used or redeclared as an identifier or has other possible uses in full Java. You should implement full MiniJava as described in the Grammar and on the MiniJava web site, except that, for our project, /* comments */ are not nested, i.e., you need to implement /* */ comments, but the first */ terminates any open comment regardless of how many /* sequences have appeared before it, as in standard Java. You also need to implement // comments.

There are two symbols in the grammar that are not otherwise specified. An <IDENTIFIER> is a sequence of letters, digits, and underscores, starting with a letter. Uppercase letters are distinguished from lowercase. An <INTEGER_LITERAL> is a sequence of decimal digits not starting with 0, or the number 0 by itself, denoting a decimal integer value.

Implementation

The implementation platform for the project is Java 21 with the JFlex/CUP scanner/parser tools. You are free to use any development environment you wish, but your resulting project should build (using ant and the basic javac/java tools) and run on the lab linux machines, attu, and/or the current lab Linux VM. It also should be possible to develop the project on a system with more recent versions of Java installed, but be sure that your code does not use any language features or extensions not present in Java 21, which is the version currently installed on the lab machines and that will be used to build and test your compiler.

If you use IntelliJ or Eclipse, you can create a suitable project by following the instructions in the starter code README files. Follow those instructions carefully. It will save you time, even if you are the impatient sort, and failing to follow instructions may produce a project that is misconfigured or that fails to work properly. In recent quarters, most groups have used IntelliJ, and the staff has more experience and can offer better support for that IDE. Some groups have successfully used VSCode in recent quarters, but the course staff has limited experience with this setup and you may be a bit more on your own if you encounter unexpected behavior with VSCode.

Extensions

The basic project requirements are small enough to be tractable for a one-quarter course project, but include enough to cover the core ideas of compiling object-oriented (as well as procedural) languages. If you are feeling ambitious and have the time, you are invited to add additional features of full Java to the language implemented by your compiler. Here are a few suggestions.

Some Simple Ideas

More Sophisticated, but very interesting

Of the suggested extensions, adding instanceof, type casts, and super. are particularly instructive.

Some small amount of extra credit will be awarded for projects that go beyond the basic requirements.

Students in M 501 (the 5th-year Master's version of the course) will be required to implement one significant extension beyond the ones outlined above if they are using extra work on the project as their additional M 501 work. Suggested extensions and details will be provided later, and it will be possible to propose different choices. Students taking 401 can attempt these extensions for extra credit if desired. Students in M 501 can add additional extra credit features beyond the required extension if desired.