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

目录

对于LR(0)文法:

对于SLR(1)文法:

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

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

对于LALR(1)文法:

例题1:

例题2:

例题3:

例题4:


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

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

首先区分几个项目

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

文法是自底向上,归约时,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)\supseteqSLR(1)

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

例题1:

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

继续求Follow集

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

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

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

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

例题2:

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

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

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

例题3:

 

例题4:

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

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

相关文章

推荐几个贼有意思的开源项目!

这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内感受到开源的魅力,对编程产生兴趣! C 项目 1、kilo:不到 1 千行代码实现的迷你文本编辑器。该项…

STL容器——map

由于某些原因其实就是作者咕咕咕了 ,这篇文章到2023年的最后一天才更出来 map的认识 关于map,这是一种常用的工具 基本上可以看成一个下标可以为任意的数组 注意,这里的任意,包括C中所有类型的所有取值可能 也就是说下标是什…

Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)

Portraiture汉化版PS磨皮插件。本期推荐一款全新ai算法ps2024中文汉化版ps磨皮插件Portraiture 4.1.2美颜滤镜安装包最新版ps调整肤色插件! 全新Portraiture 4.1.2版本PS人像修图美颜磨皮插件,升级AI算法,并支持多人及全身磨皮美化模式,推荐…

c++对c的加强

目录 提出了命名空间的概念 实用性增强 register关键字增强 变量检测增强 struct类型加强 C中所有的变量和函数都必须有类型 新增bool数据类型 提出了命名空间的概念 命名空间将全局作用域分成不同的部分 不同命名空间中的标识符可以同名而不会发生冲突 命名空间可以相互…

TypeScript 类方法装饰器

type ClassMethodDecorator (value: Function,context: {kind: method;name: string | symbol;static: boolean;private: boolean;access: { get: () > unknown };addInitializer(initializer: () > void): void;} ) > Function | void; 1、如果装饰器返回一个函数就…

C# 中 async/await 遇上 forEach 两种写法,是否按照遍历?

在 C# 中,async/await 与 forEach 可以搭配使用,但需要注意的是,forEach 本身不是一个异步操作,它会按顺序同步地遍历集合中的元素,并将每个元素作为参数传递给回调函数。因此,如果在 forEach 循环中使用 a…

【嵌入式开发 Linux 常用命令系列 7.3 -- linux 命令行数值计算】

文章目录 linux 命令行数值计算使用 awk使用 bc 命令使用 Bash 的内置算术扩展使用 expr脚本命令实现 linux 命令行数值计算 在 Linux 命令行中,您可以使用多种方法来执行基本的数学运算。以下是一些示例: 使用 awk awk 是一个强大的文本处理工具&…

【C#】知识点实践序列之Lock的输出多线程信息

大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。 2023年第2篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正! 本篇在Lock锁定代码…

CAN,SPI,IIC,USART每帧的组成

字节是计算机中用于存储数据的基本单位,一个字节由8个二进制位组成。在计算机科学中,字节的大小是固定的,即1字节8位。1比特1位 在不同的数据类型中,字节的大小也不同。例如,在ASCII码中,一个英文字母或数…

【python_数据分组】

对excel按照标签进行分组,例如按照“开票主体和对方公司”进行分组,并获取对应的明细。 表格如下: def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…

Java 语法糖的介绍

在Java编程中,语法糖是一种简化代码的技巧,它可以使代码更易读、易写,同时提高开发效率。尽管从语法上看,它更像是一种装饰,但它能给我们的代码带来革命性的改变。 一、什么是Java语法糖? "语法糖&q…

删除重复字符

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。 输入格式: 输入是一个以回车结束的非空字符串(少于80个字符)。 输出格式: 输出去重排序后的结果字符串。 输…

leetcode每日一题42

107.二叉树的层序遍历II 就层序遍历后reverse一下 class Solution { public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> que;if(root!nullptr)que.push(root);vector<vector<int>> result;while(!que.empty()){…

web component - 使用HTML Templates和Shadow DOM构建现代UI组件

Web Component是一种用于构建可重用的UI组件的技术。它使用标准化的浏览器API&#xff0c;包括Custom Elements、Shadow DOM和HTML Templates来实现组件化开发方式。这些API都是现代浏览器原生支持的&#xff0c;因此不需要引入第三方库或框架即可使用。 在这篇博客中&#xf…

[Verilog] 加法器(半加法器 | 全加法器 | 串行加法器 | 并行加法器 | 十进制加法器)详解

前言 在数字电路中,加法器是一种常见的逻辑电路,用于将两个数字相加。本文将介绍如何使用Verilog实现各种加法器。 1 加法器种类 整数加法器 半加器(Half Adder):它是最简单的加法器,只能进行两个输入位的相加操作,不包括进位位。全加器(Full Adder):它是最基本的加…

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

SpringCloud-高级篇(九)

&#xff08;1&#xff09;Seata高可用 我们学习了Seata的各种用法了&#xff0c;Seata的服务是单节点部署的&#xff0c;这个服务如果挂了&#xff0c;整个事务都没有办法完了&#xff0c;下面我们学习Seata的高可用的知识。 实现高可用&#xff0c;还是比较简单&#xff0c;…

UntiyShader(六)Unity提供的Cg/HLSL语义

目录 前言 一、什么是语义(Semantics) 系统数值语义(system-value semantics) 二、Unity

QT上位机开发(抽奖软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 用抽奖软件抽奖&#xff0c;是一种很常见的抽奖方式。特别是写这篇文章的时候&#xff0c;正好处于2023年12月31日&#xff0c;也是一年中最后一天…

【华为机试】2023年真题B卷(python)-喊七的次数重排

一、题目 题目描述&#xff1a; 喊7是一个传统的聚会游戏&#xff0c;N个人围成一圈&#xff0c;按顺时针从1到N编号。 编号为1的人从1开始喊数&#xff0c;下一个人喊的数字为上一个人的数字加1&#xff0c;但是当将要喊出来的数字是7的倍数或者数字本身含有7的话&#xff0c;…