110
第第第 第第第第第第第 第第第第 1 第第第第第第第第 第第第第第第 、一: 第第第第第第第 第第第第第第第 第第 ,体 第第第第第第第 第第第第 2 第第第第第第第第第第第第第

第四章 语法制导的翻译

  • Upload
    channer

  • View
    121

  • Download
    0

Embed Size (px)

DESCRIPTION

第四章 语法制导的翻译. 本章内容 1 、介绍语义描述的一种形式方法: 语法制导的翻译 ,它包括两种具体形式 语法制导的定义 翻译方案 2 、介绍语法制导翻译的实现方法. 4.1 语法制导的定义. 例简单计算器的语法制导定义. 4.1 语法制导的定义. 4.1.1 语法制导定义的形式 基础文法 每个文法符号有一组属性 每个文法产生式 A   有 一组形式为 b = f ( c 1 , c 2 , …, c k ) 的语义规则 , 其中 b 和 c 1 , c 2 , …, c k 是该产生式文法符号的属性, f 是函数 - PowerPoint PPT Presentation

Citation preview

Page 1: 第四章   语法制导的翻译

第四章 语法制导的翻译 • 本章内容

1 、介绍语义描述的一种形式方法:语法制导的翻译,它包括两种具体形式

– 语法制导的定义– 翻译方案2 、介绍语法制导翻译的实现方法

Page 2: 第四章   语法制导的翻译

4.1 语法制导的定义• 例 简单计算器的语法制导定义

产 生 式 语 义 规 则 L E n print (E.val) E E1 + T E.val = E1 .val + T.val

E T E.val = T.val T T1 F T.val = T1.val F.val

T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 3: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.1 语法制导定义的形式• 基础文法• 每个文法符号有一组属性• 每个文法产生式 A 有

一组形式为 b=f(c1, c2, …, ck ) 的语义规则,其中b 和 c1, c2, …, ck 是该产生式文法符号的属性,f 是函数

• 综合属性:如果 b 是 A 的属性, c1 , c2 , …, ck

是产生式右部文法符号的属性或 A 的其它属性• 继承属性:如果 b 是右部某文法符号 X 的属性

Page 4: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.2 综合属性S 属性定义:仅使用综合属性的语法制导定义

产 生 式 语 义 规 则 L E n print (E.val) E E1 + T E.val = E1 .val + T.val

E T E.val = T.val T T1 F T.val = T1.val F.val

T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 5: 第四章   语法制导的翻译

4.1 语法制导的定义注释分析树 : 结点的属性值都标注出来的分析

树8+5*2 n 的注释分析树

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 6: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 7: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 8: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 9: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 10: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 11: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 12: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 13: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 14: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 15: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 16: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 17: 第四章   语法制导的翻译

4.1 语法制导的定义分析树各结点属性的计算可以自下而上地完成

digit.lexval = 2

L

E.val = 18 n

T.val = 10E.val = 8

T.val = 8

F.val = 8

digit.lexval = 8

T.val = 5

+

F.val = 5

F.val = 2

digit.lexval = 5

Page 18: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.3 继承属性

int id, id, id

产 生 式 语 义 规 则 D TL L.in = T.type T int T. type = integer

T real T. type = real

L L1, id L1.in = L.in;

addType(id.entry, L.in) L id addType(id.entry, L.in)

Page 19: 第四章   语法制导的翻译

4.1 语法制导的定义• 例 int id1, id2, id3 的标注了部分属性的分析

树不可能像像综合属性那样自下而上标注属性

D

int

T.type = integer

, id3

L.in = integer

L.in = integer

L.in = integer id2

id1

,

Page 20: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.4 属性依赖图• 例 int id1, id2, id3 的分析树(虚线)的依赖

图(实线) D TL L.in = T.type D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 21: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.4 属性依赖图• 例 int id1, id2, id3 的分析树(虚线)的依赖

图(实线) L L1, id L1.in = L.in; addType (id.entry,

L.in) D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 22: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.4 属性依赖图• 例 int id1, id2, id3 的分析树(虚线)的依赖

图(实线) L id addType (id.entry,

L.in) D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 23: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.5 属性计算次序1 、拓扑排序:结点的一种排序,使得边只会从该次

序中先出现的结点到后出现的结点• 例 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10

D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 24: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.5 属性计算次序2 、属性计算次序:构造输入的分析树

D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 25: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.5 属性计算次序2 、属性计算次序:构造输入的分析树,构造属性依

赖图D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 26: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.5 属性计算次序2 、属性计算次序:构造输入的分析树,构造属性依

赖图,对结点进行拓扑排序D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 27: 第四章   语法制导的翻译

4.1 语法制导的定义4.1.5 属性计算次序2 、属性计算次序:构造输入的分析树,构造属性依

赖图,对结点进行拓扑排序,按拓扑排序的次序计算属性 D

int

T

, id3

L

L

L id2

id1

,

1 entry

10 2 entry

3 entry

in 9

8in 7

6in 54 type

Page 28: 第四章   语法制导的翻译

4.1 语法制导的定义语义规则的计算方法• 分析树方法:刚才介绍的方法,动态确定计

算次序,效率低 概念上的一般方法• 基于规则的方法:(编译器实现者)静态确

定(编译器设计者提供的)语义规则的计算次序 适用于手工构造的方法

• 忽略规则的方法:(编译器实现者)事先确定属性的计算策略(如边分析边计算) , (编译器设计者提供的)语义规则必须符合所选分析方法的限制 适用于自动生成的方法

Page 29: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算4.2.1 语法树• 语法树是分析树的浓缩表示:算符和关键字是作为

内部结点• 语法制导翻译可以基于分析树,也可以基于语法树• 语法树的例子:

if B then S1 else S2 8 + 5 2

if-then-else

B S1S2

+

*

25

8

Page 30: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算4.2.2 构造语法树的语法制导定义产 生 式 语 义 规 则 E E1 + T E.nptr = mkNode( ‘+’, E1.nptr, T.nptr)

E T E.nptr = T.nptr T T1 F T.nptr = mkNode( ‘’, T1.nptr, F.nptr)

T F T.nptr = F.nptr F (E) F.nptr = E.nptr F id F.nptr = mkLeaf (id, id.entry) F num F.nptr = mkLeaf (num, num.val)

Page 31: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 32: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 33: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 34: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 35: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 36: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 37: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 38: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 39: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算a+5b 的语法树的构造

E.nptr

T.nptrE.nptr

T.nptr

F.nptr

id

T.nptr

+

F.nptr

F.nptr

id

num

id idnum 5

+

指向符号表中 a 的入口

指向符号表中 b 的入口

Page 40: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算4.2.3 S 属性的自下而上计算

LR 分析器的栈增加一个域来保存综合属性值

若产生式 A →XYZ 的语义规则是A.a = f (X.x, Y.y, Z.z) ,那么归约后:

. . . . . .

A A.a

. . . . . .

top

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

Page 41: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 语 义 规 则 L E n print (E.val) E E1 + T E.val =E1 .val +T.val

E T E.val = T.val T T1 F T.val = T1.val F.val

T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 42: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (E.val) E E1 + T E.val =E1 .val +T.val

E T E.val = T.val T T1 F T.val = T1.val F.val

T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 43: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (val [ top1] ) E E1 + T E.val =E1 .val +T.val

E T E.val = T.val T T1 F T.val = T1.val F.val

T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 44: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (val [ top1] ) E E1 + T val [top 2 ] =

val [top 2]+val [top] E T E.val = T.val T T1 F T.val = T1.val F.val

T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 45: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (val [ top1] ) E E1 + T val [top 2 ] =

val [top 2]+val [top] E T T T1 F T.val = T1.val F.val

T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 46: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (val [ top1] ) E E1 + T val [top 2 ] =

val [top 2]+val [top] E T T T1 F val [top 2 ] =

val [top 2]val [top] T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval

Page 47: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (val [ top1] ) E E1 + T val [top 2 ] =

val [top 2]+val [top] E T T T1 F val [top 2 ] =

val [top 2]val [top] T F F (E) F.val = E.val F digit F.val = digit.lexval

Page 48: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (val [ top1] ) E E1 + T val [top 2 ] =

val [top 2]+val [top] E T T T1 F val [top 2 ] =

val [top 2]val [top] T F F (E) val [top 2 ] =

val [top 1] F digit F.val = digit.lexval

Page 49: 第四章   语法制导的翻译

4.2 S 属性定义的自下而上计算简单计算器的语法制导定义改成栈操作代码

. . . . . .

Z Z. z

Y Y. y

X X.x

. . . . . .

栈 state val

top

产 生 式 代 码 段 L E n print (val [ top1] ) E E1 + T val [top 2 ] =

val [top 2]+val [top] E T T T1 F val [top 2 ] =

val [top 2]val [top] T F F (E) val [top 2 ] =

val [top 1] F digit

Page 50: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算边分析边翻译的方式能否用于继承属性?

• 属性的计算次序一定受分析方法所限定的分析树结点建立次序的限制

• 分析树的结点是自左向右生成• 如果属性信息是自左向右流动,那么就有可能在分

析的同时完成属性计算

Page 51: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算4.3.1 L 属性定义

• 如果每个产生式 AX1…Xj-1Xj…Xn 的每条语义规则计算的属性是 A 的综合属性;或者是Xj 的继承属性,但它仅依赖:– 该产生式中 Xj 左边符号 X1, X2, …, Xj-1 的属性;– A 的继承属性

• S 属性定义属于 L 属性定义

Page 52: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算变量类型声明的语法制导定义是一个 L 属性定

义 产 生 式 语 义 规 则 D TL L.in = T.type T int T. type = integer

T real T. type = real

L L1, id L1.in = L.in;

addType(id.entry, L.in) L id addType(id.entry, L.in)

Page 53: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算4.3.2 翻译方案• 例 把有加和减的中缀表达式翻译成后缀表达式

如果输入是 8+5 2 ,则输出是 8 5 + 2 E T RR addop T {print (addop.lexeme)} R1 | T num {print (num.val)}

E T R num {print (8)} R num{print (8)}addop T{print (+)}R num{print(8)}addop num{print(5)}{print (+)}R … {print(8)}{print(5)}{print(+)}addop T{print()}R

… {print(8)}{print(5)}{print(+)}{print(2)}{print()}

Page 54: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算• 例 数学排版语言 EQN E sub 1 .val

S B B B1 B2

B B1 sub B2

B text

E 1 .val

Page 55: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算• 例 数学排版语言 EQN (语法制导定义) E sub 1 .val

产 生 式 语 义 规 则 S B B.ps = 10; S.ht = B.ht B B1 B2 B1.ps = B.ps; B2.ps = B.ps;

B.ht = max(B1.ht, B2.ht )

B B1 sub B2 B1.ps =B.ps; B2.ps = shrink(B.ps);

B.ht = disp (B1.ht, B2.ht )

B text B.ht = text.h B.ps

E 1 .val

Page 56: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算• 例 数学排版语言 EQN (翻译方案) S {B.ps = 10 } B 继承属性的计算

B {S.ht = B.ht } 位于 B 的左边

Page 57: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算• 例 数学排版语言 EQN (翻译方案) S {B.ps = 10 } B 综合属性的计算

B {S.ht = B.ht } 放在右部末端

Page 58: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算• 例 数学排版语言 EQN (翻译方案) S {B.ps = 10 }

B {S.ht = B.ht } B {B1.ps = B.ps } B1 {B2.ps = B.ps } B2 {B.ht = max(B1.ht, B2.ht ) } B { B1.ps =B.ps } B1

sub { B2.ps = shrink(B.ps) }B2 {B.ht = disp (B1.ht, B2.ht ) }

 B text {B.ht = text.h B.ps }

Page 59: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算• 例 左递归的消除引起继承属性

产 生 式 语 义 规 则 E E1 + T E.nptr = mkNode( ‘+’, E1.nptr, T.nptr)

E T E.nptr = T.nptr T T1F T.nptr = mkNode( ‘’, T1.nptr, F.nptr)

T F T.nptr = F.nptr F (E) F.nptr = E.nptr F id F.nptr = mkLeaf (id, id.entry) F num F.nptr = mkLeaf (num, num.val)

Page 60: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算E T {R.i = T.nptr} T + T + T + …

R {E.nptr = R.s}R +

T {R1.i = mkNode ( ‘+’, R.i, T.nptr)}R1 {R.s = R1.s}

R {R.s = R.i }T F {W.i = F.nptr}

W {T.nptr = W.s}W

F {W1.i = mkNode ( ‘’, W.i, F.nptr)}W1 {W.s = W1.s}

W {W.s = W.i }

F 产生式部分不再给出

Page 61: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 62: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 63: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 64: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 65: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 66: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 67: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 68: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算T

F.nptrF.nptr

id

i W

F.nptr

id

num

id

id

num 5

指向符号表中 a 的入口

指向符号表中 b 的入口

i W s

i W

略去了 E TR T 部分

Page 69: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算4.3.3 预测翻译器的设计把预测分析器的构造方法推广到翻译方案的实现

产生式 R +TR | 的分析过程

void R( ) {if (lookahead == '+' ) {

match ( '+' ); T( ); R( );}else / 什么也不做 /

}

Page 70: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算syntaxTreeNode R (syntaxTreeNode i) {

syntaxTreeNode nptr, i1, s1, s;char addoplexeme;

if (lookahead == '+' ) { / 产生式 R +T R /addoplexeme = lexval;match('+' ); nptr = T();i1 = mkNode(addoplexeme, i , nptr);s1 = R (i1); s = s1;

}else s = i; / 产生式 R /return s;

}

R : i, sT : nptr+ : addoplexeme

Page 71: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算4.3.4 用综合属性代替继承属性Pascal 的声明,如 m, n : integer

D L : T (非 L 属性定义)T integer | charL L, id | id

信息从右向左流,归约从左向右,两者不一致

Page 72: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算4.3.4 用综合属性代替继承属性Pascal 的声明,如 m, n : integer

D L : T (非 L 属性定义)T integer | charL L, id | id

等所需信息获得后再归约改成从右向左归约

D id LL , id L | : TT integer | char

D

:

L

,

id

Lid

integer

T

Page 73: 第四章   语法制导的翻译

4.3 L 属性定义的自上而下计算D id L { addtype (id. entry, L. type)}L , id L1 {L. type = L1. Type;

addtype (id. entry, L1. type)}

L : T {L. type = T. type}T integer {T. type = integer}T real {T. type = real}

D

:

L

,

id

Lid

integer

T

Page 74: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算在自下而上分析的框架中实现 L 属性定义的方

• 它能实现任何基于 LL(1) 文法的 L 属性定义• 也能实现许多(但不是所有的)基于 LR(1)

的 L 属性定义

Page 75: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算4.4.1 删除翻译方案中嵌入的动作E T RR + T {print (‘+’)}R1 | T {print (‘’)}R1 |

T num {print (num.val)}在文法中加入产生的标记非终结符,让每个嵌入动作由不同标记非终结符 M 代表,并把该动作放在产生式 M 的右端

E T RR + T M R1 | T N R1 | T num {print (num.val)}M {print (‘+’)}N {print (‘’)}

这些动作的一个重要特点:没有引用原来产生式

文法符号的属性

Page 76: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算4.4.2 分析栈上的继承属性

例 int p, q, r D T {L.in = T.type}

LT int {T. type = integer}T real {T. type = real}L {L1.in = L.in } L1, id {addtype (id.entry, L.in )}L id {addtype (id.entry, L.in )}

Page 77: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算4.4.2 分析栈上的继承属性1 、属性位置能预测

例 int p, q, r D T {L.in = T.type}

LT int {T. type = integer}T real {T. type = real}L {L1.in = L.in } L1, id {addtype (id.entry, L.in )}L id {addtype (id.entry, L.in )}

D

T L

L, r

L , q

p

int

type

in

in

in

Page 78: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算4.4.2 分析栈上的继承属性1 、属性位置能预测

例 int p, q, r D T {L.in = T.type}

LT int {T. type = integer}T real {T. type = real}L {L1.in = L.in } L1, id {addtype (id.entry, L.in )}L id {addtype (id.entry, L.in )}

D

T L

L, r

L , q

p

int

type

in

in

in

继承属性的计算可以略去,引用继承属性的地方改成引用其他符号的综合属性

Page 79: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算D

T L

L, r

L , q

p

int

type

in

in

in

产 生 式 代 码 段 D TL

T int val[top] = integer

T real val[top] = real

L L1, id addType(val[top], val[top3])

L id addType(val[top], val[top1])

Page 80: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算2 、属性的位置不能预测S aAC C.i = A.sS bABC C.i = A.sC c C.s = g(C.i)

• 增加标记非终结符,使得位置可以预测S aAC C.i = A.sS bABMC M.i = A.s; C.i = M.sC c C.s = g(C.i)M M.s = M.i

Page 81: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算2 、属性的位置不能预测S aAC C.i = A.sS bABC C.i = A.sC c C.s = g(C.i)

• 增加标记非终结符,使得位置可以预测S aAC C.i = A.sS bABMC M.i = A.s; C.i = M.sC c C.s = g(C.i) 还得考虑M.sM M.s = M.i 计算的可预测

Page 82: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算4.4.3 模拟继承属性的计算继承属性是某个综合属性的一个函数

S aAC C.i = f (A.s)C c C.s = g(C.i)

• 增加标记非终结符,把 f(A.s) 的计算移到对标记非终结符归约时进行S aANC N.i = A.s; C.i = N.sN N.s = f (N.i)C c C.s = g(C.i)

Page 83: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算• 例 数学排版语言 EQN S {B.ps = 10 }

B {S.ht = B.ht } B {B1.ps = B.ps } B1 {B2.ps = B.ps } B2 {B.ht = max(B1.ht, B2.ht ) } B { B1.ps =B.ps } B1

sub { B2.ps = shrink(B.ps) }B2 {B.ht = disp (B1.ht, B2.ht ) }

 B text {B.ht = text.h B.ps }

Page 84: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 语 义 规 则

S LB B.ps = L.s; S.ht = B.ht L L.s = 10 将 B.ps 存入栈中,便于引

B B1 MB2 B1.ps = B.ps; M.i = B.ps;

B2.ps = M.s;B.ht = max(B1.ht, B2.ht )

M M.s = M.iB B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i)B text B.ht = text.h B.ps

Page 85: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 语 义 规 则

S LB B.ps = L.s; S.ht = B.ht L L.s = 10 将 B.ps 存入栈中,便于引

B B1 MB2 B1.ps = B.ps; M.i = B.ps;

B2.ps = M.s;B.ht = max(B1.ht, B2.ht )

M M.s = M.i 单纯为了属性位置可预测B B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i) B text B.ht = text.h B.ps

Page 86: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 语 义 规 则

S LB B.ps = L.s; S.ht = B.ht L L.s = 10 将 B.ps 存入栈中,便于引

B B1 MB2 B1.ps = B.ps; M.i = B.ps;

B2.ps = M.s;B.ht = max(B1.ht, B2.ht )

M M.s = M.i 单纯为了属性位置可预测B B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i) 兼有计算功能B text B.ht = text.h B.ps

Page 87: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算举例说明

在 text 归约成 B 时, B的 ps 属性

都在次栈顶位置S

M s

B

L s

BB

text B sub N s B

text text

Page 88: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 语 义 规 则

S LB B.ps = L.s; S.ht = B.ht L L.s = 10 B B1 MB2 B1.ps = B.ps; M.i = B.ps;

B2.ps = M.s;B.ht = max(B1.ht, B2.ht )

M M.s = M.i B B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i) B text B.ht = text.h B.ps

Page 89: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 代 码 段

S LB val[top1] = val[top]L L.s = 10 B B1 MB2 B1.ps = B.ps; M.i = B.ps;

B2.ps = M.s;B.ht = max(B1.ht, B2.ht )

M M.s = M.i B B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i) B text B.ht = text.h B.ps

Page 90: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 代 码 段

S LB val[top1] = val[top]L val[top+1] = 10B B1 MB2 B1.ps = B.ps; M.i = B.ps;

B2.ps = M.s;B.ht = max(B1.ht, B2.ht )

M M.s = M.i B B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i) B text B.ht = text.h B.ps

Page 91: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 代 码 段

S LB val[top1] = val[top]L val[top+1] = 10B B1 MB2 val[top2] = max(val[top2], val[top])

M M.s = M.i B B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i) B text B.ht = text.h B.ps

Page 92: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 代 码 段

S LB val[top1] = val[top]L val[top+1] = 10B B1 MB2 val[top2] = max(val[top2], val[top])

M val[top+1] = val[top1]B B1 sub

NB2

B1.ps =B.ps; N.i = B.ps;

B2.ps = N.s; B.ht = disp (B1.ht, B2.ht )

N N.s = shrink(N.i) B text B.ht = text.h B.ps

Page 93: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 代 码 段

S LB val[top1] = val[top]L val[top+1] = 10B B1 MB2 val[top2] = max(val[top2], val[top])

M val[top+1] = val[top1]B B1 sub

NB2

val[top3] = disp (val[top3], val[top] )

N N.s = shrink(N.i) B text B.ht = text.h B.ps

Page 94: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 代 码 段

S LB val[top1] = val[top]L val[top+1] = 10B B1 MB2 val[top2] = max(val[top2], val[top])

M val[top+1] = val[top1]B B1 sub

NB2

val[top3] = disp (val[top3], val[top] )

N val[top+1] = shrink(val[top2])B text B.ht = text.h B.ps

Page 95: 第四章   语法制导的翻译

4.4 L 属性的自下而上计算产 生 式 代 码 段

S LB val[top1] = val[top]L val[top+1] = 10B B1 MB2 val[top2] = max(val[top2], val[top])

M val[top+1] = val[top1]B B1 sub

NB2

val[top3] = disp (val[top3], val[top] )

N val[top+1] = shrink(val[top2])B text val[top] = val[top] val[top1]

Page 96: 第四章   语法制导的翻译

本 章 要 点• 语义规则的两种描述方法:语法制导的定义

和翻译方案• 设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点

• 语法制导定义和翻译方案的实现– S 属性的自下而上计算(边分析边计算)– L 属性的自上而下计算(边分析边计算)– L 属性的自下而上计算(边分析边计算)

• 不再介绍先分析后计算的方法– 不能边分析边计算的情况是存在的,见 5.6节

Page 97: 第四章   语法制导的翻译

例 题 1

下面是产生字母表 = {0, 1, 2} 上数字串的一个文法:

S D S D | 2D 0 | 1

写一个语法制导定义,判断它接受的句子是否为回文数

S S print(S.val)S D1 S1 D2 S.val = (D1.val == D2.val) and S1.val S 2 S.val = trueD 0 D.val = 0D 1 D.val = 1

Page 98: 第四章   语法制导的翻译

例 题 2

为下面文法写一个语法制导的定义,用 S 的综合属性val

给出下面文法中 S 产生的二进制数的值。例如,输入101.101 时, S.val = 5.625 (可以修改文法)

若按 22+ 0 + 20 + 2-1 + 0 + 2-3 来计算,该文法对小数点左边部分的计算不利,因为需要继承属性来确定每个 B离开小数点的距离

S L . L | LL L B | BB 0 | 1

S

.L

L B

L B

B

L

L B

L B

B

Page 99: 第四章   语法制导的翻译

例 题 2

为下面文法写一个语法制导的定义,用 S 的综合属性val

给出下面文法中 S 产生的二进制数的值。例如,输入101.101 时, S.val = 5.625 (可以修改文法)

若小数点左边按 (1 2 + 0) 2 + 1 计算。该办法不能直接用于小数点右边,需改成 ((1 2 + 0) 2 + 1)/23 ,这时需要综合属性来统计 B 的个数

S L . L | LL L B | BB 0 | 1

S

.L

L B

L B

B

L

L B

L B

B

Page 100: 第四章   语法制导的翻译

例 题 2

为下面文法写一个语法制导的定义,用 S 的综合属性val

给出下面文法中 S 产生的二进制数的值。例如,输入101.101 时, S.val = 5.625 (可以修改文法)更清楚的办法是将文法改成下面的形式

S L . R | LL L B | BR B R | BB 0 | 1

S

.L

L B

L B

B

R

RB

RB

B

Page 101: 第四章   语法制导的翻译

例 题 2

S L . R S. val = L. val + R. valS L S. val = L. valL L1 B L. val = L1. val 2 + B. val

L B L. val = B. valR B R1 R. val = R1. val / 2 + B. val / 2

R B R. val = B. val / 2B 0 B. val = 0B 1 B. val = 1

Page 102: 第四章   语法制导的翻译

例 题 3

给出把中缀表达式翻译成没有冗余括号的中缀表达式的语法制导定义。例如 ,因为和是左结合 ,

((a (b + c )) (d )) 可以重写成 a (b + c ) d

两种方法:– 先把表达式的括号都去掉,然后在必要的地方再

加括号– 去掉表达式中的冗余括号,保留必要的括号

Page 103: 第四章   语法制导的翻译

例 题 3

第一种方法S E print ( E. code )E E1 + T

if T. op == plus thenE.code =E1.code||“+”||“(”||

T.code||“)”else

E. code = E1. code || “+” || T. code;

E. op = plusE T E. code = T. code; E. op = T. op

Page 104: 第四章   语法制导的翻译

例 题 3

T T1 Fif (F. op == plus) or (F. op == times) then

if T1. op == plus thenT. code = “(” || T1. code || “)” || “” || “(” ||

F. code || “)”else

T. code = T1. code || “” || “(” || F. code || “)”else if T1. op = plus then

T. code = “(” || T1. code || “)” || “” || F. codeelse

T. code = T1. code || “” || F. code;T. op = times

Page 105: 第四章   语法制导的翻译

例 题 3

T FT. code = F. code; T. op = F. op

F idF. code = id. lexeme; F. op = id

F ( E )F. code = E. code; F. op = E. op

Page 106: 第四章   语法制导的翻译

例 题 3

第二种方法

• 给 E , T 和 F 两个继承属性 left_op 和 right_op分别表示左右两侧算符的优先级

• 给它们一个综合属性 self_op 表示自身主算符的优先级

• 再给一个综合属性 code 表示没有冗余括号的代码

• 分别用 1 和 2 表示加和乘的优先级,用 3 表示id 和 (E) 的优先级,用 0 表示左侧或右侧没有运算对象的情况

Page 107: 第四章   语法制导的翻译

例 题 3

S EE. left_op = 0; E. right_op = 0; print ( E. code )

E E1 + T

E1. left_op = E. left_op; E1. right_op = 1;

T. left_op = 1; T. right_op = E. right_op;E.code =E1.code|| “+” || T. code ; E. self_op = 1;

E TT. left_op = E. left_op; T. right_op = E. right_op;E. code = T. code; E. self_op = T. self_op

Page 108: 第四章   语法制导的翻译

例 题 3

T T1 F . . .

T F . . .

F idF. code = id. lexeme; F. self_op = 3

Page 109: 第四章   语法制导的翻译

例 题 3

F ( E )E. left_op = 0; E. right_op = 0;F. self_op =

if (F. left_op < E. self_op) and (E. self_op >= F. right_op)

then E. self_op else 3F. code =

if (F. left_op < E. self_op) and (E. self_op >= F. right_op)

then E. code else “(” || E. code || “)”

Page 110: 第四章   语法制导的翻译

习 题• 第一次 4.1 , 4.3 , 4.5• 第二次 4.7 , 4.9, 4.10• 第三次 4.13 , 4.14