《编译原理及实践》中附带的TINY编译器,代码仅有几千行,
这点代码就实现了一个完整的编译器,及对应的目标代码运行程序,接下来会用一段时间研究下这个代码。
1. 源代码来源
Google “loucomp” 下载即可。
2. 源码结构
globals.h main.c
util.h util.c
scan.h scan.c
parse.h parse.c
symtab.h symtab.c
analyze.h analyze.c
code.h code.c
cgen.h cgen.c
其中scan、parse、analyze和cgen文件分别对应于代码扫描程序、分析程序、语义分析程序和代码生成器各阶段。
3. 关键函数
syntaxTree = parse( );
对应于词法分析及语法树生成。
buildSymtab(syntaxTree);
建立符号表
typeCheck(syntaxTree);
类型检测
codeGen(syntaxTree, codefile);
目标代码生成
同时工程采用了三个编译宏,可以分阶段进行控制编译器输出
NOPARSE 创建只扫描的编译器
NOANALYZE 创建只分析和扫描的编译器
NOCODE 创建执行语义分析但不生成代码的编译器
4. 使用方法
编译此工程生成tiny.exe程序,可以通过 tiny.ext sample.tny可以对源代码sample.tny进行编译,生成sam
这点代码就实现了一个完整的编译器,及对应的目标代码运行程序,接下来会用一段时间研究下这个代码。
1. 源代码来源
Google “loucomp” 下载即可。
2. 源码结构
globals.h main.c
util.h util.c
scan.h scan.c
parse.h parse.c
symtab.h symtab.c
analyze.h analyze.c
code.h code.c
cgen.h cgen.c
其中scan、parse、analyze和cgen文件分别对应于代码扫描程序、分析程序、语义分析程序和代码生成器各阶段。
3. 关键函数
syntaxTree = parse( );
对应于词法分析及语法树生成。
buildSymtab(syntaxTree);
建立符号表
typeCheck(syntaxTree);
类型检测
codeGen(syntaxTree, codefile);
目标代码生成
同时工程采用了三个编译宏,可以分阶段进行控制编译器输出
NOPARSE 创建只扫描的编译器
NOANALYZE 创建只分析和扫描的编译器
NOCODE 创建执行语义分析但不生成代码的编译器
4. 使用方法
编译此工程生成tiny.exe程序,可以通过 tiny.ext sample.tny可以对源代码sample.tny进行编译,生成sam