属性文法和语法制导翻译 虽然形式语义学(如指称语义学、公理语义 学、操作语义学等)的研究已取得了许多 重大的进展,但目前在实际应用中比较 流行的语义描述和语义处理的方法主要 还是属性文法和语法制导翻译方法
属性文法和语法制导翻译 虽然形式语义学(如指称语义学、公理语义 学、操作语义学等)的研究已取得了许多 重大的进展,但目前在实际应用中比较 流行的语义描述和语义处理的方法主要 还是属性文法和语法制导翻译方法
属性文法 属性文法(attribute grammar)是一个三元 组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或 非终结符相连,这些属性代表与文法符号相关信 息,如它的类型、值、代码序列、符号表内容 等等.属性与变量一样,可以进行计算和传递。 属性加工的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称 为语义规则).断言或语义规则与一个产生式相 联,只引用该产生式左端或右端的终结符或非终 结符相联的属性
属性文法 属性文法(attribute grammar)是一个三元 组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或 非终结符相连,这些属性代表与文法符号相关信 息,如它的类型、值、代码序列、符号表内容 等等 .属性与变量一样,可以进行计算和传递。 属性加工的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称 为语义规则) . 断言或语义规则与一个产生式相 联,只引用该产生式左端或右端的终结符或非终 结符相联的属性
属性有两种继承的和综合的属性 属性通常分为两类:综合属性和继承属性。简单地说,综 合属性用于“自下而上”传递信息,而继承属性用于 “自上而下”传递信息。 出现在产生式左边的继承属性和出现在产生式右边的综合 属性不由所给定的产生式的属性计算规则进行计算,它 们由其它产生式的属性规则计算或者由生计算器的参数 提供。 A-→X1X2..Xn A的综合属性,计算S(A):=fI(X1),.,I(Xn) Xj的继承属性,计算T(Xj):=fI(A),.I(Xn) 1)非终结符既可有综合属性也可有继承属性,但文法开始 符号没有继承属性 2)终结符只有综合属性
属性有两种 继承的和综合的属性 属性通常分为两类:综合属性和继承属性。简单地说,综 合属性用于“自下而上”传递信息,而继承属性用于 “自上而下”传递信息。 出现在产生式左边的继承属性和出现在产生式右边的综合 属性不由所给定的产生式的属性计算规则进行计算,它 们由其它产生式的属性规则计算或者由生计算器的参数 提供。 A→X1 X2 …Xn A的综合属性,计算 S(A):=f(I(X1),…,I(Xn)) Xj的继承属性,计算 T(Xj):=f(I(A),... I(Xn)) 1)非终结符既可有综合属性也可有继承属性,但文法开始 符号没有继承属性. 2)终结符只有综合属性
在一个属性文法中,对应于每个产生式A→都有一 套与之相关联的语义规则,每条规则的形式为 b:-f(c1c2...Ck) 这里,是一个函数,而且或者 (1)b是A的一个综合属性并且c1,c2..ck是产生式 右边文法符号的属性或者 (2)b是产生式右边某个文法符号的一个继承属性 并且c1,c2.ck是A或产生式右边任何文法符号的属 性。 在两种情况下,我们都说属性b依赖于属性c1,c2…ck
在一个属性文法中,对应于每个产生式A→都有一 套与之相关联的语义规则,每条规则的形式为 b:=f(c1 ,c2…ck ) 这里,f是一个函数,而且或者 (1)b是A的一个综合属性并且c1 ,c2…ck是产生式 右边文法符号的属性;或者 (2)b是产生式右边某个文法符号的一个继承属性 并且c1 ,c2…ck是A或产生式右边任何文法符号的属 性。 在两种情况下,我们都说属性b依赖于属性c1 ,c2…ck
一个属性文法的例子例8.1 非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性, 它的值由词法分析器提供。与产生式L→E对应的语义规则仅仅 是打印由E产生的算术表达式的值的一个过程,我们可认为这条 规则定义了L的一个虚属性。某些非终结符加下标是为了区分一 个产生式中同一非终结符多次出现 产生 式 语义规则 L→E Print(E.val) E→E+T E.val:=E1.val+T.val E→T E.val:=T.val T-T*F T.val:=T.val×F.val T→F T.val:=F.val F→(E) F.val:=E.val F→digit F.val:=digit.lexval
一个属性文法的例子 例8.1 非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性, 它的值由词法分析器提供。与产生式L→En对应的语义规则仅仅 是打印由E产生的算术表达式的值的一个过程,我们可认为这条 规则定义了L的一个虚属性。某些非终结符加下标是为了区分一 个产生式中同一非终结符多次出现 语 义 规 则 L E E E1+T E T T T1 * F T F F (E) F digit Print(E.val) E.val:=E1 .val+T.val E.val:=T.val T.val:=T1 .val F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval 产 生 式