Compilers Principles, Techniques, & Tools (purple dragon book) second edition exercise answers

6.7 节的练习

6.7.1

使用图 6-43 中的翻译方案翻译下列表达式。给出每个子表达式的 truelist 和 falselist。你可以假设第一条被生成的指令的地址是 100.

  1. a==b && (c==d || e==f)
  2. (a==b || c==d) || e==f
  3. (a==b && c==d) && e==f

解答

  1. a==b && (c==d || e==f)

    6 7 1-1

6.7.2

解答

  1. E3.false = i1
  2. S2.next = i7
  3. E4.false = i7
  4. S1.next = i3
  5. E2.true = i3

6.7.3

当使用图 6-46 中的翻译方案对图 6-47 进行翻译时,我们为每条语句创建 S.next 列表。一开始是赋值语句 S1, S2, S3,然后逐步处理越来越大的 if 语句,if-else 语句,while 语句和语句块。在图 6-47 中有 5 个这种类型的结构语句:

  • S4: while (E3) S1
  • S5: if(E4) S2
  • S6: 包含 S5 和 S3 的语句块
  • S7: if(E2) S4 else S6
  • S8: 整个程序

对于这些结构语句,我们可以通过一个规则用其他的 Sj.next 列表以及程序中的表达式的列表 Ek.true 和 Ek.false 构造出 Si.next。给出计算下列 next 列表的规则:

  1. S4.next
  2. S5.next
  3. S6.next
  4. S7.next
  5. S8.next

解答

(该题解答不是很肯定)

  1. S4.next = S3.next
  2. S5.next = S2.next
  3. S6.next = S3.next
  4. S7.next = S3.next
  5. S8.next = E1.false