编译原理复习-4

纯纯傻逼课

本章主要是讲解中间代码的形式, 并使用上一章的方法完成程序部分的翻译.

Chapter-6: 中间代码生成

DAG

下面是两种表示形式

DAG

三地址编码的表示

x = y op z

a = b * b - c 有:

(1) 四元式序列如下:

  op arg1 arg2 result
0 * b b t1
1 - t1 c t2
2 = t2 \mid a  

(2) 三元式序列

  op arg1 arg2
0 * b b
1 - (0) c
2 = t2 \mid (1)  

(3) 间接三元式序列

  instruction
35 (0)
36 (1)
37 (2)
  op arg1 arg2
0 * b b
1 - (0) c
2 = t2 \mid (1)  

表达式的翻译

翻译成中间代码及其考验之前一章的内容.

运算翻译

使用E.code的拼接.

genCal

实时输出的增量编译:

genINC

数组输出

实时输出的增量编译:

genArr

控制流

控制流的”控制”主要是布尔表达式, 其文法如下:

\[B\to B \| B \mid B \&\& B \mid !B \mid (B) \mid E rel E \mid true \mid false\]

设计SDT结果如下:

genBool

根据程序设计的语义, 比如a||b, 如果a为真, b语句可能就不会运行.

将布尔表达式翻译成没有任何布尔算符的三地址代码,运行时只计算部分表达式,称为“短路”或“转移”代码

回填技术

reverse