电子科技大学编译原理复习笔记(六):自上而下的语法分析

news2024/9/29 11:30:15

目录

前言

重点一览

引言

语法分析的功能

语法分析的分类

自上而下分析方法

回溯分析法

回溯分析法例子

方法

存在的问题

产生的原因

特点

解决缺陷

消除回溯(重点) 

递归下降分析器 

递归下降分析法

递归过程的构造

扩充BNF

改进的递归下降分析法 

预测分析法

预测分析表

⭐分析方法(重点)

⭐构造预测分析表(重点)

本章小结


前言

本复习笔记基于张老师的课堂PPT,供自己期末复习与学弟学妹参考用。


重点一览


引言

语法分析的功能

语法分析的分类

自上而下:从文法开始符出发,能否找到一个最左推导序列, 使得S=>*w ?

自下而上:从w出发,能否找到一个最左规约(最右推导的逆过程)序列,逐步向上规约,直至文法的开始符S?

自上而下分析方法

不确定的分析的方法:回溯分析法

确定的分析方法:递归下降分析法 


回溯分析法

回溯分析法例子

方法

从文法的开始符号S出发;
选取S的候选式进行推导,接着按最左推导进行下去;
如果推导失败,再换用其他的候选式;——必然导致回溯
若穷尽所有的候选式都失败,则表明w不是G的句子,w存在语法错误。

存在的问题

回溯!!!!!!!!!!

产生的原因

(1) 公共左因子

(2) 左递归

(3) ε产生式

特点

回溯分析法是一种 不确定 的方法。
使用 试探 的方法穷举每一种可能,当分析不成功时则 回退 到适当位置再重新试探其余可能的推导。
穷尽 所有可能的推导,仍不成功 才能 确认输入串不是该文法的句子

解决缺陷

回溯分析法是一种 低效 的语法分析方法,在实际的编译器中很少使用
针对产生回溯的原因,提出 消除回溯 的方法;
引进确定的语法分析方法—— 递归下降分析法 预测分析法

消除回溯(重点) 

1. 提取公共左因子

说人话:左因子写出来,右边跟个字母,字母另起一行,推出因子后面 

2. 消除左递归(直接左递归与间接左递归)

① 直接左递归的消除

说人话: 没递归的拿到左边,统统后面加上字母,字母重新另起一行,推出递归字母或ε

② 间接左递归的消除

方法:把所有非终结符排序,依次循环代入形如A→Bα的产生式,将B用B的产生式右端代替,如此循环得到直接左递归,随后消除直接左递归即可。

例题:

递归下降分析器 

如果文法没有公共左因子,也没有左递归,那么可能可以构造出没有回溯的递归下降分析器

分析程序由一组递归过程组成。

每个过程对应文法的一个非终结符

对相应的产生式的右部进行分析。

分析程序称为递归下降分析程序(器),其方法称为递归下降分析法


递归下降分析法

递归过程的构造

1.过程advance:匹配并把输入串指针后移一位
2.变量sym:输入指针指向的符号
3. Error():出错处理函数

扩充BNF

 

左递归的消除

改进的递归下降分析法 


预测分析法

将递归下降分析方法进行变化,可以得到更有效的方法——预测分析法

预测分析是一种表驱动的方法,它由下推、预测分析控制程序组成

其实质是预测每个候选式的匹配作用

预测分析表

形式:M[A,a]矩阵,A ∈ 𝑉𝑁 a ∈ 𝑉𝑡 ∪ {#}

内容:

        ◼ A→α:表示采用A→α匹配输入符号a, 或

        ◼ 出错标志(空白):表示A不可能匹配a。

目的:记录预测的结论。

穷举了ε出现的情况 

⭐分析方法(重点)

预测分析器的控制程序根据

        ◼ 下推栈的栈顶符号x

        ◼ 当前的输入符号a

决定下一步应采取的动作

        ◼ 1.若x=a=#

        ◼ 则符号串和栈均已为;则输入串ω是该文法的一个合法句子分析过程结束

        ◼ 2.若x=a≠#,

        ◼ 栈顶符号与输入符号匹配,则x出栈

        ◼ 输入指针指向下一个符号

        ◼ 这一次匹配成功,继续下一次匹配。  

        ◼ 3.若X为非终结符,则查分析表

        ◼ 若M[x,a]中存放 x→α,则x出栈,将α串逆序压入栈中(α的前缀处于栈顶位置)。

        ◼ 若M[x,a]中为出错标志,则调用出错处理程序error( )

⭐构造预测分析表(重点)

构造一个文法的预测分析表,需要引进FIRST集FOLLOW集

FIRST集

定义:由𝛼的所有可能推导开头终结符可能的𝜀组成的集合

大白话规则:终结符的FIRST集是包含它本身的集合;非终结符X能推出ε,则ε∈FIRST(X);非终结符X能推出终结符开头的串,则此终结符∈FIRST(X);非终结符X能推出终结符开头的串,那么此串开头的非终结符的FIRST集中的元素,除ε外,都∈FIRST(X)。

FOLLOW集

定义:实质上就FOLLOW(A)就是在考察A在产生式右端的出现情况,哪些终结符可以在A后面

大白话规则:文法的开始符号的FOLLOW集包含#;考察所有产生式的右端,非终结符X右边出现了串,就把后面串的除ε外的FIRST集元素加入FOLLOW(X);非终结符X右边没有字符或右边的字符可推出空元素(ε)时,将产生式左端的FOLLOW集中的元素给到FOLLOW(X)

构造算法(重点)

LL(1)文法 

当进行分析时

        ◼ 如果仅利用当前的非终结符

        ◼ 和向前查看1个输入符号,

就能唯一决定采取什么动作,

那么这个文法就是LL(1)文法。

LL=从左到右扫描,采用最左推导

(k)=向前看k位

并非所有文法G都可以改写成LL(1)文法,即使提取左公因子和消除左递归后,也不是LL(1)文法.

重点:判断是否为LL(1)文法:看预测分析表是否一格一产生式,如果一格多个产生式就不是。


本章小结

本章知识点都比较重要,尤其要掌握相关计算,大题中分析题中会考察!

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

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

相关文章

MATLAB机器学习:分类、回归和聚类的算法实现和模型优化

第一章:引言 机器学习是当今IT领域最热门的话题之一,它为我们提供了解决复杂问题的新方法。MATLAB作为一种功能强大的编程语言和环境,提供了许多用于机器学习的工具和函数。本文将介绍MATLAB中常用的分类、回归和聚类算法的实现,…

chatgpt赋能python:Python中将数字倒序:一种简单的方法提高代码效率

Python中将数字倒序:一种简单的方法提高代码效率 数字倒序是Python中一种实用的操作。网站开发者和数据分析师通常需要对数字进行反转,以使其更容易阅读和理解。虽然有多种方法可以实现数字反转,但在绝大多数情况下,使用Python中…

详解浏览器渲染原理及流程

今天来分享一下浏览器的渲染原理及流程。 前言 先来看看 Chrome 浏览器的多进程架构: 通常,我们打包出来的 HTML、CSS、JavaScript 等文件,经过浏览器运行之后就会显示出页面,这个过程就是浏览器的渲染进程来操作实现的&#xf…

Windows安装和启动SSH服务

前言 作者在做项目时遇到需要从Windows系统远程传文件到Ubuntu系统,Ubuntu系统这边使用了gFTP的文件传输工具,但是远程Windows时发现老是连接不上,后面发现是Windows这边没有开启SSH服务。 找了一些文章,结合自己的操作把配置方法…

基于工业互联网的RV1126+AI安防单目/双目高清视觉分析计数仪方案

1产品简介 产品介绍 单目视觉分析计数器是信迈科技基于单目图像分析以及深度学习算法研发的一款区域统计计数器。它可以精确的识别监控区域内的物体,统计区域内停驻的人数/车辆等,也可以统计区域内进入以及离开人数。它可适用于公交车,大巴&…

旧衣回收小程序开发需具备哪些功能呢?

旧衣回收小程序开发需具备哪些功能呢? 1、预约回收。只要通过手机小程序进行预约就可以进行上门回收旧衣,平台会根据预约的时间安排就近回收员上门进行回收废旧衣服。或者用户直接在小程序上点击捐赠,填写地址信息、时间、联系方式等待…

Android进阶 View的工作原理:源码分析View的三大工作流程

Android进阶 View的工作原理:源码分析View的三大工作流程 导语 想象一下,如果我们要画画,把画画的流程拆分的话,那么应该分几个部分呢?一般来说,专业的画师会进行提前构图,然后再进行绘画最后上…

docker hub 访问不了,可以进行拉取和推送,但是不能进行注册登陆了,界面找不到了,大家一起讨论看看有什么好的解决办法。

1,docker hub 不能访问了 在 oschina 的地方找找了文章和原因: https://www.oschina.net/comment/news/241627 2,通过啥方式进行访问呢? 目前配置源还是可以正常的pull 和 push 的。 {"data-root": "/data/doc…

数据链路层:可靠传输

1.数据链路层:可靠传输 笔记来源: 湖科大教书匠:可靠传输的基本概念 湖科大教书匠:可靠传输的实现机制–停止等待协议SW 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 1.1 可靠传输的基本概念 接收…

Rust 笔记:WebAssembly 的 JavaScript API

WebAssembly WebAssembly 的 JavaScript API 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/ar…

2023/5/29总结

abstract修饰符 抽象类就是当类和类之间有相同特征时,将这些共同的特征提取出来,形成的就是抽象类。 抽象类的特点: 抽象类和抽象方法必须使用abstract 关键字修饰:publicabstract class 类名 / public abstract void eat();抽象…

基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码)

文章目录 LSTM时间序列预测数据获取与预处理模型构建训练与测试 LSTM时间序列预测 对于LSTM神经网络的概念想必大家也是熟练掌握了,所以本文章不涉及对LSTM概念的解读,仅解释如何使用pytorch使用LSTM进行时间序列预测,复原使用代码实现的全流…

【Python实战】Python采集小说文本内容

前言 今天,我们将采集某小说数据,通过这个案例,加深我们对正则表达式的理解。我们今天来通过使用正则表达式来获取我们想要的文本。 环境使用 python 3.9pycharm模块使用 requests模块介绍 requests requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应…

MaxScript的Shape相关操作例子

MaxScript学习笔记目录 大家好,我是阿赵。之前有网友私信问了我一个相关的问题,我发现之前漏了MaxScript里面的Shape的内容,所以补一个例子,当做一个记录吧。 一、例子说明 这里做一个关于MaxScript读取二维形状(Shape)数据的例…

加盐加密——保障你的数据安全

目录 今日良言:理性和激情是生活不可或缺的调味品 一、加盐加密 1.普通密码的缺点 2.什么是加盐加密 3.加盐加密的过程 4.加盐加密的实现 今日良言:理性和激情是生活不可或缺的调味品 一、加盐加密 1.普通密码的缺点 在介绍加盐加密之前,先想想为什么普通密…

STM32F4_指针(单片机)

目录 前言 1. 计算机存储机制 2. 定义指针 2.1 指针操作 2.2 数组与指针 前言 指针(Pointer)是C语言的一个重要知识点,其使用灵活、功能强大,是C语言的灵魂。指针与底层硬件联系密切,使用指针可操作数据的地址,实现数据的间…

PreSumm模型

Text Summarization with Pretrained Encoders(PreSumm模型) 论文地址 摘要 在本文中,我们展示了如何在文本摘要中有效地应用BERT,并为提取性模型和抽象模型提出了一个通用框架。我们介绍了基于BERT的新颖文档级编码器&#xf…

安装VMware Workstation和虚拟机教程

一、VM简介   VMware Workstation中文版是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比,VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重…

iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】

文章目录 前言视频教程1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7…

sprintboot logback高级特性使用

一、业务需求 日志级别的分类 日志的级别分为: trace:微量,少许的意思,级别最低info:普通的打印信息debug:需要调试时候的关键信息打印warn:警告,不影响使⽤,但需要注…