设表达式为3*5+4,则语义动作打印数值 19 E va=19 E. val=15 Tval=4 Tva=15 Eval=4 Tval=3 F val=5 digit. lexval=4 Eval=3 digit. lexval-=5 digit lexval=3 3*5+4的带注释的分析树
设表达式为3*5+4,则语义动作打印数值 19 . L E.val=19 E.val=15 T.val=4 T.val=15 F.val=4 T.val=3 F.val=3 F.val=5 digit.lexval=4 digit.lexval=5 digit.lexval=3 + * 3*5+4的带注释的分析树
继承属性 个结点的继承属性值是由此结点的父结点和/或兄弟 结点的某些属性来决定的。 例8.2继承属性Lin 生 式语义规则 D→ TLL.in= T type T→> int T type= -integer T→ real T ty pe: real L→Ll.id Llin=L in addtype(id entry, L in) → id addtype( dentry, L in
继承属性 • 一个结点的继承属性值是由此结点的父结点和/或兄弟 结点的某些属性来决定的。 例8.2 继承属性L.in 生 产 式 语 义 规 则 D →TL T→ int T →real L → L1,id L→ id L.in:=T.type T.type=integer T.type:=real L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in)
Real idiid2 id3 Ttype=real In- rea real in= real in= real
D L.in= real L.in= real L.in= real T.type=real real id2 id1 id3 . Real id1,id2,id3 ,
例8.3 P→>DS D→>varV;D|e s→>V:=E;S|8 V→>xy|z 现在使用两个属性,name和d,每当一个新的变量声明时,就把它的name 属性附给它,name属性是综合属性 将所声明的变量都放到一个变量名字清单中(用语义函数 addlist实现),用 属性d综合声明块中声明的所有变量。然后这个d属性又作为继承属性 传到后面的语句部分,每个语句用到的变量都要进行审查,看它是否在 变量名字清单中 P→Ds[s.d1=D.d1 D1-> var V; D2 8 (D1 dl addlist(v. name, D2d1)] [D1 dl NULL] S1->V: =E; S2 8 check(V. name, S1 dl); S2.d1 =S1 d1 V->xy zV. name ='x]I tV. name =y'I ivname
例8.3 P –> DS D –> var V; D | S –> V := E; S | V –> x | y | z 现在使用两个属性,name和dl,每当一个新的变量声明时,就把它的name 属性附给它,name属性是综合属性。 将所声明的变量都放到一个变量名字清单中(用语义函数addlist实现),用 属性dl综合声明块中声明的所有变量。然后这个dl属性又作为继承属性 传到后面的语句部分,每个语句用到的变量都要进行审查,看它是否在 变量名字清单中 P –> DS {S.dl = D.dl} D1 –> var V; D2 | {D1.dl = addlist(V.name, D2.dl)} | {D1.dl = NULL} S1 –> V := E; S2 | {check(V.name, S1.dl); S2.dl = S1.dl} V –> x | y | z {V.name = 'x'} | {V.name = 'y'} | {V.name = 'z'}
var x; var y; x.e Dd=ix,yy sd=ix,yj var V Dd{y}Ⅴ:=e;S X var dd=i 8
var x;var y;x:=e; P D dl={x,y} S dl={x,y} var V ; D dl={y} V := e ; S x var V ; D dl={ } y y