【编译原理复习笔记】语法分析(一)

分类

语法分析可以按照分析方向分为两类
自顶向下/自底向上

自顶向下的分析

从分析树的顶部向底部方向构造分析树
每一步推导需要做两个选择:
(1)需要替换哪个非终结符
(2)用哪个产生式

最左推导

在最左推导中,总是选择每个句型的最左非终结符进行替换
经过最左推导得到的句型叫做最左句型

最右推导

在自底向上的分析中,总是采用最左规约的方式,因此把最左规约称为规范规约,相对应最右推导成为规范推导

递归下降分析

由于语法分析器一般从左至右读取代码,故采用最左推导
根据输入流中的下一个终结符,选择最左非终结符的有关候选式
循环过程,每个过程对应目标句子中的非终结符
问题:可能需要回溯,导致效率低

预测分析

预测分析是递归下降分析技术的特例,通过在输入中向前看固定个数 k 个符号来选择正确的 A-产生式,称为 LL(k)文法

文法转换

含有 A → A α A \to A\alpha AAα的产生式的文法称为直接左递归
如果一个文法中存在非终结符 A → + A α A \to^+ A \alpha A+Aα,那么这个文法就是左递归的
经过两步及以上产生的左递归被称为是间接左递归
左递归文法会使递归下降分析器无限循环

消除直接左递归

A → A α ∣ β , β 不以 A 开头 A\to A\alpha | \beta \\ ,\beta 不以 A 开头 AAαββ不以A开头
可以推导出 r = β α ∗ r = \beta\alpha^* r=βα
故可以写成
KaTeX parse error: Undefined control sequence: \betaA at position 6: A\to \̲b̲e̲t̲a̲A̲’
A ’ → α A ’ ∣ ϵ A’ \to \alpha A’|\epsilon AαA’∣ϵ
就避开了直接左递归,转换成了右递归

消除间接左递归

e.g.
S → A a ∣ b S \to A a|b SAab
A → A c ∣ S d ∣ ϵ A \to Ac|Sd|\epsilon AAcSdϵ
在实际推导时会出现:
S = > A a S => Aa S=>Aa
= > S d a => Sda =>Sda
出现了左递归
解决方法:将 S 产生式放入 A 产生式中,然后消除 A产生式的直接左递归

消除公共前缀

在这里插入图片描述

LL1 文法

S_文法:每个产生式的右部都以终结符开始,同一非终结符的各个候选式的首终结符都不同

产生式的后继符号集
在某个句型中紧跟在 A 后面的终结符的集合,记为 FOLLOW 集
产生式的可选集

一个产生式的可选集指的是当选用该产生式进行推导的时候,对应输入符号的集合,
e.g. S E L E C T ( A → a β ) = a SELECT(A \to a\beta) = \\{a\\} SELECT(Aaβ)=a
q_文法:每个产生式的右部为 epsilon/首字母为终结符,且具有相同左部的产生式具有不相交的可选集

串首终结符集

串首第一个符号是非终结符,简称首终结符
给定一个文法符号串 alpha,alpha 的串首终结符集 FIRST(alpha)被定义为 alpha 推导出的所有串首终结符构成的集合
对于可选集 SELECT,
如果空字符不属于 FIRST 集, S E L E C T ( A → α ) = F I R S T ( α ) SELECT(A \to \alpha) = FIRST(\alpha) SELECT(Aα)=FIRST(α)
如果空字符属于 FIRST 集, S E L E C T ( A → α ) = ( F I R S T ( a ) − ϵ ) ∪ F O L L O W ( A ) SELECT(A \to \alpha) = (FIRST(a) - \\{\epsilon\\}) \cup FOLLOW(A) SELECT(Aα)=(FIRST(a)ϵ)FOLLOW(A)

LL1 文法的定义

根据上面的概念,在文法 G 中,任意两个具有相同左部的产生式 A → α ∣ β A \to\alpha|\beta Aαβ
(1)如果 alpha 和 beta 均不能推出空字符,则 F I R S T ( α ) ∩ F I R S T ( β ) = ∅ FIRST(\alpha)\cap FIRST(\beta) = \varnothing FIRST(α)FIRST(β)=
(2)alpha 和 beta 至多有一个能够推导出空字符
如果 β = > ϵ \beta => \epsilon β=>ϵ,则 F I R S T ( α ) ∩ F O L L O W ( A ) = ∅ FIRST(\alpha)\cap FOLLOW(A) = \varnothing FIRST(α)FOLLOW(A)=
对于 alpha 同理
(3)不可能同时推出空字符,否则会产生二义性
S → α → ϵ , S → β → ϵ S \to \alpha \to \epsilon,S \to \beta \to \epsilon Sαϵ,Sβϵ

FIRST 集细究

对于一串产生式,寻找 FIRST 集方法如下:
E → T E ’ E \to TE’ ETE
E ’ → + T E ∣ ϵ E’ \to +TE|\epsilon E+TEϵ
T → F T ’ T \to FT’ TFT
T ’ → ∗ F T ’ ∣ ϵ T’ \to *FT’|\epsilon TFT’∣ϵ
F → ( E ) ∣ i d F \to (E)|id F(E)id
(1)查看各产生式右部第一个符号是否为终结符,如果为终结符,则直接填在对应左部的 FIRST 集中
在这里插入图片描述

(2)寻找空串,并将空串添加到对应的 FIRST 集中
在这里插入图片描述

(3)对于串首是非终结符的产生式,则看该非终结符下所具有的 FIRST 集合
在这里插入图片描述

不断运用这三个规则,就可以得到 FIRST 集的集合

FOLLOW 集细究

(1)首先查看开始符号的位置,开始符号算作该产生式集合所构成句型的最右符号,FOLLOW 集包含$
在这里插入图片描述

(2)观察每个式子的右部,两个连接的非终结符,后者 FIRST 集中的终结符则在前者的 FOLLOW 集中
在这里插入图片描述

(3)对于每个产生式右部的最末尾,如果其右边没有终结符,则左部的 FOLLOW 集被添加到该非终结符的 FOLLOW 集中
在这里插入图片描述

(4)对于 FIRST包含空字符的非终结符(且在右部末尾),其前面的非终结符填入左部非终结符的 FOLLOW 集
在这里插入图片描述

(5)对于右部中,一个非终结符后紧跟着一个终结符,将该终结符添加到前者的 FOLLOW 集中
在这里插入图片描述

重复以上几步作为一个循环,直到这些 FOLLOW 集不再发生变化,此时结束循环,认为找到了所有 FOLLOW 集
该例子最终的 FOLLOW 集如下所示
在这里插入图片描述

SELECT 集的细究

对于原产生式,可改写为
E → T E ’ E \to TE’ ETE
E ’ → + T E E’ \to +TE E+TE
E ’ → ϵ E’ \to \epsilon Eϵ
T → F T ’ T \to FT’ TFT
T ’ → ∗ F T ’ T’ \to *FT’ TFT
T ’ → ϵ T’ \to \epsilon Tϵ
F → ( E ) F \to (E) F(E)
F → i d F \to id Fid
在拥有了 FIRST 集和 FOLLOW 集后,判断 SELECT 集只需要以下三种分类方法:
(1)如果产生式右部第一个为终结符,则该产生式 SELECT集就为该终结符
(2)如果产生式右部第一个为非终结符,则 SELECT 集为该非终结符的 FIRST 集
(3)如果产生式右部为空字符,则 SELECT 集为产生式左部非终结符的 FOLLOW 集
遵循这三个原则,我们可以得到:
在这里插入图片描述

此时对于相同左部的产生式,其满足之前定义的 LL1 文法的要求,或者在此处直接观察 SELECT 集,red:SELECT 集不相交则说明其为 LL1 文法
所以上述文法是 LL1 文法
同时拥有了SELECT 集之后也可以很轻松的定义预测分析表:

预测分析表

在这里插入图片描述

递归的预测分析法

在递归下降分析中,编写每一个非终结符对应的过程时,根据预测分析表进行产生式的选择
e.g.
在这里插入图片描述

非递归的预测分析法

非递归的预测分析不需要为每个非终结符编写递归下降程序,而是根据预测分析表构造一个自动机,也叫表驱动的预测分析
类似有穷自动机,但是增加了栈,用于记忆,一方面从预测分析表中使用新产生式替换,另一方面当遇到目标输入时将当前终结符出栈,同时开始考虑下一个终结符
在这里插入图片描述

递归与非递归之对比

递归的预测分析表规模比较大,不需要载入预测表,而且比较直观,但是在自动生成和效率上不占优势;非递归的预测方法尽管不算特别直观且需要载入预测分析表,但是对于机器自动生成的难度来说较小,而且效率也比较高

预测分析中的错误处理

两种情况可以检测到错误

(1)栈顶的终结符和当前输入符号不匹配
(2)栈顶的非终结符与当前输入符号在预测分析表中在对应项为空

恐慌模式

忽略输入中的一些符号,直到输入中出现同步词法单元集合中的某个词法单元
一般将非终结符的 FOLLOW 集认为是同步词法单元
在这里插入图片描述

M(A,a),其中 A 表示当前栈顶符号,a 表示输入符号,如果 M = null,则表示检测到错误,根据恐慌模式忽略 a
如果遇到 synch,则弹出栈顶的非终结符 A,尝试继续分析后面的语法符号
如果栈顶此时为终结符且与输入符号不匹配,则弹出栈顶的终结符

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

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

相关文章

【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针

前言 大家好,今天是【重学C】系列的第二讲,我们来聊聊C的智能指针。 为什么需要智能指针 在上一讲《01 C如何进行内存资源管理》中,提到了对于堆上的内存资源,需要我们手动分配和释放。管理这些资源是个技术活,一不…

正点原子LWIP学习笔记(一)lwIP入门

lwIP入门 一、lwIP简介(了解)二、lwIP结构框图(了解)三、如何学习lwIP(熟悉) 一、lwIP简介(了解) lwIP是一个小型开源的TCP/IP协议栈 阉割的TCP/IP协议 TCP/IP协议栈结构&#xff0…

C语言游戏实战(12):植物大战僵尸(坤版)

植物大战僵尸 前言: 本游戏使用C语言和easyx图形库编写,通过这个项目我们可以深度的掌握C语言的各种语言特性和高级开发技巧,以及锻炼我们独立的项目开发能力, 在开始编写代码之前,我们需要先了解一下游戏的基本规则…

基础2 JAVA图形编程桌面:探索图形程序的抽象实现

嘿,大家好!我非常高兴又一次有机会与大家相聚,分享新的知识和经验。对于热爱编程和探索新技术的朋友们来说,今天的内容绝对不容错过。我为大家准备了一个详尽的视频教程:《基础2 JAVA 图形编程:主程序调用…

git拉取项目前需要操作哪些?

1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa:(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase:(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…

20240516-Flyme AIOS 特种兵发布会

目录 1 Flyme AIOS 2 路演功能 2.1 拖拽流转 2.2 任务剧本自定义 2.3 智能体商店 2.4 实况通知 2.5 AI壁纸 3 MYVU 3.1 翻译功能 3.2 AR导航-骑行 3.3 AI语音转文字-科技向善 3.4 Flyme AR-提词器增强 1 Flyme AIOS 1)目标:All in AI&#…

AI绘图Stable Diffusion,如何无损高清放大图片,保姆级教程建议收藏!

前言 我们在用 stable diffusion 制作AI图片时,默认生成图片的尺寸为512*512,即使是竖图一般也就是512*768,如果再把尺寸设置大一些,就会因为硬件算力不够而造成系统崩溃,今天就来跟大家聊一聊,如何将制作…

RocketMQ-Dashboard 控制台使用详解

1 安装部署 具体部署启动请参考:RocketMQ从安装、压测到运维一站式文档_rocketmq benchmark压测-CSDN博客 RocketMq的dashboard,有运维页面,驾驶舱,集群页面,主题页面,消费者页面,生产者页面&…

【Kubenetes】边缘计算KubeEdge架构设计详解

文章目录 前言KubeEdge云边通信方式云端架构设计EdgeController:云到边:边到云 DeviceController:云到边边到云 边缘端架构设计EdgedPod的管理部分Pod的监控部分Pod的卷管理Pod的垃圾回收Pod同步管理 MetaMangger从云到边缘的更新 (Update From Cloud To Edge)从边缘…

Covalent长期数据设施,支持基于 “blob” 、总锁仓54亿美元的L2

Covalent Network(CQT)是领先的历史数据可用性网络,通过其在 Web3 中超过 225 个区块链上的结构化数据基础设施,为数千名客户和开发人员提供支持。Covalent Network(CQT)正在与未来以太坊的进步需求相匹配&…

SQL慢查询学习篇

https://www.cnblogs.com/isyues/p/17733015.html 1. 对扫到的SQL慢查询语句执行 explain explain select task_id, channel, count(task_id) as count from tablename where send_time > "2024-05-10 16:13:59" and send_time < "2024-05-14 16:13:59…

api接口、api文档、api调试、api测试

应用程序接口是一组定义、程序及协议的集合&#xff0c;通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过调用 API 函数对应用程序进行开发&#xff0c;可以减轻编程任务。 API 同时也是一种中间件&#xff0c;为各种不同平台提供数…

展馆展厅设计施工流程

1、需求分析和确定&#xff1a; 与客户沟通&#xff0c;了解客户需求&#xff0c;对展馆展厅的用途、面积、功能、展品特点等进行分析&#xff0c;并确定设计方案。 2、方案设计 根据需求确定设计方案&#xff0c;包括平面布局、展品陈列、展示方式、照明等。设计师需要提供设计…

如何在Spring启动的时候执行一些操作

如何在Spring启动的时候执行一些操作 在Spring启动的时候执行一些操作有多种方式。你可以通过实现ApplicationRunner或者CommandLineRunner接口&#xff0c;在Spring Boot应用程序启动后执行特定操作。另外&#xff0c;你也可以使用PostConstruct注解&#xff0c;在Spring Bea…

【考研数学】张宇《1000题》强化阶段正确率多少算合格?

张宇1000题真的很练人心态.... 基础不好&#xff0c;建议别碰1000题 基础好&#xff0c;1000题建议在两个月以内刷完 如果自己本身在基础阶段学的比较水&#xff0c;自己的薄弱点刷了一小部分题没有针对性完全解决&#xff0c;转身去刷1000题就会发现&#xff0c;会的题目刷…

shell脚本-重定向与管道符

一、重定向 因为shell脚本有着批量操作的特殊性&#xff0c;大部分操作处于后台执行&#xff0c;不需要用户进行干预&#xff0c;所以提取、过滤并执行信息十分需要重定向和管道。重定向的意思是不输出到默认设备上&#xff0c;而是输出到你指定的位置&#xff08;文件、其他输…

1.微信小程序开发之准备工作

1.微信小程序账号注册 小程序开发 与 网页开发不一样&#xff0c;在开始微信小程序开发之前&#xff0c;需要访问 微信公众平台&#xff0c;注册一个微信小程序账号。 在拥有了小程序的账号以后&#xff0c;我们才可以开发和管理小程序&#xff0c;后续可以通过该账号进行开发…

国网电力分公司、税务企业如何向央媒投稿?

税务、电力、银行等单位如果想要将稿件发布到中央媒体&#xff0c;可以遵循为大家整理的以下步骤和建议&#xff1a; 了解央媒的定位与要求&#xff1a;中央媒体&#xff0c;如新华社、人民日报、中央电视台等&#xff0c;都有其独特的报道风格和关注重点。在投稿前&#xff0…

【Web后端】会话跟踪技术及过滤器

1.会话跟踪技术 1.1 会话的概念 在web应用中&#xff0c;浏览器和服务器在一段时间内发送请求和响应的连续交互的全过程 1.2 会话跟踪概念 对同一个用户跟服务器的连续请求和接收响应的监视过程 1.3 会话跟踪作用 浏览器和服务器是以http协议进行通信&#xff0c;http协议是…

算法工程师面试问题 | YOLOv8面试考点原理全解析(一)

本文给大家带来的百面算法工程师是深度学习目标检测YOLOv8面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习目标检测面试问题&#xff0c;并提供参考的回答…