属性文法和语法制导翻译 虽然形式语义学(如指称语义学、公理语义 学、操作语义学等)的研究已取得了许多 重大的进展,但目前在实际应用中比较 流行的语义描述和语义处理的方法主要 还是属性文法和语法制导翻译方法
属性文法和语法制导翻译 虽然形式语义学(如指称语义学、公理语义 学、操作语义学等)的研究已取得了许多 重大的进展,但目前在实际应用中比较 流行的语义描述和语义处理的方法主要 还是属性文法和语法制导翻译方法
属性文法 属性文法( attribute grammar)是一个三元 组:A=(G,VF,其中 G:是一个上下文无关文法 V有穷的属性集每个属性与文法的一个终结符或 非终结符相连这些属性代表与文法符号相关信 息,如它的类型、值、代码序列、符号表内容 等等属性与变量一样,可以进行计算和传递 属性加工的过程即是语义处理的过程 F:关于属性的属性断言或一组属性的计算规则(称 为语义规则).断言或语义规则与一个产生式相 联,只引用该产生式左端或右端的终结符或非终 结符相联的属性
属性文法 属性文法(attribute grammar)是一个三元 组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或 非终结符相连,这些属性代表与文法符号相关信 息,如它的类型、值、代码序列、符号表内容 等等 .属性与变量一样,可以进行计算和传递。 属性加工的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称 为语义规则) . 断言或语义规则与一个产生式相 联,只引用该产生式左端或右端的终结符或非终 结符相联的属性
属性有两种继承的和综合的属性 属性通常分为两类:综合属性和继承属性。简单地说,综 合属性用于“自下而上”传递信息,而继承属性用于 “自上而下”传递信息 出现在产生式左边的继承属性和出现在产生式右边的综合 属性不由所给定的产生式的属性计算规则进行计算,它 们由其它产生式的属性规则计算或者由生计算器的参数 提供 A→X1Ⅹ2.Xn A的综合属性计算S(A=(I(Ⅹ1)2…,J(Xn) ⅹj的继承属性计算T(Xj):=(I(A)2…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→>a都有 套与之相关联的语义规则,每条规则的形式为 b: =f(c. 12 k 这里,是一个函数,而且或者 (1)b是A的一个综合属性并且c1c2c是产生式 右边文法符号的属性;或者 (2)b是产生式右边某个文法符号的一个继承属性 并且c12c2C是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→n对应的语义规则仅仅 是打印由E产生的算术表达式的值的一个过程,我们可认为这条 规则定乂了L的一个虚属性。某些非终结符加下标是为了区分 个产生式中同一非终结符多次出现 生 语义规则 L→→E Print(e. val) E→E1+T E. val: =E, val+Tval E→T E. val: =T val T—年1*F Tval:=T1Val×Fval T→F Tval: F val F=(E) Fⅴal:=Eal 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 产 生 式