(条件转移语句 if x relopa vg,mn为关系运算符频 <、=、>>等,若x和y满足关系 relop就转而执行标号 为L的语句,否则顺序执行本语句的下一语句 (6)过程调用语句 paramE和 callEn。源程序中的过程调 用语句P(x1,x2,…,xn)可以用下列三地址代码表示: param X1 param x2 。。● param Xn callpn 其中整数n为实参个数 过程返回语句为 return y,其中y为过程返回值。 (⑦)变址赋值:x:=y(,把从地址y开始的第个地址单元的 值赋给x。 xi:=y,则是把y的值赋给从地址x开始的第Ⅰ个地址单元 以上x,y,i均代表数据对象。 16
16 (5) 条件转移语句if x relopa y goto L, relop为关系运算符如 <、=、>、>=等,若x和y满足关系relop就转而执行标号 为L的语句,否则顺序执行本语句的下一语句。 (6) 过程调用语句param X和call P.n。源程序中的过程调 用语句P(x1, x2, …, xn)可以用下列三地址代码表示: param x1 param x2 …… param xn call P, n 其中整数n为实参个数。 过程返回语句为return y,其中y为过程返回值。 (7) 变址赋值:x:=y[i],把从地址y开始的第i个地址单元的 值赋给x。 x[i]:=y,则是把y的值赋给从地址x开始的第I个地址单元。 以上x,y,i均代表数据对象
(8)地址和指针赋值: x:=&y将y的地址赋给x,y可认为是一个名字或者为一个临 时变量,它表示一个具左一值的表达式,如Aj,而x是 指针名或临时变量,这就是说x的右一值是某个对象(y)的 左一值 x:=*y将y指示的地址单元中的内容赋给x,即x的右一值等 于y指示的存贮地址的内容。Y是一个指针或临时变量,其 右一值为一地址。 x:=y将x所指向的对象的右一值置为y的右一值 对设计中间语言来说一个足够小型但却是功能完备的算符 集(足以实现源语言的运算)当然易于在目标机上实现,但 因此会产生较长的中间代码,给优化及代码生成阶段要产 生高质量的代码带来困难,因此选择适当的算符集是重要 的
17 (8) 地址和指针赋值: x:=&y将y的地址赋给x,y可认为是一个名字或者为一个临 时变量,它表示一个具左一值的表达式,如A[i, j],而x是 指针名或临时变量,这就是说x的右一值是某个对象(y)的 左一值。 x:=*y将y指示的地址单元中的内容赋给x,即x的右一值等 于y指示的存贮地址的内容。Y是一个指针或临时变量,其 右一值为一地址。 * x:=y将x所指向的对象的右一值置为y的右一值。 对设计中间语言来说一个足够小型但却是功能完备的算符 集(足以实现源语言的运算)当然易于在目标机上实现,但 因此会产生较长的中间代码,给优化及代码生成阶段要产 生高质量的代码带来困难,因此选择适当的算符集是重要 的
五、三地址代码的具体实现 三地址代码是中间代码的一种抽象形式,作为具体实现, 通常有四元式,三元式及间接三元式几种形式。 1.四元式 具有四个域的记录结构: (op, argl, arg2, result) 其中op为算符,arg1,arg2及 result为指针,可指向有关名 字在符号表中的登记项或一临时变量,也可空缺(我们用/ 表示) 18
18 五、三地址代码的具体实现 三地址代码是中间代码的一种抽象形式,作为具体实现, 通常有四元式,三元式及间接三元式几种形式。 1. 四元式 具有四个域的记录结构: (op, arg1, arg2, result) 其中op为算符,arg1, arg2及result为指针,可指向有关名 字在符号表中的登记项或一临时变量,也可空缺(我们用/ 表示)
前面曾遇到的一些三地址语句的相应四元式: x:=y opz (op, y, z, x) x:=-y(minus, y, /,X) x:=y(:=,y,/,x) param x1 (param, x1,,/ cal P (call,/,/,P) 对于赋值语句a:=b*-c+b*c相应四元式代码为: O:(minus, C,/, tI) 1:(,b,t1,t2) 2:(minus, C, / t5) 3:(,b,t3,t4) 4:(+,t2,t4,t5) 5:(:=,t5,,a)
19 前面曾遇到的一些三地址语句的相应四元式: x:= y op z (op, y, z, x) x:=-y (uminus, y, /, x) x:=y (:=, y, /, x) param x1 (param, x1, /, /) call P (call, /, /, P) 对于赋值语句a:=b*-c+b*-c相应四元式代码为: 0:(uminus, c, /, t1) 1:(*, b, t1, t2) 2:(uminus, c, /, t5) 3:(*, b, t3, t4) 4:(+, t2, t4, t5) 5:(:=, t5, /, a)
2。具有三个域的记录: (op argl arg2) 这里arg1,arg2既可指向有关名字在符号表中的登记项或 临时变量,也可以指向三元表本身某一项。相应于赋值语 句a:=b*C+b*-c的三元式代码为: 0: minus c 1 2: minus c/ 3 b 2 13 5: a 因此三元式①表示b与三元式@的结果相乘。 20
20 2。具有三个域的记录: (op arg1 arg2) 这里arg1, arg2既可指向有关名字在符号表中的登记项或 临时变量,也可以指向三元表本身某一项。相应于赋值语 句a:=b*-c+b*-c的三元式代码为: 0: uminus c 1 1: *: b 0 2: uminus c / 3: * b 2 4: + 1 3 5: := a 4 因此三元式表示b与三元式的结果相乘