编译原理与技术(第四章)语法分析
来源:互联网 发布:php单例模式代码 编辑:程序博客网 时间:2024/04/30 11:31
FIRST集合
构造算法:
对于G中的每一个文法符号
(1)若
(2)若
终结符,直接推导
(3)若
非终结符
(4)若
连续的非终结符
(5) (3)(4)中特别当ε∈FIRST(
解释:
FIRST集合表示的是,由非终结符号能够推导出的所有句子的第一个终结符号。
那么如果
如果是
如果B能够推出
如果
FOLLOW集合
构造:
对于G中的每一
(1)对于文法的开始符号
(3)对于每一个
解释:
FOLLOW集合表示的是,由非终结符号能够推导出的所有句子之后(不包含在推导出的句子内)的第一个终结符号。
那么如果
如果是
如果有
LL(1)分析法
定义:
一个文法G是LL(1)的, 当且仅当对于G的每一个非终结符A的任何两个不同产生式 A→α|β,
下面的条件成立:
① FIRST(α)∩FIRST(β)=
也就是α和β推导不出以某个相同的终结符a为首的符号串;它们不应该都能推出空字ε.
② 假若
也就是,若
构造:
for(文法G的每个产生式
for(每个终结符号
把
if(
for(任何
把
}
解释:
LL(1)分析法只往前看一位,算法也相对简单。
分析过程注意一下栈的变化,当进行产生式推导的时候,将产生式倒序压入栈。
闭包
构造:
对于拓广文法G,设I是文法G的一个LR(0)项目集合,closure(I)是从I出发,用下面的方法构造出的项目集合:
(1)I中的每一个项目(即,I的所有产生式)都属于closure(I);
(2)若项目
(3)直到集合不再扩大。
解释:
这种东西,如果没有要求,直接画DFA会比较好理解。
SLR(1)分析表
构造:
假设已构造出LR(0)项目集规范族为:
那么分析表的ACTION表和GOTO表构造步骤为:
① 若项目A→α·aβ属于
② 若项目A→α· 属于
③ 若
④ 若项目S′→S·属于
⑤ 凡不能用上述方法填入的分析表的元素,均应填上”报错标志”。为了表的清晰我们仅用空白表示错误标志。
解释:
上图是SLR(1)分析表的样式。
注意几点:
1、只有当
2、归约的时候,是所有符合条件的action都可以进行归约,如SLR(1)在所有
3、在用分析表进行分析的时候,进行完归约操作,先将栈顶的句柄全部弹出,然后根据栈顶的状态数与归约完的非终结符进行转移(将归约完的非终结符当做输入串),从而得出新的栈顶状态数。
每次入栈的是输入符号(或者是归约之后的非终结符)+现在所在的状态(DFA中的状态节点)。
LR(1)
构造:
我在网络上找到了一个非常详细的构造过程,如下:
现有文法如下,试构造其LR(1)分析表:
A→A+B
A→a
B→b
要构造 LR 表,我们需要先求出拓广文法:
加入
S→A
现在就可以逐步构造 DFA 了。
第一个状态由
对后面的每一个状态,只要依次考虑以下几点:
- 它从哪里来?
- 它的闭包是什么?
- 它需要归约吗?
- 它需要转移吗?
就能得到正确的结果。这样看起来还是有些抽象,希望下面的演示能帮助理解吧。
State 0
我们从
首先,我们寻找非终止符前是否有个
这样够了吗,闭包还可以扩展吗?我们导入了另一个在非终止符前有
这次加入的产生式包括
这次,产生式形如
现在
下一步,就是为这个状态添加转移了。对每个符号
State 1
先要看看 State 1 中出现了哪些项吧。我们从 State 0 通过
因此,将
现在再来求闭包,由于没有在非终止符前有
最后,从 State 1 出发,可以去哪里呢?由于在这个状态的
State 2
我们是从哪里过来的呢?State 0 中的
State 0 的项:
将
再看看有没有在非终止符前有
State 3
如果我们在 State 1 中遇到
State 1 的项:
把 · 后推得到:
好的,看到了非终结符前的 · 了吗?我们得求闭包了。先从
State 4
我们在 State 3 中遇上
那么对应的 State 4 项就是:
嗯,
State 5
我们在 State 3 中遇上
于是得到对应的 State 5 项:
嗯,这个状态需要归约吗?需要。应用
好了。现在该生成的状态都生成了,DFA 就构造完成了。根据我们的结果,填一下最后的 LR 转移表。
结果:
S→A A→A+B A→a B→b
goto N 代表转移,也就是转移到状态 N。
这就是LR(1)分析表。
LR(1)的分析过程和LR(0)的分析过程是一样的,就不重复累赘了。
LALR(1)
LALR(1)分析表的基本思想是合并LR(1)项目集规范族中的同心集,以减少分析表的状态数,即,用核代替项目集,以减少项目集所需的存储空间。
因为转移函数
注意:
同心集的合并,可能导致归约-归约的冲突,但不会产生新的移进-归约冲突。
同心集:
高亮的那两个状态,即
构造:
求出同心集然后合并即可
这里将
解释:
参照LR(1)分析程序,就可以类似地写出LALR(1)分析程序的分析过程。
文法分类
- 编译原理与技术(第四章)语法分析
- 语法分析(编译原理)
- 编译原理(三)语法分析
- 编译原理语法分析(java)
- 【编译原理】语法分析(一)
- 【编译原理】语法分析(二)
- 【编译原理】语法分析(三)
- 【编译原理】语法分析(四)
- 编译原理:文法与语法分析基本概念
- 编译原理学习(三)--语法分析树
- 编译原理语法分析实验(Java实现)
- 编译原理语法分析(文本输入)源程序
- 编译原理语法分析LR1
- 编译原理语法分析
- 编译原理之语法分析
- 【编译原理】语法分析
- 编译原理—语法分析
- 编译原理 - 语法分析
- ViewPager
- objective - C 下字符串的处理方法
- Linux压缩解压缩文章总结
- codeforces 412A Poster
- nyoj 诡异的电梯【Ⅰ】 1070 (DP) 好题
- 编译原理与技术(第四章)语法分析
- hdu 3466 Proud Merchants
- 拉丁矩阵问题
- 关于CocoaPods的使用小说明
- Palindrome Number
- git命令行提交代码(因为某些原因Eclipse不能提交代码,所以改用git命令)
- hdoj3664Permutation Counting【递推】
- split 的 使用方法
- 数据库