习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx
《习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx》由会员分享,可在线阅读,更多相关《习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx(71页珍藏版)》请在冰豆网上搜索。
![习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx](https://file1.bdocx.com/fileroot1/2023-5/24/bba73500-5e1a-48db-80a1-bfd7dbf6b122/bba73500-5e1a-48db-80a1-bfd7dbf6b1221.gif)
习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社
附录部分习题参考答案
第1章习题
1.解释下列术语。
翻译程序,编译程序,解释程序,源程序,目标程序,遍,前端,后端
解答:
略!
2.高级语言程序有哪两种执行方式?
阐述其主要异同点。
描述编译方式执行程序的过程。
解答:
略!
3.在你所使用的C语言编译器中,观察程序1.1经过预处理、编译、汇编、链接四个过程生成的中间结果。
解答:
略!
4.编译程序有哪些主要构成成分?
各自的主要功能是什么?
解答:
略!
5.编译程序的构造需要掌握哪些原理和技术?
编译程序构造工具的作用是什么?
解答:
略!
6.复习C语言,其字母表中有哪些符号?
有哪些关键字、运算符和界符?
标识符、整数和实数的构成规则是怎样的?
各种语句和表达式的结构是什么样的?
解答:
略!
7.编译技术可应用在哪些领域?
解答:
略!
8.你能解释在Java编译器中,输入某个符号后会提示一些单词、某些单词会变为不同的颜色是如何实现的吗?
你能解释在CodeBlocks中在输入{后,会自动添加},输入do会自动添加while()是为什么吗?
解答:
略!
第2章习题
1.判断题,对下面的陈述,正确的在陈述后的括号内画√,否则画×。
(1)有穷自动机识别的语言是正规语言。
()
(2)若r1和r2是Σ上的正则表达式,则r1|r2也是。
()
(3)设M是一个NFA,并且L(M)={x,y,z},则M的状态数至少为4个。
()
(4)令Σ={a,b},则所有以b开头的字构成的正规集的正则表达式为b*(a|b)*。
()
(5)对任何一个NFAM,都存在一个DFAM',使得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)=q2
M是一个A有穷状态自动机,它所对应的状态转换图为B,它所能接受的语言可以用正则表达式表示为C。
其含义为D。
供选择的答案:
A:
①歧义的 ②非歧义的 ③确定的 ④非确定的
B:
C:
①(0|1)* ②00(0|1)* ③(0|1)*00 ④0(0|1)*0
D:
①由0和1所组成的符号串的集合
②以0为头符号和尾符号,由0和1所组成的符号串的集合
③以两个0结束的,由0和1所组成的符号串的集合
④以两个0开始的,由0和1所组成的符号串的集合
2.[分析]
有限自动机分为确定有限自动机和非确定有限自动机。
确定有限自动机的确定性表现在映射:
Q×VT-->q是单值函数,也就是说,对任何状态q∈Q和输入字符串a∈VT,(q,a)唯一确定下一个状态。
显然,本题给出的是一个确定的有限自动机,它的状态转换图是C中的②。
它所接受的语言可以用正则表达式表示为00(0|1)*,表示的含义为由两个0开始的后跟任意个(包含0个)0或1组成的符号串的集合。
2.解答:
A:
④ B:
③ C:
② D:
② E:
④
3.查阅自己熟悉的高级语言的规范,如C或Java,确定:
字符集是什么(不包含那些只能出现在字符串或注释中的字符),数字常量的构成形式是什么,标识符的词法规则是什么?
3解答:
略!
4.画出下面的状态转换图,并给出相应的识别函数。
(1)C语言中字符常量是由一对单引号括起来的单个字符,或者以\开头的两个字符表示的转义字符;
解答:
(2)C语言中以/开头的单词有多种,如/、/=、//、/*等,其中前两种表示除法运算和除法赋值运算,它们需要返回单词本身;后两种表示注释:
以/*和*/括起来的多行注释、以//标记的单行注释,后两种识别后不需要返回单词,直接跳过;
解答:
(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)包含子串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(k≥0)。
则S→S10|S21,|S1|=2k(k>0),|S2|=2k(k≥0)。
且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)*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中的关键字select的大小写不敏感的正则表达式。
解答:
select->[Ss][Ee][Ll][Ee][Cc][Tt]
7.试描述下列正则表达式所描述的语言:
(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和1}
8.假定某语言只有三种单词:
①关键字if;②关键字while;③标识符,它是除了if和while以外的所有以字母构成的串。
试构造识别该语言的单词的NFA和DFA。
解答:
NFA中有冲突,可是使用最长优先或者先出现优先的方式来解决。
9.给出识别下列在字母表{0,1}上的语言的最小化DFA,并以状态转换图和状态转换表表示。
(1)所有以00结尾的符号串的集合。
解答:
(1)DFA M=({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*01*01*
DFA M=({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的字符串。
解答:
0
1
Q0*
Q1
Q2
Q3
Q2
Q3
Q0
Q1
Q1
Q0
Q3
Q2
10.构造与下列正则表达式等价的最小状态的DFA。
(1)10|(0|11)0*1
解答:
(1) DFA M=({0,1},{q0,q1,q2,q3},q0,{q3},),其中定义如下:
(q0,0)=q1 (q0,1)=q2
(q1,0)=q1 (q1,1)=q3
(q2,0)=q3 (q2,1)=q1
状态转换图为:
(2)((0|1)*|(11))*
解答:
DFA M=({0,1},{q0},q0,{q0},),其中定义如下:
(q0,0)=q0 (q0,1)=q0
状态转换图为:
(3)(a|b)*a(a|b)
解答:
(a|b)*a(a|b)
①求出NFAM:
②确定化,得到DFAM:
③化简:
在第②步中求出的DFAM中没有等价状态,因此它就是最小化的DFAM。
(4)(a|b)*a(a|b)(a|b)
解答:
(a)b)*a(a|b)(a|b)
①求NFAM:
②确定化,得到DFAM:
③化简,在第②步中求出的DFAM中没有等价状态,因此它已经是最小化的DFAM了。
11.应用题:
(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:
)和第三部分(.extension)可默认,若device、name和extension都是由字母组成,长度不限,但至少有1位。
①请写出识别这种文件名的正则表达式
②画出其对应的NFA;
③将上述得到的NFA确定化为等价的DFA。
解答:
①正规式:
(dd*:
|)dd*(.dd*|),d代表a~z的字母
②NFA为:
③DFA为:
(4)一个C语言编译器编译下面的函数gcd()时,报告parseerrorbefore‘else’。
这是因为else的前面少了一个分号。
但是如果第一个注释
/*thenpart*/
误写成
/*thenpart
那么该编译器发现不了遗漏分号的错误。
这是为什么?
longgcd(p,q)
longp,q;
{
if(p%q==0)
/*thenpart*/
returnq
else
/*elsepart*/
returngcd(q,p%q);
}
解答:
此时编译器认为
/*thenpart
returnq
else
/*elsepart*/
是程序的注释,因此它不可能再发现else前面的语法错误。
分析这是注释用配对括号表示时的一个问题。
注释是在词法分析时忽略的,而词法分析器对程序采取非常局部的观点。
当进入第一个注释后,词法分析器忽略输入符号,一直到出现注释的右括号为止,由于第一个注释缺少右括号,所以词法分析器在读到第二个注释的右括号时,才认为第一个注释处理结束。
为克服这个问题,后来的语言一般都不用配对括号来表示注释。
例如Ada语言的注释始于双连字符(--),随行的结束而终止。
如果用Ada语言的注释格式,那么上面函数应写成
longgcd(p,q)
longp,q;
{
if(p%q==0)
--thenpart
returnq
else
--elsepart
returngcd(q,p%q);
12.HTML语言不同于传统的程序设计语言,带有很多标记,有些标记还可以带参数,试说明如何把下面的HTML文档划分成适当的单词,哪些单词应该具有自身的值,各自是怎样的词法值?
Hereisaphotoofmygarden
Seemorephotosifyoulikeit.解答:
13.程序算法练习。
(1)用自己熟悉的语言编写程序,实现词法分析的部分预处理功能:
从文件读入源程序,去掉程序中多余的空格和注释(用/*…*/标识),用空格取代源程序中的tab和换行,结果显示在屏幕上。
(2)编写一个将C程序注释之外的所有保留字全部大写的程序。
(3)用自己熟悉的语言实现下述算法:
①把正则表达式变成NFA;
②NFA确定化;
③DFA最小化。
(4)编程实现识别Sample语言标识符和实数的程序,并完成:
①写出Sample语言的标识符和实数的正则表达式;
②画出识别它们的DFAM;
③设计出词法分析器的输出形式;
④用自己熟悉的某种语言实现识别程序。
(5)分别编写能实现下述功能的Lex源程序
①该程序复制一个文件,并将每一个非空的空白符序列用一个空格代替。
②将一个PASCAL程序中除注释之外的所有保留字全部小写。
③生成可计算文本文件的字符、单词和行数且能报告这些数字的程序,其中单词是不带标点或空格的字母和/或数字的序列,标点和空格不计算为单词。
④为一个文本文件添加行号,并将其输出到屏幕上。
⑤将文本中的十进制数替换成十六进制数,并打印被替换的次数。
⑥将输入文件中注释之外的所有大写字母转变成小写字母(即:
任何位于分隔符/*和*/之间的字符不变)。
解答:
略
第3章习题
1.语法分析器的功能是什么?
其输入/输出各是什么?
解答:
略
2.自上而下语法分析和自下而上语法分析的主要差别是什么?
解答:
略
3.自上而下语法分析面临的两个主要问题是什么?
如何解决?
解答:
略
4.解释下列术语:
上下文无关文法、推导、最左推导、最右推导、句型、句子、语言、文法等价、语法树、二义文法、LL
(1)文法、归约、规范归约、句柄、短语、最左素短语、活前缀、项目
解答:
略
5.从供选择的答案中,选出应填入 的正确答案
已知文法G[S]的产生式如下:
S→(L)|a
L→L,S|S
属于L(G[S])的句子是A,(a,a)是L(G[S])的句子,这个句子的最左推导是B,最右推导是C,语法树是D。
供选择的答案:
A:
①a ②a,a ③(L) ④(L,a)
B,C:
①S(L)(L,S)(L,a)(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+i
E=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+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+i
E=>E+T=>E+T*F=>E+T*i=>E+F*i=>E+i*i=>T+i*i=>F+i*i=>i+i*i
i+i+i和i+i*i的语法树如下图所示。
i+i+i、i+i*i的语法树
7.已知某文法G[bexpr]:
bexpr→bexprorbterm|bterm
bterm→btermandbfactor|bfactor
bfactor→notbfactor|(bexpr)|true|false
(1)请指出此文法的终结符号、非终结符号和开始符号。
(2)试对句子not(trueorfalse)构造一棵语法树。
7.解答:
(1)终结符号为:
{or,and,not,(,),true,false}
非终结符号为:
{bexpr,bterm,bfactor}
开始符号为:
bexpr
(2)句子not(trueorfalse)的语法树为:
8.试构造生成下列语言的上下文无关文法:
(1)L1={anbnci|n≥1,i≥0}。
解答:
(1)把anbnci分成anbn和ci两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为:
S→AB
A→aAb|ab
B→cB|
(2)L2={w|w∈{a,b}+,且w中a的个数恰好比b多1}。
解答:
(2)令S为开始符号,产生的w中a的个数恰好比b多一个,令E为一个非终结符号,产生含相同个数的a和b的所有串,则产生式如下:
S→aE|Ea|bSS|SbS|SSb
E→aEbE|bEaE|
(3)L3={w|w∈{a,b}+,且|a|≤|b|≤2|a|}。
解答:
(3)设文法开始符号为S,产生的w中满足|a|≤|b|≤2|a|。
因此,可想到S有如下的产生式(其中B产生1到2个b):
S→aSBS|BSaS
B→b|bb
(4)L4={w|w是不以0开始的奇数集}。
解答:
(4)解法一:
S→〈奇数头〉〈整数〉〈奇数尾〉
|〈奇数头〉〈奇数尾〉
|〈奇数尾〉
〈奇数尾〉→1|3|5|7|9
〈奇数头〉→2|4|6|8|〈奇数尾〉
〈整数〉→〈整数〉〈数字〉|〈数字〉
〈数字〉→0|〈奇数头〉
解法二:
文法G=({S,A,B,C,D},{0,1,2,3,4,5,6,7,8,9},P,S)
S→AB|B
A→AC|D
B→1|3|5|7|9
D→2|4|6|8|B
C→0|D
(5)L5是不允许0开头的能被5整除的无符号数的集合。
解答:
(5)文法G=({N,S,N,M,D},{0,1,2,3,4,5,6,7,8,9},S,P)
S→N0|N5
N→MD|
M→1|2|3|4|5|6|7|8|9
D→D0|DM|
(6)语言L6={x|x∈{a,b,c}*,x是重复对称排列的(aabcbaa,aabbaa等)}。
解答:
(6)G[S]:
S→aSa|bSb|cSc|a|b|c|
(7)用后缀方式表示的算术表达式。
解答:
S→SSop|aop→+|-|*|/
(8)由整数、标识符、四个二目运算(+、-、*、/)构成的表达式。
解答:
S→id|num|SopSop→+|-|*|/
9.已知某文法G:
→i|()|
→+|-|*|/
(1)试用最左推导证明该文法是二义性的。
(2)对于句子i+i*i构造两个相应的最右推导。
9.解答:
存在句型i+i*i,有两棵不同的语法树,如下图所示,所以是二义文法。
10.对下面的陈述,正确的在陈述后的括号内画"√",否则画"×"
(1)存在有左递归规则的文法是LL
(1)的。
()
(2)任何算符优先文法的句型中不会有两个相邻的非终结符号。
()
(3)算符优先文法中任何两个相邻的终结符号之间至少满足三种关系(a
b,a
b,a
b)之一。
()
(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