编译原理课后习题答案Word文件下载.doc
《编译原理课后习题答案Word文件下载.doc》由会员分享,可在线阅读,更多相关《编译原理课后习题答案Word文件下载.doc(28页珍藏版)》请在冰豆网上搜索。
D|ND
Dà
0|1|2|3|4|5|6|7|8|9
请给出句子123、301和75431的最右推导和最左推导。
NÞ
NDÞ
N3Þ
ND3Þ
N23Þ
D23Þ
123
NÞ
NDDÞ
DDDÞ
1DDÞ
12DÞ
N1Þ
ND1Þ
N01Þ
D01Þ
301
3DDÞ
30DÞ
N31Þ
ND31Þ
N431Þ
ND431Þ
N5431Þ
D5431Þ
75431
NDDDÞ
NDDDDÞ
DDDDDÞ
7DDDDÞ
75DDDÞ
754DDÞ
7543DÞ
4.证明文法Sà
iSeS|iS|i是二义性文法。
对于句型iiSeS存在两个不同的最左推导:
SÞ
iSeSÞ
iiSes
iSÞ
iiSeS
所以该文法是二义性文法。
5.给出描述下面语言的上下文无关文法。
(1)L1={anbnci|n>
=1,i>
=0}
(2)L2={aibj|j>
=i>
=1}
(3)L3={anbmcmdn|m,n>
=0}
(1)Sà
AB
Aà
aAb|ab
Bà
cB|e
(2)Sà
ASb|ab
a|e
(3)Sà
aSd|A|e
bAc|e
6.设计一个最简的DFAM,使其能够识别所有的被3整除的无符号十进制整数。
7.设计一个DFA,使其能够接受被4整除的二进制数。
8.写出表达下列各项的正则表达式。
(1)二进制数且为5的倍数。
(2)Σ={a,b,c},第一个a位于第一个b之前的字符串。
(3)Σ={a,b,c},包含偶数个a的字符串。
(4)Σ={0,1},不包含11子串的字符串。
(1)
可以先画出相应的有限自动机:
添加新的开始状态S和终止状态T:
根据以上自动机,列出以下方程:
①S=A
②A=0A+1B+T
③B=0C+1D
④C=0E+1A
⑤D=0B+1C
⑥E=0D+1E
解以上方程组:
⑥Þ
E=1*0D
②Þ
A=0*1B+0*T
⑥代入④Þ
C=01*0D+1A
⑤代入④Þ
C=01*00B+01*01C+1A
Þ
C=xB+yA
其中x=(01*01)*01*00y=(01*01)*1
⑤代入③Þ
B=0C+10B+11C
Þ
B=(0|11)C+10B
B=(10)*(0|11)C
将C=xB+yA代入上式Þ
B=uB+vA
Þ
B=u*vA
其中u=(10)*(0|11)xv=(10)*(0|11)y
将B=u*vA代入②Þ
A=0*1u*vA+0*T
A=(0*1u*v)*0*T
将A代入①Þ
S=(0*1u*v)*0*T
串(0*1u*v)*0*即为所求。
(2)该题目理解为:
至少有一个a和一个b,且a出现在b的前面(可以有间隔),则答案为:
c*a(a|c)*b(a|b|c)*
(3)((b|c)*a(b|c)*a)*(b|c)* (a(b|c)*a|b|c)*
(4)(0|10)*(1|e)
第三章
1.词法分析器的功能是什么?
读源程序的字符序列,逐个拼出单词,并构造相应的内部表示TOKEN;
同时检查源程序中的词法错误。
2.试分析分隔符(空格、跳格及回车等)对词法分析的影响。
空格、跳格、回车等分隔符号对词法分析不起作用,可以删除。
但是回车符号可以用于错误定位,所以在删除回车符号前需要统计回车的个数。
3.给出识别C语言全部实型常数的自动机。
(+|-|e)([1-9][0-9]*|0)(.[0-9][0-9]*|e)(E(+|-|e)[0-9][0-9]*)
4.写出识别C语言中所有单词的LEX程序。
L=[A-Z]|[a-z]
D=[0-9]
D1=[1-9]
%%
(L|_)(L|D|_)* {return
(1);
}
D1D* {return
(2);
+ {return(3);
……
第四章
1.设有如下文法G[S]:
Sà
aABbcd|e
ASd|e
SAh|eC|e
Cà
Sf|Cg|e
(1)求每个产生式的Predict集。
(2)该文法是否为LL
(1)文法?
为什么?
Predict(Sà
aABbcd)={a}
e)={#,d,f,a,h}
Predict(Aà
ASd)={a,d}
e)={h,a,d,b,e}
Predict(Bà
SAh)={a,d,h}
eC)={e}
e)={b}
Predict(Cà
Sf)={a,f}
Cg)={a,f,g}
e)={g,b}
(2)由于Predict(Aà
ASd)Ç
Predict(Aà
e)¹
Æ
,所以该文法不是LL
(1)文法。
2.下列描述括号匹配的文法中,哪些是LL
(1)文法?
(1) Sà
(SS’|e
S’à
)|e
(2) Sà
(S)S|e
(3) Sà
S(S)S|e
(4) Sà
(S|S’
S’à
(S’)|e
(1)不是,
(2)是,(3)不是,(4)不是
3.已知文法G[E]:
Eà
E+T|T
Tà
T*F|F
Fà
i|(E)
请按递归下降法构造该文法的语法分析程序。
求产生式的predict集合:
predict(Eà
E+T)={i,(}
T)={i,(}
predict(Tà
T*F)={i,(}
F)={i,(}
由于文法中非终极符号E和T对应的产生式的predict集合的交集都不为空,所以该文法不满足自顶向下分析的条件,现对文法进行等价变换得到如下文法:
TE’
E’à
+TE’|e
Tà
FT’
T’à
*FT’|e
Fà
i
(E)
求新文法的predict集合:
Predict(Eà
TE’)={(,i}
Predict(E’à
+TE’)={+}
e)={#,)}
Predict(Tà
FT’)={i,(}
Predict(T’à
*FT’)={*}
e)={+,),#}
Predict(Fà
i)={i}
(E))={(}
由于以上文法中任意非终极符号对应的产生式的predict集合的交集都为空,所以满足自顶向下分析的条件,所以可以写出如下的递归下降语法分析伪代码:
VoidE()
{if(tokenÎ
{(,i}){T();
E’();
elseError();
voidE’()
{+}){Match(‘+’);
T();
elseif(tokenÎ
{#,)}){;
voidT()
{i,(}){F();
T’();
voidT’()
{*}){Match(‘*’);
F();
{+,),#}){;
voidF()
{i}){Match(‘i’);
{(}){Match(‘(‘);
E();
Match(‘)’);
4.构造一个LL
(1)文法G,它能识别语言L:
L={w|w为字母表S上不包括两个相邻的1的非空串},其中S={0,1}。
并证明你所构造的文法是LL
(1)文法。
0E|1F
Cà
0E
B|e
C|e
0E)={0}
1F)={1}
B)={0,1}
e)={#}
C)={0}
对任意非终极符号对应的产生式的predict集合的交集都为空,所以该文法是LL
(1)文法。
5.已知文法G[A]为:
Aà
aABe|a
Bb|d
(1)试给出与G[A]等价的LL
(1)文法G’[A]。
(2)构造G’[A]的LL
(1)分析表并给出输入串aade#的分析过程。
(1)所求G’[A]为:
aA’
(1)
A’à
ABe
(2)
A’à
e (3)
dB’ (4)
B’à
bB’ (5)
B’à
e (6)
aA’)={a}
Predict(A’à
ABe)={a}
e)={#,d}
dB’)={d}
Predict(B’à
bB’)={b}
e)={e}
(3)分析表如下:
a
b
d
e
#
A
A’
(2)
(3)
B
(4)
B’
(5)
(6)
aade#的分析过程如下
分析栈
输入流
动作
A#
aade#
替换
(1)
aA’#
匹配
A’#
ade#
替换
(2)
ABe#
aA’Be#
A’Be#
de#
替换(3)
Be#
替换(4)
dB’e#
B’e#
e#
替换
成功
第五章(这章答案是错的)
1