编译原理陈火旺版第四章课后题答案
下面答案仅供参考!
1.考虑下面文法G1:
S→a∣∧∣(T)
T→T,S∣S
(1) 消去 Q 的左递归。然后,对每个非终结符,写岀不带回溯的递归子程序。
(2) 经改写后的文法是否是LL(1)的?给出它的预测分析表。
2.对下面的文法G:
P→(E)lalblΛ
(1)计算这个文法的每个非终结符的FIRST和FOLIOW.
(2)证明这个文法是LL(1)的。
(3)构造它的预测分析表。
(4)构造它的递归下降分析程序。
3.下面文法中,哪些是LL(1)的,说明理由。
(1)S→Abc
A→a∣ε
B→b∣ε
(2)S→Ab
A→a∣B∣ε
B→b∣ε
(3)S→ABBA
A→a∣ε
B→b∣ε
(4)S→aSe∣B
B→bBe∣C
C→cCe∣d
4. 对下面文法:
Expr→-Expr
Expr→(Expr)∣Var
ExprTail→-Expr∣ε
Var→id VarTail
VarTail→(Expr)∣ε
(1) 构造 LL(1)分析表。
(2) 给出对句子 id - -id((id))的分析过程。
构造文法的预测分析表,通常应当按下列步骤进行: (1) 消除文法的左递归(包括所有直接左递归和间接左递归); (2) 对消除左递归后的文法,提取左公因子; (3) 对经过上述改造后的文法,计算它的每个非终结符的 FIRST 集合和 FOLLOW 集合 ⑷ 根据 FIRST 集合和 FOLLOW 集合构造预测分析表:
第1步对文法G的每个产生式A→α执行第1步和第3步;
第2步对每个终结符a∈FIRST(α),把A→α加至M[A,a]中;
第3步若ε∈FIRST(α),则对任何b∈FOLLOW(A)把A→α加至M[A,b]中;
第4步把所有无定义的M[A,a]标上“出错标志”。
解答:
(1)计算每个非终结符的FIRST集合和FOLLOW集合如下:
FIRST(Expr)={-,(,id}
FIRST(ExprTail)={-,ε}
FIRST(Var)={id}
FIRST(VarTail)={(,ε}
FOLLOW(Expr)={),#}
FOLLOW(ExprTail)={),#}
FOLLOW(Var)={-,),#}
FOLLOW(VarTail)={-,∣,#}
构造其预测分析表如下:
- | id | ( | ) | # | |
Expr | Expr→- Expr | Expr→Var ExprTail | Expr→-( Expr) | ||
ExprTail | ExprTail→-Expr | ExprTail→ε | ExprTail→ε | ||
Var | Var→id VarTail | ||||
VarTail | VarTail→ε | VarTail→(Expr) | VarTail→ε | VarTail→ε |
(2)句子id--id((id))的分析过程如下:
步骤 |
符号栈 |
输入串 |
所用产生式 |
0 |
# Expr |
id--id((id)) # |
|
1 |
# ExprTail Var |
id--id((id)) # |
Expr→Var ExprTail |
2 |
# ExprTail VarTail id |
id--id((id)) # |
Var→id VarTail |
3 |
# ExprTail VarTail |
--id((id)) # |
|
4 |
# ExprTail |
--id((id)) # |
VarTail→ε |
5 |
# Expr - |
--id((id)) # |
ExprTail→-Expr |
6 |
# Expr |
-id((id)) # |
|
7 |
# Expr - |
-id((id)) # |
Expr→-Expr |
8 |
# Expr |
id((id)) # |
|
9 |
# ExprTail Var |
id((id)) # |
Expr→Var ExprTail |
10 |
# ExprTail VarTail id |
id((id)) # |
Var→id VarTail |
11 |
# ExprTail VarTail |
((id)) # |
|
12 |
# ExprTail ) Expr ( |
((id)) # |
VarTail→(Expr) |
13 |
# ExprTail ) Expr |
(id)) # |
|
14 |
# ExprTail ) ) Expr ( |
(id)) # |
|
15 |
# ExprTail ) ) Expr |
id)) # |
|
16 |
# ExprTail ) ) ExprTal Var |
id)) # |
Expr→Var ExprTail |
17 |
# ExprTail ) ) ExprTail VarTail id |
id)) # |
Var→id VarTail |
18 |
# ExprTail ) ) ExprTail VarTail |
)) # |
|
19 |
# ExprTail ) ) ExprTail |
)) # |
VarTail→ε |
20 |
# ExprTail ) ) |
)) # |
ExprTail→ε |
21 |
# ExprTail ) |
) # |
|
22 |
# ExprTail |
# |
|
23 |
# |
# |
ExprTail→ε |
suc |
5. 把下面文法改写为 LL(1)的:
Declist→Declist;Decl∣Decl
Decl→IdList:Type
IdList→IdList,id∣id
Type→ScalarType∣array(ScalarTypeList) of Type
ScalarType→id∣Bound..Bound
Bound→Sign IntLiteral∣id
Sign→+∣-∣ε
ScalarTypeList→ScalarTypeList,ScalarType∣ScalarType
答:本题目主要考査学生理解和运用消除文法的左递归、提取左公共因子等算法的能力, 为判断文法是否是 LL(1)文法,还要计算文法的 FIRST 集合和 FOLLOW 集合。
消除文法的左递归的基本思想是,将文法规则中的左递归结构变换成等价的右递归结构。
提取左公因子的算法,是对包含公共左因子的产生式候选,反复提取左因子,就能够 把每个非终结符(包括新引进者)的所有候选首符集变成为两两不相交。
消除文法的左递归、提取左公共因子后,再计算文法的各非终结符00的首符集 FIRST( X)和随符集 FOLLOW( X),然后根据 LL(1)文法的充分必要条件(即 LL(1)文法 的定义)来判断文法是否是 LL(1)文法。
首先消除左递归,得到文法G(Declist):
Declist→Decl Declist’
Declist’→;Decl Declist’∣ε
Decl→IdList:Type
IdList→id IdList’
IdList’→,id List’∣ε
Type→ScalarType∣array(ScalarTypeList) of Type
ScalarType→id∣Bound..Bound
Bound→Sign IntLiteral∣id
Sign→+∣-∣ε
ScalarTypeList→ScalarType ScalarTypeList’
ScalarTypeList’→,ScalarType ScalarTypeList’∣ε
显然,改造后的文法没有左公共因子,计算每个非终结符的FIRST集合和FOLLOW集合如下:
FIRST(Declist)={id}
FIRST(Declist’)={;,ε}
FIRST(Decl)={id}
FIRST(IdList)={id}
FIRST(IdList’)={;,ε}
FIRST(Type)={id,+,-,IntLiteral,array}
FIRST(ScalarType)={id,+,-,IntLiteral}
FIRST(Bound)={id,+,-,InLiteral}
FIRST(Sign)={+,-,ε}
FIRST(ScalarTypeList)={id,+,-,IntLiteral }
FIRST(ScalarTypeList’)={,,ε}
FOLLOW(Declist)={#}
FOLLOW(Declist’)={#}
FOLLOW(Decl)={id,;}
FOLLOW(IdList)={:}
FOLLOW(IdList’)={:}
FOLLOW(Type)={id,;}
FOLLOW(ScalarType)={id,;,),,}
FOLLOW(Bound)={id,;,)’,’..}
FOLLOW(Sign)={IntLiteral}
FOLLOW(ScalarTypeList)={)}
FOLLOW(ScalarTypeList’)={)}
显然,改造后的文法是 LL(1)的。
编译原理陈火旺版第四章课后题答案相关推荐
- 编译原理陈火旺版第三章课后题答案
下面答案仅供参考! 1.编写一个对于 Pascal 源程序的预处理程序.该程序的作用是,每次被调用时都将 下一个完整的语句送进扫描缓冲区,去掉注解行,同时要对源程序列表打印. 答:以下是一个简单的预处 ...
- 编译原理陈火旺版第五章课后题答案
下面答案仅供参考! 1.令文法G为: E→E+T∣T T→T*F∣F F→(E)∣i 证明E+T*F是它的一个句型,指出这个句型的所有短语,直接短语和句柄. 2.考虑下面的表格结构文法G2: S→a∣ ...
- 编译原理陈火旺第三版第七章课后题答案
下面的答案仅供参考! 1. 给出下面表达式的逆波兰表示(后缀式): a*(-b+c) not A or not (C or not D) a ...
- 编译原理陈火旺第三版第六章课后题答案
下面的答案仅供参考! 1.按照表6.1所示的属性文法,构造表达式(4*7+1) *2的附注语法树. 答: 首先考虑最底最左边的内部结点,它对应于产生式F→digit,相应的语义规则为F. val: = ...
- 数据库原理第四章课后题答案(第四版)
一.选择题 1. B 2. B 3. D 4. B 5. C 6. D 7. B 8. D 9. D 10. D 11. A 12.C 13.D ...
- 线性代数第五版吉尔伯特课后答_线性代数同济第五版第四章课后习题答案!
搜集 | 整理 | 测试 | @小愉 免责声明:以下资源或软件均来自互联网,仅供学习和交流使用,如有侵权请联系删除,请勿用于商业和非法途径等,如有法律纠纷与本人无关! 本文未经允许,不得转载! 适用 ...
- 李航老师《统计学习方法》第二版第三章课后题答案
其他章节答案请参考我的汇总统计学习方法答案汇总,都是自己写的. 1.参照图3.1,在二维空间中给出实例点,画出 kkk 为1和2时的 kkk 近邻法构成的空间划分,并对其进行比较,体会 kkk 值的选 ...
- 泛函分析——步尚全老师第四章课后题答案往年题
百度网盘链接: https://pan.baidu.com/s/1ECupHu5-Dz-XOgpaThQckA
- mysql教材第四章课后题答案_mySQL 教程 第4章 数据查询
mySQL运算符 这些运算符在SQL查询中用得到. 算数运算符 + 加 - 减 * 乘 / DIV 除 % MOD 取余数 比较运算符 = 等于 <> != 不等于 < <= ...
最新文章
- 【PAT (Basic Level) 】1015 德才论 (25 分)
- mpvue 小程序如何开启下拉刷新,上拉加载?
- 安装brew提示/usr/local/bin is not in your PATH.
- asp.net发送邮件时在正文中插入图片
- 信息学奥赛一本通 1265:【例9.9】最长公共子序列
- 关于QT多线程子线程使用信号和
- Django:ORM基本操作-CRUD,管理器对象objects,----->聚合查询、原生数据库操作
- zabbix3.2通过snmp v2采集Dell服务器iDRAC口信息监控硬件
- [原] 让网页中的对话框不显示以前输入的信息
- FHJ学长的心愿 QDUOJ 数论
- 因为计算机丢失d3dx10,Win7打开剑灵游戏提示丢失d3dx10_43.dll怎么解决
- css实现--三角形/箭头(上下左右)--详细原理
- virtualbox下安装雪豹10.6系统(AMD下亲测成功)
- do还是doing imagine加to_do还是doing imagine加to_do、to do、doing用法全汇总,再也不用担心选错啦(收藏)......
- java socket 卡住_Java socket通讯实现过程及问题解决
- GitHub 近两万 Star,无需编码,可一键生成前后端代码,这个开源项目有点强!...
- 【瑞萨RA4系列】开发环境搭建和点灯指南
- 【工具】之DataX-Web简单介绍
- [论文翻译]Deep Learning 翻译及阅读笔记
- lumia flash android,Lumia830吃上棉花糖!WP手机刷安卓7.1详细教程
热门文章
- 游戏编程中的寻路算法研究
- Linux如何部署私有IPFS(安装、部署、共享key,添加节点,测试)
- JDK 安装 配置 运行 帮助文档
- 199,一个被正则表达式遗忘的号码段?
- TOUGH系列软件建模实践方法及在地下水、CO2地质封存、水文地球化学、地热等多相多组分系统多过程耦合高级教程
- 柳传志经典语录:管理三要素,即建班子、定战略和带队伍
- js将秒转换成几天几小时几分几秒,每秒刷新
- ReadPV用法以及启动策略
- 用html+css+jQuery制作一个简单的流程图/步骤图
- floquet端口x极化入射波_AnsoftHFSS在周期性异向介质研究中的仿真方法.pdf