Compilers 框架指南

1. 项目架构

  1. Main 项目启动类, 在其main方法中完成从源代码到生成目标代码的全过程
  2. frontend 在这里进行前端开发 (包括词法分析, 语法分析, 语义分析, ir生成)
  3. ir 在这个包下模仿全部的llvm api (7.1之后的工作重点)
  4. test/java 测试驱动类存放在此目录下
  5. test/resources 测试用例存放在此目录下

2. 前端开发指南

  1. 在main方法中加入与前端相关的代码.

    1. 目前的main方法已实现了命令行参数的解析, 如图:

      前端的任务有以下:

      1. emitLLVMtrue 时, 能在 main 方法中生成一个类型为LLVMModuleRef临时变量, 代表翻译后得到的llvm ir.

        1
        LLVMModuleRef module = ...;
      2. 如果用户开启了 --emit-llvm 选项, 输出llvm ir到指定输出文件.

      3. 如果用户开启了 -O2 选项, 能够生成优化的llvm ir.

    2. 借助 antlr 完成词法分析, 语法分析.

    3. 遍历生成的语法树完成语义检查, 并且完成错误报告和恢复. (需考虑运行时库)

    4. 借助导入的llvm-platform包完成, 遍历语法树生成LLVM IR. (保证生成的IR的正确性, 并思考如何自己设计api.)

    5. 实现运行时库的LLVM IR翻译.

  2. 涉及到的文件修改 (参考):

    Main.java (你需要在这里生成module)

    src/main/java/cn.edu.nju.software/frontend (所有前端代码请组织好放在此包下)

  3. (选做) 建议在 src/main/java/cn.edu.nju.software/ir 包下放一些你所用到的 LLVM api 的类和方法的一份复刻.

    例如, 如果你使用了 LLVMModuleRef 这个类, 你可以顺便在 ir 目录下增加一个名为 ModuleRef 的空的class. 如果你使用了 LLVMAddGlobal() 方法, 你也可以在ir目录下的相应位置添加一个名为 AddGlobal 镜像的空方法.

    虽然现阶段选择使用 LLVM 的 api 来完成ir生成, 但是顺带着维护包含了所有用到的api的, 镜像ir包将会对你的后续开发带来显而易见的好处! 

3. 后端开发指南

TBD