布尔表达式的翻译
- 布尔表达式的两个基本作用:
- 产生布尔表达式的文法:

- 计算的两种方法:
- 同计算算数表示是一样,一步步进行计算
- 采用优化措施:
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
- 翻译模式:



