什么是三地址码?
三地址码是一系列形式为 A−=B op C 的语句,其中 A、B、C 可以是程序员定义的名称、常量或编译器生成的临时名称,op 表示一个运算符,可以是常量或浮点算术运算符,或者布尔值数据或逻辑运算符。“三地址码”这个名称的原因在于,每个语句通常包含三个地址,两个用于操作数,一个用于结果。
在三地址码中,最多三个地址定义任何语句。两个地址用于操作数,一个用于结果。
因此,op 是一个运算符。
在表达式的右侧一次只允许进行单个操作。
示例− 表达式 a = b + c + d 可以转换为以下三地址码。
t1 = b + c
t2 = t1 + d
a = t2
其中 t1 和 t2 是编译器生成的临时变量。大多数情况下,语句包含少于三个引用,但它仍然被称为三地址语句。
三地址码语句的类型
以下是各种类型的三地址语句:
赋值− 三种类型的赋值语句为
x = y op z,op 是一个二元运算符,y、z 为操作数。
x = op y,op 是一个一元运算符
x = y,y 的值赋给 x。
无条件跳转− 无条件跳转的形式为 goto L,L 为标签。
控制流到标有 L 的三地址语句。
条件跳转− 条件跳转的形式为
if x relop y goto L
这里 relop 可以是 <、>、<=、>=。如果条件为真,则它可以执行标签 L 处的三地址语句,否则将执行 if 语句之后的语句。
数组语句−
x = y[i],数组 y 的第 i 个位置的值赋给 x。
x[i] = y,y 的值赋给数组 x 的第 i 个位置。
地址和指针赋值− 像 Pascal 和 C 这样的语言允许指针赋值。
x = & y,y 的地址赋给 x。
x = * y,y 指向的位置的内容赋给 x。
*x=y,最终将 x 指向的对象的右值设置为 y 的右值。
过程调用/返回− 对过程 P(x1, x2 … . . xn) 的调用,其参数为 x1, x2 … . . xn,写成
param x1
param x2
………..
param xn
call p, n
这里 param 指的是参数,& call p, n 将用 n 个参数调用过程 p。