编译原理习题解答.docx

上传人:b****8 文档编号:10683665 上传时间:2023-02-22 格式:DOCX 页数:53 大小:512.56KB
下载 相关 举报
编译原理习题解答.docx_第1页
第1页 / 共53页
编译原理习题解答.docx_第2页
第2页 / 共53页
编译原理习题解答.docx_第3页
第3页 / 共53页
编译原理习题解答.docx_第4页
第4页 / 共53页
编译原理习题解答.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

编译原理习题解答.docx

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

编译原理习题解答.docx

编译原理习题解答

第二章:

习题2-4Table表

varx,y;

procedurep;

vara;

procedureq;

varb;

begin

b:

=10;

end;

procedures;

varc,d;

procedurer;

vare,f;

begin

callq;

end;

begin

callr;

end;

begin

calls;

end;

begin

callp;

end

根据:

Page289,变量table:

array[0..txmax]ofrecord结构体以及block函数得到下表,而表中各部分的含义,见教材Page18,Page19

Name

Kink

Val/Level

Adr

Size

x

variable

0

3

0

y

variable

0

4

0

p

procedur

0

1

0

a

variable

1

3

0

q

procedur

1

3

4

s

procedur

1

7

0

c

variable

2

3

0

d

variable

2

4

0

r

procedur

2

0

0

第三章文法和语言

5.写一文法,使其语言是偶正整数的集合要求:

(1)允许0打头

(2)不允许0打头

解:

⑴G[S]=({S,P,D,N},{0,1,2,…,9},P,S)

P:

SPD|D

P->NP|N

D0|2|4|6|8

N->0|1|2|3|4|5|6|7|8|9

(2)G[S]=({S,P,R,D,N,Q},{0,1,2,…,9},P,S)

P:

SPD|P0|D

P->NR|N

R->QR|Q

D2|4|6|8

N->1|2|3|4|5|6|7|8|9

Q->0|1|2|3|4|5|6|7|8|9

6.已知文法G:

<表达式>:

:

=<项>|<表达式>+<项>|<表达式>-<项>

<项>:

:

=<因子>|<项>*<因子>|<项>/<因子>

<因子>:

:

=(<表达式>)|i。

试给出下述表达式的推导及语法树。

(1)i;

(2)(i)(3)i*i;

(4)i*i+i;(5)i+(i+i);(6)i+i*i。

解:

(1)v=<表达式>=><项>=><因子>=>i=w

(2)v=<表达式>=><项>=><因子>=>(<表达式>)=>(<项>)=>(<因子>)=>(i)=w

(3)v=<表达式>=><项>=><项>*<因子>=><因子>*<因子>=>i*i=w

(4)v=<表达式>=><表达式>+<项>=><项>+<项>=><项>*<因子>+<项>=><因子>*<因子>+<因子>=>i*i+i=w

(5)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<因子>=>i+(<表达式>)=>i+(<表达式>+<项>)=>i+(<项>+<项>)=>i+(<因子>+<因子>)=>i+(i+i)=w

(6)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<项>=>i+<项>=>i+<项>*<因子>=>i+<因子>*<因子>=>i+i*i=w

语法树见下图

(3)i*i

<项>

<因子>

<因子>

i

7.为句子i+i*i构造两棵语法树,从而证明下述文法G[<表达式>]是二义的。

<表达式>:

:

=i|(<表达式>)|<表达式><运算符><表达式>

<运算符>:

:

=+卜|*|/

解:

为句子i+i*i构造的两棵语法树如下:

所以,该文法是二义的。

8.习题1中的文法G[S]是二义的吗?

为什么?

答:

是二义的。

因为对于句子abc可以有两种不同的生成树,即:

S=>Ac=>abc和S=>aB=>abc

11.令文法G[E]为:

ET|E+T|E-T

TF|T*F|T/F

F(E)|i

证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。

解:

可为E+T*F构造一棵语法树(见下图),所以它是句型。

E

/T\

E+T

T*F

从语法树中容易看出,E+T*F的短语有:

T*F是句型E+T*F的相对于T的短语,也是相对于规则TT*F的直接短语。

E+T*F是句型E+T*F的相对于E的短语。

句型E+T*F的句柄(最左直接短语)是T*F。

12.下述文法G[E]生成的语言是什么?

给出该文法的一个句子,该句子至少含五个终结符,构造该句子的

语法树。

证明:

]的句型,并指出该句型的所有短语、直接短语和句柄。

|

|

a|b|c

+|-

*|/

解:

(1)

n

|n>=0}

计算文法G[E]的语言:

由于L(T)={(a|b|c)((a|b|c)(*|/))

n

所以L(E)={L(T)(L(T)(+|-))|n>=0}

(2)

该文法的一个句子是aab*+,它的语法树是:

b

⑶证明:

G[]的句型,并指出该句型的所有短语、直接短语和句柄。

由于下面的语法树可以生成]的句型。

由于=>=>所以的短语,也是相对于规则

由于=>=>

所以

的短语。

显然,句型

14.给出生成下述语言的上下文无关文法:

nnmm

(1){abab|n,m>=0}

nmmn

(2){1010|n,m>=0}

(3){WaW|W属于{0|a},W表示W的逆}

解:

(1)所求文法为G[S]=({S,A},{a,b},P,S),其中P为:

SAA

AaAb|e

(2)所求文法为G[S]=({S,A},{0,1},P,S),其中P为:

S1S0|A

A0A1|e

*

(3)W属于{0|a}是指W可以的取值为{e,0,a,00,a0,aa0,00aa,a0a0,…}

t

如果W=aa0a00则W=00a0aa。

所求文法为G[S]=({S,P,Q},{0,a},P,S),其中P为:

S0S0|aSa|a

nmnm

15.语言{WaW和{abcd}是上下文无关的吗?

能看出它们反映程序设计语言的什么特性吗?

答:

生成语言{WaW的文法非常简单,如

G[S]:

SWaW

WaW|bW|e

可见G[S]是上下文无关的。

生成语言{anbmcnd"}的文法非常复杂,用上下文无关文法不可能办到,只能用上下文有关文法。

这是因为要在ancn的中间插入「而同时要在其后面插入dm。

即a,c相关联,b,d相关联。

这说明对语言的限定越多(特别是语言中的符号前后关联越多),生成它的文法越复杂,甚至于很难

找到一个上下文法无关文法。

16.给出生成下述语言的三型文法:

(1){an|n>=0}

(2){anbm|n,m>=1}

(3){anbmck|n,m,k>=0}

解:

(1)生成的3型文法是:

G[S]:

SaS|&

(2)生成的2型文法是:

G[S]:

SAB

AaA|a

BbB|b生成的3型文法是:

G[S]:

SaP

PaP|bD

DbD|&

(3)生成的2型文法是:

G[S]:

SABC

AaA|&

BbB|&

C->cC|&生成的3型方法是:

G[S]:

AaA|bB|cC|&

BbB|cC|&

CcC|&

第四章词法分析

1构造下列正规式相应的DFA

(1)1(0⑴*101

(2)1(1010*|1(010)*1)*0

(3)a((a|b)*|ab*a)*b

(4)b((ab)*|bb)*ab

解:

(1)1(0|1)*101对应的NFA为

 

F表由子集法将NFA转换为DFA

I

10=&closure(MoveTo(l,0))

I1=&closure(MoveTo(l,1))

A[0]

B[1]

B[1]

B[1]

C[1,2]

C[1,2]

D[1,3]

C[1,2]

D[1,3]

B[1]

E[1,4]

E[1,4]

B[1]

B[1]

F表由子集法将NFA转换为DFA

I

10=&closure(MoveTo(l,0))

I1=&closure(MoveTo(l,1))

A[0]

B[1,6]

B[1,6]

C[10]

D[2,5,7]

C[10]

D[2,5,7]

E[3,8]

B[1,6]

E[3,8]

F[1,4,6,9]

F[1,4,6,9]

G[1,2,5,6,9,10]

D[2,5,7]

G[1,2,5,6,9,10]

H[1,3,6,9,10]

I[1,2,5,6,7]

H[1,3,6,9,10]

J[1,6,9,10]

K[2,4,5,7]

I[1,2,5,6,7]

L[3,8,10]

I[1,2,5,6,7]

J[1,6,9,10]

J[1,6,9,10]

D[2,5,7]

K[2,4,5,7]

M[2,3,5,8]

B[1,6]

L[3,8,10]

F[1,4,6,9]

M[2,3,5,8]

N[3]

F[1,4,6,9]

N[3]

O[4]

O[4]

P[2,5]

P[2,5]

N[3]

B[1,6]

F表由子集法将NFA转换为DFA

I

10=&closure(MoveTo(l,0))

I1=&closure(MoveTo(l,1))

A[x]

B[z]

A[x]

B[z]

C[x,z]

D[y]

C[x,z]

C[x,z]

E[x,y]

D[y]

E[x,y]

E[x,y]

F[x,y,z]

A[x]

F[x,y,z]

F[x,y,z]

E[x,y]

1

F面将该DFA最小化:

(1)首先将它的状态集分成两个子集:

R={A,D,E},P2={B,C,F}

(2)区分P2:

由于F(F,1)=F(C,1)=E,F(F,0)=F并且F(C,O)=C,所以F,C等价。

由于F(B,O)=F(C,O)=C,F(B,1)=D,F(C,1)=E,而D,E不等价(见下步),从而B与C,F可以区分。

有P21={C,F},P22={B}。

⑶区分P1:

由于A,E输入0到终态,而D输入0不到终态,所以D与A,E可以区分,有Pn={A,E},P12={D}

(4)由于F(A,0)=B,F(E,0)=F,而B,F不等价,所以A,E可以区分。

⑸综上所述,DFA可以区分为P={{A},{B},{D},{E},{C,F}}。

所以最小化的DFA如下:

 

3•将图4.16确定化:

解:

下表由子集法将NFA转换为DFA

I

10=&closure(MoveTo(l,0))

I1=&closure(MoveTo(l,1))

A[S]

B[Q,V]

C[Q,U]

B[Q,V]

D[V,Z]

C[Q,U]

C[Q,U]

E[V]

F[Q,U,Z]

D[V,Z]

G[Z]

G[Z]

E[V]

G[Z]

F[Q,U,Z]

D[V,Z]

F[Q,U,Z]

G[Z]

G[Z]

G[Z]

 

4.把图4.17的⑻和(b)分别确定化和最小化:

(b)

解:

(a):

A,然后删除B所在的行。

I

Ia=gclosure(MoveTo(l,a))

Ib=&closure(MoveTo(l,b))

A[0]

B[0,1]

C[1]

B[0,1]

B[0,1]

C[1]

C[1]

A[0]

下表由子集法将

NFA转换为DFA

可得图(a1),由于F(A,b)=F(B,b)=C,并且F(A,a)=F(B,a)=B,所以A,B等价,可将DFA最小化,即:

删除

B,将原来引向B的引线引向与其等价的状态A,有图(a2)。

(DFA的最小化,也可看作将上表中的B全部替换为

(b):

该图已经是DFA下面将该DFA最小化:

(6)首先将它的状态集分成两个子集:

Pi={O},P2={1,2,3,4,5}

(7)区分P2:

由于F(4,a)=0属于终态集,而其他状态输入a后都是非终态集,所以区分F2如下:

P2i={4},P22={1,2,3,5}。

(8)区分P22:

由于F(1,b)=F(5,b)=4属于P21,而F(2,b)与F(3,b)不等于4,即不属于P2i,所以区分P22如下:

P221={1,5},P222={2,3}。

(9)区分P221:

由于F(1,b)=F(5,b)=4,即F(1,a)=1,F(5,a)=5,所以1,5等价。

(10)区分P222:

由于F(2,a)=1属于P221,而F(3,a)=3属于氐,所以2,3可区分。

P222区分为P2221{2},P2222Q}

(11)结论:

该DFA的状态集可分为:

P={{0},{1,5},{2},{3},{4}},其中1,5等价。

删去状态5,将原来

引向5的引线引向与其等价的状态1,有图(b1)。

(b1)最小化的DFA

5•构造一个DFA它接收艺={0,1}上所有满足如下条件的字符串:

每个1都有0直接跟在右边。

然后再构造

该语言的正则文法。

解:

根据题意,DFA所对应的正规式应为:

(0|(10))*。

所以,接收该串的NFA如下:

0

F表由子集法将NFA转换为DFA

I

10=&closure(MoveTo(l,0))

I1=&closure(MoveTo(l,1))

A[0]

B[0,2]

C[1]

B[0,2]

B[0,2]

C[1]

C[1]

B[0,2]

 

 

对应的正规文法为:

G[A]:

A1C|0A|£

C0A

6•设无符号数的正规式为e:

e=dd*|dd*.dd*|.dd*|dd*e(s|&)dd*|e(s|&)dd*|.dd*e(s|&)dd*|dd*.dd*e(s|&)dd

化简e,画岀e的DFA其中d={0,1,2,…9},s={+,-}

解:

把原正规式的每2,3项,4,5项,6,7项分别合并后化简有:

e=dd*|d*.dd*|d*e(s|&)dd*|d*.dd*e(s|&)dd*

=dd*|d*.dd*|(d*|d*.dd*)e(s|&)dd*

=(£|d*.|(d*|d*.dd*)e(s|&))dd*

=(£|d*.|d*(£|.dd*)e(s|£))dd*

 

F表由子集法将NFA转换为DFA

I

Id=£-closure(MoveTo(l,d))

Ie=£-closure(MoveTo(I,e))

Is=£-closure(MoveTo(l,s))

I.=£-closure(MoveTo(I,.))

A[0,1,4,6]:

B[1,7]

C[5,6]

rD[2,6]

B[1,7]

B[1,7]

D[2,6]

C[5,6]

E[7]

F[6]

D[2,6]

G[3,4,7]

E[7]

E[7]

F[6]厂

E[7]

G[3,4,7]

G[3,4,7]

C[5,6]

 

7•给文法G[S]:

SaA|bQ

AaA|bB|b

BbD|aQ

QaQ|bD|b

DbB|aA

EaB|bF

FbD|aE|b

构造相应的最小的DFA

解:

由于从S岀发任何输入串都不能到达状态E和F,所以,状态E,F为多余的状态,不予考虑。

这样,可以

写岀文法G[S]对应的NFA

 

F表由子集法将NFA转换为DFA

I

Ia=&closure(MoveTo(l,a))

Ib=&closure(MoveTo(l,b))

1[S]

2[A]

3[Q]

2[A]

2[A]

4[B,Z]

3[Q]

3[Q]

5[D,Z]

4[B,Z]

3[Q]

6[D]

5[D,Z]

2[A]

7[B]

6[D]

2[A]

7[B]

7[B]

3[Q]

6[D]

由上表可知:

(1)因为4,5是DFA的终态,其他是非终态,可将状态集分成两个子集:

Pi={1,2,3,6,7},P2={4,5}

⑵在R中因为2,3输入b后是终态,而1,6,7输入b后是非终态,所以P可区分为:

Pii={1,6,7},P12={2,3}

⑶在P11中由于1输入b后为3,6输入b后为7,而3,7分属Pn和P©所以1与6不等价,同理,1与7不等价。

所以P11可区分为:

Pm={1},Ph2={6,7}

⑷查看P112={6,7},由于输入a后为2,3,所以6,7是否等价由2,3是否等价决定。

⑸查看P12={2,3},由于输入b后为4,5,所以2,3是否等价由4,5是否等价决定。

(6)查看P2={4,5},显然4,5是否等价由2,3与6,7是否同时等价决定。

由于有(4)即6,7是否等价由2,3是否等价决定,所以,4,5是否等价由2,3是否等价决定。

由于有(5)即2,3是否等价由4,5是否等价决定,所以有4,5等价,2,3等价,进而6,7也等价。

(7)删除上表中的第3,5,7行,并将剩余行中的3,5,7分别改为对应的等价状态为2,4,6有下表:

I

Ia

Ib

1[S]

2[A]

2[A]

2[A]

2[A]

4[B,Z]

4[B,Z]

2[A]

6[D]

6[D]

2[A]

6[D]

这样可得最小化的DFA如下:

a

8•给岀下述文法所对应的正规式:

S0A|1B

A1S|1

B0S|0

解:

把后两个产生式代入第一个产生式有:

S=01|01S

S=10|10S

有:

S=01S|10S|01|10=(01|10)S|(01|10)=(01|10)即:

(01|10)*(01|10)为所求的正规式。

4.18

9•将图

解:

(1)

(5)

因为

7}。

由于

由于

由于

(01|10)

的DFA最小化,并用正规式描述它所识别的语言:

b

b

b

a

4

图4.18

6,7是DFA的终态,其他是非终态,可将状态集分成两个子集:

P1={1,2,3,4,5},P2={6,

F(6,b)=F(7,b)=6,而6,7又没有其他输入,所以6,7等价。

F(3,c)=F(4,c)=3,F(3,d)=F(4,d)=5,F(3,b)=6,F(4,b)=7,而6,

F(1,b)=F(2,b)=2,F(1,a)=3,F(2,a)=4,而3,4等价,所以1,2等价。

7等价,所以3,4等价。

由于状态5没有输入字符b,所以与1,2,3,4都不等价。

综上所述,上图DFA的状态可最细分解为:

P={{1,2},{3,4},{5},{6,7}}。

b

该DFA用正规式表示为:

b*a(c|da)*bb

 

10•构造下述文法G[S]的自动机:

SA0

AA0|S1|0

该自动机是确定的吗?

若不确定,则对它确定化。

该自动机相应的语言是什么?

解:

由于该文法的产生式SA0,AA0|S1中没有字符集Vt的输入,所以不是确定的自动机。

要将其他确定化,

必须先用代入法得到它对应的正规式。

把SA0代入产生式AS1有:

A=A0|A01|0=A(0|01)|0=0(0|01)*。

代入

SA0有该文法的正规式:

0(0|01)*0,所以,改写该文法为确定的自动机为:

由于状态A有3次输入0的重复输入,所以上图只是NFA,下面将它确定化:

F表由子集法将NFA转换为DFA

I

10=&closure(MoveTo(l,0))

Ib=&closure(MoveTo(l,1))

A[W]

B[X]

B[X]

C[X,Y,Z]

C[X,Y,Z]

C[X,Y,Z]

B[X]

由上表可知DFA为:

 

第五章自顶向下语法分析方法

1.对文法G[S]

Sa|A|(T)

TT,S|S

(1)给出(a,(a,a))和(((a,a),A,(a)),a)的最左推导。

(2)对文法G,进行改写,然后对每个非终结符写岀不带回溯的递归子程序。

(3)经改写后的文法是否是LL

(1)的?

给出它的预测分析表。

(4)给岀输入串(a,a)#的分析过程,并说明该串是否为G的句子。

解:

(1)(a,(a,a))

的最左推导为

S(T)

(T,S)(S,S)

(a,(T))

(a,(T,S))

(a,(S,a))

(a,(a,a))

(((a,a),

A,(a)),a)的最左推导为

S(T)

(T,S)(S,a)

((T),a)

((T,S),a)

((T,S,S),a)

((S,

A,(T)),a)

(((T),A,(S)),a)

(((T,S),A,(a)),a)

(((S,a),

A,(a)),a)

(((a,a),

A,(a)),a)

⑵由于有TT,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G[S]:

Sa|A|(T)

TSU

U,SU|£

分析子程序的构造方法对满足条件的文法按如下方法构造

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

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

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

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