习题及解答.docx
《习题及解答.docx》由会员分享,可在线阅读,更多相关《习题及解答.docx(57页珍藏版)》请在冰豆网上搜索。
习题及解答
第3章文法和语言
3.8练习(P44)
2.文法G[N]为:
N→D|ND
D→0|1|2|3|4|5|6|7|8|9|
G[N]的语言是什么?
解:
N
=>*
NDn-1
=>*.
Dn
=>*.
{0,1,3,4,5,6,7,8,9}+
∴L(G[N])={0,1,3,4,5,6,7,8,9}+
5.写一文法,使其语言是偶正数的集合。
要求:
(1)允许0打头
(2)不允许0打头解:
(1)允许0打头
1是正偶数:
S→AB
B→0|2|4|6|8A→AC|C
C→0|1|2|3|4|5|6|7|8|9|ε
1不是正偶数:
S→FABC|FE
A→1|2|3|4|5|6|7|8|9
B→BD|D
D→0|1|2|3|4|5|6|7|8|9|ε
C→0|E
E→2|4|6|8
F→F0|ε
(2)不允许0打头
S→ABC|E
A→1|2|3|4|5|6|7|8|9B→BD|D
D→0|1|2|3|4|5|6|7|8|9|ε
精选文库
C→0|E
E→2|4|6|8
9.考虑下面上下文无关文法:
S→SS*|SS+|a
(1)表明通过此文法如何生成串aa+a*,并为该串构造推导树。
(2)该文法生成的语言是什么?
解:
(1)S=>SS*
=>SS+S*
=>*.aa+a*
该串的推导树如下:
S
SS*
S+Sa
aa
(2)该文法生成的语言是只含+、*的算术表达式的逆波兰表示。
11.令文法G[E]为:
E→T|E+T|E-T
T→F|T*F|T/F
F→(E)|i
证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。
解:
∵E=>E+T=>E+T*F
∴E+T*F是文法G[E]的一个句型句型E+T*F的语法树如下:
E
E+T
T*F
—2
精选文库
∴E+T*F是句型E+T*F相对于非终结符E的短语
T*F是句型E+T*F相对于非终结符T的短语
T*F是句型E+T*F相对于规则T→T*F的直接短语
T*F是句型E+T*F的句柄
13.一个上下文无关文法生成句子abbaa的推导树如下:
(1)给出该句子相应的最左推导,最右推导。
(2)该文法的产生式集合P可能有哪些元素?
(3)找出该句子的所有短语,简单短语、句柄。
S
ABS
aSBBBAa
εbba
解:
(1)最左推导如下:
S=>ABS=>aBS=>aSBBS=>aBBS=>abBS=>abbS=>abbAa=>abbaa
最右推导如下:
S=>ABS=>ABAa=>ABaa=>ASBBaa=>ASBbaa=>ASbbaa=>Abbaa=>abbaa
(2)该文法的产生式集合P可能有以下元素:
S→ABS|Aa|ε
B→SBB|b
A→a
(3)为方便叙述将句型
abbaa写作a1b1b2a2a3
该句子的短语有:
a1,
1,
2,
2,
12,23,11223
ε,bb
abbaaabbaa
该句子的直接短语有:
a1,
ε
1,
2,
2
bb
a
该句子的句柄为:
a1
16.给出生成下述语言的三型文法:
(2){anbm|n,m≥1}
解:
该语言的三型文法为:
G[S]:
S→aB
B→aB|C
C→bC|b
或
—3
精选文库
G[S]:
S→aS|aA
B→bA|b
第4章词法分析
4.7练习(P66)
1.构造下列正规式相应的DFA:
(4)b((ab)*|bb)*ab
解:
先将正规式转换为NFA,转换过程如下:
=>
b((ab)*|bb)*a
b
1
2
3
(ab)*|bb
=>
b
a
b
1
2
3
4
(ab)*
=>
b
a
b
1
2
3
4
bb
以下为最终所得的NFA图:
5
ba
4
εε
b
a
b
=>1
2
66
7
bb
3
然后,将此NFA转换为DFA:
转换关系矩阵如下表:
C
T
T
b
a
—4
精选文库
T={1}
Φ
T
={2,4}
0
1
T1={2,4}
T2={5,6}
T3={3}
T2={5,6}
Φ
T4={2,4,7}
T={3}
Φ
T
={2,4}
3
1
T={2,4,7}
T={5,6}
T
={3}
4
2
3
所得DFA图如下:
a
b
T1
a
b
T4
=>T0
T2
b
b
T3
b
最后,将此DFA化简后如下:
b
b
a
b
=>T0
T1
T2
T4
b
a
3.将图4.16确定化:
V
0
0
0
0,1
Z
S
Q
1
0,1
1
1
1
U
图4.16
解:
首先,将此NFA转换为DFA:
转换关系矩阵如下表:
C
T0={S}
T1={V,Q}
T2={U,Q}
T3={Z,V}
T4={V}
T5={Z,Q,U}
Ta
T1={V,Q}
T3={Z,V}
T4={V}
T6={Z}
T6={Z}
T3={Z,V}
Tb
T2={U,Q}
T2={U,Q}
T5={Z,Q,U}
T6={Z}
Φ
T5={Z,Q,U}
—5
精选文库
T6={Z}T6={Z}T6={Z}
所得DFA图如下:
=>T0
0
T1
0
T3
1
1
0
0,1
T2
1
T5
T6
0
T4
10,1
0
最后,将此DFA化简后如下:
=>T00
T1
10
1
T21T30,1
0
0
T4
7.给文法G[S]:
S→aA|bQ
T4
A→aA|bB|b
B→bD|aQ
Q→aQ|bD|b
D→bB|aA
E→aB|bF
F→bD|aE|b
构造相应的最小的DFA。
解:
首先,将正规式转换成NFA如下:
a
=>S
a
A
b
T
b
b
a
b
b
b
B
D
b
b
—
a
E
F
6
a
a
b
Q
精选文库
然后,将此NFA转换为DFA:
转换关系矩阵如下表:
C
T0={S}
T1={A}
T2={Q}
T3={Z,B}
T4={Z.D}
T5={D}
T6={B}
所得DFA图如下:
=>T0a
a
T4
b
b
Ta
T1={A}
T1={A}
T2={Q}
T2={Q}
T1={A}
T1={A}
T2={Q}
a
a
T1a
b
bT6
T2
Tb
T2={Q}
T3={Z,B}
T4={Z.D}
T5={D}
T6={B}
T6={B}
T5={D}
b
T5
b
b
T3
a
最后,将此DFA化简后如下:
a
a
a
=>T0
a,b
T3
T0
b
a
b
T5
b
—7
精选文库
8.给出下述文法所对应的正规式:
S→0A|1B
A→1S|1
B→0S|0
解:
由题意得:
A=1S|1,B=0S|0,S→0A|1B,将A,B右端代入S的产生式得:
S→0(1S|1)|1(0S|0)=01S|01|10S|10=(01|10)|(01|10)S
∴S→(01|10)|(01|10)S
∴S=(01|10)|(01|10)*
∴该文法所对应的正规式为:
(01|10)|(01|10)*
11.构造下述文法G[S]的确定自动机,并给出该文法的语言的正规式。
S∷=Aa|ε
A∷=Aa|Sb|a
解:
由左线型正规文法到
NFA的转换规则可得该文法的
NFA状态转换图为:
=>
a
A
a
Q
a
ε
b
S
转换关系矩阵如下表:
C
Ta
Tb
T={Q,S}
T={A}
T
={A}
0
1
1
T={A}
T={A,S}
Φ
1
2
T2={A,S}
T2={A,S}
T1={A}
所得DFA图如下:
b
=>
a,b
T1
a
T0
T2
a
第5章自顶向下语法分析方法
5.6练习(P90)
2.对下面的文法G:
E→TE′
E′→+E|ε
T→FT′
T′→T|ε
F→PF′
F′→*F′|ε
P→(E)|a|b|^
—8
精选文库
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
(2)证明这个文法是LL
(1)的。
(3)构造它的预测分析表。
解:
(1)由题意分析得可推导出ε的非终结符表为:
EE′TT′FF′P
否是否是否是否
各非终结符的FIRST集为:
FIRST(E)=FIRST(T)={(,a,b,^}
FIRST(E′)={+}∪{ε}={+,ε}
FIRST(T)=FIRST(F)={(,a,b,^}
FIRST(T′)=FIRST(T)∪{ε}={(,a,b,^,ε}
FIRST(F)=FIRST(P)={(,a,b,^}
FIRST(F′)={*}∪{ε}={*,ε}
FIRST(P)={(,a,b,^}
∴最终求得各非终结符的FIRST集为:
FIRST(E)={(,a,b,^}
FIRST(E′)={+,ε}
FIRST(T)={(,a,b,^}
FIRST(T′)={(,a,b,^,ε}
FIRST(F)={(,a,b,^}
FIRST(F′)={*,ε}
FIRST(P)={(,a,b,^}
各非终结符的FOLLOW集为:
FOLLOW(E)={#}∪FOLLOW(E′)∪{)}
FOLLOW(E′)=FOLLOW(E)
FOLLOW(T)=FOLLOW(T′)∪(FIRST(E′)-{ε∪})FOLLOW(E)
FOLLOW(T′)=FOLLOW(T)
FOLLOW(F)=(FIRST(T′)-{FOLLOW(F′)=FOLLOW(F)FOLLOW(P)=(FIRST(F′)-{
ε∪})FOLLOW(T)
∪FOLLOW(F′)
ε∪})FOLLOW(F)
∴最终求得各非终结符的FOLLOW集为:
FOLLOW(E)={#,)}
FOLLOW(E′)={#,)}
FOLLOW(T)={#,+,)}
FOLLOW(T′)={#,+,)}
FOLLOW(F)={(,a,b,^,#,+,)}
FOLLOW(F′)={(,a,b,^,#,+,)}
FOLLOW(P)={*,(,a,b,^,#,+,)}
(2)各产生式的SELECT集为:
SELECT(E→TE′)=FIRST(TE′)=FIRST(T)={(,a,b,^}SELECT(E′→+E)=FIRST(+E)={+}
SELECT(E′→ε)=(FIRST(-{ε)∪})FOLLOW(E′)=FOLLOW(E′)={#,)}SELECT(T→FT′)=FIRST(FT′)=FIRST(F)={(,a,b,^}
SELECT(T′→T)=FIRST(T)={(,a,b,^}
—9
精选文库
SELECT(T′→ε)=(FIRST(-{ε)∪})FOLLOW(T′)=FOLLOW(T′)={#,+,)}
SELECT(F→PF′)=FIRST(PF′)=FIRST(P)={(,a,b,^}
SELECT(F′→*F′)=FIRST(*F′)=FIRST(P)={*}
SELECT(F′→ε)=(FIRST(-{ε)∪})FOLLOW(F′)=FOLLOW(F′)={(,a,b,^,#,+,)}
SELECT(P→(E))=FIRST((E))={(}
SELECT(P→a)=FIRST(a)={a}
SELECT(P→b)=FIRST(b)={b}
SELECT(P→^)=FIRST(^)={^}
∴由以上结果得相同左部产生式的SELECT交集为:
SELECT(E′→+E)∩SELECT(E′→ε)={+}∩{#,)}
SELECT(T′→T)∩SELECT(T′→ε)={(,a,b,^)∩{#,+,)}=ΦSELECT(F′→*F′)∩SELECT(F′→ε)={*}∩{(,a,b,^,#,+,)}=Φ
SELECT(P→(E))∩SELECT(P→a)∩SELECT(P→b)∩SELECT(P→^)={(}∩{a}∩{b}∩{^}=Φ
∴相同左部产生式的SELECT集合的交集为空。
∴这个文法是LL
(1)的。
(3)由以上算出的SELECT集可以构造该文法的预测分析表如下:
+*()ab^#
E→TE′→TE′→TE′→TE′
E′→+E→ε→ε
T→FT′→FT′→FT′→FT′
T′→ε→T→ε→T→T→T→ε
F→PF′→PF′→PF′→PF′
F′→ε→*F′→ε→ε→ε→ε→ε→ε
P→(E)→a→b→^
7.对于一个文法若消除了左递归,提取了左公共因子后是否一定为LL
(1)文法?
试对下面
文法进行改写,并对改写后的文法进行判断。
(2)A→aABe|a
(1)
B→Bb|d
(2)
(3)S→Aa|b
(1)
A→SB
(2)
B→ab(3)
解:
对于一个文法若消除了左递归,提取了左公因子后不一定是LL
(1)文法。
(2)将产生式
(1)提取左公因子后得:
A→a(ABe|ε)
进一步变换为文法G1:
A→aA′
A′→Abe
A′→ε
B→Bb|d
消除
(2)中的直接左递归,将B→Bb|d变换为:
B→dB′
B′→bB′|ε
—10
精选文库
该文法最终改写成的形式为:
A→aA′
A′→Abe|ε
B→dB′
B′→bB′|ε
对此改写后的文法进行判断其是否是LL
(1)文法。
由分析得可推导出ε的非终结符表为:
AA′BB′
否是否是
各非终结符的FIRST集为:
FIRST(A)={a}
FIRST(A′)=FIRST(A)∪{ε}={a,ε}
FIRST(B)={d}
FIRST(B′)={b}∪{ε}={b,ε}
各非终结符的FOLLOW集为:
FOLLOW(A)={#}∪(FIRST(B)-{ε})={#,d}
FOLLOW(A′)=FOLLOW(A)={#,d}
FOLLOW(B)={e}
FOLLOW(B′)=FOLLOW(B′)∪FOLLOW(B)={e}
各产生式的SELECT集为:
SELECT(A→aA′)=FIRST(aA′)={a}
SELECT(A′→ABe)=FIRST(ABe)=FIRST(A)={a}
SELECT(A′→ε)=(FIRST(-{ε)∪})FOLLOW(A′)=FOLLOW(A′)={#,d}
SELECT(B→dB′)=FIRST(dB′)={d}
SELECT(B′→bB′)=FIRST(bB′)={b}
SELECT(B′→ε)=(FIRST(-{ε)∪})FOLLOW(B′)=FOLLOW(B′)={e}
由以上结果得相同左部产生式的SELECT交集为:
SELECT(A′→ABe)∩SELECT(A′→ε)={a}∩{#,d}=Φ
SELECT(B′→bB′)∩SELECT(B′→ε)={b}∩{e}=Φ
∴相同左部产生式的SELECT集合的交集为空。
∴改写后的文法是LL
(1)的。
(3)该文法的非终结符S,A为间接左递归,以S,A,B为序消除一切左递归。
将
(1)的右部代入
(2)得:
A→AaB|bB
消除其直接左递归得:
A→bBA′
A′→aBA′|ε
此时文法变成如下形式:
S→Aa|b
(1)
A→bBA′
(2)
A′→aBA′|ε
B→ab
此文法中的
(1),
(2)产生式存在隐含的左公因子,消除隐含的左公因子后文法变成如下的形式:
—11
精选文库
S→bS′
S′→BA′a|ε
A→bBA′
A′→aBA′|ε
B→ab
此形式中A→bBA′是不可达的产生式,是多余的,所以应将其去掉。
所以文法最终改写成的形式为:
S→bS′
S′→BA′a|ε
A′→aBA′|ε
B→ab
相同左部产生式的SELECT集为:
SELECT(S′→BA′a)={a}
SELECT(S′→ε)={#}
SELECT(A′→aBA′)={a}
SELECT(A′→ε)={a}
相同左部产生式的SELECT交集为:
SELECT(S′→BA′a)∩SELECT(S′→ε)={a}∩{#}=Φ
SELECT(A′→aBA′)∩SELECT(A′→ε)={a}∩{a}≠Φ
∴关于A′的相同左部其产生式的SELECT集的交集不为空
∴此改写后的文法不是LL
(1)的。
第6章自底向上优先分析法
6.4练习(P116)
1.已知文法G[S]为:
S→a|^|(T)
T→T,S|S
(1)计算FIRSTVT和LASTVT。
(2)构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。
(3)计算G[S]的优先函数。
(4)给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。
解:
(1)由题意得:
FIRSTVT(S)={a,^,(}
FIRSTVT(T)=FIRSTVT(T)
∪{
,}∪FIRSTVT(S)={a,^,(,,}
LASTVT(S)={a,^,)}
LASTVT(T)=LASTVT(S)=
∪{
,}={{a,^,),,}
(2)由文法G[S]可知:
.关系有:
(.
)
.关系有:
∵有(T
∴(.
FIRSTVT(T)
.即(.
a.(
.
^
(
(
(
,
.
.
.
.
∵有,S
∴,
FIRSTVT(S)
即,
a
,
^
.
关系有:
.
.
.
.
.
,
(
∵有T)
)
)
∴LASTVT(T)
即
a
.
.
.
.
.