第六章 属性文法和语法制导翻译

74
1 第第第 第第第第第第第第第第第 第第第 第第第第第第第第第第第 第第第第 第第第第 6.1 6.1 第第第第 第第第第 6.2 6.2 第第第第第第第第第第第 第第第第第第第第第第第 6.3 6.3 S- S- 第第第第第第第第第第第 第第第第第第第第第第第 6.4 L- 6.4 L- 第第第第第第第第第第第 第第第第第第第第第第第 6.5 6.5 第第第第第第第第第第 第第第第第第第第第第

Upload: aviv

Post on 23-Jan-2016

194 views

Category:

Documents


0 download

DESCRIPTION

第六章 属性文法和语法制导翻译. 主要内容 6.1 属性文法 6.2 基于属性文法的处理方法 6.3 S- 属性文法的自下而上计算 6.4 L- 属性文法和自顶向下翻译 6.5 自下而上计算继承属性. 概述. 语义分析的任务 在词法分析和语法分析的基础上,分析所写源程序的含义,在理解含义的基础上为生成相应的目标代码作好准备或直接生成目标代码。包括语义检查和语义处理。 语义检查 例:类型、运算、维数、越界 语义处理 例:变量的存储分配 例:表达式的求值 例:语句的翻译(中间代码的生成). 6.1 属性文法. 语义分析的描述 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第六章  属性文法和语法制导翻译

1

第六章 属性文法和语法制导翻译第六章 属性文法和语法制导翻译

主要内容主要内容 6.1 6.1 属性文法属性文法 6.2 6.2 基于属性文法的处理方法基于属性文法的处理方法 6.36.3 S-S- 属性文法的自下而上计算属性文法的自下而上计算 6.4 L-6.4 L- 属性文法和自顶向下翻译属性文法和自顶向下翻译 6.5 6.5 自下而上计算继承属性自下而上计算继承属性

Page 2: 第六章  属性文法和语法制导翻译

2

概述概述 语义分析的任务语义分析的任务

在词法分析和语法分析的基础上,分析所写源在词法分析和语法分析的基础上,分析所写源程序的含义,在理解含义的基础上为生成相应程序的含义,在理解含义的基础上为生成相应的目标代码作好准备或直接生成目标代码。包的目标代码作好准备或直接生成目标代码。包括语义检查和语义处理。括语义检查和语义处理。

语义检查语义检查 例:类型、运算、维数、越界例:类型、运算、维数、越界

语义处理语义处理 例:变量的存储分配例:变量的存储分配 例:表达式的求值例:表达式的求值 例:语句的翻译(中间代码的生成)例:语句的翻译(中间代码的生成)

Page 3: 第六章  属性文法和语法制导翻译

3

6.1 6.1 属性文法属性文法 语义分析的描述语义分析的描述

描述语法规则的同时,编写相应的语义描述语法规则的同时,编写相应的语义动作和计算顺序动作和计算顺序

语义的形式化描述语义的形式化描述 操作语义学、公理语义学、指称语义学操作语义学、公理语义学、指称语义学

属性文法属性文法 接近形式化的语义描述方法接近形式化的语义描述方法

Page 4: 第六章  属性文法和语法制导翻译

4

属性文法的定义属性文法的定义 三元组:A=(G,V,F)三元组:A=(G,V,F)

G 是上下文无关文法G 是上下文无关文法 V 属性的有穷集V 属性的有穷集 F 关于属性的断言和谓词F 关于属性的断言和谓词

关系关系 语义信息作为终结符和非终结符的属性语义信息作为终结符和非终结符的属性 语义分析定义为产生式的断言和谓词语义分析定义为产生式的断言和谓词 语义规则语义规则:文法的每个产生式所对应的一组属:文法的每个产生式所对应的一组属

性的计算规则。性的计算规则。

Page 5: 第六章  属性文法和语法制导翻译

5

用法用法 针对语义,为文法符号设置属性针对语义,为文法符号设置属性

终结符使用单词的属性终结符使用单词的属性 为每个产生式设置语义规则为每个产生式设置语义规则

描述各属性的关系描述各属性的关系 两种形式两种形式

语法制导定义:语义的抽象说明语法制导定义:语义的抽象说明 翻译方案:规定实现方法(计算次序)翻译方案:规定实现方法(计算次序)

Page 6: 第六章  属性文法和语法制导翻译

6

属性文法的作用属性文法的作用

抽象描述语义分析的要求抽象描述语义分析的要求 语义信息及其计算关系语义信息及其计算关系 适用于各种语义分析(翻译、计算、适用于各种语义分析(翻译、计算、

处理)处理) 语义分析的任务语义分析的任务

属性求值计算、断言检查属性求值计算、断言检查

Page 7: 第六章  属性文法和语法制导翻译

7

属性分类:属性分类: 综合属性综合属性

从其子结点的属性值计算出来的;从其子结点的属性值计算出来的; 用于“自下而上”传递信息;用于“自下而上”传递信息; 如:如: E.valE.val 、、 T.typeT.type

继承属性继承属性 从其兄弟结点和父结点的属性值计算出来的;从其兄弟结点和父结点的属性值计算出来的; 用于“自上而下”传递信息;用于“自上而下”传递信息; 如:如: L.inL.in

固有属性(单词属性)固有属性(单词属性)

Page 8: 第六章  属性文法和语法制导翻译

8

在一个属性文法中,对应于每个产生式在一个属性文法中,对应于每个产生式 A→ aA→ a 都有一都有一套与之相关联的语义规则,每条规则的形式为套与之相关联的语义规则,每条规则的形式为 b:=f(cb:=f(c1,c2,…,ck)1,c2,…,ck) 这里,这里, ff 是一个函数,而且或者是一个函数,而且或者

11 )) bb 是是 AA 的一个综合属性并且的一个综合属性并且 c1,c2,…,ckc1,c2,…,ck 是产生式是产生式右边文法符号的属性;或者右边文法符号的属性;或者

22 )) bb 是产生式右边某个文法符号的一个继承属性并是产生式右边某个文法符号的一个继承属性并且且 c1,c2,…,ckc1,c2,…,ck 是是 AA 或产生式右边任何文法符号的属或产生式右边任何文法符号的属性。性。

在这两种情况下,我们都说属性在这两种情况下,我们都说属性 bb 依赖于属性依赖于属性 c1,c2,c1,c2,…,ck…,ck 。。

特别要强调的是:特别要强调的是: 11 )终结符只有综合属性,他们由词法分析器提供;)终结符只有综合属性,他们由词法分析器提供; 22 )非终结符既可有综合属性也可有继承属性,文法)非终结符既可有综合属性也可有继承属性,文法

开始符号的所有继承属性作为属性计算前的初始值。开始符号的所有继承属性作为属性计算前的初始值。

Page 9: 第六章  属性文法和语法制导翻译

9

属性的计算属性的计算

构造语法分析树,添加响应的语义规则构造语法分析树,添加响应的语义规则 综合属性综合属性

自底向上自底向上按照语义规则来计算各结点的综按照语义规则来计算各结点的综合属性值合属性值

继承属性继承属性 需要探讨计算次序需要探讨计算次序

Page 10: 第六章  属性文法和语法制导翻译

10

仅包括综合属性仅包括综合属性 对于所有A → X对于所有A → X 11 XX 22 … … XX nn ,, A的属性计算仅用XA的属性计算仅用X 11…… XX nn 的属的属

性性 如:算术表达式求值的属性文法如:算术表达式求值的属性文法

SS -- 属性定义: 属性定义:

Page 11: 第六章  属性文法和语法制导翻译

11

LL -- 属性定义: 属性定义: 其属性可用深度优先的顺序从左至其属性可用深度优先的顺序从左至

右计算右计算 对于所有 A→X对于所有 A→X 11 XX 22 … … XX nn

XX ii 属性计算仅使用A X属性计算仅使用A X 11 XX 22 … …

XX i-1i-1 的属性的属性 如:说明语句的属性文法如:说明语句的属性文法

Page 12: 第六章  属性文法和语法制导翻译

12

综合属性综合属性 综合属性在实际中被广泛应用。在语法树综合属性在实际中被广泛应用。在语法树

中,一个结点的综合属性值由其子结点的中,一个结点的综合属性值由其子结点的属性值确定。因此,通常使用自底向上的属性值确定。因此,通常使用自底向上的方法在每一个结点处使用语义规则计算综方法在每一个结点处使用语义规则计算综合属性的值。仅仅使用综合属性的属性文合属性的值。仅仅使用综合属性的属性文法称法称 S-S- 属性文法。属性文法。

下面的例子下面的例子 6.16.1 就是用来说明综合属性的就是用来说明综合属性的使用和计算过程。使用和计算过程。

Page 13: 第六章  属性文法和语法制导翻译

13

例例 6-1: 6-1: 计算器的设计计算器的设计 该例中的计算器读入一个可含数字、括号和该例中的计算器读入一个可含数字、括号和 ++ 、、

** 运算符的算术表达式,并打印表达式的值,每运算符的算术表达式,并打印表达式的值,每个输入行以个输入行以 nn 作为结束。作为结束。

步骤如下:步骤如下: 编制算术表达式的文法编制算术表达式的文法 引入属性表示语义信息引入属性表示语义信息

将值 将值 val val 作为表达式 作为表达式 EE 、项 、项 T T 和因子 和因子 F F 的的属性属性

用语义规则描述表达式的求值用语义规则描述表达式的求值

Page 14: 第六章  属性文法和语法制导翻译

14

属性文法(语法制导定义)属性文法(语法制导定义) 例例 6.1 6.1 一个简单台式计算器的属性文法一个简单台式计算器的属性文法 产生式 语义规则产生式 语义规则 L → E print( E.val )L → E print( E.val ) E → EE → E11 + T E.val := E + T E.val := E11.val + T.val.val + T.val E → T E.val := T.valE → T E.val := T.val T → TT → T11 * F T.val := T * F T.val := T11.val * F.val.val * F.val T → F T.val := F.valT → F T.val := F.val F → ( E ) F.val := E.valF → ( E ) F.val := E.val F → digitF → digit F.val := digit.attrF.val := digit.attr

attrattr 是单词 是单词 digit digit 的一个综合属性的一个综合属性

Page 15: 第六章  属性文法和语法制导翻译

15d ig it.a ttr=3

F .va l=3

T .va l=3 *

d ig it.a ttr=5

F .va l=5

T .va l=15

E .va l=15 +

d ig it.a ttr=4

F .va l=4

T .va l=4

E .va l=19

LP rin t(19)

例例 6-16-1 :: 3*5+4 3*5+4 的的

语法树与属性计算语法树与属性计算

Page 16: 第六章  属性文法和语法制导翻译

16

继承属性继承属性 在语法树中,一个结点的继承属性由此结点的父结在语法树中,一个结点的继承属性由此结点的父结

点和点和 //或兄弟结点的某些属性确定。例如,可以利用或兄弟结点的某些属性确定。例如,可以利用一个继承属性来跟踪一个标识符,看它是出现在赋一个继承属性来跟踪一个标识符,看它是出现在赋值号的左边还是右边,以确定是需要这个标识符的值号的左边还是右边,以确定是需要这个标识符的地址还是值。地址还是值。

方法方法 编写说明语句的文法编写说明语句的文法 将类型信息作为类型描述 将类型信息作为类型描述 T T 的属性 的属性 type type 和变量和变量

表 表 L L 的属性的属性 inin 。。 目的目的

分析说明语句 分析说明语句 DD,为变量指定类型,为变量指定类型

Page 17: 第六章  属性文法和语法制导翻译

17

例 6.2 在该例子中,继承属性在说明中为各种标识符提供在该例子中,继承属性在说明中为各种标识符提供

类型信息。类型信息。 在表在表 6.26.2 中给出的属性文法中,由非终结符中给出的属性文法中,由非终结符 DD 所产所产

生的说明含关键字生的说明含关键字 intint 和和 realreal ,后跟一个标识符表,后跟一个标识符表。非终结符。非终结符 TT 有一个综合属性有一个综合属性 typetype ,它的值由说,它的值由说明中的关键字确定。与产生式明中的关键字确定。与产生式 D → T LD → T L 相应的语义相应的语义规则规则 L.in:=T.typeL.in:=T.type 把说明中的类型赋值给继承属性把说明中的类型赋值给继承属性L.inL.in 。然后,利用语义规则把继承属性。然后,利用语义规则把继承属性 L.inL.in 沿着沿着语法树往下传。与语法树往下传。与 LL 的产生式相应的语义规则调用的产生式相应的语义规则调用过程过程 addtypeaddtype 把每个标识符的类型填入符号表的把每个标识符的类型填入符号表的相应项中(符号表入口由属性相应项中(符号表入口由属性 entryentry 指明)。指明)。

Page 18: 第六章  属性文法和语法制导翻译

18

表表 6.2 6.2 带继承属性带继承属性 L.inL.in 的属性文的属性文法 法 产生式 语义规则产生式 语义规则 D → T L L.in := T.typeD → T L L.in := T.type T → int T.type := integerT → int T.type := integer T → real T.type := realT → real T.type := real L → LL → L11,id L,id L11.in := L.in.in := L.in addtype( id.entry, L.in )addtype( id.entry, L.in ) L → id addtype( id.entry, L.in )L → id addtype( id.entry, L.in )

entry entry 单词 单词 id id 的属性的属性 addtype addtype 在符号表中为变量添加类型信息在符号表中为变量添加类型信息

Page 19: 第六章  属性文法和语法制导翻译

19

例例 6.26.2 :: real id1,id2,id3 real id1,id2,id3 的分析树和属性计算的分析树和属性计算

r e a l

T. t ype=r eal

id 1

L .in= r e a l , id 2

L .in= r e a l , id 3

L .in= r e a l

D

addtypeaddtype

addtypeaddtype

addtypeaddtype

Type 标识类型,综合属性

In :起到类型传递作用,继承属性

Page 20: 第六章  属性文法和语法制导翻译

20

例:      利用下面的利用下面的  数字串的文法数字串的文法 计算一个输入串的值。计算一个输入串的值。

NN→→NN11D ND N→→D DD D→→0 D0 D→→1 D1 D→→99解:写出的属性文法如下:解:写出的属性文法如下:

产生式产生式 语义规则语义规则 NN→→NN11D              D             

      N.val:=NN.val:=N11.val*10+D.val.val*10+D.val

NN→→D D  N.val:=D.valN.val:=D.valDD→→0  0   D.val:=0D.val:=0   DD→→11 D.val:=1D.val:=1。。。。。。。。。。。。 。。。。。。。。。。。。DD→→99 D.val:=9D.val:=9

Page 21: 第六章  属性文法和语法制导翻译

21

例如字符串“例如字符串“ 186186”” 经过计算为经过计算为 186186 。。

Page 22: 第六章  属性文法和语法制导翻译

22

6.2 基于属性文法的处理方法 处理过程:处理过程: 对单词符号串进行语法分析,构造语法分析树,然后根对单词符号串进行语法分析,构造语法分析树,然后根

据需要遍历语法树并在语法树的各结点处按语义规则进行计据需要遍历语法树并在语法树的各结点处按语义规则进行计算。算。

输入串输入串→语法树→依赖图→语义规则计算次序→语法树→依赖图→语义规则计算次序 这种由源程序的语法结构所驱动的处理办法就是这种由源程序的语法结构所驱动的处理办法就是语法制导翻语法制导翻

译法译法。语义规则的计算可能产生代码、在符号表中存放信息。语义规则的计算可能产生代码、在符号表中存放信息、给出错误信息或执行任何其它动作。对输入符号串的翻译、给出错误信息或执行任何其它动作。对输入符号串的翻译也就是根据语义规则进行计算的结果。也就是根据语义规则进行计算的结果。

然而,一个具体的实现并不一定按照上面的步骤。在某些情然而,一个具体的实现并不一定按照上面的步骤。在某些情况下可用一遍扫描实现属性文法的语义规则计算。也就是说况下可用一遍扫描实现属性文法的语义规则计算。也就是说在语法分析的同时完成语义规则的计算,无须明显地构造语在语法分析的同时完成语义规则的计算,无须明显地构造语法树或构造属性之间的依赖图。法树或构造属性之间的依赖图。

Page 23: 第六章  属性文法和语法制导翻译

23

6.2.1 依赖图 依赖图依赖图:将一棵语法树中的结点的继承属性和综合:将一棵语法树中的结点的继承属性和综合

属性之间的相互依赖关系用一个有向图来描述,则 属性之间的相互依赖关系用一个有向图来描述,则 称该图为依赖图。称该图为依赖图。

如果在一棵语法树中一个结点的属性如果在一棵语法树中一个结点的属性 bb 依赖于属性依赖于属性cc ,那么这个结点处计算,那么这个结点处计算 bb 的语义规则必须在确定的语义规则必须在确定 cc的语义规则之后使用。的语义规则之后使用。

在为一棵语法树构造依赖图之前,可以为每一个包在为一棵语法树构造依赖图之前,可以为每一个包含过程调用的语义规则引入一个虚综合属性含过程调用的语义规则引入一个虚综合属性 bb ,这,这样每一个寓意规则都写成样每一个寓意规则都写成 b:=f(c1,c2,…,ck)b:=f(c1,c2,…,ck) 的形式。的形式。依赖图中为每一个属性设置一个结点,如果属性依赖图中为每一个属性设置一个结点,如果属性 bb依赖于属性依赖于属性 cc ,则从属性,则从属性 cc 的结点有一条有向边连的结点有一条有向边连到属性到属性 bb 的结点。的结点。

Page 24: 第六章  属性文法和语法制导翻译

24

依赖图的构造方法依赖图的构造方法for 分析树中每一结点 n do for 结点 n 的文法符号的每一个属性 a do 为 a 在依赖图中建立一个结点;

for 分析树中每一个结点 n do for 结点 n 所用产生式对应的每一条 语义规则 b: = f ( c1 , c2 ,…, ck )

do for i:=1 to k do 从结点 ci到结点 b 构造一条有向边;

Page 25: 第六章  属性文法和语法制导翻译

25

例如: 假设 假设 A.a:=f(X.x, Y.y)A.a:=f(X.x, Y.y) 是对应于产生式是对应于产生式 A A →→XYXY 的一个语义规则,这条语义规则确定了的一个语义规则,这条语义规则确定了依赖于属性依赖于属性 X.xX.x 和和 Y.yY.y 的综合属性的综合属性 A.aA.a 。如。如果在语法树中应用这个产生式,那么在依赖果在语法树中应用这个产生式,那么在依赖图中会有三个结点图中会有三个结点 A.aA.a ,, X.xX.x ,, Y.yY.y 。由于。由于A.aA.a 依赖于依赖于 X.xX.x ,所以有一条有向边从,所以有一条有向边从 X.xX.x连到连到 A.aA.a 。由于。由于 A.aA.a 也依赖于也依赖于 Y.yY.y ,所以还,所以还有一条有向边从有一条有向边从 Y.yY.y 连到连到 A.aA.a 。。

如果与产生式如果与产生式 A A →XY→XY 对应的语义规则还有对应的语义规则还有X.i:=g(X.i:=g(A.a, A.a, Y.y)Y.y)那么,图中还应有两条有向那么,图中还应有两条有向边,一条从边,一条从 A.aA.a 连到连到 X.iX.i ,另一条从,另一条从 Y.yY.y 连连到到 X.iX.i ,因为,因为 X.iX.i 依赖于依赖于 A.aA.a 和和 Y.yY.y 。。

Page 26: 第六章  属性文法和语法制导翻译

26

例 6.3 当下面的产生式应用于语法树中时,就可以像图当下面的产生式应用于语法树中时,就可以像图 6.46.4 所示的那所示的那

样把有向边加入到依赖图中。样把有向边加入到依赖图中。 产生式 语义规则产生式 语义规则 E E →E1+E2 E.val:=E1.val+E2.val→E1+E2 E.val:=E1.val+E2.val 依赖图中用依赖图中用 .. 来标志的三个结点分别代表语法树中相应结点的来标志的三个结点分别代表语法树中相应结点的

综合属性综合属性 E.valE.val ,, E1.valE1.val 和和 E2.valE2.val 。从。从 E1.valE1.val 到到 E.valE.val 的有的有向边表明向边表明 E.valE.val 依赖于依赖于 E1.valE1.val ,同样,,同样, E2.valE2.val 到到 E.valE.val 的有的有向边表明向边表明 E.valE.val 也依赖于也依赖于 E2.valE2.val 。图。图 6.46.4中的虚线表示的是中的虚线表示的是语法树,它不是依赖图中的一部分。语法树,它不是依赖图中的一部分。

E

E2E1

Val.

.val

.val

+图 6.4

Page 27: 第六章  属性文法和语法制导翻译

27

例 6.4 图图 6.56.5 表示的是图表示的是图 6.26.2 的依赖图。依赖图中的结点由数字来标识,这的依赖图。依赖图中的结点由数字来标识,这

些数字将在下面用到。从代表些数字将在下面用到。从代表 T.typeT.type 的结点的结点 44 有一条有向边连到代表有一条有向边连到代表 L.inL.in的结点的结点 55 ,因为根据产生式,因为根据产生式 D D →TL→TL 的语义规则的语义规则 L.in:=T.typeL.in:=T.type ,可知,可知 L.inL.in依赖于依赖于 T.typeT.type 。根据。根据 L→L1,idL→L1,id 的语义规则可知,有两条向下的有向边分的语义规则可知,有两条向下的有向边分别进入结点别进入结点 77 和和 99 。每一个与。每一个与 LL 产生式有关的语义规则产生式有关的语义规则 addtype(id.entryaddtype(id.entry,L.in),L.in)都产生一个虚属性,结点都产生一个虚属性,结点 66 ,, 88 和和 1010 都是为这些虚属性构造的。都是为这些虚属性构造的。

T L

L id3

L id2

D

id1

real ,

,

1 entry

2 entry

3 entry

4type

in 5 6

in 7 8

in 9 10

图图 6. 56. 5

Page 28: 第六章  属性文法和语法制导翻译

28

良定义 很显然,一条求值规则只有在其各变元值均很显然,一条求值规则只有在其各变元值均已求得的情况下才可以使用。但有时候可能已求得的情况下才可以使用。但有时候可能会出现一个属性对另一个属性的循环依赖关会出现一个属性对另一个属性的循环依赖关系。例如,系。例如, PP 、、 C1C1 、、 C2C2 都是属性,若有如都是属性,若有如下求值规则下求值规则 p:=f1(c1)p:=f1(c1) 、、 c1:=f2(c2) c1:=f2(c2) 、、 c2:=f3(c2:=f3(p)p) 时,就无法对时,就无法对 PP求值。求值。

如果一属性文法不存在属性之间的循环依赖如果一属性文法不存在属性之间的循环依赖关系,那么称该文法为关系,那么称该文法为良定义的良定义的。为了设计。为了设计编译程序,我们只处理良定义的属性文法。编译程序,我们只处理良定义的属性文法。

Page 29: 第六章  属性文法和语法制导翻译

29

属性的计算次序属性的计算次序◆拓扑排序 一个有向非循环图的拓扑排序是图中结点的任何顺序 m1 , m2 ,…, mk ,使得边必须是从序列中前面的结点指向后面的结点,也就是说,如果 mi→mj

是 mi 到 mj 的一条边 , 那么在 序列中 mi 必须出现在mj 的前面。

若依赖图中无环,则存在一个拓扑排序,它就是属性值的计算顺序。

一个依赖图的任何拓扑排序都给出一个语法树中结点的语义规则计算的有效顺序。这就是说,在拓扑排序中,在一个结点上,语义规则 b:=f(c1,c2,…,ck) 中的属性 c1,c2,…,ck 在计算 b 以前都是可用的。

Page 30: 第六章  属性文法和语法制导翻译

30

例 6.5

图图 6. 56. 5 的拓扑排序是:的拓扑排序是: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10

a4:=real;

a5:=a4;

addtype(id3entry,a5);

a7:=a5;

addtype(id2entry,a7);

a9:=a7;

addtype(id1entry,a9);

Page 31: 第六章  属性文法和语法制导翻译

31

6.2.2 树遍历的属性计算方法 通过树遍历计算属性值的方法有多种。这些方法都假设语法树已经建立起通过树遍历计算属性值的方法有多种。这些方法都假设语法树已经建立起了,并且树中已带有开始符号的继承属性和终结符的综合属性。然后以某了,并且树中已带有开始符号的继承属性和终结符的综合属性。然后以某种次序遍历语法树,直至计算出所有属性。最常用的方法是种次序遍历语法树,直至计算出所有属性。最常用的方法是深度优先深度优先。。

While While 还有未被计算的属性 还有未被计算的属性 do do visitNode(S) /*SvisitNode(S) /*S 是开始符号 是开始符号 */*/ Procedure VisitNode(N:Node);Procedure VisitNode(N:Node); BeginBegin if Nif N 是一个非终结符 是一个非终结符 thenthen /*/*假设它的产生式为假设它的产生式为 N N →x1…xm */→x1…xm */ for I:=1 to m dofor I:=1 to m do if not xi Vt then∈if not xi Vt then∈ beginbegin 计算计算 XiXi 的所有能够计算的继承属性;的所有能够计算的继承属性; VisitNode(Xi)VisitNode(Xi) end;end; 计算计算 NN 的所有能够计算的综合属性的所有能够计算的综合属性 End End

Page 32: 第六章  属性文法和语法制导翻译

32

例 6.6 考虑表考虑表 6.36.3 所给出的属性的文法所给出的属性的文法 GG 。其中,。其中, SS 有继承属性有继承属性 aa ,综合属,综合属

性性 bb ;; XX 有继承属性有继承属性 cc 、综合属性、综合属性 d;Yd;Y 有继承属性有继承属性 ee 、综合属性、综合属性 ff ;;ZZ 有继承属性有继承属性 hh 、综合属性、综合属性 gg 。。

表表 6.36.3 语义规则中有较复杂的依赖关系语义规则中有较复杂的依赖关系

产生式产生式 语义规则语义规则S S →XYZ→XYZ Z.h:=S.aZ.h:=S.a

X.c:=Z.gX.c:=Z.g

S.b:=X.d - 2S.b:=X.d - 2

Y.e:=S.bY.e:=S.b

X X →x→x X.d:=2*X.cX.d:=2*X.c

Y Y →y→y Y.f:=Y.e*3Y.f:=Y.e*3

Z Z →z→z Z.g:=Z.h+1Z.g:=Z.h+1

Page 33: 第六章  属性文法和语法制导翻译

33

假设假设 S.aS.a 的初始值为的初始值为 00 ,则输入串,则输入串 xyzxyz 的语的语法树如图法树如图 6.6(a)6.6(a) 所示。所示。

S:a=0

X ZY

x y z

(a)

S:a=0

X Z:h=0 g=1

Y

x y z

(b)

S:a=0,b=0

X:c=1 d=2

Z:h=0 g=1

Y

x y z

(c)

S:a=0,b=0

X:c=1 d=2

Z:h=0 g=1

Y:e=0 f=0

x y z

(d) 图 6.6 对文法 G 的属性计算步骤(a) 初始状态; (b) 对 VisitNode(s) 的第一次调用后;(c) 对 visitNode(s)第二次调用后; (d) 最终状态

Page 34: 第六章  属性文法和语法制导翻译

34

第一次遍历的执行过程如下:第一次遍历的执行过程如下: VisitNode(s)VisitNode(s) X.cX.c 不能计算不能计算 VisitNode(X)VisitNode(X) X.dX.d 不能计算不能计算 Y.eY.e 不能计算不能计算 VisitNode(Y)VisitNode(Y) Y.fY.f 不能计算不能计算 Z.h:=0Z.h:=0 VisitNode(Z)VisitNode(Z) Z.g:=1Z.g:=1 S.bS.b 不能计算不能计算 第一遍以后,树的状态如图第一遍以后,树的状态如图 6.6(b)6.6(b) 所示。第二次调用所示。第二次调用 VisitNode(S) VisitNode(S)

导致对导致对 X.cX.c 、、 X.dX.d 和和 S.bS.b 的依次计算,树的状态如图的依次计算,树的状态如图 6.6(e)6.6(e) 所示。所示。最后第三遍扫描算出最后第三遍扫描算出 YY 的两个属性,树的最终状态如图的两个属性,树的最终状态如图 6.6(d)6.6(d) 所所示示

Page 35: 第六章  属性文法和语法制导翻译

35

6.2.3 一遍扫描的处理方法 与树遍历的属性计算方法不同,一遍扫描的处理方法与树遍历的属性计算方法不同,一遍扫描的处理方法

是在语法分析的同时计算属性值,而不是语法分析构是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性的计算,而且无需构造实际的造语法树之后进行属性的计算,而且无需构造实际的语法树。采用这种处理方法,当一个属性值不再用于语法树。采用这种处理方法,当一个属性值不再用于计算其它属性值时,编译程序不必保留这个属性值。计算其它属性值时,编译程序不必保留这个属性值。

因为一遍扫描的处理方法与语法分析器的相互作用,因为一遍扫描的处理方法与语法分析器的相互作用,它与两个鲜明因素密切相关:它与两个鲜明因素密切相关:

11 )所采用的语法分析方法;)所采用的语法分析方法; 22 )属性的计算次序。)属性的计算次序。 如果按这种一遍扫描的编译程序模型来理解语法制导如果按这种一遍扫描的编译程序模型来理解语法制导

翻译方法的话,所谓翻译方法的话,所谓语法制导翻译法语法制导翻译法,直观上说就是,直观上说就是为文法中每个产生式配上一组语义规则,并且在语法为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则。分析的同时执行这些语义规则。

Page 36: 第六章  属性文法和语法制导翻译

36

6.2.4抽象语法树抽象语法(抽象语法( abstract syntaxabstract syntax )) 从具体语法中抽象出语言结构的本质性的东西,

而不考虑语言的具体符号表示,从而可简化语义的形式描述。

在不同的语言中赋值语句有不同的写法: x=y; x:=y; y→x 等等,可以用抽象形式 assignment(variable,expression)

把前面各种具体形式统一起来。

Page 37: 第六章  属性文法和语法制导翻译

37

抽象语法树抽象语法树 通过语法分析可以很容易构造出语法分析树,然后对语法

树进行遍历完成属性的计算。因此,语法树可以作为一种合适的中间语言形式。在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树。

语法树是常用的一种中间表示形式,把语法分析和翻译分开。语法分析过程中完成翻译有许多优点,但也有一些不足:

1.适于语法分析的文法可能不完全反映语言成分的自然层次结构;

2. 语法分析方法限制,对分析树结点的访问序和翻译需要的访问序不一致。

Page 38: 第六章  属性文法和语法制导翻译

38

抽象语法树的表示产生式 s→if B then S1 else S2 的语法树 if-then-else / | \ B S1 S2

赋值语句的语法树 assignment

variable expression 在抽象语法树中,操作符和关键字都不在叶结点,而在抽象语法树中,操作符和关键字都不在叶结点,而

是在内部结点中出现。是在内部结点中出现。

Page 39: 第六章  属性文法和语法制导翻译

39

例如:表达式 3*5+4 的抽象语法树

++

5533

44**

Page 40: 第六章  属性文法和语法制导翻译

40

建立表达式的抽象语法树 语法制导翻译既可以基于语法分析树,也可以基于语法制导翻译既可以基于语法分析树,也可以基于抽象语法树进行。两种情况所采用的基本方法是一抽象语法树进行。两种情况所采用的基本方法是一样的。都可在每个结点上带上一定的属性。样的。都可在每个结点上带上一定的属性。

建立表达式的抽象语法树与把表达式翻译成后缀形建立表达式的抽象语法树与把表达式翻译成后缀形式类似。可为每一个运算分量或运算符号都建立一式类似。可为每一个运算分量或运算符号都建立一个结点来为子表达式建立子树。运算符号结点的各个结点来为子表达式建立子树。运算符号结点的各子结点分别是表示该运算符号的各个运算分量的子子结点分别是表示该运算符号的各个运算分量的子表达式组成的子树的根。表达式组成的子树的根。

抽象语法树中的每一个结点可以由包含几个域的记抽象语法树中的每一个结点可以由包含几个域的记录来实现的。在一个运算符号对应的结点中,一个录来实现的。在一个运算符号对应的结点中,一个域标识运算符号,其它域包含指向运算分量的结点域标识运算符号,其它域包含指向运算分量的结点的指针。运算符号通常叫作这个结点的的指针。运算符号通常叫作这个结点的标号标号。当进。当进行翻译时,抽象语法树中的结点可能会用附加的域行翻译时,抽象语法树中的结点可能会用附加的域来存放结点的属性值(或指向属性值的指针)。来存放结点的属性值(或指向属性值的指针)。

Page 41: 第六章  属性文法和语法制导翻译

41

建立表达式的抽象语法树使用的函数建立表达式的抽象语法树使用的函数 在这一节中,用下面的一些函数来建立表示带有在这一节中,用下面的一些函数来建立表示带有二目算符的表达式的抽象语法树中的结点。每一二目算符的表达式的抽象语法树中的结点。每一个函数都返回一个指向新建立结点的指针。个函数都返回一个指向新建立结点的指针。

1. mknode(op,left,right) 建立一个运算符号运算符号结点,标号是 op, 两个域 left 和 right 指向运算分量结点的指针。

2.mkleaf(id,entry) 建立一个标识符标识符结点 , 由标号 id标识,一个域 entry 指向标识符符号表中相应的项。

3. mkleaf(num,val) 建立一个数数结点,标号为 num ,域 val 用于存放数的值。

Page 42: 第六章  属性文法和语法制导翻译

42

例例 6.7 6.7 下面一系列函数调用建立了表达式下面一系列函数调用建立了表达式 a-4+ca-4+c 的抽的抽象语法树(见图象语法树(见图 6.76.7 )。在这个序列中,)。在这个序列中, p1,p2,…, pp1,p2,…, p55 是指向结点的指针,是指向结点的指针, entryaentrya 和和 entrycentryc 分别是指向符分别是指向符号表中的标识符号表中的标识符 aa 和和 cc 的指针。的指针。

1) p1:=mkleaf(id,entrya);1) p1:=mkleaf(id,entrya); 2) p2:=mkleaf(num,4);2) p2:=mkleaf(num,4); 3) p3:=mknode(‘-’,p1,p2);3) p3:=mknode(‘-’,p1,p2); 4) p4:=mkleaf(id,entryc);4) p4:=mkleaf(id,entryc); 5) p5:=mknode(‘+’,p3,p4);5) p5:=mknode(‘+’,p3,p4); 这棵抽象语法树是自底向上构造起来的。函数调用这棵抽象语法树是自底向上构造起来的。函数调用

mkleaf(id,entrya)mkleaf(id,entrya) 和和 mkleaf(num,4)mkleaf(num,4) 建立了叶结点建立了叶结点 aa 和和44 ,指向这两个结点的指针分别用,指向这两个结点的指针分别用 p1p1 和和 p2p2 存放。函存放。函数调用数调用 mknode(‘-’,p1,p2)mknode(‘-’,p1,p2) 建立内部结点,它以叶结点建立内部结点,它以叶结点aa 和和 44 为子结点。再经过两步,为子结点。再经过两步, p5p5 成为指向根结点成为指向根结点的左指针。的左指针。

Page 43: 第六章  属性文法和语法制导翻译

43

id

to entry for a

num 4

– id

to entry for c

+

图图 6.7 a-4+c6.7 a-4+c 的语法树的语法树

Page 44: 第六章  属性文法和语法制导翻译

44

表 6.4 为表达式建立抽象语法树的属性文法 产生式 语义规则产生式 语义规则 EE1+T E.nptr:=mknode('+',E1.nptr,T.nptr)

E E1-T E.nptr:=mknode('-',E1.nptr,T.nptr)

E T E.nptr:=T.nptr

T (E) T.nptr:=E.nptr

T id T.nptr:=mkleaf(id,id.entry)

T num T.nptr:=mkleaf(num,num.val)

Page 45: 第六章  属性文法和语法制导翻译

45

例例 6.8 6.8 一个带注释的语法分析树如图一个带注释的语法分析树如图 6.86.8 所示,所示,它用来描绘表达式它用来描绘表达式 a-4+ca-4+c 的抽象语法树的构造。的抽象语法树的构造。语法分析树是用虚线表示的。语法分析树之中的语法分析树是用虚线表示的。语法分析树之中的EE 和和 TT 标识的结点用综合属性标识的结点用综合属性 nptrnptr 来保存指向抽来保存指向抽象语法树中非终结符号代表的表达式结点的指针象语法树中非终结符号代表的表达式结点的指针。见书。见书 146146

idto entry a

num 4

– id

to entry c

+

图图 6.8 a-4+c6.8 a-4+c的抽象语法树的构造的抽象语法树的构造

1 .1 . 每个非终结符号有一个语法树结点的指针属性。每个非终结符号有一个语法树结点的指针属性。

2 .2 . 非终结符号归约为建立结点。非终结符号归约为建立结点。

Page 46: 第六章  属性文法和语法制导翻译

46

6.3 S- 属性文法的自下而上计算 S-S- 属性文法:只含有综合属性。属性文法:只含有综合属性。 综合属性可以在分析输入符号串的同时由综合属性可以在分析输入符号串的同时由自下而上的分析器来计算。分析器可以保自下而上的分析器来计算。分析器可以保存与栈中文法符号有关的综合属性值,每存与栈中文法符号有关的综合属性值,每当进行规约时,新的属性值就由栈中正在当进行规约时,新的属性值就由栈中正在规约的产生式右边符号的属性值来计算。规约的产生式右边符号的属性值来计算。

在自底向上的分析方法中,可以使用一个在自底向上的分析方法中,可以使用一个栈来存放分析过的子树的信息。现在可以栈来存放分析过的子树的信息。现在可以在分析栈中使用一个附加的域来存放综合在分析栈中使用一个附加的域来存放综合属性值。属性值。

Page 47: 第六章  属性文法和语法制导翻译

47

例子: 下图表示的是一个带有一个属性值空间的分析栈的下图表示的是一个带有一个属性值空间的分析栈的

例子。假设图中的栈是由一对数组例子。假设图中的栈是由一对数组 statestate 和和 valval 来实来实现的。每一个现的。每一个 statestate元素都是一个指向元素都是一个指向 LRLR (( 11 )分)分析表的指针(或索引)。然而,如果像第五章中那析表的指针(或索引)。然而,如果像第五章中那样把文法符号放入栈中时,那么当第样把文法符号放入栈中时,那么当第 ii 个个 statestate 对应对应的符号为的符号为 AA 时,时, val[i]val[i] 中就存放语法树中与结点中就存放语法树中与结点 AA对应的属性值。对应的属性值。

state val...X X.xY

...

Y.y

......Z Z.ztop

Page 48: 第六章  属性文法和语法制导翻译

48

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

b 是 A 的综合属性, ci(1 ik) 是中符号的属性。综合属性的值在自底向上的分析过程中,每步归约时,计算相应的属性值。

AXYZ Aa:=f(X x, Y y,Z z)

A a

X x Y y Z z

Page 49: 第六章  属性文法和语法制导翻译

49

定义式 A .a:=f(X.x, Y.y, Z.z)A .a:=f(X.x, Y.y, Z.z) (抽象)变成val[ntop]:=f(val[top-2],val[top-1],val[top])val[ntop]:=f(val[top-2],val[top-1],val[top])(具体可执

行代码 )

在执行代码段之前执行: ntop:=top-r+1 r 是句柄的长度执行代码段后执行: top:=ntop;

top

state val... ...X X.xY Y.yZ Z.z

state val......

A A .atop

Page 50: 第六章  属性文法和语法制导翻译

50

例例 6.10 6.10 用用 LRLR 分析器实现台式计算器分析器实现台式计算器 (( 表表 6.6.55 ))

产生式 代码段 ( 和表 6.1 对比)LEn printf(val[ntop])

E E+T val[ntop]:=val[top-2]+val[top]

E T

T T*F val[ntop]:=val[top-2]*val[top]

T F

F (E) val[ntop]:=val[top-1]

F digit

Page 51: 第六章  属性文法和语法制导翻译

51

表表 6.6 6.6 输入串输入串 3*5+4n3*5+4n 的语义分析过程的语义分析过程

产生式 代码段LEn printf(val[ntop])E E+T val[ntop]:=val[top-2]+val[top]E TT T*F val[ntop]:=val[top-2]*val[top]T FF (E) val[ntop]:=val[top-1]F digit

输入 输入 state val state val 使用的产生式使用的产生式3*5+4n - - *5+4n 3 3 *5+4n F 3 Fdigit *5+4n T 3 TF 5+4n T* 3- +4n T* 5 3-5 +4n T* F 3-5 F digit

Page 52: 第六章  属性文法和语法制导翻译

52

产生式 代码段LEn printf(val[ntop])E E+T val[ntop]:=val[top-2]+val[top]E TT T*F val[ntop]:=val[top-2]*val[top]T FF (E) val[ntop]:=val[top-1]F digit

+4n T 15 T T*F +4n E 15 E T 4n E+ 15- n E+4 15-4 n E+F 15-4 F digit n E+T 15-4 T F n E 19 E E+T En 19 - L 19 L En

输入 输入 state val state val 使用的产生式使用的产生式

Page 53: 第六章  属性文法和语法制导翻译

53

S-S- 属性小结属性小结

采用自底向上分析自底向上分析,例如 LR 分析,首先给出 S-S- 属性定义属性定义,然后,把 S- 属性定义变成可执行的代码段,这就构成了翻译程序。

Page 54: 第六章  属性文法和语法制导翻译

54

6.4 L-6.4 L- 属性文法和自顶向下翻译属性文法和自顶向下翻译 在语法分析过程中进行语义分析和翻译,在语法分析过程中进行语义分析和翻译,

属性的计算顺序受到语法分析建立分析属性的计算顺序受到语法分析建立分析树结点顺序的限制。树结点顺序的限制。

一种自然的计算属性的顺序是按深度优先 访问分析树结点的顺序,它适应多种自底 向上和自顶向下的翻译方法。

L- 属性定义 可用于按深度优先顺序计算属性值。

Page 55: 第六章  属性文法和语法制导翻译

55

深度优先顺序计算属性深度优先顺序计算属性

PROCEDURE dfvisit(n:node); BEGIN FOR n 的每个子结点 m, 从左至右 DO BEGIN 计算 m 的继承属性; dfvisit(m) END; 计算 n 的综合属性 END;

Page 56: 第六章  属性文法和语法制导翻译

56

L-L- 属性定义属性定义定义 一个语法制导定义是 L-L- 属性定义属性定义,如果

A→XA→X11XX22…X…XnnP, 其每一个语义规则中的每一个属性都是一个综合属性,或是 Xj(1j

n) 的一个继承属性,这个继承属性仅依赖于 1. 1. 产生式中产生式中 XXjj 的左边符号的左边符号 XX11 ,, XX22 ,…,… XXj-1j-1

的属性; 的属性; 22 .. AA 的继承属性。的继承属性。

每一个每一个 S-S- 属性定义都是属性定义都是 L-L- 属性定义。属性定义。

Page 57: 第六章  属性文法和语法制导翻译

57

表表 6.7 6.7 是否为是否为 L-L- 属性的语法制导定义?属性的语法制导定义?

解:解:表表 6.76.7 的语法制导定义不是的语法制导定义不是 L-L- 属性定义属性定义文法符号文法符号 QQ 的继承属性依赖于它右边文法符号的继承属性依赖于它右边文法符号 RR 的属性的属性

产生式产生式 语义规则语义规则

ALM

A QR

L.i:=l(A.i)M.i:=m(L.s)A.s:=f(M.s)R.i:=r(A.i)Q.i:=q(R.s)A.s:=f(Q.s)

Page 58: 第六章  属性文法和语法制导翻译

58

6.4.1 6.4.1 翻译模式翻译模式◆◆定义定义 翻译模式是语法制导定义的一种便于翻译的书翻译模式是语法制导定义的一种便于翻译的书

写形式。其中属性与文法符号相对应,语义规写形式。其中属性与文法符号相对应,语义规则或语义动作用花括号{ }括起来,可被插入则或语义动作用花括号{ }括起来,可被插入到产生式右部的任何合适的位置上。到产生式右部的任何合适的位置上。

这是一种语法分析和语义动作交错的表示法,这是一种语法分析和语义动作交错的表示法,它表达在按深度优先遍历分析树的过程中何时它表达在按深度优先遍历分析树的过程中何时执行语义动作。执行语义动作。

翻译模式给出了使用语义规则进行计算的顺翻译模式给出了使用语义规则进行计算的顺序。可看成是分析过程中翻译的注释。序。可看成是分析过程中翻译的注释。

Page 59: 第六章  属性文法和语法制导翻译

59

例:一个简单的翻译模式例:一个简单的翻译模式 E→TR R→addop T {print(addop.lexeme)}R1|ε T→num{print(num.val)}

把语义动作看成终结符号,输入把语义动作看成终结符号,输入 9-5+2,9-5+2, 其其分析树如图分析树如图 6. 106. 10 ,当按深度优先遍历它,,当按深度优先遍历它,执行遍历中访问的语义动作,将输出执行遍历中访问的语义动作,将输出

9 5 - 2 +

它是输入表达式它是输入表达式 9-5+29-5+2 的后缀式。的后缀式。

Page 60: 第六章  属性文法和语法制导翻译

60

E

T

9 TPt(´9´)Pt(´9´) RPt(´-´)Pt(´-´)

Pt(´+´)Pt(´+´)

R

-

5 Pt(´5´)Pt(´5´) + T

2 Pt(´2´)Pt(´2´)

R

图图 6.10 9-5+26.10 9-5+2 的带语义动作的分析树的带语义动作的分析树E→TR R→addop T {print(addop.lexeme)}R1|ε T→num {print(num.val)}

Page 61: 第六章  属性文法和语法制导翻译

61

设计翻译模式(根据语法制导定义)设计翻译模式(根据语法制导定义)条件:条件:语法制导定义是语法制导定义是 L-L- 属性定义属性定义保证语义动作不会引用还没有计算的属性值。保证语义动作不会引用还没有计算的属性值。

1. 1. 只需要综合属性的情况:只需要综合属性的情况:  为每一个语义规则建立一个包含赋值的动作,

并把这个动作放在相应的产生式右边右边的末尾末尾。

例如:语法和语义规则如下,请写出其翻译模式:

TT1*F Tval:=T1 val*F val 解: TT1*F {Tval:=T1 val*F val}

Page 62: 第六章  属性文法和语法制导翻译

62

2. 既有综合属性又有继承属性

● 产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。

● 一个动作不能引用这个动作右边符号的综合属性。

● 产生式左边非终结符号的综合属性只有在它所引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常可放在产生式右端的未尾。

例:下面的翻译模式满足要求吗 ?例:下面的翻译模式满足要求吗 ?

SSAA11AA2 2 {A {A11.in:=1; A.in:=1; A22.in:=2}.in:=2}

A A a { print(A.in }a { print(A.in } PrintPrint(A.in(A.in

))

PrintPrint(A.in(A.in

))

S

A

a

A

a

AA11.in:=1; .in:=1;

AA22.in:=2.in:=2

解:不满足因为:从因为:从 SS开始按深度优先遍历开始按深度优先遍历 A1A1 和和 A2A2 子树之前,子树之前,A1.inA1.in 和和 A2.inA2.in还未赋值。还未赋值。

Page 63: 第六章  属性文法和语法制导翻译

63

输入文法和翻译文法的概念输入文法和翻译文法的概念输入文法输入文法:未插入动作符号时的文法:未插入动作符号时的文法

由输入文法可以通过推导产生输入序列由输入文法可以通过推导产生输入序列

翻译文法翻译文法:插入动作符号的文法:插入动作符号的文法

由翻译文法可以通过推导产生活动序列由翻译文法可以通过推导产生活动序列

输入序列输入序列动作序列动作序列

Page 64: 第六章  属性文法和语法制导翻译

64

6.4.2 自顶向下翻译用翻译模式构造自顶向下翻译。

从翻译模式中消除左递归 从翻译模式中消除左递归

对于一个翻译模式,若采用自顶向下分析,必须必须消除左递归消除左递归和提取左公因子提取左公因子,在改写基本文法时考虑属性值的计算。

例例 6.14 6.14 带左递归的文法的翻译模式构造方法?带左递归的文法的翻译模式构造方法?

Page 65: 第六章  属性文法和语法制导翻译

65

例 6.14 图 6.13 的带左递归的文法的翻译模式被转换成图 6.14 的带右递归的文法的翻译模式

E E1+T{ E val:=E1val+T val}

E E1-T { E val:=E1 val-T val} E T {E.val:=T val}

T (E) { T val:=E val} T num { T val:=num val}

图图 6.13 6.13 带左递归的文法的翻译模式带左递归的文法的翻译模式

Page 66: 第六章  属性文法和语法制导翻译

66

E→T {Ri:=T val} R{ E val:=R s} R→+ T{ R1i:=R.i+T. val} R1{ R. s:=R1 s} R→- T{ R1 i:=R i-Tval} R1{ R s:=R1 s} R→ε{ R s:=R i} T→ ( E ) { T val:=E.va

l} T→num {T val:=num val}

EEEE11+T +T

E E E E11-T -T

E E T T T T (E) (E) T T num num

E E TR TR

RR(+T|-T)R| (+T|-T)R| εεT T (E) (E) T T num num

继承属性 i综合属性 s

图图 6.146.14 经过转换的带有右递归文法的翻译模式经过转换的带有右递归文法的翻译模式

Page 67: 第六章  属性文法和语法制导翻译

67

图图 6.15 6.15 表达式表达式 9-5+29-5+2 的计的计算算

E→T {RE→T {Ri:=T i:=T val} val} R{E R{E val:=R val:=R s} s} R→+T{RR→+T{R11i:=R.i+T. i:=R.i+T. vv

al} al} RR11{R. {R. s:=Rs:=R11 s} s}

R→-T{RR→-T{R11 i:=R i:=R i-T i-Tvv

al} al} RR11{R {R s:=Rs:=R11 s} s}

R→εR→ε{{ R R s:=R s:=R i} i} T→(E){T T→(E){T val:=E.val:=E.val} val} T→T→num {Tnum {Tval:=num val:=num val} val}

E val=6

Tval=9

R i=9; R s= 6

9– T val=

5

5

R i=4; R s= 6

+ T val=2

R i=6; R s= 62

Tval=9

R i=9

T val=5 R i=4

T val=2 R i=6R s= 6

R s= 6

R s= 6

E val=6

Page 68: 第六章  属性文法和语法制导翻译

68

◆关于左递归翻译模式更一般化的讨论• 左递归翻译模式 A→A1Y{ A.a:=g(A1.a,Y.y)} A→X { A.a:=f(X.x)} ( 6.2 ) 每一个文法符号都有一个综合属性,用相应的小写字母表示, g 和 f 是任意函数。

• 消除左递归,文法转换成 A→X R R→Y R|ε ( 6.3 )•再考虑语义动作,翻译模式变为: A→X { Ri:=f(X x)} R { A. a:=R. s} R→Y { R1 i:=g ( R i,Y y ) } R1 { R s:=R1 s} R→ε{ R s:=R i} ( 6.4 ) 经过转换的翻译模式,使用 R 的继承属性 i 和综合属性 s。

Page 69: 第六章  属性文法和语法制导翻译

69

例输入:例输入: XYXY11YY22

采用左递归翻译模式A→AA→A11YY {{ A.a:=g(AA.a:=g(A11.a,Y.y)} .a,Y.y)}

A→X A→X {{ A.a:=f(X.x)} A.a:=f(X.x)}

Y2

Y1

X (a)(a)

A

A

A

A a=g(g(f(X x),Y1 y),Y2 y)

A a=g(f(X x),Y1 y)

A a=f(X x)

Page 70: 第六章  属性文法和语法制导翻译

70

例输入:例输入: XYXY11YY2 2 消除左递归后翻译模式A→X A→X {{ RRi:=f(X i:=f(X x)} x)} R R {{ A. A. a:=R. a:=R. s} s} R→Y R→Y {{ RR11 i:=g(R i:=g(R i,Y i,Y

y)} y)} RR11 {{ R R s:=R s:=R11 s} s}

R→εR→ε{{ R R s:=R s:=R i} i}

A

ε

Y2

Y1

X

(b)(b)

R

R

R

Ri=f(X x)

R i=g(f(X x),Y1 y)

R i=g(g(f(X x),Y1 y),Y2 y)

Page 71: 第六章  属性文法和语法制导翻译

71

例例 6. 15 6. 15 表达式建立语法树的翻译模式:表达式建立语法树的翻译模式: EE1+T

{Enptr :=mknode(´+´,E1 nptr,T nptr)}

EE1-T

{Enptr :=mknode(´-´,E1 nptr,T nptr)}

ET {Enptr :=T nptr} 从翻译模式中消除左递归,变成图从翻译模式中消除左递归,变成图 6.176.17 的的翻译模式。翻译模式。

Page 72: 第六章  属性文法和语法制导翻译

72

图图 6.176.17 EEEE11+T {E+T {Enptr :=mknode(´+´,nptr :=mknode(´+´,

EE11 nptr,T nptr,T nptr)}nptr)}

EEEE11-T {E-T {Enptr :=mknode(´-´,nptr :=mknode(´-´,

EE11 nptr,T nptr,T nptr)nptr)

}}EET {ET {Enptr :=T nptr :=T nptr}nptr}

E→T {Ri:=T nptr} R { E nptr:=R s} R→+ T { R1 i:=mknode('+',R i,T nptr)} R1 { R s:=R1 s} R→- T { R1 i:=mknode('-',R i,T nptr)} R1 {R s:=R1 s} R→ε { R s:=R i} T→( E ) {T nptr:=E nptr} T→id {T nptr:=mkleaf(id, id entry)} T→num { T nptr:=mkleaf(num,num val)}

Page 73: 第六章  属性文法和语法制导翻译

73

使用继承属性构造语法树使用继承属性构造语法树E

i R s

T

id

R

- T

num

i R

T

ε+

id

id num 4

id - +

to entry for a

to entry for c

nptr

nptrnptr

Page 74: 第六章  属性文法和语法制导翻译

74