本次笔记内容:
4-12 SLR
4-13 LR1分析
4-14 LALR分析法
4-15 二义性文法的LR分析
4-16 LR分析中的错误处理
本节课幻灯片,见于我的 GitHub 仓库:第7讲 语法分析_4.pdf
上节课的内容中,LR(0)存在冲突。这节课首先提出SLR进行解决。SLR的改进很简单,但还存在冲突。因此又引出LR(1)。
但是,LR(1)的状态过多,于是引出LALR化简、合并其状态。
最后,介绍了二义性与错误处理。
SLR分析
上节课的例子中,我们认识到:LR(0)分析过程中存在冲突。而规定 FOLLOW 集,可以帮我们判断,在那些情况下,不进行归约
。这也正是 SLR的基本思想。
基本思想
这里的 S 代表simple
,因为其只需要一个 FOLLOW 集就可以化解冲突。但是对于某些冲突,需要更复杂的方法化解(后文会提到)。
SLR分析表
与 LR(0) 分析表进行对比:
- 在 LR(0) 分析表中,每一个状态在遇到任何输入符号时,都采取归约动作,因此归约状态在这一行中每一项都是归约动作(如第2行、第9行);
- 而在 SLR 分析表中,对于归约状态,只有遇到 FOLLOW 集中的元素,才采取归约动作。
例:SLR分析法构造
SLR 分析表构造算法
如上,SLR分析表与LR(0)分析表是类似的,唯一不同在于FOLLOW集的使用。
如果给定文法的SLR分析表中不存在有冲突的动作,那么该文法称为SLR文法
。
SLR分析中的冲突
如上图,产生了移入-归约冲突。
LR(1)分析法
SLR分析存在的问题:SLR只是简单地考察下一个输入符号
b是否属于与归约项目
A→α相关联的FOLLOW(A)
,但b∈FOLLOW(A)只是归约α的一个必要条件
,而非充分条件
。
如上图,对于树中的 R ,在不同地方,其后继符是不同的,一个地方对应=
,一个地方对应$
。
由此可见:在特定位置,A的后继符集合是FOLLOW(A)的子集。
因此,我们规定了新规则,如