布尔表达式的翻译
- 布尔表达式的两个基本作用:
- 产生布尔表达式的文法:
- 计算的两种方法:
- 同计算算数表示是一样,一步步进行计算
- 采用优化措施:
A or B
:if A then true else B
A and B
:if A then B else false
数值表示法的翻译模式
- 过程
emit
将三地址代码送到输出文件中
nextstat
给出输出序列中,下一条三地址语句的地址索引
- 每产生一条三地址语句后,过程
emit
便把nextstat
+1
条件控制的布尔表达式翻译
- 两种出口:一真一假
- 每次调用函数
newlabel
后都翻译一个新的符号标号
- 对于一个布尔表达式\(E\),引用两个标号:
E.true
是为true
时控制流转向的标号
E.false
是为false
时控制流转向的标号
布尔表达式的一遍扫描
- 采用四元式的形式
- 把四元式存入一个数组中,数组的下标就代表四元式的标号
- 约定:
jnz, a, -, p
:if a goto p
jrop, x, y, p
:if x rop y goto p
j, -, -, p
:goto p
- 回填:有时,四元式的转移地址无法立即知道,我只将这个未完成的四元式地址作为E的语义值保存起来,待机回填
- \(E\)的两个综合属性:
truelist
:需要回填真出口的四元式的标号所构成的链表
falselist
:需要回填假出口的四元式的标号所构成的链表
- 为了处理
truelist
和falselist
,引入下列语义变量和过程:
- 变量:
nextquad
:只想下一条将要产生但尚未形成的四元式地址
- 过程:
makelist(i)
:创建一个仅含i
的新链表,甘薯返回只想这个链的指针
merge(p1, p2)
:合并以p1
和p2
为链首的两个链表,会送合并后的链首
backpatch(p, t)
:完成回填,把p
所链接的每个四元式的第四区段都填为t
- 翻译模式: