LR(0)分析表的构建

前言

LR(0)的分析表是LR(0)分析中最重要的部分,同时这张表也是LR(0)分析中最复杂和最难的部分。
构造过程:
1、先求文法的所有项目,并对其分类
2、构建项目集规范族(在构造之前先掌握项目集闭包运算,和go函数的求解)
3、构建自动机
4、根据自动机填写分析表

先求文法的所有项目,并进行分类

  • 项目:用"•“对产生式就行分割
    分类:
    1)移进项目:后继符号为终结符号
    2)待约项目:后继符号为终结符号
    3)规约项目:后继符号位空,即”•"出现在产生式的最后
    4)接受项目:文法开始符号的规约项目
    例1:求文法G[A`]
    在这里插入图片描述
    的所有项目,并对其进行分类
    在这里插入图片描述

求项目集的闭包

  • 计算方法如下:
    设I为项目集,则CLOSURE(I)如下
    1)I中的每个项目都属于CLOSURE(I)
    2)如果项目A->α·Bβ属于CLOSURE(I),
    且B为非终结符号,且B->γ是文法中的一个产生式,
    则将形如B->·γ的项目添加到CLOSURE(I)中
    3)重复步骤2)直到CLOSURE(I)不在扩大

例2:按照上例的结果,设I={A`-> ·A},求CLOSURE(I)
在这里插入图片描述

求项目集的转换函数go

  • 计算go(I,X)(X∈Vn∪Vt)时,先找到项目集I中形如A->α·Xβ的项目,并将该项目读入X后的项目A->αX·β求闭包
    即CLOSURE(A->αX·β)
    其结果就是go(I,X)的结果
    例3:通过例1的结果,设I={A`->·A、A->·(A)、A->a},求go(I,‘(’)
    在这里插入图片描述

求项目集规范族

在学习和掌握了前面的求项目、求项目集闭包、求项目转换函数后,就可学习求项目的规范族了

-设项目规范族为C
1)令C={ I 0 {I_{0}}^{} I0 },其中 I 0 {I_{0}}^{} I0 =CLOSURE(开始项目)
2)对每个 I i {I_{i}}^{} Ii ∈C和 I i {I_{i}}^{} Ii 中形如“·X”的项目求go( I i {I_{i}} Ii ,X),若其结果非空且不属于C,则将go( I i {I_{i}} Ii ,X)的结果加入C中
3)重复2)直到C不在增加
例4:通过例1的文法和项目,求其LR(0)的项目要规范族C:
在这里插入图片描述
在这里插入图片描述

构造自动机

  • 1)将项目规范族中的每个项目集作为DFA的状态,其中含有开始项目的作为DFA的初态,含有规约项目的做为DFA的终态
  • 2)文法中的终结符号和非终结符号作为DFA的字母表
  • 3)将转换函数go( I i {I_{i}}^{} Ii,X)作为单值转换函数
    例5:将例4得到的项目规范集转换为自动机
    在这里插入图片描述

根据自动机填写分析表

  • 动作表(action)的每列头行为所有非终结符号,状态转换表goto表每列头行为所有终结符号
  • 每行的首列为自动机的状态号
  • 填表依据:
  • 1)若一个状态到另外一个状态的箭头上为终结符号,则为移进,在action表中填入 S j {S_{j}} Sj (S表示移进,j表示箭头所指的状态)
  • 2)若一个状态到另外一个状态的箭头上为非终结符号,则在goto表中填入j(j表示箭头所指的状态)
  • 3)若某个状态没有箭头射出,则在该状态所在的行的action部分填入 r p {r_{p}} rp(其中,r表示规约,p表示该状态中规约项目所对应的拓广文法的编号)
    例6:根据例5设计其对应的LR(0)分析表
    在这里插入图片描述
    至此结束
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值