首页 理论教育 编译原理与实践-依赖图关系及计算顺序

编译原理与实践-依赖图关系及计算顺序

时间:2023-11-17 理论教育 版权反馈
【摘要】:在语法树中,结点的继承属性和综合属性之间的相互依赖关系可以由依赖图来描述。例6.3 按照上述建立依赖图的方法,则图6-2中的语法树的依赖图如图6-3所示。需要注意的是,图中虚线表示的是语法树,并非依赖图中的一部分。依赖图的任何拓扑序都给出了对应语法树中结点的语义规则计算的有效顺序,也就是说,在拓扑排序中,一个结点上的语义规则b:=f(c1,c2,…

编译原理与实践-依赖图关系及计算顺序

如前所述,属性之间可能存在依赖关系,因此,在进行属性计算时,如果属性b依赖于属性c,那么计算b的语义规则必须在计算c的语义规则之后才能使用。在语法树中,结点的继承属性和综合属性之间的相互依赖关系可以由依赖图来描述。

依赖图是一个有向图,首先,它为每一个包含过程调用的语义规则引入一个虚综合属性b,这样把每一个语义规则都写成如下的形式:

b:=f(c1,c2,…,ck)

然后,为每一个属性设置一个结点,如果属性b依赖于属性c,则从属性c的结点有一条有向边连到属性b的结点。

例6.3 按照上述建立依赖图的方法,则图6-2中的语法树的依赖图如图6-3所示。依赖图中的结点由数字来标识,根据属性之间的依赖关系,建立数字之间的连线。其中,每—个addtype(id.entry,L.in)都产生一个虚属性,结点6、8和10都是为这些虚属性构造的。需要注意的是,图中虚线表示的是语法树,并非依赖图中的一部分。

图6-3 图6-2的依赖图(www.xing528.com)

显然,一条求值规则只有在其各变元值均已求得的情况下才可以使用,然而有时候可能会出现—个属性对另一个属性的循环依赖关系。如果一个属性文法不存在属性之间的循环依赖关系,则称该文法是良定义的。对于非良定义的属性文法,本书不做讨论。

一个有向非循环图的拓扑序是图中结点的任何顺序n1,n2,…,nk,而边必须是从序列中前面的结点指向后面的结点,即:如果ni→nj是ni到nj的一条边,那么在序列中ni必须出现在nj的前面。依赖图的任何拓扑序都给出了对应语法树中结点的语义规则计算的有效顺序,也就是说,在拓扑排序中,一个结点上的语义规则b:=f(c1,c2,…,ck)中的属性c1、c2、…、ck在计算b之前都是可用的。

基础文法用于建立输入符号串的语法分析树,而依赖图的拓扑序可以提供语义规则的计算顺序。按照此顺序进行语义规则计算就能得到输入符号串的翻译结果。

例6.4 在图6-3的依赖图中,每一条边都是从序号较低的结点指向序号较高的结点,因此,依赖图的一个拓扑序可以从低序号到高序号顺序写出。若用an表示依赖图中与序号n的结点相关的属性,则可得到如下的语义规则执行程序:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈