编译原理学习笔记4(自上而下和自下而上语法分析)
接上编译原理学习笔记3,剩一点自上而下语法分析
3.3.5 预测分析器
预测分析器由一张预测分析表,一个符号栈(不重要)和一个驱动器(不重要)组成,它的数学模型为下推自动机。最重要的在于构建预测分析表。
首先,先看看构造前要求出的两个集合,即FIRST集和FOLLOW集。
1)求FIRST集,算法见下图(图源编译原理第二版)
FIRST集的求法是自底向上,即从远离文法开始符号的非终结符开始求。
第三点其实是ε的穿透。
FIRST集的作用是对于下一个要匹配的终结符,判断下一步推导可以选择哪些产生式(这些产生式左部的FIRST集中含有该终结符,若没有一个产生式可以匹配上,则考虑使用ε去匹配,考虑该产生式左部的FOLLOW集)
2)求FOLLOW集,算法见下图(图源编译原理第二版)
上述的α和β也可为空,求解要十分细心。
注意#不要遗漏,FOLLOW集的计算是自顶向下的,即从文法的开始符号开始。
FOLLOW集的作用就是判断当前匹配能不能使用ε,若产生式的左部非终结符的FOLLOW集包含当前要匹配的终结符,则可直接消除非终结符达成匹配。
3)构建预测分析表
一个预测分析表如下图所示(图源编译原理第二版)
第一列即为文法所有产生式的左部非终结符,第一行即为所有终结符。
根据FIRST集,可以将产生式填入对应的终结符列,若出现ε,则填入FOLLOW集中的每个终结符列。
4)预测分析表的使用
先将#和文法开始符号压入栈,然后根据要推导句子的首个终结符和栈顶的非终结符,选择预测分析表中对应的行列,得到产生式。然后将栈顶弹出,再将产生式右部逆向压入栈中,完成一次推导;如果栈顶与输入串首部相同,则直接匹配,弹出栈顶,同时输入串前后移动一位,然后循环往复,直到输入串匹配完毕或出错。如下图所示(图源编译原理第二版):
3.4 自下而上语法分析
3.4.1 介绍
- 前面自上而下的语法分析采用的方法是推导,即从根到叶子构造分析树,而自下而上的分析采用的方法是归约(推导的逆过程),即从叶子到根构造分析树,反复用产生式的左部替换产生式的右部。
- 自下而上分析中最一般的方法为LR方法,比自上而下分析的LL方法(只能分析一些小型语言)要强,所以LR方法更为实用。但是LR方法在面对一些较大型的语言时,很难使用手工方法构建分析表,所以一般借助分析器来生成。本文中只考虑简单的LR(1)文法,对应的分析器为SLR(1)分析器。
3.4.2 分析的基本方法
- 短语:以非终结符为根的子树中所有从左到右排列的叶子
- 直接短语:只有父子关系的树中所有从左到右排列的叶子(树高为2)
- 句柄:最左边父子关系树中所有从左到右排列的叶子(句柄唯一)
- 整个移进-规约分析的过程其实就是在剪句柄,这种最左归约的方式可以节约内存。
3.4.3 构建移进-归约分析器
拓广文法
因为LR(1)文法不用担心左递归,所以无需改写文法,但是首先需要拓广文法,即加上S’->S,S为开始符号。
构造识别所有活前缀的DFA
首先初始状态I0为{S’->.S}的闭包,然后根据每个可能的状态转移,计算出之后的状态,如果点打在一个非终结符之前,则需要将该非终结符的所有产生式加入当前状态,反复执行直到没有其他可转换的状态。如下图所示(图源编译原理第二版):
构造分析表
- 移进动作:分析表纵轴即为DFA中的状态序号,然后根据边上的字符和边左右的状态序号即可填表,填写移进动作。
- 归约动作:对于每个没有后续状态的状态,即已产生句柄,需要根据该状态中产生式的左部的FOLLOW集来填入归约动作。
3.4.4 移进-归约分析
在移进-归约模式中,改变格局变化的动作有以下四种形式:1)移进;2)归约;3)接收;4)报错。
分析过程:首先把#和状态0压入栈,接着以栈顶状态即为行下标,输入串首部为列下标,然后到分析表中查找对应的动作(移进:将一个状态和一个字符弹出;归约:将句柄弹出,然后压入产生式左部和由之前栈顶状态和产生式左部确定的那个新的状态),反复执行直到出错或ACC。
示例如下图所示(图源编译原理第二版):
杂记
语法分析实质就是拼图:首先语法分析的三要素为记号流(输入,来自词法分析器),文法(输入),分析树(输出),可见,最终就是要构建一棵分析树。一开始,经过输入后,我们拥有的树的部件有根节点(文法开始符号),叶子结点(记号流中的所有终结符),还有一些“零件”(一些二层子树,即文法的所有产生式),通过这些部件,我们就要通过语法分析来完成拼图,而自上而下分析就是从根节点开始,往下拓展,而自下而上分析就是从叶子结点开始,往上拓展。
编译原理学习笔记4(自上而下和自下而上语法分析)相关推荐
- [编译原理学习笔记2-2] 程序语言的语法描述
[编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...
- 编译原理学习笔记20——符号表
编译原理学习笔记20--符号表 20.1 符号表的组织与操作 20.2 符号表的内容 20.3 利用符号表分析名字的作用域 20.1 符号表的组织与操作 符号表 符号表的作用与组织 符号表的整理和查找 ...
- 编译原理学习笔记2——高级程序设计语言概述
编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...
- 编译原理学习笔记 5.1 翻译文法和语法制导翻译
前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 导言 一.翻译文法和语法制导翻译 输入文法 翻译文法 活动 ...
- 编译原理学习笔记 3.3 正则文法的状态图
前言 参考东南大学廖力老师的编译原理教程和课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 状态图的画法(根据文法画出 ...
- 编译原理学习笔记一(待续)
这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的 ...
- 编译原理学习笔记 6.2 符号表的组织与内容
前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 一.符号表的结构与内容 "名字"域 & ...
- 编译原理学习笔记(十七)~自上而下语法分析之构造预测分析表
方法 我的理解: 首先分别计算出FIRST()和FOLLOW()集合 在对每一个非终结符的FIRST()依次分析,假设有E–>TL,其中FIRST(E)={+,-},那么在分析表中[E,+]和[ ...
- 【编译原理学习笔记】2:文法与语言描述,二义性,正规文法,左/右句型,句型分析
已知语言描述写出文法 如某种语言中0和1的个数相同,文法可以是这样的: G[A]:A->0B|1CB->1|1A|0BBC->0|0A|1CC 还可以这样: G[S]:S->0 ...
- 程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言
高级程序设计语言 一.语言概述 1.1 语法 v.s. 语义 程序本质上是一定字符集上的字符串 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序 定义了程序的形式结构 定义语 ...
最新文章
- 组合问题 contest4
- android没有捂脸表情,Emoji神器 | 如果你也喜欢[捂脸]表情
- 为什么有很多人认为“深圳是举全国之力发展起来的?
- 微信小程序之阻止冒泡事件
- python群发邮箱软件_maily:命令行邮件(批量)发送工具
- JPG如何免费无损压缩
- 搭建私有云盘 cloudreve
- 基于PHP的定时交作业系统
- linux的input命令,通过xinput命令在Manjaro中启用Tap-to-click功能的方法
- mysql 复制frm_如何通过直接复制frm文件以实现恢复/复制innodb数据表
- 统计学--从对P值的理解谈起
- 10个最常见的HTML5面试题
- EasyClick 易点云测 IOS版自动化测试工具
- docker下mysql主从搭建
- Armadillo安装
- 1、esp32(arduino)接入阿里云MQTT及数据处理
- MySQL中间件Atlas
- 5G及无线技术专栏:5G NR信号的解调分析
- 小猪cms ClassifyAction.class.php
- python做计算器_python实现计算器功能
热门文章
- 如何制作千人千面的NFT?如何存储NFT?#Crystals #nft.storage #ipfs
- CSS制作移动动画效果
- Win10将用户名修改为英文
- 2022年驾驶员考试装载车司机考试模拟试题卷及答案
- 写在最后——如何做好一个语音助手
- Unity - Timeline 之 Nesting Timeline instances(嵌套的Timeline实例)
- MSE = Bias² + Variance?什么是“好的”统计估计器
- The chain rule(链式法则)
- 【 Ansible 】
- Tony Mobily谈强化Apache