编译原理(第3版)习题精选与解析(第三章部分解析)
内容
3ư17给出接受文法S→(L)|aL→L,S|S的活前缀的一个DFA。答首先将文法进行如下拓广,其中S′是拓广文法的开始符号。S′→SS→(L)|aL→L,S|S接受该文法活前缀的一个DFA的状态转换图见图3ư5,开始状态是I0,所有的状态都是接受状态。图3ư5识别文法活前缀的DFA分析文法活前缀是LR分析的一个重要概念,接受文法活前缀的DFA是构造LR分析表过程中的重要一步。一些同学在构造LR分析表时会画这样的状态转换图,但是却未理解这是接受文法活前缀的DFA。构造SLR(1)分析表、规范LR(1)分析表和LALR(1)分析表时都需要先构造这样的DFA,由于用SLR(1)方法得到的DFA的状态数最少[实际上这个DFA就是用LR(0)方法构造的DFA],因此用SLR(1)方法。3ư18一个文法如下:S→(S)13
S→a请给出该文法中对活前缀(((有效的LR(1)项目。答该文法中对活前缀(((有效的LR(1)项目如下:S→(ưS),)S→ư(S),)S→ưa,)分析构造识别该文法活前缀的DFA时,实际上只要画出三个LR(1)项目集就可以看出结果了,这三个项目集见图3ư6。图3ư6识别文法活前缀的三个项目集3ư19接受文法S→Aa|bAc|dc|bdaA→d活前缀的DFA见图3ư7。请根据这个DFA来构造该文法的SLR(1)分析表,并说明该文法为什么不是SLR(1)文法。图3ư7识别文法活前缀的DFA答分析表见表3ư4,注意FOLLOW(A)={a,c}。因为有两处有移进-归约冲突,所以该文法不是SLR(1)文法。23
表3ư4为3ư19题的文法构造的分析表状态动作转移abcd$SA0s3s4121acc2s53s764r5s8,r55r16s97s10,r58r39r210r43ư20证明文法S→AaAb|BbBaA→εB→ε是LL(1)文法,但不是SLR(1)文法。答先证明它是LL(1)文法。因为仅非终结符S有两个不同的选择,因此只需考察它的两个右部。由于FIRST(AaAb)={a}FIRST(BbBa)={b}它们的交集为空,所以该文法是LL(1)文法。这里不是通过构造SLR(1)分析表,而是通过简单的分析来判断该文法不是SLR(1)。根据该文法,不管对什么句子,在面临第一个符号时进行空归约。由于FOLLOW(A)和FOLLOW(B)都等于{a,b},那么就不能确定是把ε归约成A还是归约成B,因此出现归约-归约冲突,所以该文法不是SLR(1)的。分析其实,该语言只有两个句子ab和ba,这个冲突是很容易解决的。但是由于用SLR方法构造分析表时,不是根据向前搜索符,而是根据所有可能的后继符号来填归约项目,这种粗糙性决定了会出现这样的归约-归约冲突。不要从这个例子得出LL(1)方法比SLR(1)方法强的错误结论。例如,习题3ư16中的表达式文法是SLR(1)的,但它不是LL(1)的,因为它有左递归。33
3ư21证明文法S→Aa|bAc|dc|bdaA→d是LALR(1)文法,但不是SLR(1)文法。答通过构造分析表来回答这个问题并不困难(见3ư23题),但是在文法很简单时,也应该能直观地分析出来。先说明该文法不是SLR(1)文法。从产生式很容易看出FOLLOW(A)={a,c}。若句子是dc,在d进分析栈后,面临的是c,这时出现移进-归约冲突,因为项目[S→dưc]要求移进,而由于c在FOLLOW(A)中,项目[A→dư]要求归约(这两个项目出现在同一项目集中)。上面的移进-归约冲突在规范LR(1)情况下不存在,因为只有在面临a时才进行d到A的归约。上面的文法还有另一个移进-归约冲突,在bd进栈后,面临a的情况,其冲突的原因和上面的类似。该冲突在规范LR(1)情况下也不存在。这样,该文法是LR(1)文法。显然,该文法的规范LR(1)项目集的集合中没有同心项目集,因此该文法也是LALR(1)文法。3ư22证明文法S→Aa|bAc|Bc|bBaA→dB→d是LR(1)文法,但不是LALR(1)文法。答该文法产生的语言仅含四个句子:da,bdc,dc和bda。不难看出,在规范LR(1)的情况下,d在什么情况下归约成A、什么情况下归约成B是能区分清楚的,所以它是LR(1)文法。在该文法的规范LR(1)项目集的集合中,对活前缀d有效的项目集是{[A→dư,a],[B→dư,c]}对活前缀bd有效的项目集是{[A→dư,c],[B→dư,a]}这两个集合都不含冲突,并且它们同心。合并同心集后变成{[A→dư,a/c],[B→dư,a/c]}出现归约-归约冲突,所以该文法不是LALR(1)文法。3ư23说明下面的文法不是SLR(1)文法,并重写一个等价的SLR(1)文法。S→Aa|bAc|dc|bdaA→d43
答分析表的部分状态见图3ư8,虽然只给出部分状态,但可能有的冲突都表现出来了。因为a是A的后继符号之一,因此在上面最右边一个项目集中有移进-归约冲突。类似地,下面中间那个状态也有移进-归约冲突。等价的SLR(1)文法是:S→da|bdc|dc|bda图3ư8分析表的有关状态3ư24下面的文法不是LR(1)的,对它略做修改,使之成为一个等价的SLR(1)文法。program→begindeclist;statementenddeclist→d;declist|dstatement→s;statement|s答修改后的文法如下:program→begindecliststatementenddeclist→d;declist|d;statement→s;statement|s分析该文法产生的句子的形式是:begind;d;…;d;s;s;…;send即主要是由分号分隔的若干个声明构成的声明表和由分号分隔的若干个语句构成的语句表,两表之间用分号分隔。由于分号既作为声明的分隔符,又作为声明表和语句表的分隔符,这就出现一个问题。该文法的第一步归约是将最后一个d归约成declist。当分析器将d压入分析栈,面临“;”时,它不能判断该d是否为最后一个d,因此有移进-归约冲突。如果把d后面的分号压入栈后再决定动作,移进-归约冲突就会消失。按这样的想法来修改文法,修改后的文法把声明d后的分号看成是d的结束符,因此把原来分隔声明表和语句表的分号看成是最后一个声明d的结束符。这时就不会有移进-归约冲突了
https://bill.lanzoui.com/iZOScx16aza
编译原理(第3版)习题精选与解析(第三章部分解析)相关推荐
- 编译原理(第3版-王生原)课后习题答案-第三章
1.构造下列正规式相应的 DFA. (1)1(0|1) *101 (2)1(1010* |1(010)*1) *0 (3)a((a|b)* |ab*a)*b (4)b((ab)* bb)*ab 答案: ...
- 编译原理(第二版)张素琴 课后代码 A.2 C版本
恰好上当编译原理了 就把课后的打了一下 希望对各位有帮助QwQ pl0.h #ifndef PL0_H_INCLUDED #define PL0_H_INCLUDED typedef enum{fal ...
- 一台微型计算机需要哪三个部分,单片机原理与应用课后习题参考题答案1~6章
- - .. -- <单片机原理及应用>习题答案 第一章 计算机基础知识 1-1 微型计算机主要由哪几部分组成?各部分有何功能? 答:一台微型计算机由中央处理单元(CPU).存储器.I/O ...
- 计量经济学及stata应用思维导图_人教版A版高中数学必修1第三章《函数的应用》思维导图...
用思维导图复习,一天顶一个月.高中数学必修和选修课本共计13本,通常两年内学完,平均一年6本,每学期3本.每本平均三到四章,每学期5个月,大约半月学完一章.而高考总复习的时间则更为宝贵,如果高考一轮复 ...
- 编译原理(第3版-王生原)课后习题答案-第二章
1.文法G=({A,B,S},{a,b,c},P,S)其中Р为:S→Ac|aB A→ab→bc 写出L(GISJ)的全部元素. 答案: L(G[S])={abc} 2.文法G[N]为:N→D|ND D ...
- 计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题
目录 第三章 3.1什么是总线?总线传输有何特点?为了减轻总线的负载,总线上的部件都应具备什么特点? 3.2总线如何分类?什么是系统总线?系统总线又分为几类,它们各有何作用,是单向的,还是双向的,它们 ...
- 数据库原理与应用(SQL Server)笔记 第三章 连接查询
目录 前言 一.连接谓词 二.JOIN连接 (一)内连接 (二)外连接 (三)交叉连接 总结 前言 本次内容,我们主要掌握数据库的多表查询,即通过两个表及两个以上的表之间的逻辑关系进行检索,将通过连接 ...
- 现代操作系统(原书第四版)课后题答案 —— 第三章 内存管理
1. IBM 360 有一个设计,为了对 2KB 大小的块进行加锁,会对每个块分配一个 4bit 的秘钥,这个秘钥会存在 PSW 中,每次内存引用时,CPU都会进行秘钥比较.但该设计有诸多缺陷,除了描 ...
- java 反编译class文件_用Java实现JVM第三章《解析class文件》
解析class文件 案例介绍 本案例主要介绍通过java代码从class文件中解析:class文件.常量池.属性表: 作为类(或者接口)信息的载体,每个class文件都完整地定义了一个类.为了使jav ...
- JavaScript高级程序设计(第4版)学习随笔【第三章】
ECMAScript语法: 区分大小写 一切都区分大小写.无论是变量.函数名还是操作符都区分大小写 标识符(变量.函数.属性或函数参数的名称) 第一个字符必须是一个字母.下划线或美元符号$ 剩下的其他 ...
最新文章
- 让我们努力从“不可救药的乐观主义者”--华尔街知名投资人约翰。多尔那里学点东西(永远放弃尝试改变这个世界)...
- 机器学习算法基础——逻辑回归
- web.xml中web-app标签报错
- bashrc,bash_profile和/etc/profile
- jenkins部署java项目之小白的笔记
- 微型计算机断电后信息将会丢失,计算机基础知识试题及答案a2
- 公司组织框架以及人员信息同步到钉钉相关解决方案
- 利用BI搭建零售业数据信息平台
- 中国码农在硅谷:告诉你如何斩获Google、微软、FB、Airbnb 四家 Offer
- indy9 indy10 MD5 实现方法
- python __import__和import区别_import reload __import__在python中的区别|python3教程|python入门|python教程...
- AAC音频的解码算法
- 【十七届恩智浦智能车】平衡单车——控制篇(串级)
- Time-Series Representation Learning via Temporal and Contextual Contrasting
- 国庆假期,人在囧途,感慨颇多
- 用html如何做发帖的页面,如何用html发帖
- 中国高端IC封装市场调查分析与投资趋势研究报告2022-2028年
- sun java system calendar 服务器拒绝服务_sun java system cale
- Maven系列学习(2)——java project的创建
- IJCAI 2019 | 通过交互提升机器翻译质量
热门文章
- 解码2022中国网安强星丨构建企业第一重“安全感”,联软科技以零信任重塑网络安全边界
- 电工学习笔记————稳压二极管伏安特性
- IC卡读卡器在安卓(android)下的开发
- 硬件射频测试和软件的区别,细说拉力试验机软件与硬件之间的区别
- Python和RF编写接口自动化
- 2022张宇考研基础30讲 第十一讲 多元函数微分学
- 发那科机器人圆弧指令怎么用_发那科机器人应用-运动指令入门(1)
- 关于Linux/kernel.h中的offsetof和container_of宏
- 新stem编程scratch3水果钢琴创意键盘兼容MakeyMakey开源国产盒装使用教程
- linux下安装yum步骤