自底向上优先分析& LR分析
- 自底向上分析法基本思想及概述
1、自底向上分析法(移进-归约分析法)的基本思想。
(1)实现时,对输入符号串自左向右进行扫描,并将输入符号逐个移入一个栈中,边移入边分析,
(2)一旦栈顶符号串形成某个句型的句柄时(对应某产生式的右部),就把句柄 (即产生式的右部串)替换成相应产生式的左部非终结符,这称为一步直接归约。
(3)重复上述12过程,一直归约到栈中只剩下文法的开始符号时,则为分析成功,即可确认输入串是文法的句子。
2、移入-归约分析技术
使用一个栈来保存归约/扫描移入的文法符号
开始时刻:栈中只包含$,而输入为w$
结束时刻:栈中为S$,而输入为$
在分析过程中,不断移入符号,并在识别到句柄时进行归约
3、“移进-归约”分析过程的操作有四类:
移入 :将下一个输入符号移入到栈顶
归约 :将句柄归约为相应的非终结符号
(注意:句柄总是在栈顶 ;具体操作时弹出句柄,压入被归约到的非终结符号 )
接受 :宣布分析过程成功完成
(注意:栈里是开始符号,外界是结束符)
报错 :发现语法错误,调用错误恢复子程序(涉及到移入-归约的分析表)
4、移入-归约分析中的冲突
(1)无法知道是否该进行归约 (移入-归约冲突):
栈中移入的东西已经足够多,发现了一个看起来像句柄的东西,似乎可以进行归约,但同时,如果移入更多的符号,也能形成一个归约的句柄,出现归约时间点选择上的冲突
(2)不知道按照什么产生式进行归约(归约-归约冲突):
现在栈顶的几个符号,发现可以选择某个产生式进行归约,但是根据栈顶符号选择的不同,有的多一点有的少一点,不止一个产生式可以拿来进行归约
5、每次归约时一定要按当前句型的句柄归约,也即任何时候栈中的符号串和剩余的输入串组成一句型
- LR(K)分析法
- 概念:
“L”:是指从左至右扫描输入符号串;
“R”:是指构造一个最右推导的逆过程
“k”:是指为了作出分析决定而向右看的输入符号的个数
- 基本方法:
LR分析方法根据当前栈中的符号串(通常以状态表示)和向右顺序查看输入串的k(k³0)个符号,就能唯一确定分析器的动作是移进还是归约,以及归约时用哪个产生式进行归约,即能唯一地确定句柄。
- 思想:
在规范规约过程中:
1记住已移进和归约出的整个符号串(记住历史)
2根据所用的产生式推测未来可能碰到的符号(展望未来)
4、LR分析器
(1)逻辑结构(一个LR分析器由3个部分组成):
①总控程序或称驱动程序:所有语言的任何LR分析器,总控程序都相同;
②分析栈:包括文法符号栈和相应的状态栈,所有语言的任何LR分析器,分析栈也都相同;
③分析表或分析函数:分动作表(ACTION)和状态转换表(GOTO) ,文法不同分析表不同,文法相同采用不同LR分析器分析表也不同。
- 分析器的动作由状态栈的栈顶状态和当前输入符号共同决定。
- LR分析器格局
- LR分析器行为
5、LR语法分析算法
6、LR语法分析表
(1)结构
两个部分:动作ACTION、转换GOTO
ACTION表项有两个参数:状态i,终结符号a
移入j:j是新状态,把j压入栈 (同时移入a)
归约A → β:把栈顶的β归约为A (并根据GOTO表项压入新状态)
接受:接受输入,完成分析
报错:在输入中发现语法错误
GOTO表项
如果GOTO[Ii, A] = Ij(GOTO函数),那么GOTO[i, A] = j( GOTO表项)
- 构造
- 例子
三、LR(0)分析
1、LR(0)文法:
即含移入项,有汉归约项目。含有多个规约项目
2、改造生成的项:
(1)含义:在文法产生式右边的任意位置添加一个点
例如:A → ·XYZ,A → X·YZ,A → XY·Z,A → XYZ· •
(特例:A → ε只对应一个项A → ·)
(2)直观含义 :
项A → α·β表示已经扫描/归约到了α,并期望在接下来的输入中经过扫描/归约得到β,然后把αβ归约到A
(Α和β不仅仅是外界输入串的,也可能是经过移入归约等若干步操作得到的符号)
如果β为空,表示我们可以把α归约为A
(3)项目类型(四种)
1)移进项目:圆点后为终结符项目,
- 归约项目:圆点在产生式右部最后的项目,
3)待约项目:
4)接受项目:当归约项目为S`->S.时,表明分析成功,即输入串为该文法的句子,相应状态为接受状态。
2、LR(0)项集规范族的构造
利用LR(0)项来做语法分析当中的自动机模型
对外部输入串识别并进行转态的转移
3、增广文法
G的增广文法成为G’,是在G中增加新开始符号S',并加入产生式S' →S而得到的.
构造自动机模型里面的初始状态
S‘ →S表示刚开始准备进行语法分析
G'和G接受相同的语言,且按照S' →S进行归约实际上就表示已经将输入符号串归约成为开始符号
4、项集闭包
(1)项集闭包 (CLOSURE):
如果I是文法G的一个项集,CLOSURE(I)就是根据下列两条规则从I构造得到的项集 :
①将I中的任何项目加入CLOSURE(I)中
②如果A →α·Bβ在CLOSURE(I)中,而B →γ是一个产生式,且项B →·γ不在CLOSURE(I)中就将该项加入。
(注意:如果点之后的γ也紧跟着一个非终结符,需要继续去找新的产生式)
③不断应用①②规则直到没有新项可加入
(2)物理含义:
A →α·Bβ,表示希望看到由Bβ推导出的串,那先看到由B推导出的串,因此加上B的各个产生式对应的项
(3)项级闭包构造算法
(4)例题:
5、GOTO函数
I是一个项集,X是一个文法符号,
则GOTO(I, X)定义为I中所有形如[A →α·Xβ]的项所对应的项[A →αX·β]的集合的闭包。
GOTO函数拿一个项集I作为状态,拿一个文法符号X作为状态的输入,然后看它的目标是
哪个新的项集
6、求LR(0)项集规范族的算法
从初始项集开始,不断计算各种可能的后继,直到生成所有的项集
初始项集是增广文法中新增的产生式S ’→ S
为在构造自动机的时候找到所有可能的状态
四、SLR(1)分析
五、LR(1)分析
六、LALR(1)分析
七、二义性文法在LR分析中的应用
语法分析程序的自动构造工具Y