编译原理课程总结--第六章:属性文法和语法制导翻译

第六章:属性文法和语法制导翻译

属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。
属性分为两类:
(1)综合属性
用于“自下而上”传递信息
在语法树中,一个结点的综合属性的值,由其子结点的属性值确定
S—属性文法:仅仅使用综合属性的属性文法
(2)继承属性
用于“自上而下”传递信息。
在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的
某些属性确定

注意:
(1)终结符只有综合属性,它由词法分析器提供
(2)非终结符既可以有综合属性也可以有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值。
(3) 产生式右边符号的继承属性和产生式左边符号的综合属性都必须提供一个计算规则
(4) 产生式左边符号的继承属性和产生式右边符号的综合属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算

所以在对属性计算的过程即是对语义处理的过程,对于文法的每一个产生式配备一组属性的计算规则,则称为语义规则。

注意:
(1)语义规则可能产生副作用(如产生代码),
(2)也可能是过程,不是严格的函数(即不一定有返回值)

例子:
编译原理课程总结--第六章:属性文法和语法制导翻译_第1张图片

在属性文法的基础上进行处理

输入串语法树->依赖图->语义规则计算次序->计算结果
这种由源程序的语法结构所驱动的处理办法就是语法制导翻译法。

在一颗语法树中的结点的继承属性和综合属性之间的相互依赖关系可以用称作依赖图的一个有向图来描述。

编译原理课程总结--第六章:属性文法和语法制导翻译_第2张图片

注意:
如果一属性文法不存在属性之间的循环依赖关系,那么该文法为良定义的。为了设计编译程序,我们只处理良定义的属性文法。

循环依赖:
例如p,c1,c2都是属性,若有如下求值规则
p:=f1(c1)、c1:=f2(c2)、c2=f3(p),
就无法对p求值.

属性的计算次序
一个有向非循环图的拓扑序是图中结点的任何顺序m1,m2, …mk,使得边必须是从序列中前面的结点指向后面的结点。也就是说,如果mimj是mi到mj的一条边,那么在序列中mi必须出现在mj之前。
一个依赖图的任何拓扑排序都给出一个语法树中结点的语义规则计算的有效顺序。这就是说,在拓扑排序中,在一个结点上,语义规则b:=f(c1,c2,…ck)中的属性c1,c2…ck在计算b以前都是可用的。

抽象语法树
从语法树中去掉对翻译不必要的信息,而获得更有效的源程序中间表示。
这种经变换后的语法树称之为抽象语法树(Abstract Syntax Tree)。
在抽象语法树中,操作符和关键字都不作为叶结点出现,而是把它们作为内部结点,即这些叶结点的父结点。

编译原理课程总结--第六章:属性文法和语法制导翻译_第3张图片

L-属性文法的自顶向下翻译

编译原理课程总结--第六章:属性文法和语法制导翻译_第4张图片

翻译模式
1. 定义
(1)翻译模式是语法制导定义的一种便于翻译的书写形式。其中属性与文法符号相对应,语义规则或语义动作用花括号{ }括起来,可被插入到产生式右部的任何合适的位置上。
(2)这是一种语法分析和语义动作交错的表示法,他表达在按深度优先遍历分析树的过程中何时执行语义动作。
(3)翻译模式给出了使用语义规则进行计算的顺序。可看成是分析过程中翻译的注释。

设计翻译模式(根据语法制导定义)
条件:语法制导定义是L-属性定义
保证语义动作不会引用还没有计算的属性值。

—–(1)只需要综合属性的情况
为每一个语义规则建立一个包含赋值的动作,并把这个动作放在相应的产生式右边的末尾。
例如:
产生式 语义规则
TT1*F Tval:=T1 val*F val
翻译模式
TT1*F { Tval:=T1 val*F val}

——(2)既有综合属性又有继承属性的情况
①产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。
②一个动作不能引用这个动作右边符号的综合属性。
③产生式左边非终结符号的综合属性只有在它所引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常可放在产生式右端的未尾。

编译原理课程总结--第六章:属性文法和语法制导翻译_第5张图片

你可能感兴趣的:(编译原理课程)