习题及解答.docx

上传人:b****6 文档编号:5547776 上传时间:2022-12-19 格式:DOCX 页数:24 大小:160.64KB
下载 相关 举报
习题及解答.docx_第1页
第1页 / 共24页
习题及解答.docx_第2页
第2页 / 共24页
习题及解答.docx_第3页
第3页 / 共24页
习题及解答.docx_第4页
第4页 / 共24页
习题及解答.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

习题及解答.docx

《习题及解答.docx》由会员分享,可在线阅读,更多相关《习题及解答.docx(24页珍藏版)》请在冰豆网上搜索。

习题及解答.docx

习题及解答

第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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1