第7章 语义分析与中间代码生成
重点:三地址码,各种语句的目标代码结构、 语法制导定义与翻译模式。
难点:布尔表达式的翻译,对各种语句的目标
代码结构、语法制导定义与翻译模式的
理解。
7.1 中间代码的形式
抽象语法树、逆波兰式、三地址码(三元式、四元式)、DAG图表示
7.2 声明语句的翻译
7.3 赋值语句的翻译
7.4类型检查
7.5控制语句的翻译
7.6 回填
1.makelist(i):创建一个只包含i的新表,i
是四元式数组的一个索引(下标),或者说
i是四元式代码序列的一个标号。
2.merge(p1, p2):合并由指针p1和p2指向
的两个表并且返回一个指向合并后的表的
指针。
3.backpatch(p,i):把i作为目标标号回填到
p所指向的表中的每一个转移指令中去。
此处的“表”都是为“回填”所准备的链表
7.7 switch语句的翻译
switchE
begin
case V1: S1
case V2: S2
. . .
case Vn- 1: Sn– 1
default: Sn
end
E的代码
ifE.addr¹ V1 gotoL1
S1的代码
gotoS.nextlist
L1: if E.addr¹V2gotoL2
S2的代码
gotoS.nextlist
L2: . . .
. . .
Ln-2: if E.addr¹Vn-1gotoLn-1
Sn-1的代码
gotoS.nextlist
Ln-1: Sn的代码
S.nextlist :
7.8 过程调用和返回语句的翻译
S => call id (Elist)
Elist => Elist,E
Elist => E
S => return E
过程调用id(E1, E2, …, En)的中间代码结构
E1.addr := E1的代码
E2.addr := E2的代码
.. .
En.addr:= En的代码
param E1.addr
param E2.addr
. . .
paramEn.addr
call id.addr,n
7.9 输入输出语句的翻译
测试:
试将下面的语句翻译成四元式序列
while(a < c) ∧ (b < d) do
if a = 1 then
c = c + 1
else
while a <= d do
a = a + 2
解析:
100: if ( a < c ) goto 102
101: goto 114
102: if ( b < d ) goto 104
103: goto 114
104: if ( a == 1 ) goto 106
105: goto 109
106: t1 := c + 1
107: c := t1
108: goto 100
109: if ( a <= d ) goto 111
110: goto 100
111: t2 := a + 2
112: a = t2
113: goto 109
114: