三地址代码是一般形式A := B op C的语句序列,其中 A、B、C 是程序员定义的名称、常量或编译器生成的临时名称; op代表对A、B应用的操作。简单来说,一行最多三个地址的代码称为三地址代码。
例子:
(a+b)*(a+b+c)
上述表达式的三个地址代码为:
t1=a+b
t2=t1+c
t3=t1*t2
在编译器设计中,最流行的中间代码表示是三地址代码。它被全球接受并且使用最广泛。有很多三地址语句。所有复杂的三地址语句一般都是简单的三地址语句的组合。
这些语句分为以下七类,可以称为三地址语句的构建块 –
Statement | Meaning |
---|---|
X = Y op Z | Binary Operation |
X= op Z | Unary Operation |
X = Y | Assignment |
if X(rel op)Y goto L | Conditional Goto |
goto L | Unconditional Goto |
A[i] = X Y= A[i] |
Array Indexing |
P = addr X Y = *P *P = Z |
Pointer Operations |
现在,通过使用上述语句,让我们在三地址代码中转换一些流行的高级结构。
1. While 声明 –
while E do S
三地址代码:
L:if(E==0) goto L1
S
goto L
L1:end
2. 声明 –
for(E1;E2;E3) do S
三地址代码:
E1
L:if(E2) goto L1
goto L2
L1:S
L2:end
3. 开关语句——
switch(E){
case 1: S1
break;
case 2: S2
break;
default: S3
}
三地址代码:
t=E
goto test
L1:S1
goto Last
L2:S2
goto Last
L3:S3
goto Last
test: if(E==1) goto L1
if(E==2) goto L2
goto L3
Last:end
因此,我们可以看到,通过使用这七个语句,我们可以将语句从高级语言复制到地址代码中。