对于属性文法的理解

属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。

属性分为两类:

(1)综合属性

用于“自下而上”传递信息

在语法树中,一个结点的综合属性的值,由其子结点的属性值确定

S—属性文法:仅仅使用综合属性的属性文法

(2)继承属性

用于“自上而下”传递信息。

在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定

 

刚开始接触的时候对于继承属性没有很直接的概念,通过学习对它有了一定的了解。

扫描二维码关注公众号,回复: 4559627 查看本文章

举两个具体的例子来说明:

 

(1)综合属性:

考虑语句:a = b + c

对应的文法如下:

E-> T + T

T-> id

 

其中,属性val是文法符号的数值,属性lexval是由词法分析器返回的数值。为id1+id2构建语法分析树,其中,id1id2lexval属性分别为28

可见E的属性值由子节点T的属性决定,而T由子节点id1id2的属性值确定。

 

(2)继承属性:

考虑语句:int a,b,c

对应的文法如下:

D->int L

L->L, id | id

推导的步骤为D->L->L,id->L,id,id->id,id,id

对应的分析树如下:

图中箭头方向为属性值传递的方向。比如L的属性由其兄弟节点“int“决定,a,b, c的属性由其父节点的属性决定。

猜你喜欢

转载自blog.csdn.net/yhj050806/article/details/85064105