| K31 Compilers | |||||||||||||||||||||
| Spring Semester 2026 | |||||||||||||||||||||
|
|
|||||||||||||||||||||
|
|
|||||||||||||||||||||
|
|
|||||||||||||||||||||
|
|
|||||||||||||||||||||
|
|
Course Project
For both course assignments you’ll be required to show your
incremental development effort in the form of version control history on
github. You will create a private github repository and
invite our You are expected to show multiple commits for every day you worked on the project and the commits are expected to be consistent with normal development effort, i.e., intermediate stages are likely to be executable, new commits are likely to remove/change existing code and not just add new code, etc. Don’t stress too much about forgetting to commit often on some day—the assignments will take you enough time that incremental effort will be easy to document, overall. For submitting the assignment, you need to email the assistants with the commit hash of your assignment’s submission commit. NO SUBMISSION IS COMPLETE WITHOUT EMAILING A COMMIT HASH Homework 2 – MiniJava Static Checking (Semantic Analysis)This homework consists of building a parser and semantic analyzer for MiniJava, a subset of Java. MiniJava is designed so that its programs can be compiled by a full Java compiler like javac. Here is a partial, textual description of the language. Much of it can be safely ignored (most things are well defined in the grammar or derived from the requirement that each MiniJava program is also a Java program):
The MiniJava grammar in BNF can be downloaded here. You can make small changes to grammar, but you must accept everything that MiniJava accepts and reject anything that is rejected by the full Java language. Making changes is not recommended because it will make your job harder in subsequent homework assignments. Normally you won’t need to touch the grammar. The MiniJava grammar in JavaCC form is here. You will use the JTB tool to convert it into a grammar that produces class hierarchies. Then you will write one or more visitors who will take control over the MiniJava input file and will tell whether it is semantically correct, or will print an error message. It isn’t necessary for the compiler to report precisely what error it encountered and compilation can end at the first error. But you should not miss errors or report errors in correct programs. The visitors you will build should be subclasses of the visitors generated by JTB, but they may also contain methods and fields to hold information during static checking, to transfer information from one visitor to the next, etc. In the end, you will have a Main class that runs the semantic analysis initiating the parser that was produced by JavaCC and executing the visitors you wrote. You will turn in your grammar file, if you have made changes, otherwise just the code produced by JavaCC and JTB alongside your own classes that implement the visitors, etc. and a Main. The Main should parse and statically check all the MiniJava files that are given as arguments. Also, for every MiniJava file, your program should store and print
some useful data for every class such as the names and the offsets of
every field and method this class contains. For MiniJava we have only
three types of fields ( Input: Output:
There will be a tutorial for JavaCC and JTB. You can use these files as MiniJava examples and to test your program. Obviously you are free to make up your own files, however the homework will be graded purely on how your compiler performs on all the files we will test it against (both the above sample files and others). You can share ideas and test files, but you are not allowed to share code. Your program should run as follows:
That is, your program must perform semantic analysis on all files given as arguments. May the Force be with you! HW 1Part 1For the first part of this homework you should implement a simple
string expression evaluator. The evaluator should accept expressions
with the The operator That is, it concatenates its second operand twice at the end of its first operand. The operator Operator The grammar is summarized in: exp -> str | exp op exp | (exp) op -> / | ** str -> char | char str char -> a-z | A-Z You need to change this grammar to support priority between the operators, to remove the left recursion for LL parsing, etc. This part of the homework is divided in two tasks:
Your parser should read its input from the standard input (e.g., via an InputStream on System.in) and write the computed values of expressions to the standard output (System.out). Parse errors should be reported on standard error (System.err). Examples:
Part 2In the second part of this homework you will implement a parser and translator for a language supporting string operations. The language supports the concatenation (+) operator over strings, function definitions and calls, conditionals (if-else i.e, every “if” must be followed by an “else”), and the following logical expressions:
All values in the language are strings. The precedence of the operator expressions is defined as: precedence(if) < precedence(concat). Your parser, based on a context-free grammar, will translate the input language into Java. You will use JavaCUP for the generation of the parser combined either with a hand-written lexer or a generated-one (e.g., using JFlex, which is encouraged). You will infer the desired syntax of the input and output languages from the examples below. The output language is a subset of Java so it can be compiled using javac and executed using Java or online Java compilers like this, if you want to test your output. There is no need to perform type checking for the argument types or a check for the number of function arguments. You can assume that the program input will always be semantically correct. Note that each file of Java source code you produce must have the same name as the public Java class in it. For your own convenience you can name the public class “Main” and the generated files “Main.java”. In order to compile a file named Main.java you need to execute the command: javac Main.java. In order to execute the produced Main.class file you need to execute: java Main. To execute the program successfully, the “Main” class of your Java program must have a method with the following signature: public static void main(String[] args), which will be the main method of your program, containing all the translated statements of the input program. Moreover, for each function declaration of the input program, the translated Java program must contain an equivalent static method of the same name. Finally, keep in mind that in the input language the function declarations must precede all statements. As with the first part of this assignment, you should accept input programs from stdin and print output Java programs to stdout. Example #1Input:
Output (Java):
Example #2Input:
Example #3Input:
|
|||||||||||||||||||