LR(1) 分析例子

来自http://jpkc.gdut.edu.cn/comp/cmpl6/6-4-1.htm#top

 

  

6.4 LR(1) 分析 

 

  本节介绍比SLR(1)功能更强的LR(1)分析法。
  例如下列文法G′为:
  (0) S′→S
  (1) S→aAd
  (2) S→bAc
  (3) S→aec
  (4) S→bed 
  (5)A →e
  我们首先用S′→·S作为初态集的项目,然后用闭包函数和转换函数构造识别文法G′的识别活前缀的有限自动机DFA见P143如图7.11所示,可以发现在项目集I5和I7中存在移进和归约冲突。
  I5:S→ae·c    I7:S→be·d
  A→e·       A→e·
  而归约项目左部非终结符的FOLLOW(A)={c,d}
  在I5中,FOLLOW(A)∩{c}={c,d}∩{c}≠∅     
  在I7中,FOLLOW(A) ∩{d}={c,d}∩{d}≠      
  因此I5,I7中冲突不能用SLR(1)方法解决。只能考虑用下面将要介绍的LR(1)方法解决。  
  由于用SLR(1)方法解决动作冲突时,对于归约项目A→α·,只要当前面临输入符为a∈FOLLOW(A)时,就确定采用产生式A→α进行归约,但是如果栈中的符号串为βα,归约后变为βA,再移进当前符a,则栈里变为βAa,而实际上βAa未必为文法规范句型的活前缀。 
    例如:在识别表达式文法的活前缀DFA中,(见图7.10)在项目集I2存在移进-归约冲突,即{E→T· T→T·*F}若栈顶状态为2,栈中符号为#T,当前输入符为‘)’,而‘)’属FOLLOW(E)中,这时按SLR(1)方法应用产生式E→T进行归约,归约后栈顶符号为#E,而再加当前符‘)’后,栈中为#E)不是表达式文法规范句型的活前缀。 因此这个归约是多余的。因此可以看出SLR(1)方法虽然相对LR(0)有所改进,但仍然存在着多余归约,也说明SLR(1)方法向前查看一个符号的方法仍不够确切,LR(1)方法恰好是要解决SLR(1)方法在某些情况下存在的无效归约问题。
    若[A→α·Bβ]∈项目集I,则[B→·γ](B→γ为一产生式)也包含在I中,不妨考虑,把FIRST(β)作为用产生式B→γ归约的搜索符,称为向前搜索符,作为归约时查看的符号集合,用以代替SLR(1)分析中的FOLLOW集,把此搜索符号的集合也放在相应项目的后面,这种处理方法即为LR(1)方法。(SLR(1)和LR(1)的区别在于LR(1)多使用了一个预判信息,即项目后面的符号如A →·e,c中的c,这个预判信息是用first集而非follow集得出的

1. LR(1)项目集族的构造

  构造LR(1)项目集的闭包函数CLOSURE(I)按如下方式构造:
  a) I 的任何项目都属于CLOSURE(I)
  b) 若有项目[A→α·Bβ,a ]属于CLOSURE(I), B→γ 
            是文法中的产生式,β∈V*,b∈FIRST(βa), 则 
             [B→·γ,b]也属于CLOSURE(I)中。
  c) 重复b)直到CLOSURE(I)不再增大为止。
  例:已知拓展文法为:
  (0) S′→S
  (1) S→aAd 
  (2) S→bAc
  (3) S→aec
  (4) S→bed 
  (5) A →e
  LR(1)项目集和转换函数如下:
LR(1) 分析例子_第1张图片

 

2.构造LR(1)分析表:

LR(1) 分析例子_第2张图片
  如果一个文法的LR(1)分析表中不含多重入口时(或任何一个LR(1)项目集中无移进—归约或归约—归约的冲突,则称该文法为LR(1)文法.
  例:G(S):S → BB     B→aB      B →b

  I0:S'→.S   S →.BB    B →.aB      B →.b
  I1:S' →S.
  I2:S →B.B    B→.aB    B→.b
  I3:B→a.B     B→.aB     B→.b 
  I4:B→aB.  
  I5: B→b.
  I6: S→BB.

  例:G(S):S → BB     B→aB      B →b 
  拓展文法 : (0)S' → S   (1) S → BB   (2) B→aB     (3) B →b 
LR(1) 分析例子_第3张图片

  对于该例题,只要仔细分析该文法的LR(1)每个项目集的项目,不难发现,即使不考察搜索符,它的任何项目都没有冲突,因此它实际上是一LR(0)文法,可以构造一个LR(0)项目集.可以得知它的LR(0)分析器只含7个状态,而现在LR(1)分析器却含有10个状态,其中I3和I6,I4和I7,I8和I9分别为同心集。


 

  

你可能感兴趣的:(自然语言处理)