LR(0)

news2025/4/16 16:32:10

在这里插入图片描述
LR0就是当我处在自动机为红色这些结束状态的时候,这些红色状态就代表我们识别到了一个句柄,那现在的问题就是识别到了句柄,那要不要对他进行归约?LR0就是我不管当前指针指向的终结符是什么,我都拿它做规约

在这里插入图片描述
这里的二号状态就是,我这个点已经到了最后,那么我这个第二个状态这一行,不管碰到哪个终结符,都用2号产生式规约,而且现在这里还不是LR0文法,因为有一个空有冲突,那能不能消除冲突,那就要加强条件,比如说不能像LR0一样,不管咋样,不管遇到那个终结符我都武断的到了最后就归约。坚强条件让他看看当前的输入,考虑一下能不能做规约。
先看个这个例子,再泛化一下,看能不能实现加强
在这里插入图片描述

按理来说,我们要把T换成E,把T弹出去,E压进来。
在这里插入图片描述
而对于自动机来说,这个过程就是先回到0状态,再压入E,那就走到1状态。这个时候我们就发现问题了。1状态的出边可以是S,可以是+,但是没有星号出边,那就卡在这一步了,因此之前那里就不要做规约。但现在的问题是,我想立马知道不能归约,而不是说我这样操作一下,后面到某一部之后操作不下去,卡住了,才知道不能这么走。
一部分由栈底到栈顶,一部分是当前还未处理的输入流,这两部分一起构成当前的句型,那我们看这个句型。
这个栈顶E,和当前未处理的 *,他们是紧挨着的,我要当前能碰到星号做归约,哪一个必要条件就是星号能跟在E后面。因为你用E换了T,E就是栈顶了,当前面对的是星号。如果我希望做规约的话,那么星号要能紧跟在E后面,这是一个必要条件。必要条件就是要能跟在你要规约的产生式的左部那个非终结符的后面。有没有联想到一个概念,跟在一个非终结符的后面,就是follow集合。
我们现在来算算这个follow集合,没有星号,所以就不要规约在这里插入图片描述

现在抛开例子,我们比较general的来说一下。对于下图这个例子,我们考虑的是,能不能拿这个句柄,在当前看到t的情况下,做规约。如果规约的话,我们看栈的状态
在这里插入图片描述
当前句型由两部分构成,这个句型就要求t能跟在A的后面,这样才能归约在这里插入图片描述
所以我们就得到了这样一个条件。原来对于LR0而言,如果出现这样一个句柄,我不管什么其他条件,我这一行都填s,做规约。而现在我们要这个终结符能跟在非终结符后面才能归约,这样得到的一个语法分析算法叫做Simple SR1,在这样一个条件下我们的分析表就没有冲突了。

在这里插入图片描述
对于这个例子而言,SR1已经没有冲突了,那还没有其他例子能够让他有冲突?也就是有没有非SR1文法
在这里插入图片描述
归约/归约冲突就是可以用两个产生式归约。没有移入/移入冲突,当前移入的符号就一个,没有什么可以冲突的。
接下来我们看一个非SLR1文法,我们看看为什么冲突,为什么SLR解决不了,从而在加强条件得到一种更强大的SR1算法
在这里插入图片描述
图上这个文法表示的是c++中的指针用法。我们现在就看二号状态,有一个移入归约冲突。如果当前面对一个等号的话,那就可以移入,从而转移到状态6;那如果选择归约的话呢,那我们就要看当前面对的这个等号是否能跟在规约的这个产生式的左部的后面,也就是是否 =∈FOLLOW®。然后我们发现的确是属于的,那我们按照之前SLR1的要求,也可以做规约,那么这里就产生了移入归约冲突。我们怎么去解决这个移入归约冲突呢?在这里插入图片描述
虽然我们满足这个条件,那应不应该做规约呢,因为我们之前说过他只是一个必要条件,不是充要条件,所以我们要对这个必要条件再加强一下,我们要先分析一下不能做规约的原因,找到这个原因,我们再加强一下,就得到了更强的规约条件。原因的话我们要看到整个自动机才好分析在这里插入图片描述
我们拿它做规约的话。在自动机上的体现就是把R弹出来,从q2回到q0,把R压进去,那就到了q3状态,我们就看到了q3状态,这里有一个等号,会出现什么情况。我们把栈的情况也画出来看看。现在我们其实是说等号属于FOLLOW(R)不够,那我们回想一下这个FOLLOWR我们之前是怎么算的,我们纯粹是看到了文法的静态文本,是静态分析,我们做所有可能的推导,这个结果是很粗糙的,当你真正的去分析一个输入的时候,你肯定不是无缘无故来到q2的,肯定有一个路径让你来到q2,这是一个动态信息,你的静态FOLLOWR是比较粗糙的,你的路径应该能帮你排除一些终结符,从而让你在某些情况下不归约。分析下面这个栈,我们可以知道R下面一定是个0号状态,这个是静态文本体现不出来的,你必须是跑这个自动机才能体现出来,我在把L弹出去之后,进入到q0,这个q0一定是栈底,不可能是站中间的一个部分,他只可能在最开始的时候进入,因为他没有入边,不可能再次来到这个状态,只有当上千的状态都弹出来,这个状态才会暴露出来,所以只会是栈底,只会是栈底就意味着R后面跟着=,这个部分一定是最前面的,一定是以它打头的
在这里插入图片描述
我们从属于FOLLOWR,我们得出的结论是等号可能出现在R后面,这点是从静态文本得出的。经过我们在自动机的分析,我们得到了更多的动态的信息,我们又能进一步加强这个结论,这个结论是说等号在FOLLOWR后面,那么在满足这个条件的句型中,一定是以R=开头的句型。然而在这里插入图片描述
所以直接做归约是不够的,我们希望的是你能获取一些动态信息,我在这个状态上发现的句柄,他能不能做规约,还和他是怎么从初始状态来到这个状态有关,这一路的信息我们都希望能分析一下,帮助我们在魔偶个状态能不能归约做一个判断。下面就来到我们更强的一个语法分析算法,这个语法分析算法最重要的就是下面这一页。我们也只是尽可能精确,无法做到百分百精确,我们现在一路走来都是从一个什么都不加的规约,到考虑一下follow集合,然后我们现在再把它精确一步,我们只是想做尽可能精确。
假设当前面对的是t,我能不能用A->a这条做规约,我们要进一步加强对t的约束
在这里插入图片描述
那么我们就看这个Ij项之前的项集,其实就是把那个点往前移一位,到了Ii,特殊的情况就是直接回到了I0,当然我们在这里考虑一般一点的情况。除了A->a,我们还要找闭包的情况,那这个图有了,那有没有看到对t更强的要求。我们还要and上什么条件?在这里插入图片描述在这里插入图片描述
那么其实我们就要前一个项集的紧跟着A的那个符号的first,我们的t要在这个first里面。但是其实也可以简化一下,我们属于First(γ)的也一定属于FOLLOW(A),这也说明了我们其实是把原来的条件加强了。
在这里插入图片描述
就是在i这个状态求闭包的时候,我们把伽马这个信息丢失了,我们希望在对某个项求闭包的时候把这个伽马的信息给带上,这样的话,可以把所有的项都带上伽马,这样我们在goto其他状态的时候,也有了这个信息,那么我们现在就来改造一下这个文法。
在这里插入图片描述

那么这个项表示什么呢?我们画一个栈来表示一下,看小数点的位置,在alpha的后面,说明我们当前的栈顶元素是alpha,然后剩下的输入(我们期望的)是β和alpha
在这里插入图片描述
在这里插入图片描述
太神奇了,我其实感觉听老师的就是讲的每一小部分内容都听明白了,但是还是没有串起来,已经开始晕了,结果问了一下ai一下就懂了,谁懂啊。

您说得对,我没有完全理解您的问题。您是在问为什么要限制FIRST(γ),而不直接使用FOLLOW(A)。 分析您的问题:
在LR(0)自动机中,如果项集Ij中包含[A → α·],而在之前的项集Ii中包含[B → β·Aγ]与[A →
·α],按照图中红框标注的内容,归约条件是"只有当α ∈ FIRST(γ)时,才可以进行A → α归约"。
您的疑问是为什么不直接使用FOLLOW(A)集合作为归约条件。
这是一个很好的问题。理论上,FOLLOW(A)确实表示可能在A之后出现的所有终结符,但在这个特定的上下文中:

  1. FIRST(γ)提供了更精确的信息 - 它专门指出在这个特定的产生式[B → β·Aγ]中,A后面实际跟随的是γ,而不是任何可能跟在A后面的符号。(最重要的就是这条了,这里的意思就
    是保存了一路走来的路径信息,因为我们找的是上一个项集的[B → β·Aγ],而不是那个静态的文本)
  2. 使用FIRST(γ)而不是FOLLOW(A)可以减少冲突 - FOLLOW(A)可能包含很多在其他上下文中跟随A的符号,但在当前文法位置不适用
  3. 这种限制确保了归约操作只在γ可能开始的情况下进行,使分析更加精确。 您的直觉是对的,在构造LR(1)或LALR(1)分析器时,我们确实会使用FOLLOW集合信息。但在图中描述的特定情景中,使用FIRST(γ)能提供更精确的上下文相关信息,减少不必要的归约行为。
    在这里插入图片描述
    注意是之前的某个项集
    在这里插入图片描述
    为什么一定要first 伽马,再提醒自己一边,看上图,因为我们在求闭包的时候,丢失了伽马的信息。LR0在做闭包,我们goto的时候伽马的信息也没有带过来。所以接下来我们要改造一下LR0,使其能让我们对某个项求闭包的时候能把伽马这个信息给带上,到其他项集的时候这个信息也一路带过去。
    首先改造LR0,我们就把LR0的项的定义先改一下,原来我们只有前面的部分,现在我们搞个逗号,加一个a,这个a就是我们向前看的符号,其实就可以理解成first伽马。这里其实first伽马是一个集合,那其实有多个这样子的项,我们只是把它拆开了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
我们还是先来从自动机入手,构造LR1自动机有两个关键的操作,一个是:一个状态内部我们要做闭包操作,经过前面的分析我们知道这是一个关键点在这里插入图片描述
在求绿色这行的,也就是上面这一行的闭包的时候,我们要把β的信息带下来,这是做闭包的一个关键点。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
有上面这样一个项,我们现在要对他求闭包,产生式是B->gama,前面的部分放小数点跟LR0是一样的,b是什么呢?可能是一个集合。对于任何满足first这个条件的,我们都写一个项把它放进去。满足b∈βa,这里就是把β和a钉在一起,这是为什么?因为对于扇面这个产生式而言,他的意思是alpha后面可能会出现Bβ,那现在我们要去追踪大B了在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人船 | 图解基于视线引导(LOS)的无人艇制导算法

目录 1 视线引导法介绍2 LOS制导原理推导3 Lyapunov稳定性分析4 LOS制导效果 1 视线引导法介绍 视线引导法(Line of Sight, LOS)作为无人水面艇(USV)自主导航领域的核心技术,通过几何制导与动态控制深度融合的机制&am…

3.2.2.3 Spring Boot配置拦截器

在Spring Boot应用中配置拦截器(Interceptor)可以对请求进行预处理和后处理,实现如权限检查、日志记录等功能。通过实现HandlerInterceptor接口并注册到Spring容器,拦截器可以自动应用到匹配的请求路径。案例中,创建了…

大模型文生图

提示词分4个部分:质量,主体,元素,风格 质量:杰作,高质量,超细节,完美的精度,高分辨率,大师级的; 权重:把图片加括号,&am…

LeetCode 118题解 | 杨辉三角

题目链接: https://leetcode.cn/problems/pascals-triangle/description/ 题目如下: 解题过程如下: 杨辉三角就是一个不规则的二维数组,实际上是一个直角三角形。如图所示: 杨辉三角特点:每一行的第一个和最后一个都是…

『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解

『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解 Pod 结构 每个 Pod 中都可以包含一个或者多个容器,这些容器可以分为两类 用户程序所在的容器,数量可多可少Pause 容器,这是每个 Pod 都会有的一个根容器,它的作用有两个 可…

数据库索引深度解析:原理、类型与高效使用实践

🧠 一句话理解索引是什么? 索引就是数据库中的“目录”或“书签”,它能帮助我们快速找到数据的位置,而不是一页页地翻整本书。 🧩 一、为什么需要索引?(用生活化例子秒懂) 想象你在…

React 记账本项目实战:多页面路由、Context 全局

在本文中,我们将分享一个使用 React 开发的「记账本」项目的实战经验。该项目通过 VS Code 完成,包含首页、添加记录页、编辑页等多个功能页面,采用了 React Router 实现路由导航,使用 Context API 管理全局的交易记录状态,并引入数据可视化组件呈现不同月份的支出情况。项…

易路iBuilder智能体平台:人力资源领域AI落地,给“数据权限管控”一个最优解

近日,加拿大电子商务巨头Shopify的CEO Tobias Ltke分享了一份内部备忘录,明确表示有效使用AI已成为公司对每位员工的基本期望,并指出:各团队在招募新员工前,必须先确定是否能够利用AI完成工作。 而在全球范围内&#…

mybatis--多对一处理/一对多处理

多对一处理(association) 多个学生对一个老师 对于学生这边,关联:多个学生,关联一个老师[多对一] 对于老师而言,集合,一个老师有多个学生【一对多】 SQL: 测试环境搭建 1.导入依…

计算机视觉——图像金字塔与目标图像边缘检测原理与实践

一、两个图像块之间的相似性或距离度量 1.1 平方差和(SSD) 平方差和(SSD) 是一种常用的图像相似性度量方法。它通过计算两个图像在每个对应位置的像素值差的平方和来衡量两个图像之间的整体差异。如果两个图像在每个位置的像素值…

VRoid-Blender-Unity个人工作流笔记

流程 VRoid 选配模型>减面、减材质>导出vrm Blender(先有CATS、vrm插件) 导入vrm>Fix model>修骨骼>导出fbx Unity 找回贴图、改着色器、调着色器参数…… VRoid 减面 以模型不出现明显棱角为准。脸好像减面100也问题不大。 下…

Domain Adaptation领域自适应

背景与问题定义 传统监督学习假设:训练集与测试集数据分布一致。 Domain Shift:测试数据分布与训练数据不同,模型泛化性能骤降 。 例如在黑白图像上训练数字分类器,测试时用彩色图像,准确率骤降。 Domain Adaptatio…

从自动测量、8D响应到供应链协同的全链路质量管理数字化方案——全星QMS如何破解汽车行业质量困局

全星QMS如何破解汽车行业质量困局:从自动测量、8D响应到供应链协同的全链路数字化方案 在当今竞争激烈的市场环境中,企业要想脱颖而出,必须确保产品质量的稳定性和可靠性。 全星质量QMS软件系统凭借其强大的功能和灵活的架构,为企…

联想电脑开机出现Defalut Boot Device Missing or Boot Failed怎么办

目录 一、恢复bios默认设置 二、关机重启 三、“物理”方法 在图书馆敲代码时,去吃了午饭回来发现刚开机就出现了下图的问题(崩溃),想起之前也发生过一次 这样的问题,现在把我用到的方法写在下面,可能对…

SQL学习笔记-聚合查询

非聚合查询和聚合查询的概念及差别 1. 非聚合查询 非聚合查询(Non-Aggregate Query)是指不使用聚合函数的查询。这类查询通常用于从表中检索具体的行和列数据,返回的结果是表中的原始数据。 示例 假设有一个名为 employees 的表&#xff…

【Vue 3 + Element Plus 实现产品标签的动态添加、删除与回显】

🚀Vue 3 Element Plus 实现产品标签的动态添加、删除与回显 在后台管理系统中,我们经常需要对表单数据进行动态处理,尤其是类似“产品标签”这样的字段,它需要用户能够灵活添加、删除,并在编辑时自动回显。今天我们就…

IntelliJ 配置(二)配置相关类库(2)LineMarkerProvider

一、介绍 LineMarkerProvider 是 IntelliJ 平台插件开发中的一个接口,它的作用是在编辑器左侧的“行标记区域”(就是代码行号左边那一栏)添加各种图标、标记或导航链接。比如Java 类中看到的: 小绿色三角形(可以点击运…

从零开始学java--线性表

数据结构基础 目录 数据结构基础 线性表 顺序表 链表 顺序表和链表的区别: 栈 队列 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表中的元素个数就是线性表的长度,表的起始位置称为表头&am…

AD917X系列JESD204B MODE7使用

MODE7特殊在F8,M4使用2个复数通道 CH0_NCO10MHz CH1_NCO30MHZ DP_NCO50MHz DDS1偏移20MHz DDS2偏移40MHz

Spring Cloud之远程调用OpenFeign最佳实践

目录 OpenFeign最佳实践 问题引入 Feign 继承方式 创建Module 引入依赖 编写接口 打Jar包 服务提供方 服务消费方 启动服务并访问 Feign 抽取方式 创建Module 引入依赖 编写接口 打Jar包 服务消费方 启动服务并访问 服务部署 修改pom.xml文件 观察Nacos控制…