语义分析及翻译
属性文法与语法制导翻译
这两章主要介绍语义分析及翻译问题,都是编译过程的阶段。
语义分析是对经语法分析器处理过后的在结构上正确的源程序进行上下文有关性质的审查,是编译程序最实质的过程。语义描述和语义处理最常用的方法是属性文法与语法制导翻译方法,也是本章主要介绍内容。
属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。属性是代表与文法符号相关的信息,和变量一样,可以进行计算和传递,分综合属性(自下而上)和继承属性(自上而下)。特别的,仅仅使用综合属性的属性文法叫S—属性文法。属性的计算规则称为语义规则,形式为b:=f(c1,c2,…,ck)。
基于属性文法的处理方法是对单词符号串进行语法分析,构造语法分析树,然后根据需要遍历语法树并在语法树的各结点处按语义规则进行计算。即按“输入串→语法树→依赖图→语义规则计算次序→计算结果”步骤计算,这种方法即为语法制导翻译法。将语法树中对翻译不必要的信息去掉,而获得更有效的源程序中间表示,就形成了抽象语法树。其中依赖图是指描述在一颗语法树中的结点的继承属性和综合属性之间的相互依赖关系的有向图。在一棵语法树构造依赖图以前,我们为每一个包含过程调用的语义规则引入一个虚综合属性b,把每一个语义规则都写成b:= f(c1,c2, …ck) 形式。依赖图为每一个属性设置一个结点,如果属性b依赖属性c,则从属性c的结点有一条有向边连到属性b的结点(被依赖的属性向依赖的属性画弧)。若属性文法不存在属性之间的循环依赖(若p、c1、c2存在如下关系p:=f1(c1)、c1:=f2(c2)、c2=f3(p)则称)关系,则称该文法为良定义的。下面讨论属性的计算次序,一个有向非循环图的拓扑序是图中结点的任何顺序m1,m2, …mk,使得边必须是从序列中前面的结点指向后面的结点,即若mi→mj,序列中mi必须出现在mj之前。在拓扑排序中,在一个结点上,语义规则b:=f(c1,c2,…ck)中的属性c1,c2…ck在计算b以前都是可用的。下面介绍几种计算属性的方法:(1)树遍历:可以通过遍历已经建立好的语法树来计算属性,深度优先或宽度优先。(2)一遍扫描:在语法分析的同时计算属性值,无需构造实际语法树。因为一遍扫描的处理方法与语法分析器的相互作用,所以它与采用的语法分析方法和属性的计算次序密切相关。S-属性文法的翻译器通常可借助于LR分析器实现,将LR分析器增加一个域来保存综合