第五章 语法分析——自上而下分析
一、知识总结
本章介绍自下而上语法分析方法。所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至鬼月到文法的开始符号。或者说,从语法树的末端开始,步步向上”归约“,直到根结。
1、自上而下分析基本问题
自上而下分析法是一种”移进-归约“法,大意是用一个寄存富豪的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
归约是指根据文法的产生式规则,把产生式的右部替换成左部符号。
2、规范归约
(1)定义:令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型
其中α,β,δ∈(VN∪VT)*,A∈VN ,如果有
则β称是句型αβδ相对于非终结符A的短语。因为句型是由开始符号推出来的,而短语是由非终结符号推出来的。所以,短语是句型的一部份或全部符号串。
(2)直接短语
特别是,如果有A=>β,则称β是句型αβδ相对于规则A=>β的直接短语。
(3)句柄
一个句型的最左直接短语称为该句型的句柄。
(4)规范归约
定义:假定α是文法G的一个句子,我们称序列
αn, αn-1,······,α0
是α的一个规范归约,如果此序列满足:
(1) αn= α
(2) α0为文法的开始符号,即α0=S
(3) 对任何i,0 < i <=n, αi-1是从αi经把句柄替换成为相应产生式左部符号而得到的。
(5)修剪语法树
使用修剪语法树的方法来加深对自下而上语法分析的理解。
子树:是由该树的某个结点(子树的根)连同它的所有子孙组成。
简单子树:只有单层分支的子树(只有父子两代没有第三代)
(6)对语法树有如下结论
①每个句型都有一棵语法树与之对应
②每棵语法树的叶结点自左至右排列就组成一个句型
③每棵子树的叶结点自左至右排列就组成一个短语
④每棵简单子树的叶结点自左至右排列就组成一个直接短语
⑤每棵最左简单子树的叶结点自左至右排列就组成一个句柄
3、用符号栈进行自下而上的语法分析
(1)‘#’的使用
在分析开始时,将‘#’预先进栈,作为栈底符号;
将‘# ’作为输入串的结束符
(2)分析过程
自左向右对输入串ω不断向栈中进行移进——归约。
二、算符优先分析法
1、定义两个终结符‘a’与‘b’的优先关系
a =.b 表示a的优先性等于b
a >.b 表示a的优先性大于b
a <.b 表示a的优先性小于b
2、算符优先文法及优先表构造
算符优先文法
(1)算符文法
定义:一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法,也称OG文法。
(2)定义终结符之间的优先关系
假定G是一个不含e产生式的算符文法。对于任何一对终结符a、b,我们说:
1. a =. b 当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
2. a <. b 当且仅当G中含有形如P→…aR…的产生式, 而R b…或R Qb…;
3. a>.b 当且仅当G中含有形如P→…Rb…的产生式,而 R …a或R…aQ。
(3)如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a=.b
a>.b
a<.b
则称G是一个算符优先文法(OPG文法)。
构造算符优先关系表
(1)通过检查产生式的每一个候选式可以找出满足a=.b
(即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
(3)构造集合FIRSTVT(P)的算法
按其定义,可用下面两条规则来构造集合FIRSTVT(P):
① 若有产生式P→a…或P→Qa…,
则aÎFIRSTVT(P);
② 若aFIRSTVT(Q),且有产生式P→Q…,
则aFIRSTVT(P)。
(4)同理构造构造集合LASTVT(P)的算法
按其定义,可用下面两条规则来构造集合LASTVT(P):
① 若有产生式P→… a或P→… aQ ,
则aLASTVT(P);
② 若aÎ LASTVT(Q),且有产生式P→… Q ,
则aLASTVT(P)。
(5)有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.和>.的所有终结符对。
①假定有个产生式的一个候选形为
…aP…
那么,对任何bFIRSTVT(P),有a <. b。
②假定有个产生式的一个候选形为
…Pb…
那么,对任何aLASTVT(P),有a >. b。
注意:
对于‘#’号,相当于在文法开始符号S前加一个额外的开始符号,比如为Z
然后,把
Z →#S#
添加到原文法中,再进行分析。
3、算符优先分析算法的设计
(1)问题的提出
自下而上分析
移进-归约法:句柄为可归纳串
算符优先分析法:最左素短语为可归纳串
(2)素短语
指一个句型的短语,它至少包括有一个终结符号且除去它本身之外不再含任何更小的素短语
(3)最左素短语
处在句型最左端那个素短语成为最左素短语
(4)算符优先分析算法和设计
句型的一般表示形式: #N1a1N2a2…NnanNn+1#
其中,每个ai都是终结符,Ni是可有可无的非终结符
定理:
一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串 Njaj…NiaiNi+1,
aj-1 <. aj
aj =. aj+1,aj+1 =. aj+2,…,ai-1 =. ai
ai >. ai+1
注意:出现在左端或右端的非终结符一定属于这个素短语
4.优先函数
(1)优先函数的定义
把每个终结符与两个自然数f(θ)与g(θ)相对应,使得
若θ1 <. θ2,则f(θ1) < g(θ2)
若θ1 =. θ2,则f(θ1) = g(θ2)
若θ1 >. θ2,则f(θ1) > g(θ2)
f称为入栈优先函数,g称为比较优先函数。
优点:便于比较,节省空间;
缺点:原来不存在优先关系的两个终结符,由于自然数相对应,变成可以比较的。要进行一些特殊的判断。
(2)优先函数的构造方法
如果优先函数存在,则可以通过以下三个步骤从优先表构造优先函数:
(1)对于每个终结符a,令其对应两个符号fa和ga,画一张以所有符号fa和ga为结点的方向图。如果a>.b,则从fa画一条弧至gb如果a<.b,则从gb画一条弧至fa 。
(2)对每个结点都赋予一个数,此数等于从该结点出发所能到达的结点(包括出发点自身)。赋给fa的数作为f(a)赋给ga的数作为g(a)。
(3)检查所构造出来的函数f和g是否与原来的关系矛盾。若没有矛盾,则f和g就是要求的优先函数,若有矛盾,则不存在优先函数。
(3)构造方法证明
现在必须证明:
若a=.b,则f(a)=g(b);若a<.b,则f(a)< g(b);若a>.b,则f(a)> g(b)。
第一个关系可从函数的构造直接获得。因为,若a=.b,则既有从fa到gb的弧,又有从gb到fa的弧。所以,fa和gb所能到达的结是全同的。
至于a<.b和a>.b的情形,只须证明其一。
如果a>.b,则有从fa到gb的弧。也就是gb能到达的任何结fa也能到达。因此,f(a) g(b)。所需证明的是,在这种情况下,f(a)=g(b)不应成立。
三.LR分析法
1.LR分析方法
LR分析方法是一种自下而上的分析方法
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
LR分析方法是一种适用于一大类上下文无关文法的分析方法
比较复杂,不适于用手工实现,可借助于YACC/bison实现
根据归约过程中向前看输入符号串中字符的个数,定义不同的LR(k)分析方法,通常,k=0,1
LR分析方法和LL分析方法的比较
LR(0)分析法需要知道什么是活前缀、LR(0)项目、项目集规范族、项目集的闭包、LR(0)分析表的构造。需要注意,该文法移进时不能归约,归约时只归一个产生式。
活前缀:文法G的活前缀是他的规范句型的前缀,该前缀不超过句柄的右端。
LR分析表的构造需要构造识别活前缀的有限自动机,用有限自动机中的状态表示分析表中的状态,用状态图中的状态之间的转换关系对分析表中的action、 goto函数等进行定义。
二、课后作业
三、感想
这一章的内容感觉比前几章内容更多也更有难度。学习了自下而上的语法分析,与上一章的自上而下分析的LL文法相反。本章还学习了规约,算符优先分析等内容。
第五章 语法分析——自上而下分析相关推荐
- 语法分析-自上而下分析 知识总结
语法分析-自上而下分析 基本思想 回溯与左递归 LL(1)文法 构建不带回溯的自上而下分析算法 消除文法的左递归性 克服回溯 1. FRIST集 2. 提取公共左因子 3. FOLLOW集 4. 构造 ...
- 编译原理复习(4)语法分析--自上而下分析
语法分析--自上而下分析 语法分析器的功能 语法分析方法分类 自上而下分析法 自下而上分析法 LL(1)分析法 左递归的消除 消除回溯,提取公共左因子 求法,例FIRST(X): FOLLOW集构造方 ...
- 第五章.系统安全分析与设计
目录 第五章.系统安全分析与设计 第一节.信息系统安全属性 第二节.对称加密技术与非对称加密技术 对称加密技术 非对称加密技术 第三节.信息摘要与数字签名 信息摘要 数字签名 第四节.数字信封与PGP ...
- 语法分析--自上而下分析的基本问题
语法分析基本概念 语法分析的前提:对语言的语法结构进行描述,采用正规式和有限自动机描述和识别语言的单词符号, 用上下文无关文法来描述语法规则 语法分析的任务:分析一个文法的句子的结构 语法分析器的功能 ...
- 笔记-编译原理-第十、十一、十二章、十三章-语法分析-自下而上分析
第10章 - 自下而上分析1 10.1 自下而上分析 10.1.1 自下而上分析的一个示例 可以看出自下而上分析的主要步骤是不断的用文法来"规约",最后找到一种句型的表示 10.1 ...
- 第五章-语法分析之抽象语法树的建立
参考博文: (1)Java的运算符 前几章讲解了将Java源文件分解为Token序列,并且也介绍了组成抽象语法树的各个实现类,那么如何根据Token序列分析出具体的树节点并最终形成一棵抽象语法树是语法 ...
- 语法分析—自上而下分析
1.美图 2.位置 语法分析器的功能 语法分析的任务是分析一个文法的句子结构. 语法分析器的功能:按照文法的产生式(语言的语法规则),识别输入符号串是否为一个句子(合式程序). 语法分析的方法 不行 ...
- 第四章 自上而下分析
第四章 词法分析--自上而下分析 4.1语法分析器功能 语法分析是编译过程的核心部分. 它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则. 自上而下分析面临的问题 ...
- 使用ArchR分析单细胞ATAC-seq数据(第十五章)
本文首发于我的个人博客, http://xuzhougeng.top/ 往期回顾: 使用ArchR分析单细胞ATAC-seq数据(第一章) 使用ArchR分析单细胞ATAC-seq数据(第二章) 使用 ...
最新文章
- 数据结构与算法:17 图
- Elastricsearch 索引操作详解(快速入门、索引管理、映射详解、索引别名)
- .net 简单实现MD5
- 全局变量、静态全局变量、静态局部变量和局部变量的区别
- maven引用servlet_解决Maven 项目报错 java.httpservlet和synchronized使用方法
- promise的应用和在VUE中使用axios发送AJAX请求服务器
- 091115 T UI生成的类
- SpringBoot实战(十六):集成Skywalking调用链监控系统
- while 常见程序逻辑
- 进化计算-遗传算法-入门级最好教程
- 红帽学习笔记[RHCSA] 第二课[文件、目录、相关命令]
- 遗传算法求解TSP问题
- 好用的手机识别文字软件推荐,你都知道几个呢?
- python采集微信聊天信息_我用 Python 破解了微信聊天记录,自动同步微信文章
- python随机生成32位乱码,由字母,数字和特殊符号
- NOIP2017大总结
- paddleocr文本识别模型的训练
- 小程序FMP优化实录,已拿offer附真题解析
- 统计学习方法(1) 梯度下降法和SMO算法实现SVM
- jmeter的安装和简单使用
热门文章
- 计算机里面不显示光驱位硬盘,Windows10系统识别不了光驱位机械硬盘怎么办?解决方法...
- 【编写自己的RTOS】搞定任务调度
- sd卡烧写linux内核,uboot从SD卡烧写内核和文件系统
- OB0201 obsidian dataview插件使用
- 暴雪战网怎么修改服务器,战网地区如何修改?地区修改流程图文介绍
- 基于Revit铝模板设计-区域配模
- 基于ThinkPHP6+Layui后台开发框架
- Linux权限drwxrwxrwx是什么意思?
- 实例013:所有水仙花数 打印出所有的“水仙花数“,所谓“水仙花数“是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数“,因为153=1的三次方+5的三次方+3的三次方
- 在家做什么挣钱,50个赚钱的热门项目分享