《编译原理与技术》...

49
计算机 科学 与技术学院 27/09/2018 编译原理与技术 语法分析

Transcript of 《编译原理与技术》...

Page 1: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

计算机科学与技术学院

李诚

27/09/2018

《编译原理与技术》

语法分析Ⅲ

Page 2: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

主要内容

自底向上分析方法归约(右推导的逆过程)

句柄(可归约串), 可能不唯一

冲突:移进-归约、归约-归约

词 法分析器

记 号

取下一个记号

源程序分析树

前端的其余部分

语法分析器

中间表示

符号表

Cheng @ Compiler Fall 2018, USTC2018/9/27 2

Page 3: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

语法分析的主要方法

自顶向下(Top-down)针对输入串,从文法的开始符号出发,尝试根据产生式规则推导(derive)出该输入串。

大部分的程序语言都不是LL(1)文法

自底向上(Bottom-up)针对输入串,尝试根据产生式规则归约(reduce)到文法的开始符号。

比top-down分析方法更一般化

Cheng @ Compiler Fall 2018, USTC2018/9/27 3

Page 4: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 4

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

Page 5: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 5

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)

a b

Page 6: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 6

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(归约)

a b

A

Page 7: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 7

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(再读入bc)

a b

A

b c

Page 8: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 8

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(再读入bc)aAde(归约)

a b

A

b

A

c

Page 9: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 9

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(再读入bc)aAde(再读入d )

a b

A

b d

A

c

Page 10: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 10

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(再读入bc)aAde(再读入d )aABe(归约)

a b

A

b d

A

c

B

Page 11: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 11

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(再读入bc)aAde(再读入d )aABe(再读入e)

ea b

A

b d

A

c

B

Page 12: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 12

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(再读入bc)aAde(再读入d )aABe(再读入e)S(归约)

S

ea b

A

b d

A

c

B

Page 13: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 13

归约(Reduce)

把输入串归约成文法的开始符号,是最右推导的逆过程

例 S aABeA Abc | bB d

abbcde(读入ab)aAbcde(再读入bc)aAde(再读入d )aABe(再读入e)S(归约)

S rm aABe rm aAde rm aAbcde rm abbcde

S

ea b

A

b d

A

c

B

Page 14: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

主要内容

自底向上分析方法归约(右推导的逆过程)

句柄(可归约串), 可能不唯一

冲突:移进-归约、归约-归约

词 法分析器

记 号

取下一个记号

源程序分析树

前端的其余部分

语法分析器

中间表示

符号表

Cheng @ Compiler Fall 2018, USTC2018/9/27 14

Page 15: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 15

句柄(Handles)

句型的句柄(可归约串)该句型中和某产生式右部匹配的子串,并且

把它归约成该产生式左部的非终结符代表了最右推导的逆过程的一步

S aABeA Abc | bB d

S rm aABe rm aAde rm aAbcderm abbcde

句柄的右边仅含终结符

如果文法二义,那么句柄可能不唯一

Page 16: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 16

例句柄不唯一

E E + E | E E | (E ) | id

Page 17: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 17

例句柄不唯一

E E + E | E E | (E ) | id

E rm E Erm E E + Erm E E + id3

rm E id2 + id3

rm id1 id2 + id3

Page 18: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 18

例句柄不唯一

E E + E | E E | (E ) | id

E rm E E E rm E + Erm E E + E rm E + id3

rm E E + id3 rm E E + id3

rm E id2 + id3 rm E id2 + id3

rm id1 id2 + id3 rm id1 id2 + id3

在句型E E + id3中,句柄不唯一

Page 19: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

主要内容

自底向上分析方法归约(右推导的逆过程)

句柄(可归约串), 可能不唯一

移进(shift)-归约(reduce)分析技术冲突:移进-归约、归约-归约

词 法分析器

记 号

取下一个记号

源程序分析树

前端的其余部分

语法分析器

中间表示

符号表

Cheng @ Compiler Fall 2018, USTC2018/9/27 19

Page 20: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 20

移进-归约分析技术

用栈实现移进-归约分析栈保存已扫描过得文法符号,缓冲区存放还未分析的其余符号

移进(shift):将下一个输入符号放到栈顶,以形成句柄

归约(reduce):将句柄替换为对应的产生式的左部非终结符

接受(accept):分析成功

报错(error):发现语法错误

Page 21: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 21

移进-归约分析技术

用栈实现移进-归约分析先通过分析输入串id1*id2 + id3时的动作序列来了解移进-归约分析的工作方式

Page 22: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 22

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$

Page 23: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 23

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

Page 24: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 24

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$

Page 25: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 25

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

Page 26: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 26

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$

Page 27: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 27

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

Page 28: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$

Page 29: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

Page 30: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$

Page 31: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

Page 32: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$

Page 33: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

Page 34: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$

Page 35: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

Page 36: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$

Page 37: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$ 按E id归约

Page 38: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$ 按E id归约

$EE+E $

Page 39: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$ 按E id归约

$EE+E $ 按E E+E归约

Page 40: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$ 按E id归约

$EE+E $ 按E E+E归约

$EE $

Page 41: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$ 按E id归约

$EE+E $ 按E E+E归约

$EE $ 按E EE归约

Page 42: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$ 按E id归约

$EE+E $ 按E E+E归约

$EE $ 按E EE归约

$E $

Page 43: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

移进-归约id1*id2 + id3

栈 输 入 动 作

$ id1 id2 + id3$ 移进

$ id1 id2 + id3$ 按E id归约

$E id2 + id3$ 移进

$E id2 + id3$ 移进

$Eid2+ id3$ 按E id归约

$EE + id3$ 移进

$EE+ id3$ 移进

$EE+id3$ 按E id归约

$EE+E $ 按E E+E归约

$EE $ 按E EE归约

$E $ 接受

Page 44: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

主要内容

自底向上分析方法归约(右推导的逆过程)

句柄(可归约串), 可能不唯一

移进(shift)-归约(reduce)分析技术冲突:移进-归约、归约-归约

词 法分析器

记 号

取下一个记号

源程序分析树

前端的其余部分

语法分析器

中间表示

符号表

Cheng @ Compiler Fall 2018, USTC2018/9/27 44

Page 45: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 45

移进-归约分析中的冲突

要想很好地使用移进归约方式,尚需解决一些问题如何决策选择移进还是归约

进行归约时,确定右句型中将要归约的子串

进行归约时,如何确定选择哪一个产生式

Page 46: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 46

移进-归约分析中的冲突

移进归约冲突例

stmt if expr then stmt| if expr then stmt else stmt

| other

如果移进归约分析器处于格局(configuration)

栈 输入… if expr then stmt else … $

归约? 移进?

Page 47: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 47

移进-归约分析中的冲突

归约归约冲突

stmt id (parameter_list) | expr = exprparameter_listparameter_list, parameter | parameterparameter idexpr id (expr_list) | idexpr_list expr_list, expr | expr

由A(I, J)开始的语句

栈 输入… id ( id , id )…

归约成expr还是parameter ?

Page 48: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

2018/9/27 Cheng @ Compiler Fall 2018, USTC 48

移进-归约分析中的冲突

归约归约冲突

stmt id (parameter_list) | expr = exprparameter_listparameter_list, parameter | parameterparameter idexpr id (expr_list) | idexpr_list expr_list, expr | expr

由A(I, J)开始的语句(词法分析查符号表,区分第一个id)

栈 输入… procid ( id , id )…

需要修改文法中的第一个产生式

Page 49: 《编译原理与技术》 语法分析Ⅲstaff.ustc.edu.cn/~chengli7/courses/compiler18/notes/...主要内容 自底向上分析方法 归约(右推导的逆过程) 句柄(可归约串),

《编译原理与技术》

语法分析Ⅲ

Imagination is more important than knowledge. For knowledge is limited, whereas

imagination embraces the entire world, stimulating progress, giving birth to evolution.

—— Albert Einstein