Compiler project for the University of Waterloo CS444/644 compiler construction course. The Joos1W language is based off the Java 1.3 language. See here for a complete feature table of Joos:
Our project is written in C++ with Flex and Bison as our lexer and parser generators. To build the project, simply run:
mkdir build
cd build
cmake .. && make
Make sure you are either using Clang 16 (preferred) or later or GCC 12 or later. There is currently a bug in older GCC compilers that would not compile this project. In addition, here is a summary of the dependencies:
CMake>= 3.21Clang>= 17 for C++23 supportlibstdc++-12-devor later (must have C++23 support)flex>= 2.6.4 andbison>= 3.8.2
In addition, if you wish to build the debug version, you will need:
xsltproc(for debug builds)- One of
libdw-dev,binutils-devorlibdwarf-dev(for backward.cpp)
Our project directory structure is:
lib/: Contains the core compiler libraries. Includes AST, parser grammar and other files.tests/: Contains the unit test drivers and data files.tools/: Contains the frontends -- these are the programs you actually can run.
-
Install the dependencies via Homebrew:
brew install cmake bison flex llvm@17bison,flex, andllvm@17are all keg-only, so Homebrew will not symlink them into yourPATH. That is fine โ we point CMake at them explicitly below. -
Configure the build, pointing CMake at the Homebrew Clang, Bison, and Flex:
mkdir build cmake -S . -B build \ -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm@17/bin/clang \ -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm@17/bin/clang++ \ -DBISON_EXECUTABLE=/opt/homebrew/opt/bison/bin/bison \ -DFLEX_EXECUTABLE=/opt/homebrew/opt/flex/bin/flex -
Build:
make -C build all -j$(sysctl -n hw.ncpu)The tool binaries (
jcc1,scanner,parser, ...) are written tobuild/.
Note: Use
llvm@17rather than the latestllvm. Newer libc++ fully removes some C++17-deprecated facilities (e.g.std::result_of) that this codebase still relies on.
You can try out the VM once built by executing:
./build/tir-vm tests/vm/HelloJDK.java
and you should see something like:
Hello, World!
tir-vm: '_JF8HelloJDK4testEi' returned 0
You should also check out the optimizing compiler frontend jcc1 alone:
jcc1 --help