tiger 语义分析(类型检查)

本文档介绍了如何在编译器中实现Tiger语言的类型检查,包括对抽象语法树的类型检查,使用types和env模块,重点在semant模块的SEM_transProg函数。内容涵盖类型环境构建,表达式类型匹配,作用域管理,如for、while、if-then的处理,以及nil类型的特殊规则。此外,还讨论了递归类型、函数声明,重声明,break嵌套,以及作用域规则的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为编译器实现类型检查。
在语法分析的基础上,对抽象语法树进行类型检查,并生成相关报错信息。

完成语法分析的基础上,还需:
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)或记录,即使各个域相同,也不具有等价性。

例如:
type a = {x:int, y:int}
type b = {x:int, y:int}
a和b为两种类型,不能相互赋值。
而 name类型
type a = {x:int, y:int}
type b =a
a和b视为相同类型。
由此可以容易的实现类型比较,类型构建后都对应唯一的数据结构,只需比较两个非name类型的指针是否相等即可。
-
4. 递归类型和函数声明。 递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值