例 1,a:=X[b,c]+d的翻译
设 A[1:10,1:20],W=4,CONSPART=X0
a
V1 V.place=a
V.offset=null
V1:=X[b
V1:=X[E1 E1.place=b
V1:=Elist1 Elist1.array=X
Elist1.place=b
Elist1.dim=1
V1:=Elist1,c
V1:=Elist1,E2 E2.place=c
V1:=Elist2 Elist2.array=X (*,b,20,t1)
Elist2.place=t1 (+,t1,c,t1)
Elist2.dim=2
V1:=Elist2]
V1:=V2 V2.place= X0 (*,t1,4,t2)
V2.offset=t2
V1:=E3 E3.place=t3 (=[],X0[t2],_,t3)
V1:=E3+d
V1:=E3+E4 E4.place=d
V1:=E5 E5.place=t4 (+,t3,d,t4)
A (:=,t3,_,a)
例 2,X[i+2,j+1]:=m+n的翻译
设 A[1:10,1:20],W=4,CONSPART=X0
X[i
X[E1 E1.place=i
X[E1+2
X[E1+E2 E2.place=2
X[E3 E3.place=t1 (+,i,2,t1)
Elist1 Elist1.array=X
Elist1.place=t1
Elist1.dim=1
Elist1,j
Elist1,E4 E4.place=j
Elist1,E4+1
Elist1,E4+E5 E5.place=1
Elist1,E6 E6.place=t2 (+,j,1,t2)
Elist2 Elist2.array=X (*,t1,20,t3)
Elist2.place=t3 (+,t3,t2,t3)
Elist2.dim=2
Elist2]
V1 V1.place= X0 (*,t3,4,t4)
V1.offset=t4
V1:=m
V1:=E7 E7.place=m
V1:=E7+n
V1:=E7+E8 E8.place=n
V1:=E9 E9.place=t5 (+,m,n,t5)
A ([]=,t5,_,t4[X0])
四, 一类说明语句的翻译
1,文法
P→D
D→D1;D2│i:T
T→real│integer│array[num] of T1│↑T1
可见,非终结符 P产生一系列 i:T形式的说明
语句 。
2,主要工作
不产生可执行指令,仅负责填表,将被
说明对象的类型及相对存储位置记入各
自的符号表中 。
3,语义变量及过程
(1)offset:相对位移量,初值为 0,是一个
全局变量
(2)T.type:数据类型
(3)T.width:数据宽度
(4)enter:语义过程,将变量名及其类型
和相对存储位置记入符号表中 。
4,翻译方案
对一个程序来说, offset的初值为 0,针
对这个赋初值的语义动作, 引进了标记
非终结符 M及空字产生式 M→ε的归约 。
P→M D
M→ε {offset:=0}
D→D1;D2
D→i:T { enter(i.name,T.type,offset);
offset:=offset+T.width }
T→integer { T.type:=integer; T.width:=4 }
T→real { T.type:=real; T.width:=8 }
T→array[num] of T1
{ T.type:=array(num.val,T1.type);
T.width:=num.val*T1.width }
T→↑T1
{ T.type:=pointer(T1.type); T.width:=4 }
5,补充说明
(1)说明语句可能为如下形式
D→integer namelist│real namelist
namelist→namelist,i│i
先改写为 D→D,i│integer i│real i
(2)说明语句也可为如下形式
D→namelist integer | namelist real
namelist→namelist,i | i
翻译时需引进队列 namelist.QUEUE用以存
放变量名
(3)对数组说明的翻译:分配内情向量
表区,产生在运行时动态地建立内情向量
和分配数组空间的目标指令。
五, 一类控制语句的翻译
1,文法及其分析
S→if B then S1
│if B then S1 else S2
│while B do S1
B
S1
if B then S1
B为假
B为真
S1的第一条四元式
用以“回填
B
S1
S2
if B then S1 else S2
B为假
B为真
S1,S2的第一条
四元式用以
“回填”
此处产生一无条件
转移语句
B
S1
B为假
B为真
while B do S1
B的第一条四元式需记录,S1的第一条四元式用以“回填”
由上面几个图可见,
(1)B具有真假出口
?B为真假时的转向不同
?在翻译 B时其真假出口有待“回填”
(2)因 if语句的嵌套,必须记录不确定转
移目标的四元式的地址 — 拉链技术
2,转移语句的四元式
?条件转移 (jrelop,P1,P2,0)
(jnz,P1,-,0)
?无条件转移 (j,-,-,0)
3,语句变量及过程
(1)B.truelist,B.falselist,B的真假出口链
(2)M.code,记录四元式地址
(3)N.nextlist,记录不确定转移目标的
四元式地址
(4)S.nextlist,记录 S中不确定转移目标的
且转向地址均相同的四元式 ( 这些四元
式形成一个链,S.nextlist为链头 )
如,
(p) (j,-,-,0)
……
(q) (j,-,-,p)
……
(r) (j,-,-,q)
S.nextlist=r
(5)makelist(t),语义过程,建链 ; t为链头 ;
t空缺时建一空链 ;
(6)merge(t1,t2),语义函数,将 t1,t2合并,
返回合并后的链头 t2;
(7)backpatch(t1,code),语义过程,用 code
回填 t1;
(8)nextcode,全局量,下一条即将生成
但尚未生成四元式的地址 。 值同 ip
如,
(p) (j,-,-,0) (u) (j,-,-,0)
…… …..,
(q) (j,-,-,p) (v) (j,-,-,u)
…… …..,
(r) (j,-,-,q) (w) (j,-,-,v)
t1=r t2=w
执行 merge(t1,t2)后
得
(p) (j,-,-,0) (u) (j,-,-,r)
…… …..,
(q) (j,-,-,p) (v) (j,-,-,u)
…… …..,
(r) (j,-,-,q) (w) (j,-,-,v)
链头 t2=w
执行 backpatch(t2,120)后,
(p) (j,-,-,120) (u) (j,-,-,120)
…… …..,
(q) (j,-,-,120) (v) (j,-,-,120)
…… …..,
(r) (j,-,-,120) (w) (j,-,-,120)
设 A[1:10,1:20],W=4,CONSPART=X0
a
V1 V.place=a
V.offset=null
V1:=X[b
V1:=X[E1 E1.place=b
V1:=Elist1 Elist1.array=X
Elist1.place=b
Elist1.dim=1
V1:=Elist1,c
V1:=Elist1,E2 E2.place=c
V1:=Elist2 Elist2.array=X (*,b,20,t1)
Elist2.place=t1 (+,t1,c,t1)
Elist2.dim=2
V1:=Elist2]
V1:=V2 V2.place= X0 (*,t1,4,t2)
V2.offset=t2
V1:=E3 E3.place=t3 (=[],X0[t2],_,t3)
V1:=E3+d
V1:=E3+E4 E4.place=d
V1:=E5 E5.place=t4 (+,t3,d,t4)
A (:=,t3,_,a)
例 2,X[i+2,j+1]:=m+n的翻译
设 A[1:10,1:20],W=4,CONSPART=X0
X[i
X[E1 E1.place=i
X[E1+2
X[E1+E2 E2.place=2
X[E3 E3.place=t1 (+,i,2,t1)
Elist1 Elist1.array=X
Elist1.place=t1
Elist1.dim=1
Elist1,j
Elist1,E4 E4.place=j
Elist1,E4+1
Elist1,E4+E5 E5.place=1
Elist1,E6 E6.place=t2 (+,j,1,t2)
Elist2 Elist2.array=X (*,t1,20,t3)
Elist2.place=t3 (+,t3,t2,t3)
Elist2.dim=2
Elist2]
V1 V1.place= X0 (*,t3,4,t4)
V1.offset=t4
V1:=m
V1:=E7 E7.place=m
V1:=E7+n
V1:=E7+E8 E8.place=n
V1:=E9 E9.place=t5 (+,m,n,t5)
A ([]=,t5,_,t4[X0])
四, 一类说明语句的翻译
1,文法
P→D
D→D1;D2│i:T
T→real│integer│array[num] of T1│↑T1
可见,非终结符 P产生一系列 i:T形式的说明
语句 。
2,主要工作
不产生可执行指令,仅负责填表,将被
说明对象的类型及相对存储位置记入各
自的符号表中 。
3,语义变量及过程
(1)offset:相对位移量,初值为 0,是一个
全局变量
(2)T.type:数据类型
(3)T.width:数据宽度
(4)enter:语义过程,将变量名及其类型
和相对存储位置记入符号表中 。
4,翻译方案
对一个程序来说, offset的初值为 0,针
对这个赋初值的语义动作, 引进了标记
非终结符 M及空字产生式 M→ε的归约 。
P→M D
M→ε {offset:=0}
D→D1;D2
D→i:T { enter(i.name,T.type,offset);
offset:=offset+T.width }
T→integer { T.type:=integer; T.width:=4 }
T→real { T.type:=real; T.width:=8 }
T→array[num] of T1
{ T.type:=array(num.val,T1.type);
T.width:=num.val*T1.width }
T→↑T1
{ T.type:=pointer(T1.type); T.width:=4 }
5,补充说明
(1)说明语句可能为如下形式
D→integer namelist│real namelist
namelist→namelist,i│i
先改写为 D→D,i│integer i│real i
(2)说明语句也可为如下形式
D→namelist integer | namelist real
namelist→namelist,i | i
翻译时需引进队列 namelist.QUEUE用以存
放变量名
(3)对数组说明的翻译:分配内情向量
表区,产生在运行时动态地建立内情向量
和分配数组空间的目标指令。
五, 一类控制语句的翻译
1,文法及其分析
S→if B then S1
│if B then S1 else S2
│while B do S1
B
S1
if B then S1
B为假
B为真
S1的第一条四元式
用以“回填
B
S1
S2
if B then S1 else S2
B为假
B为真
S1,S2的第一条
四元式用以
“回填”
此处产生一无条件
转移语句
B
S1
B为假
B为真
while B do S1
B的第一条四元式需记录,S1的第一条四元式用以“回填”
由上面几个图可见,
(1)B具有真假出口
?B为真假时的转向不同
?在翻译 B时其真假出口有待“回填”
(2)因 if语句的嵌套,必须记录不确定转
移目标的四元式的地址 — 拉链技术
2,转移语句的四元式
?条件转移 (jrelop,P1,P2,0)
(jnz,P1,-,0)
?无条件转移 (j,-,-,0)
3,语句变量及过程
(1)B.truelist,B.falselist,B的真假出口链
(2)M.code,记录四元式地址
(3)N.nextlist,记录不确定转移目标的
四元式地址
(4)S.nextlist,记录 S中不确定转移目标的
且转向地址均相同的四元式 ( 这些四元
式形成一个链,S.nextlist为链头 )
如,
(p) (j,-,-,0)
……
(q) (j,-,-,p)
……
(r) (j,-,-,q)
S.nextlist=r
(5)makelist(t),语义过程,建链 ; t为链头 ;
t空缺时建一空链 ;
(6)merge(t1,t2),语义函数,将 t1,t2合并,
返回合并后的链头 t2;
(7)backpatch(t1,code),语义过程,用 code
回填 t1;
(8)nextcode,全局量,下一条即将生成
但尚未生成四元式的地址 。 值同 ip
如,
(p) (j,-,-,0) (u) (j,-,-,0)
…… …..,
(q) (j,-,-,p) (v) (j,-,-,u)
…… …..,
(r) (j,-,-,q) (w) (j,-,-,v)
t1=r t2=w
执行 merge(t1,t2)后
得
(p) (j,-,-,0) (u) (j,-,-,r)
…… …..,
(q) (j,-,-,p) (v) (j,-,-,u)
…… …..,
(r) (j,-,-,q) (w) (j,-,-,v)
链头 t2=w
执行 backpatch(t2,120)后,
(p) (j,-,-,120) (u) (j,-,-,120)
…… …..,
(q) (j,-,-,120) (v) (j,-,-,120)
…… …..,
(r) (j,-,-,120) (w) (j,-,-,120)