本份课堂笔记来源于我院最最高大的七米八同学,不知道他用不用CSDN写博客,但是不管如何向他表示感谢。
LR文法——通用语法分析法,基于规约、FA
对于文法
对于每个状态(就是每个圈)的命名,我们不会和以前一样一路
状态命名
状态命名:
就比如说,第一层的加黄的状态是
第二层的最左边状态是
其中,
状态的拓展
if(
B→α⋅Aβ∈Ii ) {
A→⋅γ∈Ii }
这个证明很简单,我们看一下之前的那张图,
公式
看了看效果,我决定下面一个公式还是手画一下吧。。
对于上面的两组公式,
转换模型
我们有这样的语法:
首先讲一下LR转换模型,这个跟LL(1)的转换模型结构是差不多的。不过左边的栈变了,有一个状态栈和符号栈。LR分析程序,应该说差不多也是LR转换表,也变了。
对于刚刚的语法,我们二话不说,先加一个0号产生式:
为什么要加一个0号产生式?因为这样使得分层状态自动机最上层有且仅有一个自动机,且有且仅有一个初始状态。
转换图
下面看一下分层有限状态自动机,如果看不懂的话可能需要补一补前面的课。
这个图主要是示意一下的
注意要结合前面的公式。
转换表
我们由上面的转换图来获取转换表。
上图就是转换表,符号含义如下:
1)
2)
3)accept means accept
4)blank means error
有以下的主要规则:
如果说这个不是很好理解的话,我们可以这么来看。首先 。
对于填
然后最复杂的显然是
我们只要在
算法
此时就是对着转换表来填状态栈和符号栈,此处借助一个实例来讲解。
对于刚刚的文法,检验
首先,二话不说,在状态栈里写一个0,在符号栈里写一个
状态栈栈顶是0,输入的最左边是
状态栈栈顶是5,输入的最左边是
具体算法如下:
构造分析树
构造分析树的方法就是根据刚刚的算法来构造。假设算法执行下来的步骤是
以上讲的大概都是SLR(1)部分的内容。
SLR(1)是说,simple, left-to-right scan, •construct
a rightmost derivation in reverse
the number of input symbols of look ahead is 1
为什么simple?
不能分析所有的非二义文法,但是SLR(1)都是非二义文法。
备注
- 一个状态既存在可规约项目,又存在移进项目,可能导致出现二义性。既出现
S 又出现r ,称为“移进-规约冲突” - 有两个可规约项目,称为“规约-规约冲突”
SLR(1) → LR(1)
这一步相当于只加了一个预测符。
| 起点 | 状态内部扩展 | 状态之间扩展 | 可规约项目处理 |
|---|---|---|---|
| SLR(1) |
|
|
移点 |
| LR(1) |
|
|
移点,相同预测符 |
对于文法:
对于文法:
LR(1) → LALR(1)
这部分不要求掌握,所以就偷懒一点。。。
思路:合并同心状态(same core)
LA: look ahead
状态的心:去掉预测符之后的部分
若LR(1)的DFA出现同心状态,能合并,则LALR(1)状态数和SLR(1)状态数是相同的
由Yack生成语法分析程序为LALR(1)
举个例子来说明不能合并的现象:
由于在
| State | Action | ||
|---|---|---|---|
| c | d | …… | |
|
|
|
|
此时出现规约-规约冲突,不行。