天天看点

LL(1),LR(0),SLR(1),LALR(1),LR(1)LL(1)步骤LL(1),LR(0),SLR(1),LALR(1),LR(1)对比LR(0)的介绍LR(0) -> SLR的必要性SLR的介绍SLR -> LR(1)的必要性LR(1)的介绍LALR table 构造reduce-shift reduce 移进-归约冲突SLR

LL(k)文法

LL(1)

为什么需要FIrst和Follow,以及如何根据First与Follow生成预测分析表

步骤

首先生成First,再结合First生成Follow, 最后根据First与Follow生成预测分析表

LL(1),LR(0),SLR(1),LALR(1),LR(1)对比

http://blog.csdn.net/linraise/article/details/9237195

LR(0)的介绍

从左分析,从栈顶归约,

LR(0) -> SLR的必要性

对于LR(0),由于分析中一遇到终态就归约,一遇到First集就移进,如果有一下状态I1,I1包含两个语法:

F->Y·+

F->Y·

那LR(0)就无法确定到底是移进还是归约了。

这就是为什么我们要引入SLR解决reduce-shift conflict(尽管不能完全解决该问题).

SLR的介绍

如果不仅考虑First,而且把Follow集也考虑在内,就可以一定程度上解决reduce-shift conflict.

还是以上语法:

F->Y·+B

F->Y·

如果FOLLOW(F) = {a, b},那么当我们遇到a与b时,就可以选择归约F;当我们遇到+时,就可以选择移进操作。

SLR -> LR(1)的必要性

SLR不能完全解决reduce-shift confict.

同样还是上面的语法:

F->Y·+B

F->Y·

如果 FOLLOW(F) = {a, b, +},那当我们遇到 + 符号时,就无法确定到底是选择移进操作得到F->Y+·B,还是归约F。

SLR不能完全解决reduce-shift conflict. 这就是为什么我们要选择LR(1) / LALR(1)了

LR(1)的介绍

https://parasol.tamu.edu/~rwerger/Courses/434/lec10.pdf

LALR table 构造

关键

合并同心集

合并前

合并后

构造方法: 见中文第二版P.169下方[算法 4.56]

reduce-shift reduce 移进-归约冲突

LR(0)不能解决移进-归约冲突(不知道该移进还是归约)

SLR

写出First、Follow,并得出LR(0)

根据中文版P.161画出SLR table.

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

本文分享自作者个人站点/博客

https://www.jianshu.com/u/68cbc4294f4c

复制

如有侵权,请联系 [email protected] 删除。