其它LR分析技术
一、LR(1)分析
1. SLR(1)分析的问题
-
无效归约问题:
在SLR(1)分析中,我们考虑了所归约非终结符的 Follow 符号,这可以分析出怎么选择归约或移进,但是在选择归约的情况中里,我们只是确认了移进符号是属于非终结符的Follow集的,而没有确认移进后是否是表达式文法规范句型的活前缀,也就是未考虑非终结符 Follow 集中的符号是否也是句柄的 Follow 符号;这样虽然不会影响判断结果,但产生了无效归约,减低了效率。
例:现在符号栈中的元素是
βα,移进符号是a,已知有归约项目A->α,并且a属于follow(A)而a不属于follow(βα);此时我们的做法是归约然后移进,之后的符号栈中的元素是βAa,而βAa不是文法规范句型的活前缀。如果我们能判断出
a!∈follow(βA),就可以判断出出错了。 -
局限性问题:
SLR(1)分析的要求是:
Ii ={A1->α1•b1γ1 ,… , Am->m•bm γm, B1->β 1 • ,…, Bn-> β n • },若集合{b1 ,b2,… ,bm }、FOLLOW(B1)、FOLLOW(B2),…,FOLLOW(Bn)均两两不相交。和上面的道理相似,没有考虑非终结符 Follow 集中的符号是否也是句柄的 Follow 符号,导致虽然follow集出现了相交,但是事实上正确的符号串是不会出现某些 follow集中的符号的,从而不能判断。已知:增广文法 G’ [ S ]:
(0) S -> E
(1) E -> (L , E )
(2) E -> F
(3) L -> L , E
(4) L -> E
(5) F -> ( F )
(6) F -> d有G’ [S] 的 LR(0)FSM:
G’ [S] 的 LR(0)FSM在I7中出现了
{)}∩follow(E)={)}的情况,所以不能进行SLR(1)分析;但是I7中的情况是(·F,E),此时的follow(E)中没有)而应该是,。
2.LR(1)分析法原理
我们在求项目集的时候,每个项目的末尾添加一个非终结符并以,分隔开来,来表示在当前情况下用该产生式进行规约时所期望的下一个字符,称之为向前搜索符,来替代follew集。
在检查是否可用.LR(1)分析法的时候,要求是Ii={A1->α1•b1 γ1,a1,… , Am->m•bm γm,am , B1->β 1 •,c1,…,Bn-> β n •,cn },若集合{b1} ,{b2},… ,{bm}、{c1} ,{c2},… ,{cm}均两两不相交。满足这样要求的文法称之为LR(1)文法:。
通过比较``{b1},{b2},… ,{bm}、{c1},{c2},… ,{cm}`和待移进字符就能分析出当前应该进行的操作。
例:增广文法 G’ [ S ]:
(0) S -> E
(1) E -> (L , E )
(2) E -> F
(3) L -> L , E
(4) L -> E
(5) F -> ( F )
(6) F -> d构造增广文法G’ [S] 的 LR(1)FSM:
G’ [S] 的 LR(1)FSM(1)G’ [S] 的 LR(1)FSM(2)G’ [S] 的 LR(1)FSM(3)
3. LR(k)分析
同理可推广到LR(k)分析:
形如: [A ->α . β , a1a2…ak ],其中a1a2…ak 为向前搜索符号串。
移进项目形如:[ A ->α . aβ, a1 a2 … ak] ;待约项目形如:[A ->α . Bβ, a1 a2 … ak]; 归约项目形如:[A ->α . ,a1 a2 … ak] 。
但LR(k)分析只有理论意义,因为LR(1)FSM 的状态数已经很大,k>1 的情形难以想象。
二、LALR(1)分析
1.基本概念
-
LR(1)项目的“心”(core):
LR(1)项目
[A -> α . β , a]中的A -> α . β部分称为该项目的“心“ 。 同心集:
对于LR(1)FSM 的两个状态,如果只考虑每个项目的 “心”,它们是完全相同的项目集合,那么这两个状态互为同心集。
2.LALR(1)分析法原理
我们可以发现LR(1)分析的有限状态机中,项目集的数量十分的多。这是因为许多在LR(0)分析中循环的项目集在LR(1)分析中由于·的位置变化导致向前搜索集也产生了变化,从而产生了许多同心集。而LALR(1)分析法正是对这些同心集进行了合并。
暴风(Brute Force)算法:
- 构造增广文法的 LR(1)FSM 状态 。
- 合并“同心”的状态(同心项目的搜索符集合相并) 得到LALR(1) FSM 的状态 。
- LALR(1) FSM 状态由 GO 函数得到的后继状态是所有被合并的“同心”状态的后继状态之并 。
注意:
合并同心状态后,不会产生新的移进-归约冲突,但可能产生新的归约-归约冲突。
一个LR(1)文法,如果将其LR(1)FSM的 同心状态合并后所得到的新状态无归约-归约 冲突,则该文法是一个 LALR(1)文法 。
例:增广文法 G’ [ S ]:
(0) S -> E
(1) E -> (L , E )
(2) E -> F
(3) L -> L , E
(4) L -> E
(5) F -> ( F )
(6) F -> d构造增广文法G’ [S] 的 LALR(1) FSM
G’ [S] 的 LALR(1) FSM




