/SysYF-Compiler

2021年**科学技术大学编译原理(H)课程实验项目

Primary LanguageLLVM

SysYF编译器

SysYF语言是在20202021年全国大学生计算机系统能力大赛编译系统设计赛要求实现的SysY语言基础上增加了float类型和元素类型为float的数组类型。本仓库是2021年**科学技术大学编译原理H课程的实验项目。

目录结构

.
├── CMakeLists.txt
├── README.md
├── doc/                          #实验文档
│   ├── AST.md                    #语法树说明
│   ├── DeadCodeEli.pdf      
│   ├── Dominance.pdf        
│   ├── SysYFIR.md                #IR接口说明
│   └── SysYF语言定义.pdf
├── grammar/                      #词法和语法文件
│   ├── SysYFParser.yy
│   └── SysYFScanner.ll
├── include/                      #头文件
├── lib/
├── report/                       #实验报告
├── src                           #源代码
│   ├── ASTBuilder/
│   ├── ASTPrinter/
│   ├── Checker/                  #类型检查
│   ├── ErrorReporter/
│   ├── Frontend/
│   ├── Optimize/                 #优化算法
│   ├── SysYFIR/                  #IR构建
│   ├── SysYFIRBuilder/
│   └── main.cpp
└── test                          #测试集
    ├── test.py                   #测试脚本
    ├── test_2020/                #2020编译比赛测试集
    └── test_2021/                #2021编译比赛测试集
        

实验环境

  • Ubuntu 20.04.6 LTS
  • gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
  • GNU Make 4.2.1
  • cmake 3.16.3
  • flex 2.6.4
  • bison 3.7.6
  • clang 10.0.0-4ubuntu1
  • LLVM version 10.0.0

环境构建

实验框架搭建需要flexbison(3.7.6及以上)、clangllvm等工具,下面以Ubuntu为例安装上述工具:

sudo apt install flex

wget http://ftp.gnu.org/gnu/bison/bison-3.7.6.tar.gz
tar xvzf bison-3.7.6.tar.gz
cd bison-3.7.6
sudo ./configure
sudo make
sudo make install

sudo apt install clang
sudo apt install llvm

检查安装是否成功:

which flex
which bison
which clang
which lli

若能依次输出安装位置,则表明安装成功。

编译运行

在搭建好环境后,便可以开始编译SysYF编译器了,编译需要cmakemake工具链。在顶层目录下输入:

mkdir build
cd build
cmake ..
make

即可完成编译,在build目录下会出现可执行文件compiler.

你可以通过如下方式运行编译器:

./compiler [.sy文件路径] [参数] -o [生成文件路径]

参数主要如下:

  • -h--help: 打印提示信息
  • -p--trace_parsing: 打印文法扫描过程
  • -s--trace_scanning: 打印词法扫描过程
  • -emit-ast: 从语法树复原代码
  • -emit-ir: 生成IR
  • -check: 类型检查
  • -O: 将IR转化为SSA格式
  • -O -cse: 开启公共子表达式删除优化
  • -O -cp: 开启常量传播优化
  • -O -dce: 开启死代码删除优化
  • -O2: 开启全部优化

例如:

./compiler test.sy -emit-ir -O -cse -o test.ll

表示对test.sy分析,生成IR并执行公共子表达式删除优化,结果保存在test.ll文件中。

测试

仓库提供了编译大赛的测试样例以及python测试脚本,位于test目录下,在终端中输入:

python test.py

即可自动运行test_2020test_2021下的测试点,本仓库的编译器能通过全部的测试点。

你还可以修改python脚本,添加测试目录以及更改编译选项。