区分LR(0),SLR(1),LR(1)和LALR(1)

简介: 区分LR(0),SLR(1),LR(1)和LALR(1)

这几个文法大致的步骤都相同,只是细节不同:

拓广文法---->项目集规范族---->构造分析表

首先区分几个项目

为什么要进行拓广文法呢?

文法是自底向上,归约时,b和c是归约哪一个S,编译器是不能区分的,那么拓广文法通过S'--->S

区分了两个S

对于LR(0)文法:

对于SLR(1)文法:

若冲突项目存在,那么就无法构表,继续判断是不是SLR(1)文法,如果根据Follow集判断交集为空,那么就是SLR(1)文法,如果不为空,那么就无法构表,既不是LR(0)文法,也不是SLR(1)文法。

对于LR(0)和SLR(1)文法:

如果文法中没有冲突项目,他是LR(0)文法,也是SLR(1)文法,也就是SLR(1)中包含不冲突的项目,也包含符合条件的冲突项目,但是如果该冲突项目也不包含在SLR(1)中,那么既不是LR(0)文法,也不是SLR(1)文法。


所以,SLR(1)文法的目的就是减少冲突的产生


对于LR(1)和SLR(1)文法:

若存在冲突项目:


LR(1)文法根据向前搜索符来判断:如果为空,那么就是LR(1)文法


SLR(1)文法是根据Follow集判断的:如果为空,那么就是SLR(1)文法

LR(1)的使用场景:

若是冲突项目,并且也不满足SLR(1)的条件,那么就要回退,重新构建带向前搜索符号的项目,判断是否为LR(1)文法。

对于LALR(1)文法:

任何一个 SLR(1)文法一定是一个 LALR(1) 文法,即:

LALR(1) SLR(1)

LALR(1)文法与LR(1)文法的区别在于,LALR(1)文法合并了同心集

例题1:

对于I2,S->L•=R和R-->L•产生了(移进--归约冲突)

继续求Follow集

将移进项目的“点”后面的终结符和规约项目的Follow集进行交集,判断是否为空

通过构造向前搜索符号继续判断,在I2中存在(移进---归约)冲突:

通过移进的“点”后面的终结符和归约项目“逗号”后面的向前搜索符号的交集判断是否为空

{=} {#}= 所以是LR(1)文法

例题2:

① 整行填上r,就是LR(0)

② 若同样的表中,不同的行出现了同样的项目,那么就是LR(1)

③ 不同的行中是不同的项目,就是SLR(1)

例题3:

例题4:

目录
相关文章
|
1月前
|
机器学习/深度学习 存储 搜索推荐
GBDT+LR简介
GBDT+LR简介
32 0
|
3月前
|
API 算法框架/工具
【Tensorflow+keras】使用keras API保存模型权重、plot画loss损失函数、保存训练loss值
使用keras API保存模型权重、plot画loss损失函数、保存训练loss值
32 0
|
6月前
|
机器学习/深度学习 数据可视化 算法
【学习打卡04】可解释机器学习笔记之Grad-CAM
【学习打卡04】可解释机器学习笔记之Grad-CAM
|
6月前
|
机器学习/深度学习 数据处理 计算机视觉
YOLOv8改进 | 2023 | 将RT-DETR模型AIFI模块和Conv模块结合替换SPPF(全网独家改进)
YOLOv8改进 | 2023 | 将RT-DETR模型AIFI模块和Conv模块结合替换SPPF(全网独家改进)
242 0
|
机器学习/深度学习 PyTorch 算法框架/工具
base model初始化large model,造成的参数矩阵对不上权重不匹配问题+修改预训练权重形状和上采样
base model初始化large model,造成的参数矩阵对不上权重不匹配问题+修改预训练权重形状和上采样
221 0
|
存储 测试技术
测试模型时,为什么要with torch.no_grad(),为什么要model.eval(),如何使用with torch.no_grad(),model.eval(),同时使用还是只用其中之一
在测试模型时,我们通常使用with torch.no_grad()和model.eval()这两个方法来确保模型在评估过程中的正确性和效率。
1044 0
|
机器学习/深度学习 算法
逻辑回归(LR)--分类
逻辑回归(logistic regression)属于有监督学习,判别模型,线性分类,不支持多分类,有预测函数,优化目标,求解算法。
143 0
逻辑回归(LR)--分类
TF之AE:AE实现TF自带数据集数字真实值对比AE先encoder后decoder预测数字的精确对比—daidingdaiding
TF之AE:AE实现TF自带数据集数字真实值对比AE先encoder后decoder预测数字的精确对比—daidingdaiding
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch的F.dropout为什么要加self.training?
以下介绍Module的training属性,F(torch.nn.functional).dropout 和 nn(torch.nn).Dropout 中相应操作的实现方式,以及Module的training属性受train()和eval()方法影响而改变的机制。
|
机器学习/深度学习 算法
【CS224n】(assignment3)Adam和Dropout
各类深度学习的优化算法的演变过程:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的历程。 优化算法的框架:
111 0
【CS224n】(assignment3)Adam和Dropout