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