习题及解答.docx
《习题及解答.docx》由会员分享,可在线阅读,更多相关《习题及解答.docx(24页珍藏版)》请在冰豆网上搜索。
习题及解答
第3章文法和语言
3.8练习(P44)
2.文法G[N]为:
N→D|ND
D→0|1|2|3|4|5|6|7|8|9|
G[N]的语言是什么?
解:
NNDn-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打头
0是正偶数:
S→AB
B→0|2|4|6|8
A→AC|C
C→0|1|2|3|4|5|6|7|8|9|ε
0不是正偶数:
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|9
B→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*
该串的推导树如下:
(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+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)找出该句子的所有短语,简单短语、句柄。
解:
(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,ε,b1,b2,a2,b1b2,a2a3,a1b1b2a2a3
该句子的直接短语有:
a1,ε,b1,b2,a2
该句子的句柄为:
a1
16.给出生成下述语言的三型文法:
(2){anbm|n,m≥1}
解:
该语言的三型文法为:
G[S]:
S→aB
B→aB|C
C→bC|b
或
G[S]:
S→aS|aA
B→bA|b
第4章词法分析
4.7练习(P66)
1.构造下列正规式相应的DFA:
(4)b((ab)*|bb)*ab
解:
先将正规式转换为NFA,转换过程如下:
以下为最终所得的NFA图:
然后,将此NFA转换为DFA:
转换关系矩阵如下表:
C
Ta
Tb
T0={1}
Φ
T1={2,4}
T1={2,4}
T2={5,6}
T3={3}
T2={5,6}
Φ
T4={2,4,7}
T3={3}
Φ
T1={2,4}
T4={2,4,7}
T2={5,6}
T3={3}
所得DFA图如下:
最后,将此DFA化简后如下:
3.将图4.16确定化:
解:
首先,将此NFA转换为DFA:
转换关系矩阵如下表:
C
Ta
Tb
T0={S}
T1={V,Q}
T2={U,Q}
T1={V,Q}
T3={Z,V}
T2={U,Q}
T2={U,Q}
T4={V}
T5={Z,Q,U}
T3={Z,V}
T6={Z}
T6={Z}
T4={V}
T6={Z}
Φ
T5={Z,Q,U}
T3={Z,V}
T5={Z,Q,U}
T6={Z}
T6={Z}
T6={Z}
所得DFA图如下:
最后,将此DFA化简后如下:
7.给文法G[S]:
S→aA|bQ
A→aA|bB|b
B→bD|aQ
Q→aQ|bD|b
D→bB|aA
E→aB|bF
F→bD|aE|b
构造相应的最小的DFA。
解:
首先,将正规式转换成NFA如下:
a
然后,将此NFA转换为DFA:
转换关系矩阵如下表:
C
Ta
Tb
T0={S}
T1={A}
T2={Q}
T1={A}
T1={A}
T3={Z,B}
T2={Q}
T2={Q}
T4={Z.D}
T3={Z,B}
T2={Q}
T5={D}
T4={Z.D}
T1={A}
T6={B}
T5={D}
T1={A}
T6={B}
T6={B}
T2={Q}
T5={D}
所得DFA图如下:
最后,将此DFA化简后如下:
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状态转换图为:
转换关系矩阵如下表:
C
Ta
Tb
T0={Q,S}
T1={A}
T1={A}
T1={A}
T2={A,S}
Φ
T2={A,S}
T2={A,S}
T1={A}
所得DFA图如下:
第5章自顶向下语法分析方法
5.6练习(P90)
2.对下面的文法G:
E→TE′
E′→+E|ε
T→FT′
T′→T|ε
F→PF′
F′→*F′|ε
P→(E)|a|b|^
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
(2)证明这个文法是LL
(1)的。
(3)构造它的预测分析表。
解:
(1)由题意分析得可推导出ε的非终结符表为:
E
E′
T
T′
F
F′
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(T)
FOLLOW(F′)=FOLLOW(F)∪FOLLOW(F′)
FOLLOW(P)=(FIRST(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,^}
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集可以构造该文法的预测分析表如下:
+
*
(
)
a
b
^
#
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′|ε
该文法最终改写成的形式为:
A→aA′
A′→Abe|ε
B→dB′
B′→bB′|ε
对此改写后的文法进行判断其是否是LL
(1)文法。
由分析得可推导出ε的非终结符表为:
A
A′
B
B′
否
是
否
是
各非终结符的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)产生式存在隐含的左公因子,消除隐含的左公因子后文法变成如下的形式:
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)^))),)
∵有T,∴LASTVT(T),即a,^,),,,
∴G[S]的算符优先关系矩阵为:
a
^
(
)
,
#
a
^
(
)
,
#
由算符优先关系表可知该文法G中任意两个终结符对之间至多只有,和
三种关系的一种成立。
所以G[S]是算符优先文法。
(3)由
(2)中所得优先关系表可以构造如下优先函数关系图:
由以上优先关系图求得如下优先函数结果:
a
^
(
)
,
#
f
6
6
2
6
4
2
g
7
7
7
2
3
2
其优先函数的优先关系与优先矩阵的优先关系是一致的。
(3)对输入串(a,a)#的算符优先规约过程如下:
步骤
栈
优先关系
当前符号
剩余输入串
移进或归约
(1)
#
(
a,a)#
移进
(2)
#(
a
,a)#
移进
(3)
#(a
,
a)#
归约
(4)
#(S
,
a)#
移进
(5)
#(S,
a
)#
移进
(6)
#(S,a
)
#
归约
(7)
#(S,S
)
#
归约
(8)
#(T
)
#
移进
(9)
#(T)
#
归约
(10)
#S
#
接受
对输入串(a,(a,a))#的算符优先规约过程如下:
步骤
栈
优先关系
当前符号
剩余输入串
移进或归约
(1)
#
(
a,(a,a))#
移进
(2)
#(
a
,(a,a))#
移进
(3)
#(a
,
(a,a))#
归约
(4)
#(S
,
(a,a))#
移进
(5)
#(S,
(
a,a))#
移进
(6)
#(S,(
a
,a))#
移进
(7)
#(S,(a
,
a))#
归约
(8)
#(S,(S
,
a))#
移进
(9)
#(S,(S,
a
))#
移进
(10)
#(S,(S,a
)
)#
归约
(11)
#(S,(S,S
)
)#
归约
(12)
#(S,(T
)
)#
移进
(13)
#(S,(T)
)
#
归约
(14)
#(S,S
)
#
归约
(15)
#(T
)
#
移进
(16)
#(T)
#
归约
(17)
#S
#
接受
第7章LR分析法
7.7练习(P151)
6.文法G=({U,T,S}{a,b,c,d,e},P,S)
其中P为:
S→UTa|Tb
T→S|Sc|d
U→US|e
(1)判断G是LR(0),SLR
(1),LALR
(1)还是LR
(1),说明理由。
(2)构造相应的分析表。
解:
将文法拓广为G′如下:
S′→S
S→UTa|Tb
T→S|Sc|d
U→US|e
该文法的LR(0)项目集规范族为:
I0:
S′→.S
S→.UTa
S→.Tb
U→.US
U→.e
T→.S
T→.Sc
T→.d
I1:
S′→S.
T→S.
T→S.c
I2:
S→U.Ta
T→.S
T→.Sc
T→.d
S→.UTa
S→.Tb
U→.US
U→.e
U→U.S
I3:
S→T.b
I4:
U→e.
I5:
T→d.
I6:
T→Sc.
I7:
S→UT.a
S→T.b
I8:
T→S.
T→S.c
U→US.
I9:
S→Tb.
I10:
S→UTa.
与此相应的识别该文法活前缀的有限自动机如下图:
不难看出I1和I8中存在移进-归约和归约-归约冲突,因此该文法不是LR(0)文法。
在I1中:
S′→S.
T→S.
T→S.c
FOLLOW(S′)={#}
FOLLOW(T)={a,b}
FOLLOW(S′)∩FOLLOW(T)=Φ
FOLLOW(S′)∩{c}=Φ
FOLLOW(T)∩{c}=Φ
I1中的冲突可以用SLR
(1)方法解决。
在I1中:
T→S.
T→S.c
U→US.
FOLLOW(T)={a,b}
FOLLOW(U)={d,e}
FOLLOW(T)∩FOLLOW(U)=Φ
FOLLOW(T)∩{c}=Φ
FOLLOW(U)∩{c}=Φ
I8中的冲突也可以用SLR
(1)方法解决。
(2)由题意可得各非终结符的SELECT集如下:
FIRST(S′)=FIRST(S)={e,d}
FIRST(S)=FIRST(U)∪FIRST(T)={e}∪FIRST(T)∪{d}={e,d}
FIRST(T)=FIRST(S)∪{d}={e,d}
FIRST(U)=FIRST(U)∪{e}={e}
由题意可得各非终结符的FOLLOW集如下:
FOLLOW(S′)={#}
FOLLOW(S)=FOLLOW(S′)∪FOLLOW(T)∪FOLLOW(U)∪{c}={#,a,b,c,d,e}
FOLLOW(T)={a,b}
FOLLOW(U)=FIRST(Ta)∪FIRST(S)=FIRST(T)∪FIRST(S)={e,d}
∴根据以上构造的文法的LR(0)项目集规范族和计算出的所有非终结符的FOLLOW集。
可以构造该文法的改进的SLR
(1)分析表如下:
a
b
c
d
e
#
S
T
U
0
S5
S4
1
3
2
1
r3
r3
S6
acc
2
S5
S4
8
7
2
3
S9
4
r7
r7
5
r5
r5
6
r4
r4
7
S10
S9
8
r3
r3
S6
r6
r6
9
r