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

上传人:b****4 文档编号:24107466 上传时间:2023-05-24 格式:DOCX 页数:71 大小:926.53KB
下载 相关 举报
习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx_第1页
第1页 / 共71页
习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx_第2页
第2页 / 共71页
习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx_第3页
第3页 / 共71页
习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx_第4页
第4页 / 共71页
习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

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

《习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx》由会员分享,可在线阅读,更多相关《习题参考答案编译原理及实践教程第3版黄贤英清华大学出版社.docx(71页珍藏版)》请在冰豆网上搜索。

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

习题参考答案编译原理及实践教程第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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

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

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