#编译原理课后习题答案Word文件下载.docx
《#编译原理课后习题答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《#编译原理课后习题答案Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
![#编译原理课后习题答案Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/11/3258b95b-25c0-42bb-b27c-92d1accea6ab/3258b95b-25c0-42bb-b27c-92d1accea6ab1.gif)
NNDN1ND1N01D01301
NNDNDDDDD3DD30D301
NNDN1ND1N31ND31N431ND431N5431D543175431
NNDNDDNDDDNDDDDDDDDD7DDDD75DDD754DD7543D754
31
4.证明文法SiSeS|iS|i是二义性文法。
对于句型iiSeS存在两个不同的最左推导:
1/23
SiSeSiiSes
SiSiiSeS所以该文法是二义性文法。
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|
ASb
|ab
a|
3)
aSd
|A|
bAc
|
6.设计一个最简的DFAM,使其能够识别所有的被3整除的无符号十进制整数。
2|5|8
1|4|7
7.设计一个DFA,使其能够接受被4整除的二进制数。
8.写出表达下列各项的正则表达式。
1)二进制数且为5的倍数。
<
2)Σ={a,b,c},第一个a位于第一个b之前的字符串。
3)Σ={a,b,c},包含偶数个a的字符串。
4)Σ={0,1},不包含11子串的字符串。
2/23
可以先画出相应的有限自动机
1S=A
2A=0A+1B+T
3B=0C+1D
4C=0E+1A
5D=0B+1C
6E=0D+1E解以上方程组:
⑥E=1*0D
②A=0*1B+0*T
⑥代入④C=01*0D+1A
⑤代入④C=01*00B+01*01C+1AC=xB+yA
其中x=(01*01>
*01*00y=(01*01>
*1
⑤代入③B=0C+10B+11CB=(0|11>
C+10B
B=(10>
*(0|11>
C
将C=xB+yA代入上式B=uB+vA
B=u*vA
其中u=(10>
*(0|11>
xv=(10>
y将B=u*vA代入②A=0*1u*vA+0*T
3/23
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|>
第三章
1.词法分析器的功能是什么?
读源程序的字符序列,逐个拼出单词,并构造相应的内部表示TOKEN;
同时检查源程
序中的词法错误。
2.试分析分隔符<
空格、跳格及回车等)对词法分析的影响。
空格、跳格、回车等分隔符号对词法分析不起作用,可以删除。
但是回车符号可以用于错误定位,所以在删除回车符号前需要统计回车的个数。
3.给出识别C语言全部实型常数的自动机。
(+|-|>
([1-9][0-9]*|0>
(.[0-9][0-9]*|>
(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]:
SaABbcd|
AASd|
BSAh|eC|
CSf|Cg|
(1)求每个产生式的Predict集。
(2)该文法是否为LL(1>
文法?
为什么?
(1>
Predict(SaABbcd>
={a}
Predict(S>
={#,d,f,a,h}
Predict(AASd>
={a,d}
4/23
Predict(A>
={h,a,d,b,e}
Predict(BSAh>
={a,d,h}
Predict(BeC>
={e}
Predict(B>
={b}
Predict(CSf>
={a,f}
Predict(CCg>
={a,f,g}
Predict(C>
={g,b}
(2>
因为Predict(AASd>
Predict(A>
,所以该文法不是LL(1>
文法。
2.下列描述括号匹配的文法中,哪些是LL(1>
(1>
S(SS'
|
S'
>
S(S>
S|
(3>
SS(S>
(4>
S(S|S'
(S'
>
不是,(2>
是,(3>
不是,(4>
不是
3.已知文法G[E]:
EE+T|T
TT*F|F
Fi|(E>
请按递归下降法构造该文法的语法分析程序。
求产生式的predict集合:
predict(EE+T>
={i,(}
predict(ET>
predict(TT*F>
predict(TF>
因为文法中非终极符号E和T对应的产生式的predict集合的交集都不为空,所以该文法不满足自顶向下分析的条件,现对文法进行等价变换得到如下文法:
E
TE'
E'
+TE'
T
FT'
T'
*FT'
F
i
(E>
求
新文法的
predict集合
Predict(ETE'
={(,i}
Predict(E'
={+}
={#,>
Predict(TFT'
Predict(T'
*FT'
={*}
5/23
={+,>
#}
Predict(Fi>
={i}
Predict(F(E>
={(}
因为以上文法中任意非终极符号对应的产生式的predict集合的交集都为空,所以满足自顶向下分析的条件,所以可以写出如下的递归下降语法分析伪代码:
VoidE(>
{if(token{(,i}>
{T(>
E'
(。
elseError(>
voidE'
(>
{if(token{+}>
{Match(‘。
+T'
(>
。
elseif(token{#,>
}>
{。
voidT(>
{if(token{i,(}>
{F(>
T'
voidT'
{if(token{*}>
*F'
elseif(token{+,>
#}>
voidF(>
{if(token{i}>
i}'
elseif(token{(}>
(E‘(>
Match(‘>
'
4.构造一个LL(1>
文法G,它能识别语言L:
L={|为字母表上不包括两个相邻的1的非空串},其中={0,1}。
并证明你所构造的文法是LL(1>
0E
|1F
0E|
1F
B|
C|
Predict(A0E>
={0}
Predict(A
1F>
={1}
Predict(B
0E>
Predict(E
B>
={0,1}
={#}
Predict(F
C>
对任意非终极符号对应的产生式的predict集合的交集都为空,所以该文法是LL(1>文
6/23
法。
5.已知文法G[A]为:
AaABe|a
BBb|d
(1)试给出与G[A]等价的LL(1>
文法G'
[A。
]
(2)构造G'
[A的]LL(1>
分析表并给出输入串aade#的分析过程。
所求G'
[A为]:
aA'
A'
ABe
dB'
B'
bB'
(5>
(6>
Predict(AaA'
ABe>
={#,d}
={d}
bB'
对任意非终极符号对应的产生式的predict集合的交集都为空,所以该文法是LL(1>
文
(3)分析表如下:
a
b
d
e
#
aade#的分析过程如下
分析栈
输入流
动作
A#
aade#
替换(1>
#
匹配
ade#
替换(2>
ABe#
替换(