语法制导定义的例子 L∴=En Print(E. val) E∴=E1+T E. val= e, val+T val E∷=T E.yal=Tⅴal T: : =T*F Tval=t, val*f. val 工:三F Tval= f val F::=(E) Eval=e val F∷= digit F. val digit. lexval 对于语法符号E,TF,都确定了属性val,表示它们的值。 如果一个重写规则中有两个相同的符号,需加足标区 别 在归约过程中,每个归约得到的符号都对应于输入符 号串中的某一段
语法制导定义的例子 • 对于语法符号E,T,F,都确定了属性val,表示它们的值。 • 如果一个重写规则中有两个相同的符号,需加足标区 别。 • 在归约过程中,每个归约得到的符号都对应于输入符 号串中的某一段。 L::=En Print(E.val) E::=E1+T E.val = E1 .val+T.val E::=T E.val = T.val T::=T1*F T.val = T1 .val*F.val T::=F T.val = F.val F::=(E) F.val = E.val F::=digit F.val = digit.lexval
语法制导定义的例子(2) D:=TL L in=T type T =int T type: =integer T. - real T type integer L∴=L1.id LI. in: =L in; addtype(id entry .n) L:=空 L的属性包括in;T的属性值为type addtype表示将d对应的类型信息加入到标识符 表中
语法制导定义的例子(2) • L的属性包括:in;T的属性值为type • addtype表示将id对应的类型信息加入到标识符 表中。 D::=TL L.in = T.type T::=int T.type := integer T::=real T.type := integer L::=L1, id L1.in := L.in; addtype(id.entry, L.in) L::= 空
属性的计算和注释分析树 在语法制导分析过程中,我们不仅生成了一棵语法树, 还可以得到各个结点的属性值。把这些值加入到语法树 上面之后,就得到了注释分析树。 ·结点的属性值的计算过程有两种类型: 结点的属性由其子结点确定,称为综合属性。 结点的属性由兄弟结点和父结点的属性确定,称为继 承属性 在概念上,翻译过程如下 1:分析输入符号,建立语法树 2:从语法分析树得到描述结点属性之间的依赖关系,得到计算 次序 3:按照语义规则计算属性值
属性的计算和注释分析树 • 在语法制导分析过程中,我们不仅生成了一棵语法树, 还可以得到各个结点的属性值。把这些值加入到语法树 上面之后,就得到了注释分析树。 • 结点的属性值的计算过程有两种类型: – 结点的属性由其子结点确定,称为综合属性。 – 结点的属性由兄弟结点和父结点的属性确定,称为继 承属性。 • 在概念上,翻译过程如下: – 1:分析输入符号,建立语法树 – 2:从语法分析树得到描述结点属性之间的依赖关系,得到计算 次序。 – 3:按照语义规则计算属性值
分析过程和注释分析树例子(1) val=15 E+ T val=15 f val=4 val=5 va 5 4 lexval=4 Lexval=3
分析过程和注释分析树例子(1) L E n E T T F F 3 T * + Lexval=3 val=3 5 val=5 val=3 val=15 val=15 F 4 lexval=4 val=4 Val=4 Val=19
分析过程和注释分析树例子(2) ype- real in=real in=reak rea in=real l
分析过程和注释分析树例子(2) D T L real L , i3 L , i2 i1 type=real in=real in=real in=real