为编译器实现类型检查。
在语法分析的基础上,对抽象语法树进行类型检查,并生成相关报错信息。
完成语法分析的基础上,还需:
types.[ch]: 已给出,描述了tiger语言的数据类型
env.[ch]: 实现值环境、类型环境
semant.[ch]:实现类型检查函数SEM_transProg(A_exp exp)
semtest.c: 测试平台,main入口
修改makefile
实现方法:
1. 类型检查过程中,遇到声明时,将其按规则检查并构造,放入相应值或类型环境中,遇到类型、变量或函数标示符时在这两个环境中查找。初始tenv中包含int、string两种基本类型,venv包含print,ord等预定义函数。
2. 表达式根据不同类型作相应处理,例如exp1:=exp2要保证exp1和exp2类型相同。特别声明了void类型用于匹配无值表达式,方便处理。
3. 作用域处理。可以通过在环境中插入一个标记实现。作用域开始,插入一个标记,作用域结束,弹出标记以上的所有新增声明或定义。
注意:
1. for、while、if-then等表达式无值返回,需要判断。
2. nil类型只能用于给记录(record)类型赋值或比较,两个nil比较非法。
3. tiger语言中定义的两个数组(array)或记录,即使各个域相同,也不具有等价性。<