ImageVerifierCode 换一换
格式:DOCX , 页数:71 ,大小:926.53KB ,
资源ID:24107466      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24107466.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx

1、习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社附录 部分习题参考答案第1章习题1. 解释下列术语。翻译程序,编译程序,解释程序,源程序,目标程序,遍,前端,后端解答:略!2. 高级语言程序有哪两种执行方式?阐述其主要异同点。描述编译方式执行程序的过程。解答:略!3. 在你所使用的C语言编译器中,观察程序1.1经过预处理、编译、汇编、链接四个过程生成的中间结果。解答:略!4. 编译程序有哪些主要构成成分?各自的主要功能是什么?解答:略!5. 编译程序的构造需要掌握哪些原理和技术?编译程序构造工具的作用是什么?解答:略!6. 复习C语言,其字母表中有哪些符号?有哪些关键字、运算符和界符?

2、标识符、整数和实数的构成规则是怎样的?各种语句和表达式的结构是什么样的?解答:略!7. 编译技术可应用在哪些领域?解答:略!8. 你能解释在Java编译器中,输入某个符号后会提示一些单词、某些单词会变为不同的颜色是如何实现的吗?你能解释在Code Blocks中在输入后,会自动添加,输入do 会自动添加while()是为什么吗?解答:略!第2章习题1. 判断题,对下面的陈述,正确的在陈述后的括号内画,否则画。(1) 有穷自动机识别的语言是正规语言。 ( )(2) 若r1和r2是上的正则表达式,则r1|r2也是。 ( )(3) 设M是一个NFA,并且L(M)x,y,z,则M的状态数至少为4个。

3、( )(4) 令a,b,则所有以b开头的字构成的正规集的正则表达式为b*(a|b)*。( )(5) 对任何一个NFA M,都存在一个DFA M,使得L(M)=L(M)。 ( )1解答:略!2.从供选择的答案中,选出应填入下面叙述中 ?内的最确切的解答。有穷自动机可用五元组(Q,VT,q0,Qf)来描述,设有一有穷自动机M定义如下:VT=0,1,Q=q0,q1,q2,Qf=q2,的定义为: (q0,0)=q1 (q1,0)=q2 (q2,1)=q2 (q2,0)=q2M是一个 A 有穷状态自动机,它所对应的状态转换图为 B ,它所能接受的语言可以用正则表达式表示为 C 。其含义为 D 。供选择的

4、答案:A:歧义的 非歧义的 确定的 非确定的B:C: (0|1)* 00(0|1)* (0|1)*00 0(0|1)*0D: 由0和1所组成的符号串的集合以0为头符号和尾符号,由0和1所组成的符号串的集合以两个0结束的,由0和1所组成的符号串的集合以两个0开始的,由0和1所组成的符号串的集合2. 分析有限自动机分为确定有限自动机和非确定有限自动机。确定有限自动机的确定性表现在映射 :QVT -q是单值函数,也就是说,对任何状态 qQ和输入字符串aVT, (q,a)唯一确定下一个状态。显然,本题给出的是一个确定的有限自动机,它的状态转换图是C中的。它所接受的语言可以用正则表达式表示为00(0|1

5、)*,表示的含义为由两个0开始的后跟任意个(包含0个)0或1组成的符号串的集合。 2. 解答:A: B: C: D:E: 3查阅自己熟悉的高级语言的规范,如C或Java,确定:字符集是什么(不包含那些只能出现在字符串或注释中的字符),数字常量的构成形式是什么,标识符的词法规则是什么?3解答:略!4画出下面的状态转换图,并给出相应的识别函数。(1) C语言中字符常量是由一对单引号括起来的单个字符,或者以开头的两个字符表示的转义字符;解答:(2) C语言中以/开头的单词有多种,如/、/=、/、/*等,其中前两种表示除法运算和除法赋值运算,它们需要返回单词本身;后两种表示注释:以/*和*/括起来的多

6、行注释、以/标记的单行注释,后两种识别后不需要返回单词,直接跳过;解答: (3) C语言中的整数有多种形式:十进制、八进制和十六进制;解答: (4) C语言中不带指数的浮点数;解答: 5一个长度为n的字符串,前缀和后缀分别有多少个,如果字符串为abcd,分别是哪些?解答:前缀和后缀都是n+1个,字符串abcd的前缀分别, ,a,ab,abc,abcd,后缀分别是: ,d,cd,bcd,abcd。6试写出以下各描述中所表示的正则表达式:(1) 以01结尾的二进制数串;解答:(0|1)*01(2) 不以0开头,能被5整除的十进制整数;解答:(1|2|9)(0|1|2|9)*| )(0|5) (3)

7、 包含子串011的由0和1组成的符号串的全体;解答:(0|1)*(011)(0|1)* (4) 不包含子串011的由0和1组成的符号串的全体;解答:1*(01|0)* | 1*0(0|10)*(1| ) (5) 按字典序递增排列的所有小写字母串;解答:a*b*c*z* (6) =0,1上的含奇数个1的所有串。解答:(0|10*1)*1 (7) 包含偶数个0和1的二进制串;解答:(00|11) | (00|11)*(01|10)(00|11)*(01|10)(00|11)*)* (8) 具有偶数个0和奇数个1的由0和1组成的符号串的全体;解答:分析设S是符合要求的串,|S|=2k+1 (k0)。

8、则 SS10|S21,|S1|=2k (k0),|S2|=2k (k0)。且S1是0,1上的串,含有奇数个0和奇数个1。S2是0,1上的串,含有偶数个0和偶数个1。考虑有一个自动机M1接受S1,那么自动机M1如下:和L(M1)等价的正规式,即S1为:(00|11)|(01|10)(00|11)*(01|10)*(01|10)(00|11)*类似的考虑有一个自动机M2接受S2,那么自动机M2如下:和L(M2)等价的正规式,即S2为:(00|11)|(01|10)(00|11)*(01|10)*因此,S为:(00|11)|(01|10)(00|11)*(01|10)*(01|10)(00|11)*

9、0|(00|11)|(01|10)(00|11)*(01|10)*1另一种答案:(参考龙书上,用a,b表示0,1) (a(aa)*b(b(aa)*b)*(b(aa)*ab|a)|(aa)*b)(b(aa)*b|(ba(aa)*b|a)(b(aa)*b)*(b(aa)*ab|a)*分析过程: (9)由/* 和 */括起来的注释的串,且串中没有在双引号中的*/;解答:/*(*”.*”|*+/)*/ (10)有些语言是大小写敏感的,因此这些语义中的关键字只有一种写法,描述它的正则表达式比较简单,但SQL语言是大小写不敏感的,如select和SeLect、SELECt等都是一样的,试描述SQL中的关键

10、字select的大小写不敏感的正则表达式。解答:select - SsEeLlEeCcTt7试描述下列正则表达式所描述的语言:(1)0(0|1)*0解答:以0开头并且以0结尾的,由0和1组成的符号串。(2)(|0)1*)*解答:|0,1* (3)(0|1)*0(0|1)(0|1)解答:由0和1组成的符号串,且从右边开始数第3位为0。(4)0*10*10*10*解答:含3个1的由0和1组成的符号串。|0,1+,且中含有3个1 (5)(00|11)*(01|10)(00|11)*(01|10)(00|11)*)*解答:包含偶数个0和1的二进制串,即|0,1*,且中有偶数个0和18假定某语言只有三种

11、单词:关键字if;关键字while;标识符,它是除了if和while以外的所有以字母构成的串。试构造识别该语言的单词的NFA和DFA。解答:NFA中有冲突,可是使用最长优先或者先出现优先的方式来解决。9给出识别下列在字母表0,1上的语言的最小化DFA,并以状态转换图和状态转换表表示。(1)所有以00结尾的符号串的集合。解答:(1) DFAM=(0,1,q0,q1,q2,q0,q2, )其中 定义如下: (q0,0)=q1 (q0,1)=q0 (q1,0)=q2 (q1,1)=q0 (q2,0)=q2 (q2,1)=q0状态转换图为:(2)所有具有3个0的符号串的集合。解答:正规式: 1*01*

12、01*01* DFAM=(0,1,q0,q1,q2,q3,q0,q3, ),其中 定义如下: (q0,0)=q1 (q0,1)=q0 (q1,0)=q2 (q1,1)=q1 (q2,0)=q3 (q2,1)=q2 (q3,1)=q3 状态转换图为:(3)含有偶数个0或偶数个1的字符串。解答:01Q0*Q1Q2Q3Q2Q3Q0Q1Q1Q0Q3Q210. 构造与下列正则表达式等价的最小状态的DFA。(1) 10 | (0|11)0*1解答:(1) DFAM=(0,1,q0,q1,q2,q3,q0,q3, ),其中 定义如下: (q0,0)=q1 (q0,1)=q2 (q1,0)=q1 (q1,1)

13、=q3 (q2,0)=q3 (q2,1)=q1状态转换图为:(2) (0|1)*| (11)*解答:DFAM=(0,1,q0,q0,q0, ),其中 定义如下: (q0,0)=q0 (q0,1)=q0状态转换图为:(3) (a|b)*a(a|b)解答:(a|b)*a(a|b) 求出NFA M:确定化,得到DFA M:化简:在第步中求出的DFA M中没有等价状态,因此它就是最小化的DFA M。(4) (a|b)*a(a|b)(a|b)解答:(a)b)*a(a|b)(a|b) 求NFA M: 确定化,得到DFA M:化简,在第步中求出的DFA M中没有等价状态,因此它已经是最小化的DFA M了。1

14、1应用题:(1)有假定一台自动售货机,接受1元和5角的硬币,出售每瓶1元5角的饮料,顾客每次向机器中投放1元5角的硬币,就可得到一瓶饮料(注意:每次只给一瓶饮料,且不找钱),构造该售货机的有穷自动机(可以是NFA或DFA)。解答:其中a代表1元硬币,b代表5角硬币(2)设计一个状态数最少的DFA,其输入字母表是0,1,它能接受以00或01结尾的所有序列。解答:正规式为:(0|1)*(00|01) 化简:(0|1)*0(0|1)不确定的有穷自动机为:确定化,并最小化得到:(3)某操作系统下合法的文件名规则为device:name.extension,其中第一部分(device:)和第三部分(.e

15、xtension)可默认,若device、name和extension都是由字母组成,长度不限,但至少有1位。 请写出识别这种文件名的正则表达式 画出其对应的NFA; 将上述得到的NFA确定化为等价的DFA。解答: 正规式:(dd*:| )dd*(.dd*| ),d代表az的字母 NFA为: DFA为:(4)一个C语言编译器编译下面的函数gcd()时,报告parse error before else。这是因为else的前面少了一个分号。但是如果第一个注释 /* then part */误写成 /* then part那么该编译器发现不了遗漏分号的错误。这是为什么?long gcd(p,q)l

16、ong p,q; if (p%q = 0) /* then part */ return q else /* else part */ return gcd(q, p%q);解答:此时编译器认为/* then part return q else /* else part */是程序的注释,因此它不可能再发现else 前面的语法错误。分析 这是注释用配对括号表示时的一个问题。注释是在词法分析时忽略的,而词法分析器对程序采取非常局部的观点。当进入第一个注释后,词法分析器忽略输入符号,一直到出现注释的右括号为止,由于第一个注释缺少右括号,所以词法分析器在读到第二个注释的右括号时,才认为第一个注释处

17、理结束。 为克服这个问题,后来的语言一般都不用配对括号来表示注释。例如Ada语言的注释始于双连字符(-),随行的结束而终止。如果用Ada语言的注释格式,那么上面函数应写成long gcd(p,q)long p,q; if (p%q = 0) - then part return q else - else part return gcd(q, p%q);12HTML语言不同于传统的程序设计语言,带有很多标记,有些标记还可以带参数,试说明如何把下面的HTML文档划分成适当的单词,哪些单词应该具有自身的值,各自是怎样的词法值?Here is a photo of my garden See mor

18、e photos if you like it. 解答:13程序算法练习。(1) 用自己熟悉的语言编写程序,实现词法分析的部分预处理功能:从文件读入源程序,去掉程序中多余的空格和注释(用/*/标识),用空格取代源程序中的tab和换行,结果显示在屏幕上。(2) 编写一个将C程序注释之外的所有保留字全部大写的程序。(3) 用自己熟悉的语言实现下述算法: 把正则表达式变成NFA; NFA确定化; DFA最小化。(4) 编程实现识别Sample语言标识符和实数的程序,并完成: 写出Sample语言的标识符和实数的正则表达式; 画出识别它们的DFA M; 设计出词法分析器的输出形式; 用自己熟悉的某种语

19、言实现识别程序。 (5) 分别编写能实现下述功能的Lex源程序该程序复制一个文件,并将每一个非空的空白符序列用一个空格代替。将一个PASCAL程序中除注释之外的所有保留字全部小写。生成可计算文本文件的字符、单词和行数且能报告这些数字的程序,其中单词是不带标点或空格的字母和/或数字的序列,标点和空格不计算为单词。为一个文本文件添加行号,并将其输出到屏幕上。将文本中的十进制数替换成十六进制数,并打印被替换的次数。将输入文件中注释之外的所有大写字母转变成小写字母(即:任何位于分隔符/*和*/之间的字符不变)。解答:略第3章习题1语法分析器的功能是什么?其输入/输出各是什么?解答:略2自上而下语法分析

20、和自下而上语法分析的主要差别是什么?解答:略3自上而下语法分析面临的两个主要问题是什么?如何解决?解答:略4解释下列术语:上下文无关文法、推导、最左推导、最右推导、句型、句子、语言、文法等价、语法树、二义文法、LL(1)文法、归约、规范归约、句柄、短语、最左素短语、活前缀、项目解答:略5. 从供选择的答案中,选出应填入 的正确答案已知文法GS的产生式如下: S (L)|aL L,S|S属于L(GS)的句子是 A ,(a,a)是L(GS)的句子,这个句子的最左推导是 B ,最右推导是 C ,语法树是 D。供选择的答案:A: a a,a (L) (L,a)B,C: S (L) (L,S) (L,a

21、) (S,a) (a,a) S (L) (L,S) (S,S) (S,a) (a,a) S (L) (L,S) (S,S) (a,S) (a,a)D:5. 解答:A: B: C: D:6. 已知某算术表达式的文法G为:(1) + |(2) * |(3) i |()给出i+i+i和i+i*i的最左推导、最右推导和语法树6. 解答:用E表示,T表示,F表示,上述文法可以写为: E T | E+T T F | T*F F (E) | i最左推导:E=E+T=E+T+T=T+T+T=F+T+T=i+T+T=i+F+T=i+i+T=i+i+F=i+i+iE=E+T=T+T=F+T=i+T=i+T*F=i

22、+F*F=i+i*F=i+i*i最右推导:E=E+T=E+F=E+i=E+T+i=E+F+i=E+i+i=T+i+i=F+i+i=i+i+iE=E+T=E+T*F=E+T*i=E+F*i=E+i*i=T+i*i=F+i*i =i+i*ii+i+i和i+i*i的语法树如下图所示。i+i+i、i+i*i的语法树7. 已知某文法Gbexpr: bexprbexpr or bterm|bterm btermbterm and bfactor | bfactor bfactornot bfactor|(bexpr)|true |false(1) 请指出此文法的终结符号、非终结符号和开始符号。(2) 试对

23、句子not(true or false)构造一棵语法树。 7. 解答:(1) 终结符号为:or,and,not,(,),true,false非终结符号为:bexpr,bterm,bfactor开始符号为:bexpr(2) 句子not(true or false)的语法树为:8. 试构造生成下列语言的上下文无关文法:(1) L1=anbnci | n1,i0 。解答:(1) 把anbnci分成anbn和ci两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为:S ABA aAb|abB cB| (2) L2=w | wa,b+,且w中a的个数恰好比b多1 。解答:(2) 令S为开始符号,

24、产生的w中a的个数恰好比b多一个,令E为一个非终结符号,产生含相同个数的a和b的所有串,则产生式如下: S aE|Ea|bSS|SbS|SSbE aEbE|bEaE| (3) L3=w | wa,b+,且|a|b|2|a| 。解答:(3) 设文法开始符号为S,产生的w中满足|a|b|2|a|。因此,可想到S有如下的产生式 (其中B产生1到2个b): S aSBS|BSaSB b|bb (4) L4=w | w是不以0开始的奇数集 。解答:(4) 解法一:S 奇数头整数奇数尾 |奇数头奇数尾 |奇数尾 奇数尾 1|3|5|7|9 奇数头 2|4|6|8|奇数尾 整数 整数数字|数字 数字 0|奇

25、数头解法二:文法G=(S,A,B,C,D,0,1,2,3,4,5,6,7,8,9,P,S)SAB | BAAC | DB1|3|5|7|9D2|4|6|8|BC0|D (5) L5是不允许0开头的能被5整除的无符号数的集合。解答:(5) 文法G=(N,S,N,M,D,0,1,2,3,4,5,6,7,8,9 ,S,P)SN0 | N5NMD| M1|2|3|4|5|6|7|8|9DD0 | DM | (6) 语言L6=x|xa,b,c*,x是重复对称排列的(aabcbaa,aabbaa等)。解答:(6) GS:SaSa | bSb | cSc | a | b | c | (7) 用后缀方式表示的

26、算术表达式。解答: SSS op|a op +|-|*|/(8) 由整数、标识符、四个二目运算(+、-、*、/)构成的表达式。解答:Sid|num|S op S op +|-|*|/ 9已知某文法G: i|() | + | - | * | / (1) 试用最左推导证明该文法是二义性的。(2) 对于句子i+i*i构造两个相应的最右推导。 9. 解答:存在句型i+i*i,有两棵不同的语法树,如下图所示,所以是二义文法。10. 对下面的陈述,正确的在陈述后的括号内画,否则画(1) 存在有左递归规则的文法是LL(1)的。 ( )(2) 任何算符优先文法的句型中不会有两个相邻的非终结符号。 ( )(3)

27、 算符优先文法中任何两个相邻的终结符号之间至少满足三种关系(ab,ab,ab)之一。 ( )(4) 任何LL(1)文法都是无二义性的。 ( )(5) 每一个SLR(1)文法也都是LR(1)文法。 ( )(6) 存在一种算法,能判定任何上下文无关文法是否是LL(1)的。 ( )(7) 任何一个LL(1)文法都是一个LR(1)文法,反之亦然。 ( )(8) LR(1)分析中括号中的1是指,在选用产生式A进行分析,看当前读入符号是否在First()中。10. 解答:(1) (2) (3) (4) (5) (6) (7) (8)11. 选择题,从供选择的答案中,选出应填入_内的正确答案。(1) 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类。_A_和LL(1)分析法属于自顶向下分析;_B_和LR分析法属于自底向上分析。自顶向下分析试图为输入符号串构造一个_C_;自底向上分析试图为输入符号串构造一个_D_。采用自顶向下分析方法时,要求文法中不含有_E_。供选择的答案:A、B: 深度分析法 宽度优先分析法 算符优先分析法 递归子程序分析法C

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1