编译原理期末速成-自上而下分析、消除文法的左递归问题

news2024/11/15 17:16:05

文章目录

  • 自上而下分析
    • 面临的问题
      • 文法左递归问题
      • 回溯问题
    • 构造不带回溯的自上而下分析算法
      • 消除文法的左递归

自上而下分析

自上而下就是从文法的开始符号出发,向下推导,推出句子。

在这里插入图片描述

面临的问题

文法左递归问题

左递归在语法分析过程中可能会导致无限循环和低效的分析。

回溯问题

回溯问题在语法分析过程中可能会出现,特别是在递归下降分析中。它指的是当选择一条产生式进行推导时,如果无法匹配当前输入符号或导致错误结果,就需要回溯到上一步选择另一条产生式进行尝试。这种回溯的过程可能导致效率低下和冗余的分析。

构造不带回溯的自上而下分析算法

消除文法的左递归

见诸于产生式的直接左递归:假定关于非终结符P的规则为在这里插入图片描述

在这里插入图片描述

接下来我我们可以把P的规则等价的改写非直接左递归的形式:

在这里插入图片描述
在这里插入图片描述

了解了左递归的消除,我们也可以思考一下左递归会把分析带入无限循环中,右递归会吗

在编译原理中,左递归确实可能导致分析进入无限循环,而右递归不会导致这个问题。这是由于在语法分析过程中,左递归会导致左递归展开时产生的推导过程无限地循环下去,而右递归则没有这个问题。

具体来说,左递归是指在文法规则中,产生式的右侧直接或间接地引用了同一个非终结符作为其左侧的非终结符。例如,考虑以下文法规则:

A -> Aα | β

其中,A是非终结符,α和β是文法符号(可以是终结符或非终结符)。这是一个左递归的文法规则,因为A在右侧出现。

当使用递归下降分析或类似的自顶向下分析方法时,对于左递归的产生式,如果没有适当的处理,会导致分析进入无限循环,无法终止。这是因为在展开左递归时,每次展开都会再次遇到同一个非终结符A,从而形成循环。

为了解决左递归带来的无限循环问题,可以使用递归下降分析中的左递归消除技术,如左因子提取或左递归消除算法。

相比之下,右递归不会导致无限循环的问题。右递归是指产生式右侧的非终结符出现在产生式的末尾,例如:

A -> αA | β

在自顶向下的分析过程中,右递归可以顺利地向下展开,因为每次展开都会使得右递归的非终结符出现在产生式的末尾,从而逐步减少产生式的长度,最终终止分析过程。

总结而言,左递归在编译原理中可能导致分析进入无限循环,而右递归不会引起这个问题。因此,在语法分析的过程中,对于左递归的处理是非常重要的。

理论了解之后,我们看个习题对消除左递归进一步认识一下:

在这里插入图片描述

上面所说的都是直接消除左递归,显而易见,有直接消除左递归法就有间接消除左递归法,如何间接消除左递归呢?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

测试员,自己都不上心,就不要抱怨别人对你冷眼旁观

昨日表哥恳请帮他的学生投递一下开发岗的简历,举手之劳,这忙必须得帮。但当发来学生的简历后,我吐槽了“这简历平平无奇,没有任何亮点,如何令人另眼相看?”表哥说,学生经历不多,总不…

Echarts 显示指定区域内容 + 不允许控制缩放

需求 在开发中,遇到如下一个需求,要展示指定区域的图形,并控制其不允许缩放 分析 第一想到的就是控件 dataZoom 中设置指定展示的区域,总结如下 解决 示例 源码 option: {xAxis: {type: "category",data: ["A…

医疗设备都在用哪些晶振?

医疗设备是指用于医疗诊断、治疗、监测等方面的各种设备。随着科技的不断发展,医疗设备的功能不断增强,精度和稳定性也得到了大幅提升。在这些医疗设备中,晶振是非常重要的元件之一。本文将介绍医疗设备中常用的晶振类型及其特点。 一、晶振…

Apache Kafka学习

目录 一、简介 1.概念: 2.kafka四大API: 3.Kafka消费模式 4.Kafka的基础架构 5.kafka文件存储方式 二、特性 三、优点 1.解耦 2.异步处理 3.流量削峰 4.数据持久化 5.顺序保证 6.可恢复性 四、名词解释 五、QA Q:如何保证数据高可靠、不…

RK3288 Android8.1添加lvds以及gt9触摸屏(一)

我们公司的屏幕是分为两部分 1.lvds负责屏幕亮起,显示UI 2.gt9触摸屏负责触摸点击反馈操作 现在先说lvds如何配置 RK的LVDS屏调试,主要是配置正确LVDS的dts,配置正确基本都是可以点亮的 1 首先拿到LVDS屏厂商给的屏规格书,规格…

微信小程序开发大坑盘点

微信小程序开发大坑盘点 起因 前几天心血来潮,想给学校设计个一站式校园小程序,可以查询成绩,考试信息,课表之类的(本来想法里是还想包括一些社交功能的,但这个因为资质问题暂且搁置了)。其实…

原生态Ajax价绍与使用方法

目录 什么是Ajax? 什么是原生态Ajax? Ajax使用方法与步骤 步骤: 代码示例: 什么是Ajax? 当谈到Ajax(Asynchronous JavaScript and XML)时,我们指的是一种用于在网页上进行异步…

效率低?不灵活?别担心,试试低代码应用开发平台,一招搞定!

在日常办公中,你有没有遇到办公效率低下、表格制作不灵活等常见问题?在大数据时代,这样的问题在现代化办公环境中经常遇到,也成为了大众头疼问题之一。要想解决这个问题,可以了解低代码应用开发平台,它的灵…

【六一儿童节】九九乘法表

文章目录 前言循环嵌套循环结语 前言 非常感谢您点进来这篇特殊的文章,时间匆匆,不知不觉已来到了自己的第三十余个儿童节。 很开心,小时候节日在学校和小朋友们一起玩耍,后来长大了又和兄弟们一起疯。很幸运!现在还有公司带着我们…

思否黑马圆满收官,28 支队伍创意使用 Jina AI 三款 AIGC 装备!

上周末,杭州被 AI 热潮所沸腾!SegmentFault AI Hackathon 杭州站暨思否 11 周年特别活动在 G5 创投中心拉开帷幕,超过 30 支团队参加了 32 小时的极限编程挑战,他们的产品展示直击评委的心,其中 28 支队伍得到了 Jina …

Windows/Linux搭建Stable Diffusion WebUI

什么是Stable Diffusion WebUI?能用来干嘛? Stable Diffusion WebUI(以下简称SD)是一个基于Gradio库的Stable Diffusion的浏览器界面,可以方便地配置和生成AI绘画作品,并且进行各种精细地配置。Stable Dif…

如何挂载企业邮箱网盘到windows本地

西部数码的企业邮箱网盘支持本地挂载功能,可以不用任何客户端,方便的将企业邮箱的个人网盘和企业网盘挂载到本机,并像本地硬盘一样使用,支持复制、粘贴、删除、改名等操作,将极大的方便用户对网盘文件的使用&#xff0…

grpc 实现grpc gateway(window环境)

官网:https://grpc-ecosystem.github.io/grpc-gateway/ github:https://github.com/grpc-ecosystem/grpc-gateway grpc gateway的原理官网有介绍。总结一下就是: gRPC-Gateway帮助你同时以gRPC和RESTful风格提供你的API。grpc-gateway旨在为您…

从零开始 Spring Boot 39:循环依赖

从零开始 Spring Boot 39:循环依赖 图源:简书 (jianshu.com) 什么是循环依赖 我们看一个例子: Component public class Person {private Dog pet;public Person(Dog pet) {this.pet pet;} }Component public class Dog {private Person o…

《项目实战》 Jenkins 与 CICD、发布脚本

前言 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释…

Monocle2拟时基因富集分析

****Monocle2全部往期精彩系列:1、群成员专享:Monocle2更新(就是重新梳理一下)2、一键跑完monocle2?3、ggplot2个性可视化monocle2结果4、ggplot修饰monocle2拟时热图:一众问题全部解决5、Monocle2终极修改…

IDEA 开发必备神级插件

“工欲善其事, 必先利其器” 分享几款 自用好用到起飞的 IDEA插件 插件下载方式 file->settings->plugins->macketplace—>然后搜索 1. Alibaba Java Coding Guidelines 阿里巴巴编码规范检查插件,让你的代码更规范 2. Tabnine 代码自动补全工具…

redis源码之:跳跃表skiplist

老规矩,先来看看大致结构: debug所用demo如下: #include "src/server.h"void testSDS(); void testAlign(); void testZipList(); void testSkipList(); void testQuickList();int main(int argc, char **argv) { // testAli…

flutter DevTools(1)

在VSCODE中调试 第一步: ① 切换到 vscode 的调试和运行模式, ② 配置好 .vscode 中的启动项 launch.json ③ 共有四种模式 [1] debug : 模式编译产物适合纯 Flutter 侧代码的开发、调试 [2] profile : 的用来做性能分析和测试 [3] release : 的用于打包发布 [4]…

DBeaver连接(DM)达梦数据库

DBeaver连接(DM)达梦数据库 文章目录 1.下载驱动2.DBeaver新建驱动3.连接DM数据库4.JDBC 接口 DBeaver是一款功能强大的数据库管理工具,可以连接多种类型的数据库。下面是连接达梦数据库的步骤: 打开DBeaver并点击“连接”按钮。在弹出的“连接”对话框中…