【编译原理笔记07】语法分析:SLR、LR(1)、LALR、二义性分析与错误处理
本次笔记内容:
4-12 SLR
4-13 LR1分析
4-14 LALR分析法
4-15 二义性文法的LR分析
4-16 LR分析中的错误处理
本节课幻灯片,见于我的 GitHub 仓库:第7讲 语法分析_4.pdf
文章目录
-
-
- SLR分析
-
- 基本思想
- SLR分析表
- 例:SLR分析法构造
- SLR 分析表构造算法
- SLR分析中的冲突
- LR(1)分析法
-
- 规范LR(1)项目
- 等价LR(1)项目
- 例:LR(1)自动机
- 例:赋值语句文法的LR(1)分析表
- LR(1)项目集闭包
- GOTO函数
- 为文法G' 构造LR(1)项集族
- LR(1)自动机的形式化定义
- LR分析表的构造算法
- LALR 分析法
-
- LR(1)的局限性
- 基本思想
- 例:合并通信项集
- 合并同心项集时产生归约-归约冲突的例子
- 合并同心项集后,虽然不产生冲突,但可能会推迟错误的发现
- LALR(1)的特点
- 二义性文法的LR分析
-
- 二义性文法的特点
- 二义性算术表达式文法的LR(0)分析器
- 例:二义性if 语句文法的LR分析
- 二义性文法的使用
- LR分析中的错误处理
-
- 恐慌模式错误恢复
- 短语层次错误恢复
- 例:算数表达式文法的LR分析器
- 带有错误处理子程序的算术表达式文法LR分析表
-
上节课的内容中,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)的子集。
因此,我们规定了新规则,如
abc_123_02: D盘这么大!分给C盘点呗!
m0_73888903: 请问能不能把appdata直接转移到d盘吗,我发现有些app他没有自定义安装路径就装在appdata roaming里
find1star: Meritorious Winner
m0_74863514: zju的课程内容还要会员解锁有点那个了吧、、
BLACKNIAOR2: 收费挺EX的,另外正则表达式并不适合制作词法,因为它的匹配会把特殊符号给删除,而我们要的是保留切割符。比如+-*/ 这些