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.