本次笔记内容:
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=t1∗c
注意这里我们用名字表示地址。
数组引用的翻译
赋值语句的基本文法:
- S → i d = E ; ∣ L = E ; S \to id=E;|L=E; S→id=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 E→E1