编译器主体模块
回顾一下编译器前端架构:
- 词法分析,作用生成一个个TOKEN序列
- 语法分析,编写BNF范式语法规则.
- 抽象语法树生成,按照规则,利用JavaCC工具生成语法树.
- 语义分析,对语法树进行几次遍历,包括静态类型检查,变量定义消解,类型消解.此后代码没有语法错误.
- 中间代码生成,对抽象语法树进行遍历,遍历的过程中将对应节点转成中间代码节点.方便生成汇编指令.
前端部分每个模块已完成,还需要编译器的主体模块用来调用这些功能.
编译器功能参数
首先要制定好编译器能实现的几个功能参数:
- 检查文件的语法是否正确. –check-syntax
- 打印出Token序列. –print-token
- 打印出原始抽象语法树,用命令 –print-ast
- 打印出语义检查后的语法树 –print-semantic
- 打印出中间代码,用命令 –print-ir
-
-实现流程
首先是从命令行读取要编译的命令参数和源文件,然后封装成一个Options类:12345678910111213141516public void start(String[] args){//对命令参数解析,封装成一个option类Options opts = parseOptions(args);//只是检查文件语法.if (opts.mode() == CompilerMode.CheckSyntax) {checkSyntax(opts);}try{List<SourceFile> srcs = opts.sourceFiles();build(srcs, opts);}catch (CompileException ex) {errorHandler.error(ex.getMessage());System.exit(1);}}
这个选项类中包含了文件名,还有通过对参数进行解析设置好的程序模式和与平台有关的类型表等.
接着对所有源文件进行编译:
在编译的过程中每完成一步需要判断一下是否已完成所需的功能.
异常与错误
抛出的异常一般都需要在程序中处理,错误不需要处理直接终止程序.整个项目中用到的异常与错误如下: