第五章介绍的是语法制导定义。
这一章是目前发现的最短的一章,内容也比较好明白。至少,比CFG那里简单。
语法制导定义、属性文法、语法制导翻译模式这三个东西是稍有区别的。
首先,语法制导定义是指:给程序的构造(CFG中的非终结符和终结符)附加一些属性,并且给每一个生成式附加一些计算属性的规则————称为语义规则。如果在语法制导定义中所有的规则都没有副作用,那么这个形式也就是属性文法了。
第二,语法制导翻译模式是指:在语法的生成式中嵌入一些程序的片段,这些程序的片段描述了一些动作、行为,————称为语义动作,这些动作可以是计算某个属性的值或是打印字符串等。
基本上来讲,语法制导定义中的语义规则和翻译模式中的语义动作是对应的,后者常常用来实现前者。语义规则更适合阅读,翻译模式更适合使用。
1、在语法制导定义中,使用两种性质略有不同的属性:
综合属性:计算综合属性的规则一定计算的是它所在的生成式头的属性,并且计算过程中只能引用生成式体中的符号的属性;
继承属性:计算继承属性的规则一定是计算它所在的生成式体的某个符号的属性,计算可以引用生成式头和生成式体中符号的属性。
2、计算语义规则/动作的一个必杀方法是:构造分析树、构造依赖图、给依赖图的节点拓扑排序,按照派出的顺序执行。在实际中几乎没有这么用的。另外,如果依赖图中有环,那么就没有办法计算了。
3、判断一个给定的语法制导定义是否存在有环的依赖图的分析树是指数时间的算法。。。
4、存在两类比较好用的语法制导定义,可以证明,它们一定没有“环”
S属性定义:语义规则中所有的属性都是综合属性;
L属性定义:可以包含综合属性,可以包含满足以下规则的继承属性 “该继承属性的计算只能引用生成式头符号的继承属性、其左边的生成式体中符号的属性、以及它自己的属性。
5、语法树就是将分析树中无用的节点去掉后得到的。
6、S属性定义的实现比较简单,只要自底向上计算就好了,可应用与LR类的文法实现与分析同时进行的求值。
7、L属性只能应用于LL类的文法才能实现与分析同时进行的求值,如果用在LR文法上,就只好用2中的方法了。
阅读(1423) | 评论(0) | 转发(0) |