例1:a:=Xb,c]+d的翻译 kA[l: 10, 1: 20L W=4, CONSPART-X V place=a Voffset=null V1: -X[b e V1: =X[E1 El place=b V1:=Elist1 Elist 1. array=X Elistl. place=l Elist 1. dim=1
例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: -Elistl, c V1: =Elist1, E2 E2 place=c VI=Elist2 Elist2, array=X ,b,20t1) Elist2. place=tI (+,tl,c,t1 Elist2 dim=2 V1: Elist2 V1: =V2 V2. place= Xo (*tl,4,t2) V2. offset=t2 V1:=E3 E3. place=t3 (=[],ⅹl[t2],,t3) V1 =E3+d V1:=E3+E4 E4. place=d V1:=E5 E5. place=t4 (+t3,d,t4) A
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[+2+1:-m+n的翻译 设A10NRx [E1 El place=i ⅹ[E1+2 ⅹ[E1+E2 E2. place=2 XE3 E3. place=tI (+,1,2,t1) Elist 1 Elistl. array=X Elist l place=tI Elist l dim=1 Elist 1, i Elist le4 E4. place=j Elistl.E4+1
例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
ElistlE4+e5 E5. place= Elistle6 E6 place=t2(+j, 1, t2 Elist2 Elist2. array=x(*,t1, 20, 3) Elist2. place=t3 (+t3,t2,t3) Elist2, dim=2 Elist2 1. place=Xo (*t3,4,t4) Offset=t4 V1:=m VI: E7 E7 placem V1:=E7+n V1:=E7+E8 E8. place=n V1:=E9 E9 place==t5 n.t5 (+,m,nt5) A 15,-+4|x)
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→D1212 D,: T T→ real integer array[num]ofT1|↑T1 可见非终结符P产生一系列:形式的说明 语句
四. 一类说明语句的翻译 1. 文法 P→D D→D1 ;D2│i:T T→real│integer│array[num] of T1│↑T1 可见,非终结符P产生一系列i:T形式的说明 语句
2.主要工作 不产生可执行指令仅负责填表将被说明 对象的类型及相对存储位置记入各自的 符号表中
2. 主要工作 不产生可执行指令,仅负责填表,将被说明 对象的类型及相对存储位置记入各自的 符号表中
3.语义变量及过程 (1) Offset:相对位移量初值为0,是一个 全局变量 (2) T type:数据类型 (3) Twidth:数据宽度 (4) Denter语义过程将变量名及其类型 和相对存储位置记入符号表中
3. 语义变量及过程 (1)offset:相对位移量,初值为0,是一个 全局变量 (2)T.type:数据类型 (3)T.width:数据宽度 (4)enter:语义过程,将变量名及其类型 和相对存储位置记入符号表中
4.翻译方案 对一个程序来说,ose的初值为0,针对 这个赋初值的语义动作,引进了标记非 终结符M及空字产生式M→的归约 P→MD M→8{ offset:=0} D→D1D2 D1:T enter(iname, T type, offset) offset: =offset+T width j
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 Ttype: integer; Twidth: =4 Treal Ttype: real; Twidth: =8 T→ arraylnum]ofT1 T type: array(num. val,T1 type) T width -num. val *T. width j T→→个 T type: =pointer(T, type); T width: =4)
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,ii 先改写为D→ D,i integer i l real i
5. 补充说明 (1)说明语句可能为如下形式 D→integer namelist│real namelist namelist→namelist,i│i 先改写为D→D,i│integer i│real i