【编译原理笔记12】中间代码生成:简单赋值语句的翻译,数组引用的翻译

这篇笔记探讨了编译原理中的中间代码生成,重点在于简单赋值语句和数组引用的翻译。介绍了赋值语句翻译的任务,如生成表达式求值的三地址码,并提出了增量翻译方法。对于数组引用,讲解了一维到k维数组元素的寻址方式,并展示了带有数组引用的赋值语句翻译实例。
摘要由CSDN通过智能技术生成

本次笔记内容:
6-3 简单赋值语句的翻译
6-4 数组引用的翻译

本节课幻灯片,见于我的 GitHub 仓库:第12讲 中间代码生成_2.pdf

简单赋值语句的翻译

赋值语句翻译的任务


赋值语句翻译的主要任务:

  • 生成对表达式求值的三地址码
赋值语句的SDT


动作中有三个函数:

  • lookup(name):查询符号表,返回 name 对应的记录;
  • gen(code):生成三地址指令 code ;
  • newtemp():生成一个新的临时变量 t ,返回t的地址

可以看出,表达式的 code 属性要复制子表达式的 code 属性,以此递推…这样,code 属性就可能是一个比较长的字符串。这样在复制和移动的过程中就需要较长的时间。因此使用增量的方式进行翻译

增量翻译 Incremental Translation

在增量翻译中,不需要设置 code 属性,而是在已经生成的三地址码后面追加三地址指令。下图中,就可以把 code 属性对应的行删掉。

在增量方法中,gen( )不仅要构造出一个新的三地址指令,还要将它添加到至今为止已生成的指令序列之后







上图中,根据③的语义动作,生成一个临时变量用于记录表达式的地址,假设变量名为 t 2 t_2 t2;之后调用了栈函数,生成一条三地址指令:
t 2 = t 1 ∗ c t_2 = t_1 * c t2=t1c

注意这里我们用名字表示地址。

数组引用的翻译

赋值语句的基本文法:

  • S → i d = E ; ∣ L = E ; S \to id=E;|L=E; Sid=E;L=E;
  • E → E 1 + E 2 ∣ − E 1 ∣ ( E 1 ) ∣ id ∣ L E \to E_1 + E_2 | -E_1 | (E_1)|\text{id}|L EE1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值