Compilers 框架指南
Compilers 框架指南
1. 项目架构
Main
项目启动类, 在其main方法中完成从源代码到生成目标代码的全过程frontend
在这里进行前端开发 (包括词法分析, 语法分析, 语义分析, ir生成)ir
在这个包下模仿全部的llvm api (7.1之后的工作重点)test/java
测试驱动类存放在此目录下test/resources
测试用例存放在此目录下
2. 前端开发指南
在main方法中加入与前端相关的代码.
目前的main方法已实现了命令行参数的解析, 如图:
前端的任务有以下:
当
emitLLVM
为true
时, 能在main
方法中生成一个类型为LLVMModuleRef
临时变量, 代表翻译后得到的llvm ir.1
LLVMModuleRef module = ...;
如果用户开启了
--emit-llvm
选项, 输出llvm ir到指定输出文件.如果用户开启了
-O2
选项, 能够生成优化的llvm ir.
借助 antlr 完成词法分析, 语法分析.
遍历生成的语法树完成语义检查, 并且完成错误报告和恢复. (需考虑运行时库)
借助导入的llvm-platform包完成, 遍历语法树生成LLVM IR. (保证生成的IR的正确性, 并思考如何自己设计api.)
实现运行时库的LLVM IR翻译.
涉及到的文件修改 (参考):
Main.java
(你需要在这里生成module
)src/main/java/cn.edu.nju.software/frontend
(所有前端代码请组织好放在此包下)(选做) 建议在
src/main/java/cn.edu.nju.software/ir
包下放一些你所用到的 LLVM api 的类和方法的一份复刻.例如, 如果你使用了
LLVMModuleRef
这个类, 你可以顺便在ir
目录下增加一个名为ModuleRef
的空的class. 如果你使用了LLVMAddGlobal()
方法, 你也可以在ir
目录下的相应位置添加一个名为AddGlobal
镜像的空方法.虽然现阶段选择使用 LLVM 的 api 来完成ir生成, 但是顺带着维护包含了所有用到的api的, 镜像ir包将会对你的后续开发带来显而易见的好处!
3. 后端开发指南
TBD