《编译原理及实践》中附带的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.tn
这点代码就实现了一个完整的编译器,及对应的目标代码运行程序,接下来会用一段时间研究下这个代码。
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.tn

本文介绍了TINY编译器的学习,包括源码结构、关键函数和编译过程。通过分析,展示了如何使用TINY编译器将源代码转换为目标代码,并解释了TM虚拟机的执行原理。文章还提供了示例代码,如计算阶乘的程序,帮助读者深入理解编译原理。
&spm=1001.2101.3001.5002&articleId=36050813&d=1&t=3&u=abf729e5c9554365aeff58e99ebf05a4)
4273

被折叠的 条评论
为什么被折叠?



