语法制导定义SDD是对于 上下文无关语法CFG 的一个推广:
- 将每个产生式和一组语义规则相关联,用来计算该文法产生式中每个文法符号的属性值。
- 将每个文法符号和一个语义属性集合相关联。
也就是说,SDD为CFG的每个文法符号设置了一个语义属性,对于给定的输入串x,SDD可以分析出语法分析树中每一个节点的属性值。
问法符号的属性包括:综合属性和继承属性。
所谓综合属性,指的是:分析数节点N上的非终结符A的综合属性只能通过N的子节点或者N本身的属性决定。
比如说这里面的产生式E -> E1 +T. 对于这个产生式的语法分析树我们看出来,这里面E的val属性值只由他的子节点E1和T的属性值val决定。所以E的val就是一个综合属性。
所谓继承属性,指的是N上的非终结符A的继承属性只能由N的父节点,N的兄弟节点和N本身的属性决定。
比如上面的例子中,在产生式的语法分析树中我们能够看出,L的inh属性是由T的type属性决定的,而T是L的兄弟节点,所以这个是继承属性。
我举一个例子:
上图中表示每一个产生式对应的语义规则,可以看出这是一个加法和乘法的语义规则。通过上面的sdd就可以根据语义规则来计算语法分析树上各个节点的属性值了,以算术表达式求值 3*5+4n为例:
从上面语法分析树中的最下面的叶节点可以看出,数字的值lexval分别是3,5和4,那么一步一步向上,由语义规则中的F.val = digit.lexval可知,每个因子的值由数字的值决定,所以可以向上构建上层节点的值F.val分别是3,5,4. 在往上看,由T.val = F.val可知,终结符的val由因子的val决定,所以计算再上层的T.val也分别是3,5,4。再计算乘法和加法的终结符属性值,最终算出来E.val = 19 以及n。L为打印输出,最终输出了结果,语法分析树的各个节点的值就是这么自底向上算出来的。