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

2018-12-08  本文已影响0人  getianao

其它LR分析技术

一、LR(1)分析

1. SLR(1)分析的问题

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:

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.基本概念

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

G’ [S] 的 LALR(1) FSM
上一篇下一篇

猜你喜欢

热点阅读