三地址代码 地址代码是语法树或DAG的一种线性表示 例:a+a*(b-c)+(b-c)*d t1 =b-c a *t t3 a tt tI*d t t3+t4 a) dag b)三地址代码 语法树对应的代码?
三地址代码 • 三地址代码是语法树或DAG的一种线性表示 例:a + a * (b – c) + (b – c) * d 语法树对应的代码?
三地址代码中的“地址” ·名字(源程序中的变量) 实现中,使用指向符号表条目的指针 常量 编译器生成的临时变量
三地址代码中的“地址” • 名字(源程序中的变量) • 实现中,使用指向符号表条目的指针 • 常量 • 编译器生成的临时变量
本书用的三地址指令 条指令右侧最多有一个运算符 改变控制流的指令使用标号 赋值x=yopz,x=opy,ⅹ=y 无条件转移 goto L 条件转移 x goto L, if False x goto L, if x relop y goto l 过程调用 param x和 call p,n param EI pa 过程返回 return y Param 索引赋值x=y和x[]=y call p, n y[]表示距离位置y处个内存单元的位置 地址和指针赋值x=&y,x=*y和*x=y
本书用的三地址指令 • 一条指令右侧最多有一个运算符 • 改变控制流的指令使用标号 • 赋值x = y op z,x = op y,x = y • 无条件转移goto L • 条件转移if x goto L,ifFalse x goto L,if x relop y goto L • 过程调用param x 和call p , n • 过程返回 return y • 索引赋值x = y[i]和 x[i] = y • y[i]表示距离位置y处i个内存单元的位置 • 地址和指针赋值x = &y,x = *y和*x = y
三地址代码示例 假设数组每个元素 语句doi=i+1;Whie(a[i]<); 占8个内存单元 L: t i+1 100 i+1 1=t 101:i t2 8 102:t t 2 103:t3 t 2 if t3<v goto L 104: if t3 < v goto 100 a)符号标号 b)位置号 图6-9给三地址指令指定标号的两种方法
三地址代码示例 • 语句 do i=i+1; while (a[i]<v); 假设数组每个元素 占8个内存单元
三地址代码的实现 用具体的数据结构实现三地址代码的方法 四元式 三元式 间接三元式 静态单赋值表示
三地址代码的实现 • 用具体的数据结构实现三地址代码的方法 • 四元式 • 三元式 • 间接三元式 • 静态单赋值表示