SLR(1)分析

引言:

求出下面文法的LR(0)分析表具体求的方法见LR(0)项目集规范族的构造及LR(0)分析表的构造_用编程写诗的博客-CSDN博客

(0) S’→ S
(1) S→ rD
(2) D→D,i
(3) D→i

 我们可以看到S5和r1部分出现了冲突这个是移进规约冲突我们需要解决这个冲突那么我们现在所掌握的知识显然是不够的。所以我们需要引入新的东西来解决这个问题

这里提一下冲突是有两种的:

移进 - 归约冲突
移进和归约项目同时存在形如:
A→α·aβ
B→γ·
归约 - 归约冲突
归约和归约项目同时存在形如:
A→β·
B→γ·
假若一个文法 G 的拓广文法 G’ 的活前缀识别自 动机中的每个状态 ( 项目集 )不 存在 下述情况
既含移进项目又含归约项目
或者含有多个归约项目
则称 G 是一个 LR(0) 文法
LR(0) 文法规范族的每个项目集不包含任何冲 突项目 ( 移进 - 归约冲突、归约 - 归约冲突 )
接下来开始引入SLR(1)分析
I ={ X→   α · , 移进项目
A→   α · , 归约项目
B→ α · } 归约项目
存在移迚 - 归约冲突和归约 - 归约冲突,但是叧要满足:
FOLLOW( A ) ∩ FOLLOW ( B ) = Ø
FOLLOW( A ) ∩{ b } = Ø
FOLLOW( B ) ∩{ b } = Ø
当状态 I 面临输入符号 a 时,则动作可以按一下规定决策
(1) a = b , 则移进 b
(2) a FOLLOW (A), 则使用 A→   α 归约
(3) a FOLLOW (B), 则使用 B→ α 归约
(4) 否则, 报错
鉴于以上思想,构造 SLR 表两步走:
首先,
要先构造识别活前缀的 DFA 方法与 LR(0) 相同
然后, 根据 DFA 构造 SLR 分析表 , 时会用到 FOLLOW
一般地若一个 LR(0) 项目集 I 中有 m 个移进项目, n 个归约项目,即:
I ={ A 1→   α ·a 1 β 1 , 移进项目
A 2→  α ·a 2 β 2 ,
Am→ α ·a m β m ,
B1 → α · , 归约项目
B2 → α ·
Bn → α · }
如果所有移进项目向前看一符号 集合 { a 1 a 2 …,a m } 和所有 FOLLOW(Bi) 两两交集 均为空
那么当状态 I 面临输入符号 a :
(1) a = a i , 则移进 a i
(2) a FOLLOW(B i ), 则使 B i→   α 归约
(3) 否则, 报错
这种解决冲突的方法称为 SLR(1) 方法。若文法的 LR(0) 项目集规范族中所有 项目集的冲突均能如此解决,则称此文法为 SLR(1) 文法
DFA C={I 0 ,I 1 ,…,I n }, 构造 SLR 分析表 在构造 LR(0) 分析表的基础上更改
(1) A→ α·aβ I k GO( I k ,a)= I j , ACTION[ k,a ] =sj
(2) A→ α· I k , a FOLLOW (A) ACTION[ k,a ]= rj (假定产生式 A→ α 是文法 G’ 的第 j 个产生式)
(3) S’→ I k , ACTION[ k,# ]= acc
(4) GO(I k ,A)=I j , GOTO[k,A]=j
(5) 分析表中凡是不能用以上规则填入信息的空白格均置 上“报错标志”
注意:所有的规约项目都是要求FOLLOW集合的。都是要求的。都是要求的。强调三次!!!并不是只有产生冲突才去求是都要求!!!
例题:
(0) E’→ E
(1) E→E+T
(2) E→T
(3) T→T*F
(4) T→F
(5) F→(E)
(6) F→i

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用编程写诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值