编译原理课后习题答案.doc

上传人:豆**** 文档编号:28540310 上传时间:2022-07-28 格式:DOC 页数:14 大小:63KB
返回 下载 相关 举报
编译原理课后习题答案.doc_第1页
第1页 / 共14页
编译原理课后习题答案.doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《编译原理课后习题答案.doc》由会员分享,可在线阅读,更多相关《编译原理课后习题答案.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精品文档,仅供学习与交流,如有侵权请联系网站删除第一章1典型的编译程序在逻辑功能上由哪几部分组成?答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。2. 实现编译程序的主要方法有哪些?答:主要有:转换法、移植法、自展法、自动生成法。3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式?答:编译法、解释法。4. 编译方式和解释方式的根本区别是什么?答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快;解释方式:在执行时,必须源程

2、序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。第二章1. 乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关系如何?答:1)0型文法、1型文法、2型文法、3型文法。2)2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。答:ZSME | BS1|2|3|4|5|6|7|8|9Me | D | MDD0|SB2|4|6|8E0|B3. 设文法G为:N D|NDD 0|1|2|3|4|5|6|7|8|9请给出句子123、301和75431的最右推导和最左推导。答:NNDN3ND3N23D23123NNDNDDDDD1DD12D123

3、NNDN1ND1N01D01301NNDNDDDDD3DD30D301NNDN1ND1N31ND31N431ND431N5431D543175431NNDNDDNDDDNDDDDDDDDD7DDDD75DDD754DD7543D754314. 证明文法 SiSeS|iS| i是二义性文法。答:对于句型iiSeS存在两个不同的最左推导:SiSeSiiSesSiSiiSeS所以该文法是二义性文法。5. 给出描述下面语言的上下文无关文法。(1) L1=anbnci |n=1,i=0 (2) L2=aibj|j=i=1(3) L3=anbmcmdn |m,n=0答:(1) SABAaAb | abBc

4、B | e(2) SASb |abAa | e(3) SaSd | A | eAbAc | e6. 设计一个最简的DFA M,使其能够识别所有的被3整除的无符号十进制整数。答:7. 设计一个DFA,使其能够接受被4整除的二进制数。答:8. 写出表达下列各项的正则表达式。(1)二进制数且为5的倍数。(2)=a,b,c,第一个a位于第一个b之前的字符串。(3)=a,b,c,包含偶数个a的字符串。(4)=0,1,不包含11子串的字符串。答:(1)可以先画出相应的有限自动机:添加新的开始状态S和终止状态T:根据以上自动机,列出以下方程: S=A A=0A+1B+T B=0C+1D C=0E+1A D=

5、0B+1C E=0D+1E解以上方程组: E=1*0D A=0*1B+0*T代入 C=01*0D+1A代入 C=01*00B+01*01C+1A C=xB+yA 其中x=(01*01)*01*00 y=(01*01)*1代入 B=0C+10B+11C B=(0|11)C+10B B=(10)*(0|11)C将C=xB+yA代入上式 B=uB+vA B=u*vA其中u=(10)*(0|11)x v=(10)*(0|11)y将B=u*vA代入 A=0*1u*vA+0*T A=(0*1u*v)*0*T将A代入 S=(0*1u*v)*0*T串(0*1u*v)*0*即为所求。(2)该题目理解为:至少有一

6、个a和一个b,且a出现在b的前面(可以有间隔),则答案为:c*a(a|c)*b(a|b|c)*(3)(b|c)*a(b|c)*a)*(b|c)*(a(b|c)*a | b | c)*(4)(0|10)*(1|e)第三章1. 词法分析器的功能是什么?答:读源程序的字符序列,逐个拼出单词,并构造相应的内部表示TOKEN;同时检查源程序中的词法错误。2. 试分析分隔符(空格、跳格及回车等)对词法分析的影响。答:空格、跳格、回车等分隔符号对词法分析不起作用,可以删除。但是回车符号可以用于错误定位,所以在删除回车符号前需要统计回车的个数。3. 给出识别C语言全部实型常数的自动机。答:(+|-|e)(1-

7、90-9*|0)(.0-90-9*|e) (E(+|-|e)0-90-9*)4. 写出识别C语言中所有单词的LEX程序。答:L=A-Z | a-zD=0-9D1=1-9(L|_)(L|D|_)*return (1);D1D*return (2);+return (3);第四章1. 设有如下文法GS:SaABbcd | eAASd | eBSAh | eC | eCSf | Cg | e(1) 求每个产生式的Predict集。(2) 该文法是否为LL(1)文法?为什么?答:(1)Predict(SaABbcd)=aPredict(S e)=#,d,f,a,h Predict(AASd)=a,dP

8、redict(A e)=h,a,d,b,ePredict(BSAh)=a,d,hPredict(B eC)=ePredict(B e)=bPredict(CSf)=a,fPredict(C Cg)=a,f,gPredict(C e)=g,b(2)由于Predict(AASd) Predict(A e),所以该文法不是LL(1)文法。2. 下列描述括号匹配的文法中,哪些是LL(1)文法?(1)S(SS | eS ) | e(2)S(S)S | e(3)SS(S)S | e(4)S(S | SS(S) | e答:(1)不是,(2)是,(3)不是,(4)不是3. 已知文法GE:EE+T | TTT*

9、F | FFi | (E)请按递归下降法构造该文法的语法分析程序。答:求产生式的predict集合:predict(EE+T)=i,(predict(ET)=i,(predict(TT*F)=i,(predict(TF)=i,(由于文法中非终极符号E和T对应的产生式的predict集合的交集都不为空,所以该文法不满足自顶向下分析的条件,现对文法进行等价变换得到如下文法:ETEE+TE | eTFTT*FT | eFiF(E)求新文法的predict集合:Predict(ETE)=(,iPredict(E+TE)=+Predict(Ee)=#,)Predict(TFT)=i,(Predict(T

10、*FT)=*Predict(Te)=+,),#Predict(Fi)=iPredict(F(E)=(由于以上文法中任意非终极符号对应的产生式的predict集合的交集都为空,所以满足自顶向下分析的条件,所以可以写出如下的递归下降语法分析伪代码:Void E() if(token(,i) T();E(); else Error();void E() if(token+) Match(+);T();E(); else if(token#,) ; else Error();void T() if(tokeni,() F();T(); else Error();void T() if(token*)

11、Match(*);F();T(); else if(token+,),#) ; else Error();void F() if(tokeni) Match(i); else if(token() Match();E();Match(); else Error();4. 构造一个LL(1)文法G,它能识别语言L:L=w | w为字母表S上不包括两个相邻的1的非空串,其中S=0,1。并证明你所构造的文法是LL(1)文法。答:A0E | 1FB0E | 1FC0EEB | eFC | ePredict(A0E)=0Predict(A1F)=1Predict(B0E)=0Predict(B1F)=1

12、Predict(EB)=0,1Predict(Ee)=#Predict(FC)=0Predict(Fe)=#对任意非终极符号对应的产生式的predict集合的交集都为空,所以该文法是LL(1)文法。5. 已知文法GA为:AaABe | aBBb | d(1) 试给出与GA等价的LL(1)文法GA。(2) 构造GA的LL(1)分析表并给出输入串aade#的分析过程。答:(1)所求GA为:AaA(1)AABe (2)A e(3)BdB(4)BbB (5)B e(6)Predict(AaA)=aPredict(AABe)=aPredict(Ae)=#,dPredict(BdB)=dPredict(B

13、bB)=bPredict(Be)=e对任意非终极符号对应的产生式的predict集合的交集都为空,所以该文法是LL(1)文法。(3) 分析表如下:abde#A(1)A(2)(3)(3)B(4)B(5)(6)aade#的分析过程如下分析栈输入流动作A#aade#替换(1)aA #aade#匹配A #ade#替换(2)ABe#ade#替换(1)aABe#ade#匹配ABe#de#替换(3)Be#de#替换(4)dBe#de#匹配Be#e#替换e#e#匹配#成功第五章(这章答案是错的)1. 设有下列文法:(1)SaAAAbAb(2)SaSSbSaSSSSc(3)SASSbASAAa(4)ScAScc

14、BBccBBbAcAAa构造上述文法的LR(0)归约活前缀状态机,并给出LR(0)分析表。答:(1)(2)(3)(4)2. 设有下列文法:(1)SSaS | b(2)SbSb | cSc | b | c(3)SbSb | bSc | d(4)SaSb | bSa | ab(5)SSab | bRRS | a(6)SSAB | BABbAaA | B(7)SAaAb | BbBaBeAe(8)AaABe | BaBdB | e说明上述文法是否为SLR(1)文法。若是,请构造SLR(1)分析表;若不是,请说明理由。答:(1)(2)(3)(4)(5)(6)(7)(8)3. 设有下列文法:SaAd |

15、 bBd | aBe | bAeAgBg说明该文法是LR(1)文法,但不是LALR(1)文法。答:4. 设有下列文法:(1)EE+T | TTTF | TF(E) | F* | a | b(2)SAa | bAc | dc | bdaAd说明上述文法是否为SLR(1)文法?是否为LALR(1)文法?并构造相应的分析表。答:(1)(2)5. 设有下列文法:LMLb | aMe说明上述文法是否为LR(1)文法,若不是,请说明理由。答:第六章1.试写出下列类型的内部表示: a.integer b.ARRAY 1.5 of RECORD i:integer; b:boolean END c.ARRAY

16、 1.5 of RECORD a:ARRAY 1.10; r:RECORD i,j:integer END END d. RECORD r: RECORD x,y:real END;a: ARRAY 1.10 of integer END2. 设当前层数为l,可用区距为101,且有下列程序段: CONST mm=333;nn=444; TYPE atype = ARRAY1.10 OF real; rtype = RECORD i,j:integer END; VAR a,b:atype; x,y:real 试写出各标识符的内部表示。3. 设当前层数和区距分别为l和off,且有函数说明首部:

17、FUNCTION f(A:atype;VAR B:atype;VAR X:real):integer 其中atype的定义见题5,试写出f的内部表示。4. 要求在下面括号中写上相应(层数)和区距(off)。 ()()PROCEDURE g(A:atype;()()VAR B:atype;()()VAR X:real()()()().5. 给出下面C程序扫描到语句c=a+b+x时相应的全局符号表(采用顺序表结构)。main()int a=0;float c=1.0;float a=3.0;float x=1.3;float b=0.3; int b=10; c=a+b+x;6. 给出题1中程序扫

18、描到语句c=a+b+x时相应的全局符号表(采用外拉链的散列表结构)。7. 根据标识符的作用域规则,分别给出图6.5的程序中,过程P、Q、R、S中有效的标识符。第七章1. 将算术表达式 (a+b)*(c+d)-(a+b+c) 翻译成四元式序列。2. 将下列语句翻译成四元式序列:a. IF x0 THEN x:=0 ELSE x:=1b. WHILE x0 DO x:=x-1c. IF x0 THEN x:=x+1 ELSE IF x 0 DOWHILE y 0 DO BEGIN y:=y-x; x:=x-1 END3. 给出如下程序段的四元式序列。(四元式的操作符可用自身代替)。其中A:Arra

19、y of 1.10 of integer。 a:=1;while a=10 do begin if ab then Aa:=Ab+2; else a:=a+1; b:=b+1; end4. 试将FOR语句翻译成四元式序列。5. 试将UNTIL语句翻译成四元式序列。6. 试将CASE语句翻译成四元式序列。7. 试给出4、5、6题中翻译过程的语法制导程序。第八章1. 将下面的程序段划分为基本块并画出其程序流图。read(A);read(B);F:=1;C:=A*A;D:=B*B;if C100 goto L2;goto L3;L2:F:=F-1;goto L1;L3:write(E);2. 假设有

20、如下语句序列,写出常表达式优化前和优化后的四元式中间代码。(1)i:=1;(2)a:=20;j:=i*(i+1);b:=a*(a+10);k:=2*(i+j);c:=a*b;3. 假设有如下语句序列或表达式,写出公共表达式优化前和优化后的四元式中间代码。(1)x:=x*y+z; y:=x*y+z; z:=x*y+z;(2)(a*b+c)/(a*b-c)+(c*b+a-d)/(a*b+c)4. 写出如下循环语句不变式外提后的四元式中间代码。while i=100 dobeginu:=A*B;m:=u*u;S:=S+m*m;i:=i+1;end5. 写出下面循环语句不变式外提后的四元式中间代码,其

21、中数组各下标的类型为1.10。while i=100 dobeginj:=1;while j=100 dobegink:=1;while k=100 doAijk:=0;endend第九章1.过程活动记录包含哪些信息?各信息的作用?何时填写它们?2.下面是一个调用递归函数的Pascal程序program PP(input,output) VAR k:integer; FUNCTION F(n:integer):integer begin if n 0 THEN y:=y+1 ELSE IF x 0 THEN y:=y-1的目标代码,其中的变量均为非形参实型变量。 试写出程序段WHILE x 0 THEN y :=y-x ELSE WHILE y 0 DO y := y + xEND的目标代码,其中变量均为非形参实型变量。 试为FOR循环语句设计目标代码。 试为REPEAT循环语句设计目标代码。 试为CASE语句设计目标代码。【精品文档】第 14 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁