目录
第四章 语法分析
1.自顶向下分析概述
- 从分析树的顶部(根节点)向底部(叶节点)方向构造分析树
- 可以看成是从文法开始符号S推导出词串w的过程
- 每一步推导中,都需要做两个选择
- 替换当前句型中的哪个非终结符
- 用该非终结符的哪个候选式进行替换
最左推导 | 最右推导 |
---|---|
自顶向下的语法分析采用最左推导方式
1.总是在选择每个句型的最左非终结符进行替换
2.根据输入流中的下一个终结符,选择最左非终结符的一个候选式
预测分析
- 预测分析是递归下降分析技术的一个特例,通过在输入中向前看固定个数(通常是一个)符号来选择正确的A-产生式
- 可以对某些文法构造出向前看k个输入符号的预测分析器,该类文法有时也称为LL(k)文法类
- 预测分析不需要回溯,是一张确定的自顶向下分析方法
2.文法转换
左递归问题
左递归文法会使递归下降分析器陷入无限循环
3.LL(1)文法
非终结符的后继符号集——Follow集
串首终结符集——First集
产生式的可选集
LL(1)文法
4.First集和Follow集的计算
计算文法符号X的FIRST(X)
FIRST(X):可以从X推导出的所有串首终结符构成的集合
如果X=>*ε, 那么ε∈FIRST ( X )
FIRST(S)
S->XXX
找左侧为S的产生式,一直往下最左推导,取最左的终结符(本人的简单理解 )
计算非终结符A的FOLLOW(A)
FOLLOW(A):可能在某个句型中紧跟在A后边的终结符a的集合
如果A是某个句型的最右符号,则将结束符“$”添加到FOLLOW(A)中
FOLLOW(S) S->XXX
找右侧有S的产生式,一直推
1.若S为最右,即A->XXS,则Follow(S)+=Follow(A)
2.若A->XML等,则Follow(S)+=(First(L)-ε)(L推不出ε)
Follow(S)+=Follow(A)(L可推出ε)
3.若S右侧为终结符,则直接加入Follow(S)
(个人理解 )
SELECT集
就是非终结符对应的输入符号集
预测分析表根据SELECT集可得
LL(1)文法的分析方法
-
递归的预测分析法
在递归下降分析中,根据预测分析表进行产生式的选择 -
非递归的预测分析法
非递归的预测分析不需要为每个非终结符编写递归下降过程,而是根据预测分析表构造一个自动机,也叫表驱动的预测分析
5.预测分析中的错误处理
两种情况下可以检测到错误
- 栈顶的终结符和当前输入符号不匹配
- 栈顶非终结符与当前输入符号在预测分析表对应项中的信息为空
预测分析中的错误恢复
6.自底向上分析概述
可以看成是将输入串w规约为文法开始符号S的过程
自底向上的语法分析采用最左规约方式(反向构造最右推导)
通用框架
- 移入-规约分析
工作过程
移入-规约分析的四种动作
- 移入:将下一个输入符号移到栈的顶端
- 规约:被规约的符号串的右端必然处于栈顶。语法分析器在栈中确定这个串的左端,并决定用哪个非终结符来替换这个串
- 接收:宣布语法分析过程成功完成
- 报错:发现一个语法错误,并调用错误恢复子例程
移入-规约分析中存在的问题
无法正确识别句柄
句柄:句型的最左直接短语
7.LR分析法概述
LR文法是最大的、可以构造出相应移入-规约语法分析器的文法类
- L:对输入进行从左到右的扫描
- R:反向构造出一个最右推导序列
LR(k)分析
需要向前查看k个输入符号的LR分析
个人理解
两个栈储存,一个是符号栈,一个是状态栈
1.当上次规则时规约时,看状态栈栈顶和符号栈栈顶,正常情况下都看状态栈栈顶和输入符号,当状态栈栈顶与符号Y(两种情况,一种来自输入符号,一种来自符号栈栈顶)对应规则为Sn时,将输入符号和状态都压入
2.当对应规则为规约时,则将对应的符号和状态出栈
3.对应规则为数字时,则将数字压入状态
8.LR(0)分析
LR(0)项目
- 右部某位置标有圆点的产生式称为相应文法的一个LR(0)项目
- A->a1·a2
增广文法
构造分析表(个人理解 )
1.根据增广文法的第一条构建第一个状态I0,然后拓展I0状态,计算闭包(用增广文法来计算)
2.I0状态拓展之后,根据输入符号构建其他状态I,点往后移一位,然后拓展状态
9.LR(0)分析表构造算法
CLOSURE()函数
计算给定项目集I的闭包
GOTO()函数
返回项目集I对应于文法符号X的后继项目集目闭包集
构造LR(0)自动机的状态集
LR(0)分析过程中的冲突
10.SLR分析
在LR(0)的基础上,通过Follow集来解决一定的冲突
11.LR(1)分析
规范LR(1)项目
求展望符:
1.若β不为空,则B->·γ,b中,b为First(β),自生的后继符
2.若β为空,则B->·γ,b中,b为a,继承的后继符
LR(1)自动机的形式化定义
12.LALR分析法
- 在LR(1)的基础上寻找相同核心的LR(1)项集,并将这些项集合并为一个项集。所谓项集的核心就是其第一分量的集合
- 然后根据合并后得到的项集族构造语法分析表
- 如果分析表中没有语法分析动作冲突,给定的文法就称为LALR(1)文法,就可以根据该分析表进行语法分析
自动机
LR(1) | LALR(1) |
---|---|
LALR(1)的特点
- 形式上与LR(1)相同
- 大小上与LR(0)/SLR相当
- 分析能力介于SLR和LR(1)二者之间
SLR<LALR(1)<LR(1) - 合并后的展望符集合仍为FOLLOW集的子集
13. 二义性文法的LR分析
- 每个二义性文法都不是LR的
- 某些类型的二义性文法在语言的描述和实现中很有用
- 更简短,更自然
14.LR分析中的错误处理
- 语法错误的检测
- 当LR分析器在查询分析表并发现一个报错条目时,就检测到了一个语法错误
- 错误恢复策略
-
恐慌模式错误恢复
-
短语层次错误恢复
-
区分LL
相同左部的产生式的SELECT集不相交
区分LR(0),SLR,LR(1),LALR
首先分为两部分
一是LR(0)项集族
1.若有移进规约冲突则不为LR(0)
2.若移进项目的点后符号与规约项目产生式左部非终结符的FOLLOW集相交不为空,则不为SLR
二是LR(1)项集族
1.若移进项目的点后符号与规约项目产生式左部非终结符的展望符集相交不为空,则不为LR(1)
2.在LR(1)的基础上合并后,若产生规约规约冲突则不为LALR