编译原理习题参考答案.docx
《编译原理习题参考答案.docx》由会员分享,可在线阅读,更多相关《编译原理习题参考答案.docx(55页珍藏版)》请在冰豆网上搜索。
编译原理习题参考答案
程序设计语言与编译——语言的设计与实现(第2版)
习题4答案
4-5解:
上下文有关文法(1型文法),产生的语言L(G){=aibici|i≥1,i为整数}
4-6解:
3型文法,L(G)={ai|i≥1,i为奇数}
4-7解:
2型文法,L(G)={aibi|i≥1,i为整数}
4-8解:
1型文法,L(G)={aibici|i≥1,i为整数}
4-9解:
1.最左推导最右推导
S⇒(A)⇒(B)⇒(SdB)S⇒(A)⇒(B)⇒(SdB)
⇒((A)dB)⇒((B)dB)⇒(SdS)⇒(Sda)
⇒((S)dB)⇒((b)dB)⇒((A)da⇒((B)da)
⇒((b)dS)⇒((b)da)⇒((s)da⇒((b)da)
2.语法树
4-10解:
1.因为存在推导S⇒SbF⇒SbP⇒Sbc⇒Fbc⇒FaPbc
所以FaPbc是文法G(S)的一个句型。
2.语法树
4-11解:
因为串aaabaa可有下列两棵不同的语法树
所以文法G(S)是二义文法。
4-12解:
因为串i(*可有下列两棵不同的语法树
习题9答案
9-2解:
(1)消除文法G的②产生式直接左递归。
A→SeA'|fA'③
A'→dA'|ε④
(2)消除间接左递归:
按S.A排序,将S的①产生式代入③有
A→AaeA'|AbeA'|ceA'|fA'⑤
(3)消除⑤的直接左递归有
A→ceA'A"|fA'A"⑥
A"→aeA'A"|beA'A"|ε⑦
(4)对S的①产生式提公因子有
S→AB|c⑧
B→|a|b⑨
(5)最后,文法G提取公因子,消除左递归后的产生式由⑧,⑨,⑥,⑦和④组成,无
多余的产生式。
(6)若按A.S排序,得到的产生式组合是另外的形式,但它们是等价的文法,读者可以试试。
9-3解:
消除左递归后,得文法G':
S→(L)|a
L→SL'
L'→,SL'|ε
递归下降过程:
Procedurematch(t:
token);
begin
iflookahead=tthenlookahead=nexttoken
elseerror
end
procedureS;
begin
iflookahead='a'thenmatch('a')
elseiflookahead='('
then
begin
match('(');
L;
iflookahead=')'
thenmatch(')')
elseerror
end
end
procudureL;
beginS;
L';
end
procudureL';
begin
iflookahead=','thenbegin
match(',')
S;
L'
end
end
9-6解:
(1)G'(S):
S→AS'
S'→:
AS'|ε
A→BA'
A'→+BA'|ε
B→bS*|a
(2)FIRST集和FOLLOW集
FIRST
FOLLOW
S
b,a
#,*
S'
:
,ε
#,*
A
b,a
#,*,:
A'
+,ε
#,*,:
B
b,a
#,*,:
,+
预测分析表
a
:
+
b
*
#
S
S→AS'
S→AS'
S'
S'→:
AS'
S'→ε
S'→ε
A
A→BA'
A→BA'
A'
A→ε
A→+BA'
A→ε
A→ε
B
B→a
B→bS*
(3)因为预测分析表无多重定义入口,所以G'是LL
(1)文法。
9-7解:
对习题9-3的文法G消除左递归后,得文法G':
S→(L)|a
L→SL'
L'→,SL'|ε
FIRST集和FOLLOW集
FIRST
FOLLOW
S
(,a
),’,#
L
(,a
)
L'
’,ε
)
预测分析表
(
)
a
#
S
S→(L)
S→a
L
L→SL'
L→SL'
L'
L'→ε
L'→,SL'
因为预测分析表无多重定义入口,所以文法G是LL
(1)文法。
习题10答案
10-1解:
(1)规范规范推导(最右推导)最右推导S⇒AB⇒ASb⇒AABb⇒bBABb
(2)语法树(推导树)
(3)短语bB,AB,ABb,bBABb
直接短语bB,AB
句柄bB
最左素短语bB
10-2解:
(1)因为存在推导S⇒SbF⇒FbF⇒FaPbF⇒FaPbP⇒FaPbc
所以FaPbc是文法G的一个句型。
(2)语法树
(3)短语FaP,c,FaPbc
直接短语FaP,c
句柄FaP
最左素短语FaP
10-3解:
拓广文法
'→S
1.S→AS
2.S→b
→SA
→a
LR(0)项目集规范族
I0=closure{S'→·S}I1=GO(I0,S)I2=GO(I0,A)I3=GO(I0,b)
S'→·SS'→S·S→A·SS→b·
S→·ASA→S·AS→·ASGO(I1,a)=I4
S→·bA→·SAS→·bGO(I2,A)=I2
A→·SAA→·aA→·SAGO(I2,b)=I3
A→·aS→·ASA→·a
S→·b
I4=GO(I0,a)I5=GO(I1,A)I6=GO(I1,S)I7=GO(I2,S)
A→a·A→SA·A→S·AS→AS·
S→A·SA→·SAA→S·A
S→·ASA→·bA→·SA
S→·bS→·ASA→·a
A→·SAS→·bS→·AS
A→·aS→·b
GO(I1,b)=I3
GO(I2,a)=I4
FOLLOW(S)={a,b,#}FOLLOW(A)={a,b}
∵状态5在输入a时有S4和r3的移进归约矛盾。
状态5在输入b时有S3和r3的移进归约矛盾。
状态7在输入a时有S4和r1的移进归约矛盾。
状态7在输入b时有S3和r1的移进归约矛盾。
∴文法G既不是LR(0)文法,也不是SLR
(1)文法。
10-4解:
(1)最左推导
S⇒(T)⇒(T,S)⇒(S,S)⇒(a,S)⇒(a,(T))
⇒(a,(T,S))⇒(a,(S,S))⇒(a,(a,S))⇒(a,(a,a))
最右推导
S⇒(T)⇒(T,S)⇒(T,(T))⇒(T,(T,S))⇒(T,(T,a)
⇒(T,(S,a))⇒(T,(a,a))⇒(S,(a,a))⇒(a,(a,a))
最左推导
S⇒(T)⇒(T,S)⇒(S,S)⇒((T),S)⇒((S),S)⇒((T,S),S)
⇒((T,S,S),S)⇒((S,S,S),S)⇒(((T),S,S),S)
⇒(((T,S),S,S),S)⇒(((S,S),S,S),S)⇒(((a,S),S,S),S)
⇒(((a,a),S,S),S)⇒(((a,a),∧,S),S)⇒(((a,a),∧,(T)),S)
⇒(((a,a),∧,(S)),S)⇒(((a,a),∧,(a)),S)
=(((a,a),∧,(a)),S)⇒(((a,a),∧,(a)),a)
最右推导
S⇒(T)⇒(T,S)⇒(T,a)⇒(S,a)⇒((T),a)⇒((T,S),a)
⇒((T,(T)),a)⇒((T,(S)),a)⇒((T,(a)),a)⇒((T,S,(a)),a)
⇒((T,∧,(a)),a)⇒((S,∧,(a)),a)⇒(((T),∧,(a)),a)
⇒(((T,S),∧,(a)),a)⇒(((T,a),∧,(a)),a)⇒(((S,a),∧,(a)),a)
⇒(((a,a),∧,(a)),a)
(2)对句子(a,(a,a))的移进归约栈的变迁如下:
其中,(3),(4),(8),(9),(12),(13),(15),(16),(18)共进行9次归约,最右推导也是9次推导,正好是递过程。
归约(3)的句柄是a,语法树如图
(1)所示。
归约(4)的句柄是S,语法树如图
(2)所示。
归约(8)的句柄是a,语法树如图(3)所示。
归约(9)的句柄是S,语法树如图(4)所示。
归约(12)的句柄是S,语法树如图(5)所示。
归约(13)的句柄是T,S,语法树如图(6)所示。
归约(15)的柄是(T),语法树如图(7)所示。
归约(16)的句柄是T,S,语法树如图(8)所示。
归约(18)的句柄是(T),语法树如图(9)所示。
图(9)即是完整的语法树。
图中的下标是为了区分归约过程中同名文法符号和便于理解而添加的,实际是没有的。
对句子(((a,a),∧,(a)),a)的规约栈变迁如图(10)所示。
图(10)
规范推导(最右推导)一共进行17步推导,归约过程也进行了17次归约,语法树如图(11)所示,其中的下标可表明其形成的先后。
图(11)
10-7解:
'→SFOLLOW(S)={$}
→ABFOLLOW(A)={b,c}
→cBdFOLLOW(B)={d,$}
→cd
→aAb
→ab
I0=closure{S'→·S}
S'→·SI4=GO(I2,B)I9=GO(I5,d)
S→·ABS→AB·B→cd·
A→·aAbI5=GO(I2,c)I10=GO(I6,b)
A→·abB→c·BdA→aAb·
I1=GO(I0,S)B→·cBdI11=GO(I8,d)
S'→S·B→·cdB→cBd·
I2=GO(I0,A)B→c·d
S→A·BI6=GO(I3,A)
B→·cBdA→aA·b
B→·cdGO(I3,a)=I3
I3=GO(I0,a)I7=GO(I3,b)
A→a·AbA→ab·
A→a·bI8=GO(I5,B)
A→·aAbB→cB·d
A→·abGO(I5,c)=I5
上述状态集没有移进—归约冲突,(a)是SLR文法,分析表如下:
a
b
c
d
$
S
A
B
0
S3
1
2
1
acc
2
S5
4
3
S3
S7
6
4
r1
5
S5
S9
8
6
S10
7
r5
r5
8
S11
9
r3
r3
10
r4
r4
11
r2
r2
习题11答案
11-1解:
11-3解:
推导树如下:
(1)E→iE·VAL=B设四元式初始编号ip=100
(2)E→iE·VAL=C
(3)E→-EE·VAL=T1(101)(@,c,-,T1)
(4)E→iE·VAL=D
(5)E→E+EE·VAL=T2(101)(+,T1,D,T2)
(6)E→E*EE·VAL=T3(103)(*,B,T2,T3)
(7)S→i:
=E(104)(:
=,T3,-,A)
11-4解:
结果为333645211。
11-5解:
(1)E1→C(2)W→whileW·code=102(101)(j,-,-,103)
(3)E2→A>BE2·F=103(102)(>,A,B,104)
(4)E1→E*EE1·VAL=T1(103)(j,-,-,0)
(5)E2→E+EE2·VAL=T21)
(6)A→i:
=E2A·chain=0(105)(+,y,T1,T2)
(7)S→AS1·chain=0(106)(:
=,T2,-,x)
(8)S→WS1S1·chain=103(107)(j,-,-,102)
(9)S→ifE1thenS1S·chain=103
习题12答案
12-2解:
(1)基本块
(2)程序流图
B1
(1)~(3)
B2(4)~(5)
B3(6)~(7)
B4(8)
12-7解:
MOVbR0
ADDR0c
MOVaR1
SVBR1R0
MOVR0t1
MOVdR0
ADDR01
MOVR1t2
MOVeR1
MVLR1f
ADDR0R1
MOVt2R1
DIVR1R0
习题13答案
13-2解:
当运行到C调用B时,活动记录栈的状态如下图。
13-4解:
静态作用域规则下输出0.
0.250
0.250
第一章
1、将编译程序分成若干个“遍”是为了。
a.提高程序的执行效率
b.使程序的结构更加清晰
c.利用有限的机器内存并提高机器的执行效率
d.利用有限的机器内存但降低了机器的执行效率
2、构造编译程序应掌握。
a.源程序b.目标语言
c.编译方法d.以上三项都是
3、变量应当。
a.持有左值b.持有右值
c.既持有左值又持有右值d.既不持有左值也不持有右值
4、编译程序绝大多数时间花在上。
a.出错处理b.词法分析
c.目标代码生成d.管理表格
5、不可能是目标代码。
a.汇编指令代码b.可重定位指令代码
c.绝对指令代码d.中间代码
6、使用可以定义一个程序的意义。
a.语义规则b.语法规则
c.产生规则d.词法规则
7、词法分析器的输入是。
a.单词符号串b.源程序
c.语法单位d.目标程序
8、中间代码生成时所遵循的是-。
a.语法规则b.词法规则
c.语义规则d.等价变换规则
9、编译程序是对。
a.汇编程序的翻译b.高级语言程序的解释执行
c.机器语言的执行d.高级语言的翻译
10、语法分析应遵循。
a.语义规则b.语法规则
c.构词规则d.等价变换规则
二、多项选择题
1、编译程序各阶段的工作都涉及到。
a.语法分析b.表格管理c.出错处理
d.语义分析e.词法分析
2、编译程序工作时,通常有阶段。
a.词法分析b.语法分析c.中间代码生成
d.语义检查e.目标代码生成
三、填空题
1、解释程序和编译程序的区别在于。
2、编译过程通常可分为5个阶段,分别是、语法分析、代码优化和目标代码生成。
3、编译程序工作过程中,第一段输入是,最后阶段的输出为程序。
4、编译程序是指将程序翻译成程序的程序。
单选解答
1、将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。
2、构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。
3、对编译而言,变量既持有左值又持有右值,故选c。
4、编译程序打交道最多的就是各种表格,因此选d。
5、目标代码包括汇编指令代码、可重定位指令代码和绝对指令代码3种,因此不是目标代码的只能选d。
6、词法分析遵循的是构词规则,语法分析遵循的是语法规则,中间代码生成遵循的是语义规则,并且语义规则可以定义一个程序的意义。
因此选a。
7、b8、c9、d10、c
多选解答
1.b、c2.a、b、c、e
填空解答
是否生成目标程序2、词法分析中间代码生成3、源程序目标代码生成4、源程序目标语言
第二章
一、单项选择题
1、文法G:
S→xSx|y所识别的语言是。
a.xyxb.(xyx)*c.xnyxn(n≥0)d.x*yx*
2、文法G描述的语言L(G)是指。
a.L(G)={α|S
α,α∈VT*}b.L(G)={α|S
α,α∈VT*}
c.L(G)={α|S
α,α∈(VT∪VN*)}d.L(G)={α|S
α,α∈(VT∪VN*)}
3、有限状态自动机能识别。
a.上下文无关文法b.上下文有关文法
c.正规文法d.短语文法
4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立。
a.若f(a)>g(b),则a>bb.若f(a)c.a~b都不一定成立d.a~b一定成立
5、如果文法G是无二义的,则它的任何句子α。
a.最左推导和最右推导对应的语法树必定相同
b.最左推导和最右推导对应的语法树可能不同
c.最左推导和最右推导必定相同
d.可能存在两个不同的最左推导,但它们对应的语法树相同
6、由文法的开始符经0步或多步推导产生的文法符号序列是。
a.短语b.句柄c.句型d.句子
7、文法G:
E→E+T|T
T→T*P|P
P→(E)|I
则句型P+T+i的句柄和最左素短语为。
a.P+T和ib.P和P+Tc.i和P+T+id.P和T
8、设文法为:
S→SA|A
A→a|b
则对句子aba,下面是规范推导。
a.S⇒SA⇒SAA⇒AAA⇒aAA⇒abA⇒aba
b.S⇒SA⇒SAA⇒AAA⇒AAa⇒Aba⇒aba
c.S⇒SA⇒SAA⇒SAa⇒Sba⇒Aba⇒aba
d.S⇒SA⇒Sa⇒SAa⇒Sba⇒Aba⇒aba
9、文法G:
S→b|∧(T)
T→T,S|S
则FIRSTVT(T)。
a.{b,∧,(}b.{b,∧,)}c.{b,∧,(,,}d.{b,∧,),,}
10、产生正规语言的文法为。
a.0型b.1型c.2型d.3型
11、采用自上而下分析,必须。
a.消除左递归b.消除右递归c.消除回溯d.提取公共左因子
12、在规范归约中,用来刻画可归约串。
a.直接短语b.句柄c.最左素短语d.素短语
13、有文法G:
E→E*T|T
T→T+i|i
句子1+2*8+6按该文法G归约,其值为。
a.23B.42c.30d.17
14、规范归约指。
a.最左推导的逆过程b.最右推导的逆过程
c.规范推导d.最左归约的逆过程
二、多项选择题
1、下面哪些说法是错误的。
a.有向图是一个状态转换图b.状态转换图是一个有向图
c.有向图是一个DFAd.DFA可以用状态转换图表示
2、对无二义性文法来说,一棵语法树往往代表了。
a.多种推导过程b.多种最左推导过程c.一种最左推导过程
d.仅一种推导过程e.一种最左推导过程
3、如果文法G存在一个句子,满足下列条件之一时,则称该文法是二义文法。
a.该句子的最左推导与最右推导相同
b.该句子有两个不同的最左推导
c.该句子有两棵不同的最右推导
d.该句子有两棵不同的语法树
e.该句子的语法树只有一个
4、有一文法G:
S→AB
A→aAb|ε
B→cBd|ε
它不产生下面集合。
a.{anbmcndm|n,m≥0}b.{anbncmdm|n,m>0}
c.{anbmcmdn|n,m≥0}d.{anbncmdm|n,m≥0}
e.{anbncndn|n≥0}
5、自下而上的语法分析中,应从开始分析。
a.句型b.句子c.以单词为单位的程序
d.文法的开始符e.句柄
6、对正规文法描述的语言,以下有能力描述它。
a.0型文法b.1型文法c.上下文无关文法d.右线性文法e.左线性文法
三、填空题
1、文法中的终结符和非终结符的交集是。
词法分析器交给语法分析器的文法符号一定是,它一定只出现在产生式的部。
2、最左推导是指每次都对句型中的非终结符进行扩展。
3、在语法分析中,最常见的两种方法一定是分析法,另一是分析法。
4、采用语法分析时,必须消除文法的左递归。
5、树代表推导过程,树代表归约过程。
6、自下而上分析法采用、归约、错误处理、等四种操作。
7、Chomsky把文法分为种类型,编译器构造中采用和文法,它们分别产生和语言,并分别用和自动机识别所产生的语言。
四、判断题
1、文法S→aS|bR|ε描述的语言是(a|bc)*()
R→cS
2、在自下而上的语法分析中,语法树与分析树一定相同。
()
3、二义文法不是上下文无关文法。
()
4、语法分析时必须先消除文法中的左递归。
()
5、规范归约和规范推导是互逆的两个过程。
()
6、一个文法所有句型的集合形成该文法所能接受的语言。
()
五、简答题
1、句柄2、素短语3、语法树4、归约5、推导
六、问答题
1、给出上下文无关文法的定义。
2、文法G[S]:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的语言是什么?
3、按指定类型,给出语言的文法。
L={aibj|j>i≥1}的上下文无关文法。
4、有文法G:
S→aAcB|Bd
A→AaB|c