LR(0)是什么

  • LR(0) : 假如一个文法G的拓广文法G’的活前缀识别自动机的每个状态(项目集)不存在下述情况:
    (1):既含移进项目又含归约项目
    (2) 含多个归约项目
    则称G是一个LR(0)文法。换言之,LR(0)文法规范族的每个项目集不包含任何冲突项目

如何判断是否是LR (0)

1.构造它的LR(0)项目集合的DFA(即识别来该文法全部活前缀的DFA);

2.根据自该DFA画出该文法zd的LR(0)分析表;

3.在分析表中,每格要么只有一个内容,要么没有内容,(即无冲突)则为LR(0)文法。

项目分类:

  • 归约项目:凡圆点在最右的项目,如A→α•称为一个“归约项目”
  • 接受项目:对文法的开始符号S’的归约项目,如S’→α•称为“接受”项目。
  • 移进项目:形如A→α•aβ的项目,其中a为终结符,称为“移进”项目。
  • 待约项目:形如A→α•Bβ的项目,其中B为非终结符,称为“待约”项目。

LR(0)分析表构造算法

假定项目集规范族C={I0,I1,…,In}。令每一个项目集Ik的下标k作为分析器的状态。分析表的ACTION子表和GOTO子表可按如下方法构造:

  1. 令那个包含项目S’→•S的集合Ik的下标k为分析器的初态。
  2. 若项目A→α•aβ属于Ik且GO(Ik , a)= Ij,a为终结符,置ACTION[k,a]为“把(j,a)移进栈”,简记为“sj”。
  3. 若项目A→α•属于Ik,对任何终结符a(或结束符#),置ACTION[k,a]为“用产生式A→α进行归约”,简记为“rj”(假定产生式A→α是文法G’的第j个产生式)。
  4. 若项目S’→S•属于Ik,则置ACTION[k,#]为“接受”,简记为“acc”。
  5. 若GO(Ik , A)= Ij,A为非终结符,则置GOTO[k,A]=j。
LR 分析表结构

R判断是否为empty_构造算法

例子

步骤

  • 1.写出扩张文法
  • 2.写出所有的项目集
    -3.写出DFA( A→α•aβ,B属于非终结符,Si需要写出 B→·r)
  • 4.构造分析表
    如果某个状态Sx接收一个VT,置ACTION Sj
    如果某个状态Sx接收一个VN,置ACTION j
    如果某个状态Sx接收一个VT产生规约项目,置ACTION rj

例: G[S]为 :

S →a A c B e
      A →b
      A →A b
      B →d

1.写出扩展文法

S` →S
      S →a A c B e
      A →b
      A →A b
      B →d

2. 写出项目表

3.写出DFN

R判断是否为empty_开始符号_02

4.构造它的 LR(0) 分析表

R判断是否为empty_构造算法_03