You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wqz 2f438dab62
改进非运算在条件语句中的处理
3 years ago
.vscode make 3 years ago
antlr Remove ANTLR 4.9.3 jar executable. 3 years ago
build Add const 3 years ago
doc 1 3 years ago
src 改进非运算在条件语句中的处理 3 years ago
test add functional test cases 3 years ago
.gitignore Add rule for doxygen generated files. 3 years ago
CMakeLists.txt CMakeLists 3 years ago
README.md 补充README后端部分 3 years ago

README.md

SysY Compiler

用于实现SysY编译器的代码框架。

Getting Started

建议使用Ubuntu 22.04系统原生版本与WSL版本均可。

Ubuntu下载与安装说明

WSL Ubuntu安装说明

SysY编译器前端基于ANTLR工具实现本仓库已经包含ANTLR 4.9.3版本的可执行程序与C++运行时库但编译ANTLR运行时库存在一些依赖需要提前安装。

sudo apt update
sudo apt install -y uuid-dev libutfcpp-dev pkg-config make git cmake openjdk-11-jre

依赖安装完成后可以开始构建SysY编译器构建过程包含了ANTLR运行时库的构建

git clone https://gitee.com/xsu1989/sysy.git
cd sysy
cmake -S . -B build
cmake --build build

构建完成后,可以运行一个小的测试用例。该测试将逗号分隔的整数或字符串列表进行格式化后重新输出,即将相邻参数之间的分隔统一调整为逗号外加一个空格。

cat /test/funcrparams.sysy
# -> 1,0xa ,  011,	"hellow"
./build/bin/sysyc test/funcrparams.sy
# -> 1, 0xa, 011, "hellow"

Documentation

ANTLR手册

SysY语言规范

SysY运行时库

实验1用ANTLR实现SysY词法/语法分析器

当前的代码框架已经部署好了编译环境,同学们可专注于程序开发。

在实验1中同学们需要完成的任务包括

  • 参照SysY语言规范修改src/SysY.g4文件实现SysY词法/语法的完整定义
  • 修改任意代码后需要重新执行cmake --build build命令重新构建项目ANTLR工具会从SysY.g4生成词法/语法分析器,生成的文件位于./build/src目录
  • (进阶内容)修改src/ASTPrinter.hsrc/ASTPrinter.cpp实现从AST输出源程序但输出的源程序是经过格式化的测试用例为test/format-test.sy,格式化后的参考结果为test/format-ref.sy

实验2从AST生成中间表示

exp2分支为大家准备好了进行实验2的基本代码框架包括

  • IR相关数据结构的定义src/IR.h
  • 创建IR对象的工具类src/IRBuilder.h
  • IR生成器的示例代码src/SysYIRGenerator.h

在实验2中同学们需要完成的任务包括

  • 熟悉掌握IR定义与相关数据结构
  • 从AST生成IR基于visitor机制

请同学们仔细阅读代码学习IR的定义。可以使用doxygen工具自动生成HTML文档

sudo apt install doxygen graphviz
doxygen doc/Doxyfile

上述命令执行完毕后将在doxygen/html下找到生成的代码文档。

实验3从SysY IR 生成ARMv7汇编代码

后端相关源码

当前ref2分支为ARMv7后端代码实验,已经包含了后端代码生成的代码框架,包含

  • 后端生成代码源文件src/backend/codegen.cpp
  • 后端生成代码头文件src/backend/codegen.hpp

本实验需要基于以上两个源文件添加ARMv7后端生成代码(也可以按照自己的设计重头编写整个后端生成代码),完成这两个源文件中所有空函数的实现.不局限于本实验提供的后端代码框架,自由设计自己的ARMv7后端实现.

后端代码的编译与运行

本实验也修改了驱动代码sysyc.cpp, sysyc.cpp可以调用后端生成的最顶层函数接口code_gen().该函数会逐层调用各层级的代码生产函数并最终生成ARMv7汇编代码并打印至屏幕.通过下列命令编译

cmake -S . -B build
cmake --build build

通过下列命令运行编译产生的sysyc

./sysyc 01_add.sy

或者通过下列命令只生成SysY IR代码

./sysyc 01_add.sy ir

测试

本实验提供了两个sysy源文件用于测试,分别是位于sysy-backend/test的01_add.sy 11_add2.sy; 当完成sysyc的编译器后端后,可以通过sysy-backend/test下的Makefile文件编译生成测试程序的可执行二进制.

在x86平台编译运行测试代码

下载并配置ARMv7交叉编译器工具链

Arm GNU Toolchain下载安装交叉编译工具链,并设置环境变量PATH来使用交叉编译工具链

export PATH=${your_arm-gnu-toolchain_path}/bin:$PATH;  
安装qemu模拟器
sudo apt update
sudo apt install qemu-system-arm qemu-user
编译测试程序

使用如下命令调用完成后端实现的sysyc生成ARMv7汇编代码,并调用ARMv7交叉编译工具链汇编并连接生成可执行文件.

cd test
../build/bin/sysyc 01_add.sy > 01_add.s
arm-none-linux-gnueabihf-gcc 01_add.s -o 01_add.out -static #注意使用-static选项来静态链接  
使用qemu-arm模拟运行测试程序
cd test
qemu-arm ./01_add.out
echo $? #查看测试程序返回值
使用makefile编译与运行
cd test
make all -r #利用sysyc编译两个测试程序
make run -r #使用qemu-arm模拟运行两个测试程序

在树莓派上编译运行测试代码

参见'Raspberry.pptx'设置树莓派的编译运行环境,也可以在自己的x86电脑上利用ARMv7交叉编译工具链来编译测试程序, 将编译产生的可执行文件上传到树莓派上运行.

交叉编译器生成汇编代码

可以通过如下的命令让交叉编译器生成汇编代码,以参考gcc后端的编译行为.

cd test  
cp 01_add.sy 01_add.c # 修改代码后缀名  
arm-none-linux-gnueabihf-gcc 01_add.c  -O0 -S  -o 01_add.S #O0编译优化  

请自己构造一些简单的c程序,阅读交叉编译器编译产生的汇编代码来理解ARMv7汇编代码与编译器后端行为.

参考文档

参见doc/backend/下的ARMv7相关文档