8.1 属性文法的基本概念 属性文法: (也称属性翻译文法)是Kunth在1968年首先提出的。 它是在上下文无关文法的基础上,为每个文法符号(终结 符或非终结符)配备若干相关的“值”(称为属性)。这 些属性代表与文法符号相关信息,例如它的类型、值、代 码序列、符号表内容等。属性与变量一样,可以进行计算 和传递。属性加工的过程即是语义处理的过程。 属性通常分为两类: 综合属性:“自下而上”传递信息 继承属性:“自上而下”传到信息
8.1 属性文法的基本概念 ① 属性文法: (也称属性翻译文法)是Kunth在1968年首先提出的。 它是在上下文无关文法的基础上,为每个文法符号(终结 符或非终结符)配备若干相关的“值”(称为属性)。这 些属性代表与文法符号相关信息,例如它的类型、值、代 码序列、符号表内容等。属性与变量一样,可以进行计算 和传递。属性加工的过程即是语义处理的过程。 属性通常分为两类: 综合属性: “自下而上”传递信息。 继承属性: “自上而下”传到信息
可以在复杂的处理(甚至编译程序的构造)之前确定属性。 例如,一个数的有效位数可以根据语言的定义确定(或者至少 给出一个最小值)。 属性也可以在程序执行期间才确定,如非常数)表达式 的值,或者动态分配的数据结构的位置。属性的计算及将计 算值与正在讨论的语言结构联系的过程称作属性的联编(bⅰ nding)。联编属性发生时编译执行过程的时间称作联编 时间(binding time)。不同的属性变化,甚至不同语言的相 同属性都可能有完全不同的联编时间。在执行之前联编的属 性称作静态的(static),而只在执行期间联编的属性是动 态的(dynamic)。对于编译程序编写者而言,当然对那 些在翻译时联编的动态属性感兴趣
可以在复杂的处理(甚至编译程序的构造)之前确定属性。 例如,一个数的有效位数可以根据语言的定义确定(或者至少 给出一个最小值)。 属性也可以在程序执行期间才确定,如(非常数)表达式 的值,或者动态分配的数据结构的位置。属性的计算及将计 算值与正在讨论的语言结构联系的过程称作属性的联编( b i n d i n g )。联编属性发生时编译/执行过程的时间称作联编 时间(binding time)。不同的属性变化,甚至不同语言的相 同属性都可能有完全不同的联编时间。在执行之前联编的属 性称作静态的( s t a t i c ),而只在执行期间联编的属性是动 态的( d y n a m i c )。对于编译程序编写者而言,当然对那 些在翻译时联编的动态属性感兴趣
语义规则: 对于文法的每个产生式都配备了一组属性的计算规则。 在一个属性文法中,对应于每个产生式A一>α都有一套 与之相关语义规则,每条规则的形式为 b:=f(c1,c2,...,ck) 这里,是一个函数 > b是A的一个属性,并且cL,c2,.,ck是产生式右边文法符号 的属性;或者A的其他属性,则称b是A的综合属性: >b是产生式右边某个文法符号X的一个属性,并且c1,c2,.,ck 是A或产生式右边任何文法符号的属性,则称b是文法符号X的继承属性。 在这两种情况下,我们都说属性b依赖于属性c1,c2,.,ck
② 语义规则: 在一个属性文法中,对应于每个产生式A->α都有一套 与之相关语义规则,每条规则的形式为 b:= f(c1,c2,…,ck) 这里,f是一个函数 ➢ b是A的一个属性,并且c1,c2,…,ck是产生式右边文法符号 的属性;或者A的其他属性,则称b是A的综合属性; ➢ b是产生式右边某个文法符号X的一个属性,并且c1,c2,…,ck 是A或产生式右边任何文法符号的属性,则称b是文法符号X的继承属性。 在这两种情况下,我们都说属性b依赖于属性c1,c2,…,ck。 对于文法的每个产生式都配备了一组属性的计算规则
强调 终结符只有综合属性,它们由词法分析器提供; 非终结符既可以有综合属性也可有继承属性,文法开始符 号的所有继承属性作为属性计算前的初始值 ·对出现在产生式右边的继承属性和出现在产生式左边的综 合属性都必须提供一个计算规则 冬 出现在产生式左边的继承属性和出现在产生式右边的综合 属性不由所给的产生式的属性计算规则进行计算,它们由 其他产生式的属性计算规则或者由属性计算器的参数提供
强调 ❖ 终结符只有综合属性,它们由词法分析器提供; ❖ 非终结符既可以有综合属性也可有继承属性,文法开始符 号的所有继承属性作为属性计算前的初始值 ❖ 对出现在产生式右边的继承属性和出现在产生式左边的综 合属性都必须提供一个计算规则 ❖ 出现在产生式左边的继承属性和出现在产生式右边的综合 属性不由所给的产生式的属性计算规则进行计算,它们由 其他产生式的属性计算规则或者由属性计算器的参数提供
※例一必 考虑非终结符A,B和C,其中,A有一个继承属性a和一个综合属 性b,B有综合属性c,C有继承属性d。 产生式A一>BC可能有规则 C.d:=B.c+1 A.b:=A.a+B.c 而属性Aa和B.c在其他地方计算
※例一※ 考虑非终结符A,B和C,其中,A有一个继承属性a和一个综合属 性b ,B有综合属性c ,C有继承属性d。 产生式A->BC可能有规则 C.d := B.c + 1 A.b := A.a + B.c 而属性A.a和B.c在其他地方计算