Implementation of Tiger compiler with C++, for SE course SE3355.
My code is well-documented and many commit message contains useful information. See the doc
folder for more documentations.
Some suggestions (with heart!! ❤️):
- This project is really, really difficult, especially when it comes to lab5 and lab6. In lab5 and lab6, you almost get nothing with the skeleton. And the workload is tremendously increased compared with lab1-lab4 (I'd say, frankly, lab5 >> 1ab1-lab4). Therefore, spare yourself enough time.
- I like reading the textbook. So I'd like to suggest you reading the textbook/slides carefully when working with lab5 and lab6. It could be worthwhile even though you spend a whole day to understand how to deal with the interfaces.
- Try you best to hand in the lab in time!!!
Because of the difficulty, the teacher says on the class: Delay is tolerable, and don't be so nervous. That's where the tragedy begins as I am convinced by him and go to sleep, complete my lab5 with 1-day delay (The TA only admits your completion after you pass all the test cases). The outcome is that I get -3.6 in my final score! That's really a "intolerable" punishment! I'm full of regret now 😭.
- Keep on discussion with your classmates. Don't be shy. Under the catastrophe, there's no time to waste.
Original doc below.
We rewrote the Tiger Compiler labs using the C++ programming language because some features in C++ like inheritance and polymorphism are more suitable for these labs and less error-prone.
We provide you all the codes of all labs at one time. In each lab, you only need to code in some of the directories.
-
Tiger compiler in C++ uses flexc++ and bisonc++ instead of flex and bison because flexc++ and bisonc++ is more flexc++ and bisonc++ are able to generate pure C++ codes instead of C codes wrapped in C++ files.
-
Tiger compiler in C++ uses namespace for modularization and uses inheritance and polymorphism to replace unions used in the old labs.
-
Tiger compiler in C++ uses CMake instead of Makefile to compile and build the target.
We provide you a Docker image that has already installed all the dependencies. You can compile your codes directly in this Docker image.
-
Install Docker.
-
Run a docker container and mount the lab directory on it.
# Run this command in the root directory of the project
docker run -it --privileged -p 2222:22 -v $(pwd):/home/stu/tiger-compiler ipadsse302/tigerlabs_env:latest # or make docker-run
There are five makeable targets in total, including test_slp
, test_lex
, test_parse
, test_semant
, and tiger-compiler
.
- Run container environment and attach to it
# Run container and directly attach to it
docker run -it --privileged -p 2222:22 \
-v $(pwd):/home/stu/tiger-compiler ipadsse302/tigerlabs_env:latest # or `make docker-run`
# Or run container in the backend and attach to it later
docker run -dt --privileged -p 2222:22 \
-v $(pwd):/home/stu/tiger-compiler ipadsse302/tigerlabs_env:latest
docker attach ${YOUR_CONTAINER_ID}
- Build in the container environment
mkdir build && cd build && cmake .. && make test_xxx # or `make build`
- Debug using gdb or any IDEs
gdb test_xxx # e.g. `gdb test_slp`
Note: we will use -DCMAKE_BUILD_TYPE=Release
to grade your labs, so make
sure your lab passed the released version
Use make
make gradelabx
You can test all the labs by
make gradeall
Push your code to your GitLab repo
git add somefiles
git commit -m "A message"
git push
Note, each experiment has a separate branch, such as lab1
. When you finish the lab1
, you must submit the code to the lab1
branch. Otherwise, you won't get a full score in your lab.
We provide an LLVM-style .clang-format file in the project directory. You can use it to format your code.
Use clang-format
command
find . \( -name "*.h" -o -iname "*.cc" \) | xargs clang-format -i -style=file # or make format
or config the clang-format file in your IDE and use the built-in format feature in it.
Utility commands can be found in the Makefile
. They can be directly run by make xxx
in a Unix shell. Windows users cannot use the make
command, but the contents of Makefile
can still be used as a reference for the available commands.
You can post questions, issues, feedback, or even MR proposals through our main GitLab repository. We are rapidly refactoring the original C tiger compiler implementation into modern C++ style, so any suggestion to make this lab better is welcomed.
You can read external documentations on our course website: