LR分析法浅理解

LR分析法是自下而上的分析,从句子开始,向上归约,归约到文法的开始符号。LR(0)分析法局限很大,但是建立其他分析表的基础。

在这里插入图片描述

在这里插入图片描述

相比LL分析法,LR分析增加了状态栈,LL分析程序每步动作由栈顶元素 X X X和输入 a a a决定,而后者将对栈顶元素的考量转化为对状态的考量。

LR(0)分析法

在这里插入图片描述

点在产生式右部的中间实际代表部分匹配,点在最后代表已经匹配了,可以用该产生式进行归约。

如果进行归约,则状态栈需要弹出产生式右部长度个数量的状态,相应地这些状态之间的连接弧上对应的字符和输入状态匹配了。

在这里插入图片描述

拓广文法,简化程序的逻辑,无需对接收项目特殊处理。
闭包求取,这个过程产生的新项目数不会超过产生式的个数,而且往往遵循一个固定的模式,这里可以用新符号简化替代由某个非终结符号带来的项目集合。

在这里插入图片描述

LR(0)分析表的构造,根据Go,填写Action的 s i s_i si和Goto,之后结合每个状态中的归约项目,填写 r k r_k rk

在这里插入图片描述

SLR

在这里插入图片描述

相比于LR(0)分析法,填归约项目时考虑 a ∈ F o l l o w ( A ) a\in Follow(A) aFollow(A),利用Follow集合向后看一个符号,即通过该产生式归约得到A,必须保证a会在A之后出现,否则a无法匹配!从这里也可以看到LR(0)中有些归约项目不仅会冲突,还会导致错误。
SLR分析表相比LR(0)分析表减少了一些错误项。

LR(1)分析法

在这里插入图片描述

实际上,并不是a出现在Follow集合中就可以用该产生式归约,还需要在一定条件下,因而在构建项目时加入对搜索符号的考量,考虑一个搜索符则是LR(1)分析法。

在这里插入图片描述

LR(1)项目有一个搜索符, F i r s t ( β a ) First(\beta a) First(βa)考量了什么情况(输入符号是什么,这些符号一定在 F o l l o w ( B ) Follow(B) Follow(B)集合中出现)下可以使用该产生式进行归约。这里可以 β = ϵ \beta= \epsilon β=ϵ,所以是求 F i r s t ( β a ) First(\beta a) First(βa)

在这里插入图片描述

LR(1)分析表相比SLR分析表又减少了一些错误的归约项。

LR(1)分析表仍可能存在移进-归约冲突,因为文法本身是二义文法。这时可通过运算符的运算次序 or 约定,决定归约 or 移进。

在这里插入图片描述

在这里插入图片描述

这里状态8,输入字符e时产生移进-归约冲突, r 3 r_3 r3代表可以用 S ⟶ i S S\longrightarrow iS SiS,这意味着此时栈顶为 i S iS iS,根据约定, e l s e else else与最近的 i f if if结合,比如 i i S e S iiSeS iiSeS,应用 i ∣ i S e S i|iSeS iiSeS的方式“断句”,所以输入 e e e是不应归约前面的 i S iS iS,而是等待到最后一起归约 i S e S iSeS iSeS

reference
山东大学编译原理郑艳伟老师ppt

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

u小鬼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值