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

LL(1),LR(0),SLR(1),LALR(1),LR(1)_第1张图片
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 构造

关键

合并同心集


LL(1),LR(0),SLR(1),LALR(1),LR(1)_第2张图片
合并前

LL(1),LR(0),SLR(1),LALR(1),LR(1)_第3张图片
合并后

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

reduce-shift reduce 移进-归约冲突

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

SLR

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

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

你可能感兴趣的:(LL(1),LR(0),SLR(1),LALR(1),LR(1))