LR(0)

参考文章
参考文章

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 分析表结构
在这里插入图片描述

例子

步骤

  • 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

avatar

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

avatar

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值