中间代码表示

  • 图形表示
  • 三地址码

三地址码

一般形式:

$$ x := y \operatorname{op} z $$

表示:

  • 四元式:$ (\operatorname {op} , \text {arg}_1, \text {arg}_2, \text {target}) $
  • 三元式:$ (\operatorname {op} , \text {arg}_1, \text {arg}_2) $
    • 通过语句指针消去显式的返回值
  • 间接三元式:使用间接码表,映射序号到三地址语句序号。消除重复。

$8.3$ 请把语句

if (x+y)*z=0 then
	s:=(a+b)*c
else 
	s:=a*b*c

翻译为:

(2) 三地址代码。

解:

0  t1 = x + y
1  t2 = t1 * z
2  IF t2 == 0 GOTO 4
3  GOTO 8
4  t3 = a + b
5  t4 = t3 * c
6  s = t4
7  GOTO 11
8  t5 = a * b
9  t6 = t5 * c
10 s = t6
11

要点就是分支语句满足条件,往近处跳,不满足,则往远处跳。

IF COND_TRUE GOTO A
GOTO B
A:
    ...
    GOTO C:
B:
    ...
C:
    ...

还有注意第 5、6 行不能合并。第 8、9 行不能合并。

8.4 有如下的 C 语言程序片断,请把其中的可执行语句翻译为:

(2) 三地址代码。

main(){
    int i;
    int a[10];
    i=0;
    while (i<10) 1{    
	    a[i]=0;
	    i++;
    }
}
i = 0
LOOP:
    IF I < 10 GOTO INNER
    GOTO OUT
    INNER:
        ...
    GOTO LOOP
OUT:
    EXIT
i = 0
LOOP:
    IF i < 10 GOTO INNER
    GOTO OUT
    INNER:
        t1 = a
        t2 = i * 2
        t1[t2] = 0
        i = i + 1
    GOTO LOOP
OUT:
    EXIT

0 i = 0
1 IF i < 10 GOTO 3
2 GOTO 9
3 t1 = a;
4 t2 = i * 2
5 t1[t2] = 0
6 t3 = i + 1        
7 i = t3
8 GOTO 1
9 EXIT

注意访问数组

注意不能写 i = i + 1 ,要拆开。