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