前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >语法分析

语法分析

作者头像
code-child
发布于 2023-05-30 03:19:46
发布于 2023-05-30 03:19:46
3420
举报
文章被收录于专栏:codechildcodechild

自顶向下的分析

最左推导

lm表示的是最左

最右推导

自顶向下的语法分析采用最左推导方式

例子

自顶向下语法分析的通用形式

预测分析

文法转换

两个问题

消除直接左递归

消除直接左递归的一般形式

消除间接左递归

提取左公因子

LL(1)文法

S_文法

例子

非终结符的后继符号集follow

产生式的可选集select

串首终结符集first

比如求x的first集合,那么就是求的x—>字符串,所有字符串首字母构成的集合

LL(1)文法定义

判断一个文法是不是LL(1)的,只需要查看它们的同一非终结符的各个产生式的可选集select集互不相交就可以

first集和follow集的计算

计算文法符号x的first(x)

计算串X1X2……Xn的first集合

计算非终结符A的follow(A)

first集合不能有终结符$,可以有空串ε follow集合可以有终结符$,不可以有空串ε 计算需要反复

算法

例:表达式文法各产生式的select集

select的计算:

  1. select(A->空)它的结果是Afollow集合
  2. select(A->B)它的结果是Afirst集合
  3. select(A->a)它的结果就是a

预测分析表

递归的预测分析法

非递归的预测分析法

两种方法进行对比

预测分析法实现步骤

预测分析中的错误处理

预测分析中的错误检测

预测分析中的错误恢复

例子:

M表示预测分析表,A表示栈顶的非终结符,a表示当前输入符号。

自底向上的语法分析(考试不考)

移入-归约分析的工作过程

移入-归约分析器可采取的4种动作

移入-归约分析中的关键问题

分析完了之后,栈中没有推出起始符S

LR分析法

LR分析法的基本原理

LR分析表的结构

例子:

LR分析器的工作过程

LR分析算法

LR(0)项目

增广文法

文法中的项目

S已经归约出来了,就是(1)就是接收项目——看例子记住就行

例子:LR(0)自动机

LR(0)分析表构造算法——看不懂,不要看

CLOSURE()函数

goto函数

构造LR(0)自动机的状态集

LR(0)分析过程中的冲突

SLR分析

SLR分析法的基本思想

例子:

SLR分析表构造算法

SLR分析中的冲突

LR(1)分析法

LR(1)分析法的提出

规范LR(1)项目

等价LR(1)项目

例子:LR(1)自动机

赋值语句文法的LR(1)分析表

例:LR(1)自动机

LALR分析法

LALR分析的基本思想

例:合并同心项集

合并同心项集时产生归约-归约冲突的例子

这里合并状态6和状态9,因为它们的左部都是相同的 合并之后:

就会发现有归约-归约冲突

合并同心集后,虽然不产生冲动,但是可能会推迟错误的发现

LR分析中的错误处理

语法制导翻译

什么是语法制导翻译

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
编译原理 | 期末复习笔记
warning: 这篇文章距离上次修改已过396天,其中的内容可能已经有所变动。
Ranlychan
2023/03/05
1.7K0
编译原理 | 期末复习笔记
编译原理 第四章&第五章:语法分析 LR(0)分析器 SLR(1)分析器
关于first集和follow集的求法已经放到了另一篇博客中编译原理必考大题:first集和follow集的求法
小徐在进步
2024/09/25
1.1K0
编译原理 第四章&第五章:语法分析 LR(0)分析器 SLR(1)分析器
编译原理:第六章 LR分析
LR分析法是一种自下而上语法分析技术,L表示从左到右扫描输入符号,R表示构造一个最右推导的逆过程——最左归约,k表示超前读入k个符号,以便确定归约用的产生式。一个LR分析器由3部分组成:
Here_SDUT
2022/08/09
1.4K0
编译原理:第六章 LR分析
编译原理(第四版)复习 (三)
复习要求:first集follow集select集的求解;firstvt集和lastvt集的求解;LL(1)文法的判断;算符优先文法的判断;
meihuasheng
2021/03/18
4120
第四章 自顶向下语法分析方法
基本方法:对任何输入串,试图从文法的开始符号出发, 自上而下地为输入串建立一棵语法树,或者说为输入串寻找一个最左推导。
Here_SDUT
2022/09/09
1.3K0
第四章 自顶向下语法分析方法
编译原理学习笔记-5:自顶向下语法分析
在词法分析中,我们扫描输入源程序的每个字符,得到多种类型的单词(token),一系列的单词就构成了一条单词流。可以设想,单词流的某个部分有多个并排的单词,它们可能会构成某个句子,但是这个句子是否真的符合语法规则呢?我们需要借助语法分析器才能进行判断。更直接点,我们可以说语法分析器是用来判断句子是否符合某个给定的上下文无关文法的。
Chor
2020/05/12
5.2K2
编译原理预测分析表自顶向下的语法分析实现
递归子程序方法的思路:递归子程序法是一种确定的自顶向下语法分析方法,要求文法是LL(1)文法。它的实现思想是对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时能够按LL(1)形式唯一地确定选择某个候选式进行推导。
里克贝斯
2021/05/21
1.9K0
编译原理预测分析表自顶向下的语法分析实现
前端工程师为什么要学习编译原理?
普遍的观点认为,前端就是打好 HTML、CSS、JS 三大基础,深刻理解语义化标签,了解 N 种不同的布局方式,掌握语言的语法、特性、内置 API。再学习一些主流的前端框架,使用社区成熟的脚手架,即可快速搭建一个前端项目。胜任前端工作非常容易。再往深处学习,你会发现前端这个领域,总是有学不完的框架、工具、库,不断有新的轮子出现。技术推陈出新,版本快速迭代,但万变不离其宗。工具致力于流程自动化、规范化,服务于简洁、优雅、高效的编码,将问题高度抽象化、层次化。在如今前端开源界如此火热的现状下,框架的使用者与框架的维护者联系更加紧密,不仅能深入源码来更彻底地认识框架,还能够提出问题,参与讨论,贡献代码,共同解决技术问题,推进前端生态的发展和壮大。而编译原理,作为一门基础理论学科,除了 JS 语言本身的编译器之外,更成为 Babel、ESLint、Stylus、Flow、Pug、YAML、Vue、React、Marked 等开源前端框架的理论基石之一。了解编译原理能够对所接触的框架有更充分的认识。
Nealyang
2019/09/29
1.6K0
前端工程师为什么要学习编译原理?
LR分析中shift/reduce reduce/reduce冲突解决方案SLR(1)与LR(1)
LR分析法从左至右移进输入的终结符(词法分析器的输出实际是token,但在语法分析阶段会代表是一个终结符),并将终结符压入到堆栈,称为shift。如果当前栈上的符号恰好符合某个非终结符的生成式,则此时进行归约操作:将这些符号弹出栈,然后将规约后的非终结符压入堆栈,这一步就称为reduce。然后继续上面的步骤,直到没有输入。 如果最终栈上只有一个非终结符,且该非终结符就是目标符号,那证明识别成功,否则识别失败。 名称LR得名于:从左(Left)到右扫描(L),反向(Reverse)最右推导(R)。
Orlion
2024/09/02
2650
大学课程 | 编译原理知识点
令 X 为一个文法符号(一个终结符或非终结符)或 ε ,则集合 First (X) 由终结符组成,此外可能还有 ε ,它的定义如下:
Justlovesmile
2021/12/14
1.4K0
大学课程 | 编译原理知识点
编译原理4—6章案例复习总结【编译原理】
(1)first集 (2)follow集 ——利用到select集 (3)select集 ——利用到first、select集合 (4)构造自上而下分析表 —利用select集 (5)句子分析—利用LL(1)分析表,注意倒序入栈—符号栈是将表中查询到的产生式倒着写入,栈内只剩下 # 为止
来杯Sherry
2023/05/25
2680
编译原理4—6章案例复习总结【编译原理】
编译原理题练习题测试题
(3)如果是二义的,将其改为无二义的,其优先级从高到低依次是not, and, 和 or。
张哥编程
2024/12/19
1360
LL(1),LR(0),SLR(1),LALR(1),LR(1)
http://blog.csdn.net/linraise/article/details/9237195
平凡的学生族
2019/05/25
1.4K0
词法分析、语法分析、语义分析
词法分析(Lexical analysis或Scanning)和词法分析程序(Lexical analyzer或Scanner)
jack.yang
2025/04/05
1570
编译原理复习总结-耗子尾汁
2. 上下文无关法 一个上下文无关法G是一个四元式 ,其中 :终结符集合(非空) :非终结符集合(非空),且
唔仄lo咚锵
2021/12/31
1.3K0
编译原理复习总结-耗子尾汁
编译原理从入门到放弃
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了 研究生入学考试 的必考内容。我觉得有了解的必要性,文章由自己理解汇总,以达到考试及格为目的,若有错误,请留言指正,谢谢~
Lcry
2022/11/29
8970
编译原理从入门到放弃
正则引擎设计与实现——基于子集构造法
在自然语言中, 以英语为例, 构成句子的最小单元,可以是单词、短语, 这些最小单元称作 词素(lexeme) . 词素具有属性, 比如动词、名词、副词、形容词等, 这些属性决定了语法层面, 其在句子里可充当的成分.
hunterzju
2023/05/09
3570
正则引擎设计与实现——基于子集构造法
编译原理文法详解_编译原理为什么存在递归文法
学完了词法分析,我们知道词法分析器将正则表达式转换成词法单元流,但对于这个记号流我们不知道是否能由正确的文法产生,因此我们需要通过语法分析器来检测其合法性。语法分析器的输出是一棵语法分析树(无论显性还是隐性),并且进行一些语法纠错处理。语法分析的整个过程大概就是我们先定义一个语法,再用相应的算法来检测我们的词法单元流是否符合该语法。这里主要讨论上下文无关文法构成的语法和自顶向下、自底向上的语法分析。
全栈程序员站长
2022/11/17
8090
编译原理文法详解_编译原理为什么存在递归文法
SQLite虚拟机
1 前言 本文主要介绍SQLite虚拟机VDBE,为了更好地了解SQLite虚拟机,文中也加入了一些Lua虚拟机内容来对比学习,更好地了解不同虚拟机之间的异同。 1.1 预备知识 虚拟机设计需要编译原理相关理论基础,这里先简单温习下编译原理中的一些知识。 1.1.1 文法 (1) LR文法 1965年,D.knuth 首先提出了LR(K)文法及LR(K)分析技术。括号中的K 表示向右查看输入串符号的个数。对于大多数用无二义性上下文无关文法描述的语言都可以用相应的LR 分析器进行识别,而且这种方法还具
微信终端开发团队
2018/01/29
1.5K0
SQLite虚拟机
编译原理自动生成LR(0)分析表Python实现
对于LR文法,我们可以自动构造相应的LR分析表。为了构造LR分析表,我们需要定义一个重要概念——文法的规范句型“活前缀”。
里克贝斯
2021/05/21
1.9K0
编译原理自动生成LR(0)分析表Python实现
推荐阅读
相关推荐
编译原理 | 期末复习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档