目录
8 自底向上分析概述
9 LR分析法概述
(1)LR 分析法的基本原理
(2)LR 分析器(自动机)的总体结构
(3)LR 分析表的结构
(4)LR 分析器的工作过程及LR 分析算法
(5)如何构造给定文法的LR分析表
10 LR(0)分析
(1)LR(0) 项目
(2)增广文法 (Augmented Grammar)
(3)文法中的项目
(4)LR(0)自动机
11 LR(0)分析表构造算法
12 SLR分析
13 LR(1)分析
(1)LR(1)分析法的提出
(2)规范LR(1)项目
(3)等价LR(1)项目
(4)例:LR(1)自动机
(5)LR(1)项目集闭包及GOTO函数
(6)LR(1)自动机的形式化定义
(7)LR分析表构造算法
14 LALR分析法
15 二义性文法的LR分析
16 LR分析中的错误处理
8 自底向上分析概述
- 从分析树的底部(叶节点)向顶部(根节点)方向构造分析树
- 可以看成是将输入串w归约为文法开始符号S的过程
- 自顶向下的语法分析采用最左推导方式,自底向上的语法分析采用最左归约方式(反向构造最右推导)
- 最左归约是最右推导的逆过程
- 自底向上语法分析的通用框架 — 移入-归约分析(Shift-Reduce Parsing)
①在对
输入
串的一次从左到右扫描过程中,语法分析
器将零个或多个输入符号
移入
到
栈
的顶端,直到它
可以对栈顶的一个文法符号串
β
进行
归约
为止
②然后,它将β
归约
为某个产生式的左部
③语法分析器不断地重复这个循环,直到它检测到一个语法
错误
,或者栈中包含了开始符号且输入缓冲
区为空
(
当进入这样的格局时,语法分析器停止运行,
并宣称
成功
完成了语法分析)为止
移入-归约分析器可采取的4种动作
移入:将下一个输入符号移到栈的顶端
归约:被归约的符号串的
右端
必然处于栈顶。语法
分析器在栈中确定这个串的
左端
,并决定用哪个非终结符来替换这个串
接收:宣布语法分析过程成功完成
报错:发现一个语法错误,并调用错误恢复子例程
移入-归约分析中存在的问题
9 LR分析法概述
LR文法
(
Knuth, 1963) 是最大的、可以构造出相应
移入-归约语法分析器
的文法类
L: 对输入进行从
左
到右的扫描
R: 反向构造出一个最
右
推导序列
LR(k)分析
需要向前查看k个输入符号的LR分析
k = 0
和
k
= 1 这两种情况具有实践意义,当省略(k
)
时,表示
k =1
(1)LR 分析法的基本原理
自底向上分析的关键问题是什么? ——如何正确地识别句柄
句柄是逐步形成的,用“状态”表示句柄识别的进展程度
(2)LR 分析器(自动机)的总体结构
(3)LR 分析表的结构
![](https://i-blog.csdnimg.cn/blog_migrate/5f157c06e079ccb0039f600e3f851a73.png)
(4)LR 分析器的工作过程及LR 分析算法
![](https://i-blog.csdnimg.cn/blog_migrate/443615a2239473786a82a73aa0545655.png)
(5)如何构造给定文法的LR分析表
LR(0)分析
SLR分析
LR(1)分析
LALR分析
10 LR(0)分析
(1)LR(0) 项目
![](https://i-blog.csdnimg.cn/blog_migrate/41441ad50057f0015494a482fc61ee86.png)
(2)增广文法 (Augmented Grammar)
![](https://i-blog.csdnimg.cn/blog_migrate/94d070af8ef894891444e5cf3ce3485a.png)
(3)文法中的项目
![](https://i-blog.csdnimg.cn/blog_migrate/5aeb7f098fc9d186daf538b0f4032ca7.png)
(4)LR(0)自动机
![](https://i-blog.csdnimg.cn/blog_migrate/87a635ae2080cd1b75af8cbadaf6ad53.png)
11 LR(0)分析表构造算法
LR(0)自动机的每一个状态是一个项目集闭包
![](https://i-blog.csdnimg.cn/blog_migrate/9271abbefdbb09a7dafe7b754b972e21.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9b4afba535387d621977051dd7995a5e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/22907ef5f75b7842ad5a5157265c4ce1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2fec0cf3af847abcf80d8c19d5e2379a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/03995006bc6b8399fdca0c55f5ab4ebd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c955190083bac1b7e9ec6a6631f30ed8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0606841729e91b19f2d9020cc7456ed8.png)
12 SLR分析
LR(0)分析在构造项目时向前查看0个符号,即没有考虑文法符号的上下文环境。
LR(0)文法要求文法的每一个LR(0)项目都不含有冲突的项目,这个条件比较苛刻。对于大多数程序设计语言来说,一般都不能满足LR(0)文法的条件。
不难看出在状态I2中既存在规约项目,又存在移进项目,因而这个文法不是LR(0)文法。
为了对语言句子进行确定性的分析,需要解决冲突。可以采用对含有冲突的项目集向前查看一个输入符号的办法来解决冲突,这种分析法称为简单的LR分析法,即SLR(1)分析法。
![](https://i-blog.csdnimg.cn/blog_migrate/6bf98dc9aeef47ec829db5e34b4a26d5.png)
SLR分析法只需向前查看一个符号,因此也称SLR(1)分析法,k=1时可省略
S:simple 仅需FOLLOW集便可化解冲突
![](https://i-blog.csdnimg.cn/blog_migrate/40e25c9e0a63cccc58b01452cfa333dd.png)
LR(0)分析表中每一个归约状态遇到任何输入符号时都采取归约动作
SLR分析表中归约状态只有遇到FOLLOW集中的元素时才采取归约动作
这种用来解决分析动作冲突的方法称为SLR(1)方法。如果对于一个文法的某些LR(0)项目集或LR(0)分析表中所含有的动作冲突都能用SLR(1)方法解决,则称这个文法是SLR(1)文法。
![](https://i-blog.csdnimg.cn/blog_migrate/5224edb3657cb94323dad847f96e25e9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/73e198002ba4d72371a358a4c0770ce6.png)
和LR(0)分析表构造仅有一处不同。
![](https://i-blog.csdnimg.cn/blog_migrate/a6bfca44184cab20aee1d76c2d2a69ce.png)
13 LR(1)分析
(1)LR(1)分析法的提出
SLR
分析存在的问题
SLR
只是简单地考察
下一个输入符号
b
是否属于与
归约
项目
A
→
α
相关联的
FOLLOW
(
A
)
,
但
b
∈
FOLLOW
(
A
)
只是归约
α
的一个
必要条件
,而非
充分条件
对于产生式
A
→
α
的归约,在
不同的使用位置
,
A
会要求
不同的后继符号
在特定位置,A
的后继符集合是
FOLLOW
(
A
)
的
子集
而SLR分析法利用FOLLOW集作为判定是否可以归约的条件,显然
扩大了可以归约的范围
(2)规范LR(1)项目
![](https://i-blog.csdnimg.cn/blog_migrate/d530865464fbcff6d009103417191441.png)
(3)等价LR(1)项目
![](https://i-blog.csdnimg.cn/blog_migrate/ffb23d2a94176f50d699804b35ce7ac9.png)
(4)例:LR(1)自动机
![](https://i-blog.csdnimg.cn/blog_migrate/ce06eecfc0aa61f215795a583d0867f3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7b188bd9fe918c2969646b3775f1a841.png)
(5)LR(1)项目集闭包及GOTO函数
![](https://i-blog.csdnimg.cn/blog_migrate/5568458b51a8b2b6471a70b3990a7ecd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ebf7ce936c2964d01b27d47a1f09a6e5.png)
(6)LR(1)自动机的形式化定义
![](https://i-blog.csdnimg.cn/blog_migrate/93c67e181cae065bec899643aa8b6cd5.png)
(7)LR分析表构造算法
![](https://i-blog.csdnimg.cn/blog_migrate/e61169f8e2097eb0a89f7cd0372ed7d1.png)
14 LALR分析法
LR(1)分析法根据展望符集合的不同将原始的LR(0)项目进行分裂分裂成不同的LR(1)项目使LR(1)自动机中的状态数比LR(0)多很多
而把没有动作冲突的状态进行合并可以大大减少自动机的状态数,有利于节省空间。
LALR ( lookahead-LR )分析的基本思想
①寻找具有
相同核心
的
LR
(1) 项集,并将这些项集合并为一个项集。 所谓项集的核心就是其第一分量的集合
②然后根据合并后得到的项集族构造语法分析表
③如果分析表中
没有
语法分析动作
冲突
,给定的文法就称为
LALR
(1)
文法
,就可以根据该分析表进行语法分析
实际合并的是对应项的展望符集合,展望符仅在归约时起作用,在移入时不起作用,所以在合并前各个同心项目集不存在移入-归约冲突的话,合并后也不会有移入-归约冲突
状态4&9、6&10同心项目
但是当遇到错误的输入d$(因为至少输入dcd) 合并前状态4遇到$报错;合并后不会报错执行归约,将栈顶d连同状态4一起出栈,露出了压在状态4下的状态0,状态0遇到刚刚归约的A进入状态2,此时遇到$是非法符号报错
LALR
(1)
的特点
形式上与LR
(1)相同
大小上与
LR
(0)/
SLR相当
分析能力介于
SLR
和
LR
(1)二者之间 SLR<LALR
(1)<
LR(1)
合并后的展望符集合仍为
FOLLOW
集的
子集
15 二义性文法的LR分析
![](https://i-blog.csdnimg.cn/blog_migrate/040ccd60a24bf28c04cd9b7d80be4423.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2d0e34e5118f90f874902c913839132f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fd4e4cadda8738a99e2e515050527355.png)
二义性文法的使用
应该保守地使用二义性文法,并且必须在严格控制之下使用,因为稍有不慎就会导致语法分析器所识别的语言出现偏差
16 LR分析中的错误处理
LR
分析中的错误处理
语法错误的检测 当
LR
分析器在查询分析表并发现一个报错条目时,就检测到了一个语法错误
错误恢复策略
恐慌模式错误恢复
短语层次错误恢复