设表达式为3*5+4,则语义动作打印数值 19 E.val=19 E.val=15 T.val=4 T.val=15 F.val=4 T.val=3 F.val=5 digit.lexval=4 F.val=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继承属性L.im 生产式 语义规则 D→TL L.in:=T.type T→int T.type=integer T->real T.type:=real L→L1,id L1.in:=L.in addtype(id.entry,L.in) L-→id addtype(id.entry,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 id1,id2,id3 D T.type-real L.in=real real L.in=real id3 L.in=real id2
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->var V;D|8 S->V:=E;S|8 V->xlylz 现在使用两个属性,name和dl,每当一个新的变量声明时,就把它的name 属性附给它,name属性是综合属性。 将所声明的变量都放到一个变量名字清单中(用语义函数addlist实现),用 属性d综合声明块中声明的所有变量。然后这个d属性又作为继承属性 传到后面的语句部分,每个语句用到的变量都要进行审查,看它是否在 变量名字清单中 P->DS (s.d1 D.dl) D1->var V;D2|8(D1.dl addlist(v.name,D2.dl)} (D1.dl NULL} S1->V:=E;S2 8 (check (V.name,s1.dl);s2.dl s1.dl} V->x|yl z(v.name ='x'}I (v.name ='y'}I (v.name 1z'}
例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; D dl={x,y) S dl-{x,y} var V; Ddl=y) V:= e X var V Ddl=y y
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