编译原理实验 之 TINY 之 语义分析(第二次作业)
文章目录
本实验是接着前面的两个实验的基础上进行完善的,所以对于前面的实验如何操作?请看我的另外两个博客~
编译原理 之 实验一
编译原理实验 之 Tiny C语言编译程序实验 语法分析
- 首先明确一下这次实验的任务?
主要目的:实现符号表管理和类型检查,确保
TINY C
语言程序的语义正确性,为后续代码生成提供基础
-
符号表生成器(
symtab.c
):管理变量信息 -
核心任务:
- 建立符号表:使用散列表存储变量的名称、内存位置、引号行号等信息
- 插入符号表条目:在语法树遍历过程中,将变量名插入符号表,并记录其首次出现的内存位置和后续引用的行号
-
语义分析器(
annalyze.c
):类型检查 -
核心任务:
- 遍历语法树:通过后根遍历,从叶子到根,检查各语法结构的类型是否一致
- 类型检查规则:
- 表达式类型,确保算术运算符和关系运算符的操作数类型匹配
- 语句类型,检查赋值语句、条件语句、循环语句的类型兼容性
总的来说,需要补充以下的文件:
symtab.c
、analyze.c
、symtab.h
、analyze.h
、main.c
symtab.h
- 只需完善这个
st_insert
函数即可
analyze.c
- 只需完善
checkNode
函数即可
symtab.h
- 不用修改
analyze.h
- 稍微修改一下函数的参数
main.c
- 参数设置为:
/* set NO_PARSE to FALSE to enable the parser */
#define NO_PARSE FALSE
/* set NO_ANALYZE to FALSE to enable semantic analysis */
#define NO_ANALYZE FALSE
/* set NO_CODE to TRUE to disable code generation */
#define NO_CODE TRUE// .../* allocate and set tracing flags */
int EchoSource = TRUE;
int TraceScan = FALSE; // 禁用词法分析输出
int TraceParse = TRUE; // 启用语法分析输出
int TraceAnalyze = TRUE; // 启用语义分析输出
int TraceCode = FALSE;
int Error = FALSE;
上面需要补充的程序,自己根据自己的理解补充完整,下面给出具体的运行指令
- 补充完整之后,通过下面的命令进行编译
gcc main.c util.c scan.c parse.c analyze.c symtab.c -o tiny
- 运行测试
./tiny SAMPLE.TNY
其实只要第三张图片即可,所以你们交作业的时候,只用给出第三张图即可,也可以
修改main.c
的参数,只输出符号表和检查子程序的结果