编译原理复习(5)语法分析--自下而上分析
自下而上分析
- 自下而上分析基本问题
- 归约
- 规范归约
- 算符优先分析
- LR分析法
- 出错判断:
- 基本思想
- LR文法
- 构造LR分析表
- LR(0)分析表的构造
- 思想:
- 前缀:
- 活前缀:
- LR(0)项目
- 构造NFA的方法(识别活前缀)
- LR(0)项目集规范族和LR(0)分析表的构造
- 构造识别活前缀的DFA
- 有效项目的定义
- LR(0)文法判别
- 构造LR(0)分析表的算法
- SLR分析表的构造
- 关系
- 冲突解决方法
- SLR(1)分析表例题
- LR(1)文法
- 有效项目:
- 项目集I 的闭包CLOSURE(I)构造方法:
- 项目集的转移函数GO
- 分析表构造
- LALR分析表的构造
- 解决二义文法语法分析问题的方法
自下而上分析基本问题
中心问题:
怎样判断栈顶的符号串的可归约性以及如何归约。
“可归约串”的不同定义,形成了不同的自下而上的分析方法。
各种自下而上分析法的共同特点:
边输入单词符号(移进符号栈),边归约。
归约
.“移进—归约”的思想:
用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
规范归约
中心问题:
如何寻找或确定一个句型的句柄。
实质:
在移进过程中,当发现栈顶呈现句柄时,
就用相应产生式的左部符号进行替换。
规范推导,就是最右推导。
规范句型:规范推导得到的句型。
规范归约:
若文法G是无二义的,则规范推导(最右推导)的逆过程必然是规范归约(最左归约)。
短语、直接短语、句柄:
规范归约过程:
算符优先分析
素短语:
是指这样的一个短语,它至少含有一个终结符,
并且, 除它自身之外不再含任何更小的素短语。
最左素短语:
指处于句型最左边的那个素短语。
”最左素短语“ 就是 ”可归约串“。
不是一种规范归约法,是一种自下而上的语法分析法,
关键在于规定算符(即终结符)之间的优先顺序和结合性质,
借助这种优先关系寻找“可归约串”进行归约。
分析速度快,有利于表达式分析,宜于手工实现。
算符文法:
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,
即不含如式的产生式右部:…QR…则我们称该文法为算符文法。
算符优先文法前提是一个算符文法(没有相邻的非终结符)
算符优先文法:
实际上,在真正的算符优先分析方法中,
需定义任意两个相继出现的终结符号a和b之间的优先关系
(a与b之间可有一个非终结符),一旦确定了这种优先关系,
就可以用它来确定“可归约串”进行归约。
优先关系:
如果一个算符文法G中的任何终结符对(a,b)至多只满足三者中的一个,则称G是一个算符优先文法。
FIRSTVT集合,就是找推导出来的第一位或第二位的终结符(算符优先文法不可能有两个连续的非终结符)
LASVT集合,就是找推导出来的最后一个或倒数第二个终结符。
构造优先关系表的算法:
构造FIRSTVT集合的算法:
只有扫描一遍全部的产生式,FIRSTVT集合不发生改变了,算法才可以停止。(因为只要有一个非终结符的FIRSTVT改变,所有的都可能改变)。
伪码实现:
构造集合LASTVT集合的算法:
构造优先关系表的算法:
特别的:
# <· FIRSVT(开始符号)
LAVTVT(开始符号) ·> #
伪代码:
句型一般形式:
一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串:
子串内终结符,优先级相同,大于前面,大于后面
伪代码:
算符优先分析得到的分析树,不一定是语法树。
因为会跳过单个非终结符到非终结符的替换。
LR分析法
LR分析方法:
把”历史“及”展望“综合抽象程状态;由栈顶的状态和现行的输入符号唯一确定每一步工作。
出错判断:
只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误。
结构:
基本思想
在规范归约过程中,一方面记住已移进和归约出的整个符号串(即“历史”),
另一方面根据所用的产生式推测未来可能碰到的输入符号(即对未来进行“展望”)。
当一串貌似句柄的符号串呈现于分析栈的顶端时,我们希望能根据
所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,
来确定栈顶的符号串是否构成相对某一产生式的句柄。
LR分析器,可以准确及时地发现栈顶出现的句柄,并提示你该使用哪个产生式进行归约。
符号栈 + 剩余输入串 是一个规范句型。
LR分析过程:
LR文法
LR文法 :
对一个文法,如果能够构造一个分析表,且它的每个入口均是唯一的。
LR文法不是二义的,二义文法一定不是LR。
LR(k)文法:
一个文法,如果能用一个每步顶多向前检查k个输入符号的LR分析器进行分析。
构造LR分析表
LR(0)分析表的构造
思想:
只概括“历史”材料而不包括推测性“展望”材料的“状态”。
前缀:
字的任意首部。
例:字abc-前缀:ℇ ,a,ab或abc
活前缀:
指规范句型的一个前缀,不含句柄之后的任何符号。
在活前缀右部增添一些终结符之后,就可使之成为一个规范句型。
LR(0)项目
项目:
文法产生式的右部添加一个圆点,称为项目。
例: A→•XYZ, A→X•YZ, A→XY•Z, A→XYZ•
含义:
指明了在分析过程的某时刻我们看到产生式多大一部分。
A→X• YZ
我们已经从输入串中看到能从X推出的符号串,
希望能进一步看到可以从YZ推出的符号串。
项目集:若干个项目组成的集合。
构造NFA的方法(识别活前缀)
将文法的所有项目都写出,每个项目是一个状态
规定项目1为NFA的唯一初态
如果状态i和状态j出自同一产生式,而且状态j的圆点只落后于状态i一个位置:
如果i的这个位置是终结符a,从状态i画一条弧到状态j,标记为a
如果i的这个位置是非终结符A,则连两种弧,
(1)从状态i画ε弧到所有的A→ · β的状态。
(2)从状态i画一条弧到状态j,标记为A
归约项目表示结束状态(句柄识别态),用双圈表示
例
LR(0)项目集规范族和LR(0)分析表的构造
构造识别活前缀的DFA
LR(0)项目集规范族:
识别活前缀的DFA的项目(状态)集。
(其中,该DFA的状态是LR(0)项目集)
构造方法有两种:
1) 使用第三章的子集法将NFA确定化
2) 直接使用闭包和状态转换函数进行计算
有效项目的定义
性质:
LR(0)项目集规范族的构造:
1、 将文法G(S)拓广成G’(S’),引进非终结符S’ 和产生式S’→S.
2、项目集的闭包CLOSURE
3、状态转换函数
例:
LR(0)文法判别
LR(0)文法规范族的每个项目集不包含任何冲突项目。
假若一个文法G的拓广文法G’的活前缀识别自动机中的每个状态不存在:
①既含移进项目又含归约项目;
②或者含有多个归约项目;
则称G是一个LR(0)文法。
构造LR(0)分析表的算法
示例:
LR(0)分析示例:
SLR分析表的构造
关系
真包含关系。
(1)文法拓广:S’ → S;
(2)构造S’的LR(0)项目集规范族C;
(3)利用C和S’,按下述算法构造S’的SLR分析表。
冲突解决方法
一般化:
SLR(1)分析表例题
LR(1)文法
LR(1)文法状态比SLR更多。
规范LR分析表:
若一个输入串语法正确的话,活前缀加上剩余的输入串应形成一个规范句型,因此,在当前状态中若有一个归约项目(A→α • ),应当面临在规范句型中可以跟在A后的符号时,才在当前状态下执行归约操作
有效项目:
性质:
项目集I 的闭包CLOSURE(I)构造方法:
项目集的转移函数GO
分析表构造
例:
分析示例:
LALR分析表的构造
对于同一个文法,LALR分析表和SLR分析表永远具有相同数目的状态。
同心集合并:
若两个LR(1)项目集,除去搜索符外,
这两个集合相同,则称它们是同心集
构造分析表的步骤:
只是LR(1)多了步合并同心集。
解决二义文法语法分析问题的方法
任何二义文法决不是一个LR文法,因而也不是SLR或LALR文法。
(1)借助于消除二义性的“规定”来解决
(2)不需对文法改写,只需据“规定”解决项目集中的冲突
编译原理复习(5)语法分析--自下而上分析相关推荐
- java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 【编译原理】山东大学编译原理复习提纲
涵盖所有考点,复习绝对高效,点赞+留邮箱获取pdf版本. 山东大学编译原理复习提纲 一.简答与计算 1.1 必考 1. 编译过程 画图表示编译过程的各阶段,并简要说明各阶段的功能: 词法分析器:输入源 ...
- 编译原理--实验2 语法分析
文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...
- java编程实现算符优先分析法,编译原理实验三-算符优先分析法
编译原理实验3-算符优先分析法 #include #include #include #include #define SIZE 128 char priority[6][6]; //算符优先关系表数 ...
- 编译原理复习(4)语法分析--自上而下分析
语法分析--自上而下分析 语法分析器的功能 语法分析方法分类 自上而下分析法 自下而上分析法 LL(1)分析法 左递归的消除 消除回溯,提取公共左因子 求法,例FIRST(X): FOLLOW集构造方 ...
- 笔记-编译原理-第十、十一、十二章、十三章-语法分析-自下而上分析
第10章 - 自下而上分析1 10.1 自下而上分析 10.1.1 自下而上分析的一个示例 可以看出自下而上分析的主要步骤是不断的用文法来"规约",最后找到一种句型的表示 10.1 ...
- 【编译原理】Up-Down-算符优先分析
宏观自下而上分析. 所谓自下而上分析,就是从输入串开始,逐步进行"归约",直至归约到文法的开始符号:或者说,从语法树的末端开始,步步向上"归约",直到根结点.我 ...
- 编译原理(六)自底向上分析之LR分析法
自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...
- 编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
需要原卷和答案请点赞关注收藏后评论区留言私信~~~ 下面对编译原理中一些常见的概念以及算法小题的讲解,这部分可能单独出题考试,也有可能混在大题中出现 一.编译器结构 题目如下 The phases o ...
- 【编译原理】Python语法分析LL(1)、LR(1)
目录 一.实验目的 二.实验任务 三.实验原理 1 LL(1)文法 2 LR文法 四.实验过程 1 LL(1)文法 2 LR文法 五.实验结果 1 LL(1)文法 2 LR(0)文法 3 ...
最新文章
- mergesort java_归并排序详解(MergeSort)递归和非递归实现
- 常见数控机床的数据采集方法比较
- 优秀技术人的管理陷阱
- 互联网公司招聘奇葩黑历史:不要学日语,不要信中医,不要黄泛区……
- rabbitmq视频教程,面试官:
- 集成Atlas到现有的网站项目中--决定弃用Ajaxpro转用Atlas了
- 人力资源管理系统需求分析报告及系统架构图
- python 移动文件位置-python工具-文件及文件夹移动及处理
- IOS越狱插件安装后设置里边未显示
- 哈工大C语言程序设计精髓MOOC 第十二周编程题
- python爬虫之以腾讯招聘为例,爬取动态页面
- 软件设计 抽象_调试抽象给软件工程师带来正念的好处
- Flutter之基础Widget
- Orthanc的REST API — Orthanc Book文档
- 解决Windows Firewall/Internet Connection Sharing (ICS)服务无法启动(ping通IP,但不能浏览网页)
- 芯片制造全工艺流程详情,请收藏!
- RINEX 2.11 观测值文件格式说明
- ThreadPoolExecutor 线程池的七个参数
- oracle餐厅网络点餐系统_点餐外卖小程序值得搞吗?
- Flink一站式平台 StreamX 1.2.2 正式发布, 迄今最稳定可用版本