编译原理系列之六 自底向上的LR分析法(3) – 其它LR分析技术

其它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:

    编译原理系列之六 自底向上的LR分析法(3) – 其它LR分析技术_第1张图片
    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,amB1->β 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:

编译原理系列之六 自底向上的LR分析法(3) – 其它LR分析技术_第2张图片
G’ [S] 的 LR(1)FSM(1)
编译原理系列之六 自底向上的LR分析法(3) – 其它LR分析技术_第3张图片
G’ [S] 的 LR(1)FSM(2)
编译原理系列之六 自底向上的LR分析法(3) – 其它LR分析技术_第4张图片
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)算法:

  1. 构造增广文法的 LR(1)FSM 状态 。
  2. 合并“同心”的状态(同心项目的搜索符集合相并) 得到LALR(1) FSM 的状态 。
  3. 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

编译原理系列之六 自底向上的LR分析法(3) – 其它LR分析技术_第5张图片
G’ [S] 的 LALR(1) FSM

你可能感兴趣的:(编译原理系列之六 自底向上的LR分析法(3) – 其它LR分析技术)