属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。
属性分为两类:
(1)综合属性
用于“自下而上”传递信息
在语法树中,一个结点的综合属性的值,由其子结点的属性值确定
S—属性文法:仅仅使用综合属性的属性文法
(2)继承属性
用于“自上而下”传递信息。
在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定
刚开始接触的时候对于继承属性没有很直接的概念,通过学习对它有了一定的了解。
举两个具体的例子来说明:
(1)综合属性:
考虑语句:a = b + c
对应的文法如下:
E-> T + T
T-> id
其中,属性val是文法符号的数值,属性lexval是由词法分析器返回的数值。为id1+id2构建语法分析树,其中,id1、id2的lexval属性分别为2、8
可见E的属性值由子节点T的属性决定,而T由子节点id1和id2的属性值确定。
(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的属性由其父节点的属性决定。