编译技术复习题答案.docx
《编译技术复习题答案.docx》由会员分享,可在线阅读,更多相关《编译技术复习题答案.docx(28页珍藏版)》请在冰豆网上搜索。
编译技术复习题答案
第一章:
编译系统概述
一.单选题
1.编译程序前三个阶段完成的工作是(C)。
A.词法分析、语法分析和代码优化
B.代码生成、代码优化和词法分析
C.词法分析、语法分析、语义分析和中间代码生成
D.词法分析、语法分析和代码优化
2.编译程序绝大多数时间花在(D)上。
A.出错处理B.词法分析C.目标代码生成D.表格管理
3.编译程序是对(C)。
A.汇编程序的翻译B.高级语言程序的解释执行
C.高级语言的翻译D.机器语言的执行
4.在使用高级语言编程时,首先可通过编译程序发现源程序的全部(A)错误。
A.语法B.语义C.语用D.运行
二.填空题
1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)并翻译其意义。
2.通常把编译过程分为分析前端与后端两大阶段。
词法、语法和语义分析是对源程序的(分析),中间代码生成、代码优化与目标代码的生成则是对源程序的(综合)。
3.对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。
4.对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、
代码生成)报告的。
(1)else没有匹配的if(语法分析)
(2)数组下标越界(语义分析)
(3)使用的函数没有定义(语法分析)
(4)在数中出现非数字字符(词法分析)
5.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段:
(编译阶段)和(运行阶段)。
如果编译程序生成的目标程序是汇编语言程序,则源程序的执行方式分成三个阶段:
(编译阶段)(汇编阶段)和(运行阶段)。
6.编译程序在其工作过程使用最多的数据结构是(表),它记录着源程序中各种信息,以便查询或修改,在这些(表)中,尤以(符号表)最重要,它的生存期最长,使用也最频繁。
三.简述题:
1.编译程序的工作分为那几个阶段?
答:
词法分析、语法分析和语义分析是对源程序进行的分析(称为编译程序的前端),而中间代码生成、代码优化和代码生成三个阶段合称为对源程序进行综合(称为编译程序的后端),它们从源程序的中间表示建立起和源程序等价的目标程序。
第二章词法分析
一.单选题:
1.语言是(A)。
A.句子的集合B.产生式的集合C.符号串的集合D.句型的集合
2.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即(B)。
A.字符B.单词C.句子D.句型
3.词法分析的任务是(A)。
A.识别单词B.分析句子的含义C.识别句子D.生成目标代码
4.DFA(如图所示)接受的字集为(D)。
A.以0开头的二进制数组成的集合B.以0结尾的二进制组成的集合
C.含奇数个0的二进制组成的集合D.含偶数个0的二进制组成的集合
5.词法分析器的输出结果是(C)。
A.单词的种别编码B.单词在符号表中的位置
C.单词的种别编码和自身的值D.单词自身值
二.填空题:
1.描述程序设计语言的词法的机制是(正则表达式),识别机制是(有穷状态自动机)。
2.最小状态DFA的含义是(没有多余状态,没有两个状态等价)。
3.确定有限自动机DFA是(NFA)的一个特例。
4.确定的有穷自动机是一个(五元组),通常表示为(DFA=(S,∑,f,s0Z))。
三、简述题:
1.词法分析
答:
词法分析的主要任务是从左向右扫描每行源程序的符号,按照词法规则从构成源程序的字符串中识别出一个个具有独立意义的最小语法单位,并转换成统一的内部表示(token),送给语法分析程序。
四.综合应用题:
1.设有非确定的有自限动机NFAM=({A,B,C},{0,1},d,{A},{C}),其中:
d(A,0)={C}d(A,1)={A,B}d(B,1)={C}d(C,1)={C}。
请画出状态转换距阵和状态转换图。
解:
状态转换距阵为:
0
1
A
C
A,B
B
C
C
C
状态转换图为:
2.有一台自动售货机,接收1分和2分硬币,出售3分钱一块的硬糖。
顾客每次向机器中投放≥3分的硬币,便可得到一块糖(注意;只给一块并且不找钱)。
(1)写出售货机售糖的正则表达式;
(2)构造识别上述正则式的最简DFA。
解:
(1)设a=1,b=2,,则售货机售糖的正则表达式为:
a(b|a(a|b))|b(a|b)。
(2)画出与正则表达式a(b|a(a|b))|b(a|b)对应的NFA,如图所示:
3.设S={0,1}上的正规集S由倒数第二个字符为1的所有字符串组成,请给出该字集对应的正规式,并构造一个识别该正规集的DFA。
解:
构造相应的正规式:
(0|1)*1(0|1)
NFA:
11
1
00
确定化:
(3分)
I
{0,1,2}
{1,2}
{1,2,3}
{1,2}
{1,2}
{1,2,3}
{1,2,3}
{1,2,4}
{1,2,3,4}
{1,2,4}
{1,2}
{1,2,3}
{1,2,3,4}
{1,2,4}
{1,2,3,4}
0
1
0100
01
11
4.构造一个DFA,使其接受S={0,1}上0和1的个数都是偶数的字符串。
解:
5.构造一个字母表{0,1}上的DFA,其接受的串中所含0的数目能被3除尽。
解:
6.写出在S={a,b}上不是a开头的,以aa结尾的的字符串集合的正规表达式,并直接构造与之等价的状态最少的DFA。
解:
7.写一个文法使其语言为L(G)={anbncm|m,n≥1,n为奇数,m为偶数}。
解:
文法G(S):
8.构造一个DFA,它接受={a,b}上所有包含ab的字符串。
解:
构造相应的正规式:
(a|b)*ab(a|b)*
aa
ab
bb
确定化:
I
{0,1,2}
{1,2,3}
{1,2}
{1,2,3}
{1,2,3}
{1,2,4,5,6}
{1,2}
{1,2,3}
{1,2}
{1,2,4,5,6}
{1,2,3,5,6}
{1,2,5,6}
{1,2,3,5,6}
{1,2,3,5,6}
{1,2,4,5,6}
{1,2,5,6}
{1,2,3,5,6}
{1,2,5,6}
bb
ba
aaaa
abb
b
最小化:
{0,1,2}{3,4,5}{0,2},1,{3,4,5}
第三章程序设计语言的语法描述
一.单选题:
1.如果文法G是无二义的,则它的任何句子α(A)。
A.最左推导和最右推导对应的语法树必定相同
B.最左推导和最右推导对应的语法树可能不同
C.最左推导和最右推导必定相同
D.可能存在两个不同的最左推导,但它们对应的语法树相同
2.正规式M1和M2等价是指(C)。
A.M1和M2的状态数相等 B.M1和M2的有向边条数相等
C.M1和M2所识别的语言集相等 D.M1和M2状态数和有向边条数相等
3.文法G所描述的语言是(D)的集合。
A.文法G的字符表V中所有符号组成的符号串。
B.文法G的字符表V的闭包V*中的所有符号串。
C.由文法的识别符号推出的所有符号串。
D.由文法的识别符号推出的所有
4.已知语言L={anbbn|n≥1},则下述文法,(D)可以产生语言L。
A.Z→aZb|aAb|bB.A→aAb
A→aAb|bA→b
C.Z→AbBD.Z→aAb
A→aA|aA→aAb|b
B→bB|b
5.正则表达式的运算符的优先顺序为(C)。
A.|>*>·B.*>|>·C.*>·>|D.|>·>*
6.ab3的另一种表示方法是()。
A.abbbB.abababC.abbaabD.aaabbb
二.填空题:
1.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是(二义性的)。
2.最右推导亦称为(规范推导),由此得到的句型称为(规范)句型。
3.对于文法G,仅含终结符号的句型称为(句子)。
4.2型文法又称为(上下文无关)文法;3型文法又称为(正则)文法。
5.一个文法G是一个四元式(VT,VN,S,P)组成的。
6.文法G产生的(句子)的全体是该文法描述的语言。
7.L+可以写成(LL*)。
三.简述题
1.一个文法是由哪几部分组成的,各部分的功能是什么?
解:
一个文法G是一个四元式(VT,VN,S,P)其中:
VT是一个终结符的非空有限集合,终结符通常用小写字母表示;
VN是一个非终结符的非空有限集合,非终结符通常用大写字母表示;
S是一个特殊的非终结符(S∈VN),称为开始符号。
P是一个产生式(规则)的有限集合,每个产生式的形式是A→α,其中A∈VN,α∈(VT∪VN)*。
第四章自上而下的语法分析
一.单选题:
1.文法G[S]:
S→xSx|y所识别的语言是(C)。
A.xyxB.(xyx)*C.xnyxn(n≥0)D.x*yx*
2.编译过程中,语法分析器的任务是()。
A.分析单词是怎样构成的B.分析单词串是如何构成语句和说明的
C.分析语句和说明是如何构成程序的D.分析程序的结构
3.下列关于标识符和名字的叙述中,正确的为(C)。
A.标识符有一定的含义B.名字是一个没有意义的字符序列
C.名字有确切的属性D.都不对
二.填空题:
1.编译器常用的语法分析方法有(自底向上)和(自顶向下)两种。
2.在LL
(1)文法,其中的第一个L代表(从左向右扫描输入),第二个L表示产生(最左推导),1代表在决定分析器的每步动作时(向前看一个输入符号)。
3.一个上下文无关文法所含四个组成部分是(非终结符有限集合、终结符有限集合、产生式有限集合、开始符)。
4.一个文法G[Z],若存在推导序列Z→+…Z…,则称G[Z]是(递归)文法,这类文法所产生的句子有(无数)个。
5.描述语言L={ambn|n≥m≥1}的文法是:
(Z→aAb、A→Ab|aAb|ε)。
三.简述题
1.简述自顶向下的语法分析方法。
答:
所谓自顶向下的语法分析方法就是从文法的开始符开始,根据给定的输入串并按照文法的产生式一步一步的向下进行最左推导,试图推导出文法的,使之与给定的输入串。
四.综合应用题:
1.试验证如下文法G[E]是LL
(1)文法:
E→[F]E′
E’→E|ε
F→aF’
F’→aF’|ε
其中E,F,E’,F’为非终结符
解:
各非终结符的FIRST集和FOLLOW集如下:
FIRST(E)={[}FOLLOW(E)={#}
FIRST(E′)={[,ε}FOLLOW(E′)={#}
FIRST(F)={a}FOLLOW(F)={]}
FIRST(F′)={a,ε}FOLLOW(F′)={]}
对于E’→E|εFIRST(E)∩FOLLOW(E’)=φ
对于F’→aF’|εFIRST(aF’)∩FOLLOW(F’)=φ
所以,文法G[E]是LL
(1)文法。
2.设有文法G[A]的产生式集为:
A→BaC|CbB
B→Ac|c
C→Bb|b
试消除G[A]的左递归。
解:
不妨以A、B、C排序.先将A代入B中,然后消除B中左递归;再将A、B代
入C中。
再消除C中左递归。
最后结果为:
G[A]:
A→BaC|CbBB→CbBcB'|cB'B'→aCcB'|ε
C→cB'bC'|bC'C'→bBcB'bC'|ε
3.对文法G[S]:
S→a|∧|(T)
T→T,S|S
(1)给出(a,(a,a)的最左推导。
(2)对文法G,进行改写,消除左递归。
(3)对修改后的文法求First和Follow集。
(4)并给出它的预测分析表。
(5)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
解:
(1)对(a,(a,a)的最左推导为:
S=>(T)=>(T,S)=>(S,S)=>(a,S)=>(a,(T))=>(a,(T,S))=>(a,(S,S))=>(a,(a,S))=>(a,(a,a))
(2)改写文法为:
S→a
S→∧
S→(T)
T→SN
N→,SN
N→ε
(3)
非终结符
First集
Follow集
S
{a,∧,(}
{#,,,)}
T
{a,∧,(}
{)}
N
{,,ε}
{)}
(4)预测分析表:
a
∧
(
)
#
S
→a
→∧
→(T)
T
→SN
→SN
→SN
N
→ε
→,SN
(5)对于输入串(a,a)#的分析过程为:
栈
当前输入符
剩余输入符号
使用的产生式
#S
(
a,a)#
S→(T)
#)T(
(
a,a)#
#)T
a
a)#
T→SN
#)NS
a
a)#
#)Na
a
a)#
#)N
a)#
N→,SN
#)NS,
a)#
#)NS
a
)#
S→a
#)Na
a
)#
#)N
)
#
N→ε
#)
)
#
#
#
可见输入串(a,a)#是文法的句子。
4.对文法G(S):
SSaT|aT|aT
TaT|a
(1)消除该文法的左递归和提取左公因子;
(2)构造各非终结符的FIRST和FOLLOW集合;
(3)构造该文法的LL
(1)分析表,并判断该文法是否是LL
(1)的。
解:
(1)消除左递归:
SaTS’|aTS’
S’aTS’|ε
TaT|a
提取左公因子:
SaTS’|aTS’
S’aTS’|ε
TaT’
T’T|ε
(2)FIRST(S)={a,}FOLLOW(S)={#}
FIRST(S')={,ε}FOLLOW(S')={#}
FIRST(T)={}FOLLOW(T)={,#}
FIRST(T')={,ε}FOLLOW(T')={,#}
(3)LL
(1)分析表如下,该文法是LL
(1)文法。
a
#
S
SaTS'
SaTS'
S'
S'aTS'
S’ε
T
TaT'
T'
T'ε
T'T
T'ε
5.考虑文法G:
Sa|^|(T)
TT,S|S
(1)消除文法G的左递归。
(2)用类C++语言写出递归下降分析程序。
假设由单词种别构成的源文件存放于文件Lex.txt中,如文件内容。
6.考虑下列文法G(j相当与endif):
SfCtSj|fCtSes|a
Ci
(1)提取文法的左因子。
(2)构造预测分析表。
(3)判断经改写的文法是否是LL
(1)文法。
解:
(1)SfCtSS’|a
S’eS|j
Ci
(2)chart;
ifstremcinf("lex.txt");
voidmain()
{
cinf>>t;
S();
}
voidS()
{
if(t=='a')
cinf>>t;
else
{
if(t=='f')
cinf>>t;
C();
if(t=='t')
cinf>>t;
S();
S'();
}
}
voidS()
{
if(t=='e')
{
cinf>>t;
S();
}
else
if(t=='j')
cinf>>t;
}
voidC()
{
if(t=='i')
cinf>>t;
}
(3)first(S)={f,a}
first(S')={e,j}
first(C)={i}
f
t
a
e
j
i
#
S
fCtSS
a
S’
eS
j
C
i
表不含多重定义,因此该文法是LL
(1)文法。
第五章自下而上的语法分析
一.单选题:
1.一个句型中称为句柄的是该句型的最左(D)
A.非终结符号B.短语C.句子D.直接短语
2.若a为终结符,则A→α.aβ为(B)项目。
A.归约B.移进C.接受D.待约
3.在规范归约中,用(B)来刻画可归约串。
A.直接短语B.句柄C.最左短语D.短语
4.若项目集Ik含有A→α.,则在状态K时,仅当面临的输入符号a∈Follow(A)时,才采用“A→α.”动作的一定是(D)。
A.LALR文法B.LR(0)文法C.LR
(1)文法D.SLR
(1)文法
5.在LR(0)的ACTION子表中,如果某一行中存在标记“rj”的栏,则(A)。
A.该行必定填满rjB.该行未填满rj
C.其他行也有rjD.goto子表中也有rj
二.填空题:
1.一个LR分析器包括两部分:
一个总控程序和(一张分析表)。
2.LR(0)分析法的名字中“L”表示(自左至右分析),“R”表示(采用最右推导的逆过程即最左归约),“0”表示(向右查看0个字符)。
3.如果文法G的开始符是S,那么G的拓广文法G’是在G的基础上增加一个新的开始符号(S’)和产生式(S’S)。
4.由于存在(规约-移进)冲突,使得文法不是LR(0),转换LR(0)为SLR
(1)文法,需要计算(非终结符的follow集)。
三.简述题;
1.简述自下而上的分析方法。
答:
所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的
开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根节点。
四.综合应用题:
1.对于文法G[S]:
S®AB,A®Aa|bB,B®a|Sb求句型baSb的全部短语、直接短语和句柄?
答.句型baSb的语法树如图所示。
图五
(2)句型baSb的的语法树
短语:
baSb、ba、Sb、a
直接短语:
Sb、a
句柄:
a
2.证明下述文法G:
S®aSbS|aS|d是二义性文法。
解:
一个文法,如果存在某个句子有不只一棵语法分析树与之对应,那么称这个文法是二义性文法。
句子aadbd有两棵语法树。
如下图:
(1)
(2)
由此可知,SaSbS|aS|d定义的文法是二义性文法。
3.对于文法G(S):
(1)写出句型b(Ma)b的最右推导并画出语法树。
(2)写出上述句型的短语,直接短语和句柄。
解:
(1)
(2)短语:
Ma),(Ma),b(Ma)b
直接短语:
Ma)
句柄:
Ma)
4.已知文法G:
A→aAd|aAb|ε
判断该文法是否是SLR
(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。
解:
:
文法:
A→aAd|aAb|ε拓广文法为G′,增加产生式S′→A
若产生式排序为:
(0)S'→A
(1)A→aAd
(2)A→aAb
(3)A→ε
由产生式知:
First(S')={ε,a}
First(A)={ε,a}
Follow(S')={#}
Follow(A)={d,b,#}
G′的LR(0)项目集族及识别活前缀的DFA如下图所示:
在I0中:
A→.aAd和A→.aAb为移进项目,
A→.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。
在I0、I2中:
Follow(A)∩{a}={d,b,#}∩{a}=
所以在I0、I2中的移进-归约冲突,可以由Follow集解决,所以G是SLR
(1)文法。
构造的SLR
(1)分析表如下:
state
Action
Goto
a
d
b
#
A
0
S2
R3
R3
R3
1
1
acc
2
S2
R3
R3
R3
3
3
S4
S5
4
R1
E1
R1
5
R2
R2
R2
对于输入ab#分析过程如下;
步骤
状态栈
符号栈
输入符
动作
1
0
#
ab#
shift
2
02
#a
b#
reduce
3
023
#aA
b#
shift
4
0235
#aAb
#
reduce
5
01
#A
#
accept
5.若有定义二进制数的文法如下:
S→L·L|L
L→LB|B
B→0|1
(1)试为该文法构造LR分析表,并说明属哪类LR分析表。
(2)给出输入串101.110的分析过程。
解:
文法:
S→L.L|L
L→LB|B
B→0|1
拓广文法为G′,增加产生式S′→S
若产生式排序为:
(0)S'→S
(1)S→L.L
(2)S→L
(3) L→LB
(4)L→B
(5)B→0
(6)B→1
由产生式知:
Follow(S')={#}
Follow(S)={#}
Follow(L)={.,0,1,#}
Follow(B)={.,0,1,#}
G′的LR(0)项目集族及识别活前缀的DFA如下图所示:
在I2中:
B→.0和B→.1为移进项目,S→L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。
在I2、I8中:
Follow(s)∩{0,1}={#}∩{0,1}=
所以在I2、I8