编译原理34.docx

上传人:b****5 文档编号:7813704 上传时间:2023-01-26 格式:DOCX 页数:27 大小:28.55KB
下载 相关 举报
编译原理34.docx_第1页
第1页 / 共27页
编译原理34.docx_第2页
第2页 / 共27页
编译原理34.docx_第3页
第3页 / 共27页
编译原理34.docx_第4页
第4页 / 共27页
编译原理34.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

编译原理34.docx

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

编译原理34.docx

编译原理34

第三章

P67

e

1.解:

Z

其状态图为:

starte

由状态图知:

f,eeff不是合法的句子

eefe是该文法的句子。

2.解:

⑴正则文法为G[Z]:

Z∷=A1∣0A∷=A0∣0

⑵该文法的V={Z,A,1,0}Vn={Z,A}Vt={1,0}

⑶该文法所确定的语言为:

L﹙G[Z]﹚={0n1或0∣n≥1}

5.证明:

⑴A∣A={x∣x∈LA或x∈LA}={x∣x∈LA}=A

⑵(A*)*=(A*)0∪(A*)1∪(A*)2∪…∪(A*)n

=ε∪(A0∪A1∪A2∪…∪An)∪(A1…)=ε∪A0∪A1∪A2∪…∪An

=A

⑶ε︱AA*所表示的语言是{ε}∪LA·LA*=LA0∪LA(LA0∪LA1∪LA2∪…)

=LA0∪LA1∪LA2∪…=LA*

故ε︱AA*=A*

⑷(LALB)*LA=({ε}∪LALB∪LALBLALB∪LALBLALBLALB∪…)LA

=LA∪LALBLA∪LALBLALBLA∪LALBLALBLALB∪LA…

=LA∪({ε}∪LBLA∪LBLALBLA∪…)

=LA(LBLA)

∴(AB)*=A(AB)*

⑸三个表达式所描述的语言都是LALA中任意组合

P2

∴(A|B)*=(A*B*)=(A*|B*)*

start

6.解:

⑴R1=0︱1对应的自动机为

P3

ε

start

1

(R1)*=(0|1)*对应的自动机为M2’

 

将M2’确定化

状态输入

ε

0

1

P0

{P1,P3}

φ

φ

P1

φ

{P2}

{P2}

P2

{P1,P3}

φ

φ

P3

φ

φ

φ

 

I

I0

I1

(空)

状态输入

0

1

{P0,P1,P3}

{P1,P2,P3}

{P1,P2,P3}

P0’

P1’

P1’

{P1,P2,P3}

{P1,P2,P3}

{P1,P2,P3}

P1’

P1’

P1’

(注:

上图中的(空)列表示没有该列。

即上图为两个独立的表)

P1

状态转换图为:

0,1

简化为:

1

 

∴R=1(0|1)*|0的DFAM为:

 

⑵R1=1010*|1(010)*1对应的DFAM为:

q8

 

S13

R2=(1010*|1(0|0)*1)*对应的DFAM为:

0

start

 

S9

 

P11

对应R=1(1010*|1(010)*1)*0的DFAM为:

P14

P9

0

1

8.解:

(a)

I

Ia

Ib

{0}

{0,1}

{1}

{0,1}

{0,1}

{1}

{1}

{0}

φ

∴DFA的状态转换矩阵为:

状态输入

a

b

q0

q1

q2

q1

q1

q2

q2

q0

φ

化简:

p0=q0=q1p1=q2

a

状态图为:

b

a

start

P1

P0

10.解:

它所识别的语言为:

(1010)*

第四章语法分析

P80

1.解:

(见课本)

2.解:

文法有左递归,故先改写文法:

error

A

A∷=(B)|dBeB∷=c{c}

下面给出两个分析子程序的框图:

Sym=’c’(?

B

Y

Y

Y

N

Y

两分析子程序如下:

procedureA;

IFsym=’(‘THEN

Begin

Nextsym;

B;

Ifsym=’)’Then

Nextsym;

Else

Error

End;

ELSE

Ifsym=’d’Then

Begin

Nextsym;

B;

ifsym=’e’then

Nextsym

else

Error

End;

Else

Error;

 

ProcedureB;

IFsym=’c’THEN

Begin

Nextsym;

Whilesym=’c’do

Nextsym

End

ELSE

Error;

/*程序中nextsym为读字符子程序,error为出错处理子程序*/

/*主程序*/

programG;

VARsym:

CHAR;

BEGIN

Nextsym;

A;

END

3.解:

(1)。

FIRST(AcB)={c}FIRST(Bd)={a}

FIRST(AaB)={c}FIRST(c)={c}

FIRST(aA)={a}FIRST(a)={a}

(2).

若用不带回溯的自顶向下的语法分析程序,必须改写文法:

Z∷=AcB|BdA∷=c{aB}B∷=a[A]

因为调用分析子程序A的过程中,调用了B子程序,在B中又调用了A,相当于A间接的调用了A,所以该文法应编写成递归子程序。

(3).三个分析子程序框图如下:

 

A

Z

Y

Y

Sym=’c’(?

errror

Y

nextsym

Sym=’a’(?

N

Y

B

B

三个分析子程序为:

procedureZ;

ifsym=’c’then

begin

A;

Ifsym=’c’then

B;

Else

Error

End;

Else

Ifsym=’a’then

Begin

B;

Ifsym=’d’then

Nextsym;

Else

Error

End;

Else

Error;

ProcedureA;

Ifsym=’c’then

Begin

Nextsym;

Whilesym=’a’do

B;

End;

Else

Error;

ProcedureB;

Ifsym=’a’then

Begin

Nextsym;

Ifsym=’c’then

A;

End;

Else

Error;

P87

1.解:

(1)FIRST(P)={(,a,b,∧)}FOLLOW(E)={#,)}

FIRST(F’)={﹡,ε}FOLLOW(E’)={#,)}

FIRST(F)={(,a,b,∧)}FOLLOW(T)={#,),+}

FIRST(T’)={(,a,b,∧,ε)}FOLLOW(T’)={#,),+}

FIRST(T)={(,a,b,∧)}FOLLOW(F)={(,a,b,∧),+,#}

FIRST(E’)={+,ε}FOLLOW(F’)={(,a,b,∧),+#}

FIRST(E)={(,a,b,∧)}FOLLOW(P)={(,a,b,∧),+,#,*}

(2)证明:

对于E’→+E|ε

FIRST(+E)={+}FIRST(ε)={ε}FOLLOW(E’)={#,}}

∵FIRST(+E)∩FIRST(ε)=ФFIRST(+E)∩FOLLOW(E’)=Ф

对于T’→T|ε

FIRST(T)∩FOLLOW(T’)=Ф

对于F’*F’|ε

FIRST(*F’)∩FOLLOW(F’)=Ф

对于P(E)|a|b|∧

FIRST((E))={()FIRST(a)={a}FIRST{b}={b}FIRST{∧}={∧}

∴根据LL

(1)文法的充要条件可以断定该文法是LL

(1)文法.

(3).构造其分析表如下:

a

b

*

+

#

E

ETE’

ETE’

ETE’

ETE’

E’

E’ε

E’+E

E’ε

T

TFT’

TFT’

TFT’

TFT’

T’

T’T

T’T

T’T

T’T

T’ε

T’ε

T’ε

F

FPF’

FPF’

FPF’

FPF’

F’

F’ε

F’ε

F’ε

F’ε

F’ε

F’*F’

F’ε

F’ε

P

Pa

Pb

P∧

P(E)

(注:

空白处均为ERROR)

2解:

(2)FIRST(aABbcd)={a};FIRST()={};

FIRST(Asd)={a,d};FRIST(SAh)={a,h};

FIRST(eC)={e};FRIST(Sf)={a,f};

FIRST(Cg)={g,a,f};FRITS(aBD)={a};

(3)对于CSf|Cg,FIRST(Sf)∩FIRST(Cg)={a,f}

此文法不是LL

(1)文法。

6.解:

一个文法是文法的充要条件是:

∨A€Vn,A的任何两条不同的规则A:

:

=α|β

有下列条件成立:

*

①FIRST(α)∩FIRST(β)=Φ

②β=>ε,则FIRST(α)∩FOLLOW(A)=Φ

证明:

充分性:

*

对于任意非终结符A若A:

:

=α|β满足上述条件,取分析表项M[A,a],a€Vt

若A=>a…假设α=>a…即a€FIRST(α)

∵FIRST(α)FIRST(β)=Φ

*

∴a€FIRST(β)分析表项M[A,a]=A:

:

若β=>ε,且a€FOLLOW(A)a€FIRST(α)

M[A,a]=A:

:

=ε否则M[A,a]=error

综上,分析表的元素无多重定义,符合LL

(1)文法定义,是LL

(1)文法

必要性:

令对于LL(!

)文法G的∨A€Vn,A:

:

=α|β条件不成立

FIRST(α)FIRST(β)=B≠φFIRST(α)FIRST(β)=C≠φ

*

若a€β,则M[A,a]中,可同时存在A:

:

=α及A:

:

若β=>ε则M[A,a]中,可同时存在A:

:

=αA:

:

=ε两条规则

这与定义相矛盾,假设错误

必要性得证。

 

P100

2.

(2)

解:

步骤

对象栈

算符栈

关系

读入符号

符号串

0

#

a+b*(c+d)-e#

1

#

a

+b*(c+d)-e#

2

a

#

+

b*(c+d)-e#

3

a

#+

b

*(c+d)-e#

4

ab

#+

*

(c+d)-e#

5

ab

#+*

c+d)-e#

6

ab

#+*(

c

+d)-e#

7

abc

#+*(

+

d)-e#

8

abc

#+*(+

d

)-e#

9

abcd

#+*(+

-e#

10

abf

#+*(

-e#

11

abf

#+*

-

e#

12

ag

#+

-

e#

13

h

#

-

e#

14

h

#-

e

#

15

he

#-

#

16

t

#

#

所以,a+b*(c+d)-e是文法的合法句子。

3.解:

procedureINSERT(u,a)

ifnotL[u,a]then

begin

L[u,a]:

=true;

将(u,a)压入栈STACK

end;

programMAIN;

begin

for每个非终结符U和终结符ado

L[u,a]:

=false;

For每条形如U:

:

=…a或U:

:

=…aV规则do

INSERT(U,a);

WhileSTACK非空DO

Begin

将STACK栈顶弹出,记为(V,a);

for每条形如U:

:

=…V规则do

INSERT(U,a);

End;

End

4.

短语素短语

E无无

TT无

iii

T*FT*FT*F

F*FF*F,FF*F

i*Fi*F,ii

F*iF*i,F,ii

F+F+FF+F+F,F+F,FF+F

 

5.

步骤

符号栈

优先关系

读入符号

符号串

0

#

#

i

i

+i#

1

#i

#

i

+

+

i#

2

#N

#

+

+

i#

3

#N+

+

i

i

#

4

#N+i

+

i

#

#

5

#N+N

#

+

#

#

6

#N

接受

所以i+i是符合文法的句子。

步骤

符号栈

优先关系

读入符号

符号串

0

#

#

i

i

*(i*i)#

1

#i

#

i

*

*

(i*i)#

2

#N

#

*

*

(i*i)#

3

#N*

*

i*i)#

4

#N*(

i

i

*i)#

5

#N*(i

i

*

*

i)#

6

#N*(N

*

*

i)#

7

#N*(N*

*

i

i

)#

8

#N*(N*i

*

i

#

9

#N*(N*N

i

#

10

#N*(N

#

11

#N*(N)

*

#

#

12

#N*N

#

*

#

#

13

#N

接受

 

P104

1.

(a)

(1)E+F*i#=>E+i*i#

所以活前缀的集合为{E,E+,E+i}

(2)E+P↑T#=>E+P↑P#=>E+P↑F#=>E+P↑(E)#=>E+P↑(E+T)#=>E+P↑(E+P)#=>

E+P↑(E+F)#=>E+P↑(E+i)#=>E+P↑(T+i)#=>E+P↑(P+i)#=>E+P↑(F+i)#=>

E+P↑(i+i)#

 

(b)

(1)i+i*i#的最右推导逆过程如下:

i+i*i#-->F+i*i#-->P+i*i#-->T+i*i#-->E+i*i#-->E+F*i#-->E+P*F#-->

E+P#-->E+T#-->E#

(2)i+i↑(i+i)#的最右推导的逆过程如下:

i+i↑(i+i)#-->F+i↑(i+i)#-->P+i↑(i+i)#-->T+i↑(i+i)#-->E+i↑(i+i)#-->E+F↑(i+i)#-->E+P↑(i+i)#-->E+P↑(F+i)#-->E+P↑(P+i)#-->

E+P↑(T+i)#-->E+P↑(E+i)#-->E+P↑(E+F)#-->E+P↑(E+P)#-->E+P↑(E+T)#-->E+P↑(E)#-->E+P↑F#-->E+P↑T#-->E+T#-->E#

2.

(1)

步骤

栈内容

输入串

活前缀

句柄

0

0

i+i-i#

1

0i3

+i-i#

i

i

2

0T2

+i-i#

T

T

3

0E1

+i-i#

E

4

0E1+6

i-i#

E+

5

0E1+6i3

-i#

E+i

i

6

0E1+6T8

-i#

E+T

E+T

7

0E1

-i#

E

8

0E1-7

i#

E-

9

0E1-7i3

#

E-i

i

10

0E1-7T9

#

E-T

E-T

11

0E1

#

E

12

0E1#5

E#

E#

13

0

接受

所以,i+i-i#为合法输入串。

(2)

步骤

栈内容

输入串

活前缀

句柄

0

0

(i+i)-i#

1

0(4

i+i)-i#

2

0(4i3

+i)-i#

(i

i

3

0(4T2

+i)-i#

(T

T

4

0(4E10

+i)-i#

(E

5

0(4E10+6

i)-i#

(E+

i

6

0(4E10+6i3

)-i#

(E+i

i

7

0(4E10+6T8

)-i#

(E+T

E+T

8

0(4E10

)-i#

(E

9

0(4E10)11

-i#

(E)

(E)

10

0T2

-i#

T

T

11

0E1

-i#

E

12

0E1-7

i#

E-

13

0E1-7i3

#

E-i

i

14

0E1-7T9

#

E-T

E-T

15

0E1

#

E

16

0E1#5

E#

E#

17

0

接受

所以(i+i)-i#为合法输入串。

P108

1.解:

(a)Ø

(b){F→(.E),E→.E-T,E→.T,T→.F,T→.F↑T,F→.i,F→.(E)}

(c){E→E-T.}

2.解:

I0=closure({S.E#})={S.E#,E.wX,E.xY}

I1=goto(I0,E)=closure({SE.#})={SE.#}

I2=goto(I0,w)=closure({Ew.X})={Ew.X,X.yX,X.z}

I3=goto(I0,x)=closure({Ex.Y})={Ex.Y,Y.yY,Y.z}

I4=goto(I1,#)=closure({SE#.})={SE#.}

I5=goto(I2,X)=closure({EwX.})={EwX.}

I6=goto(I2,y)=closure({Xy.X})={Xy.X,X.yX,X.z}

I7=goto(I2,z)=closure({X.z})={Xz.}

I8=goto(I3,Y)=closure({ExY.})={ExY.}

I9=goto(I3,y)=closure({Yy.Y})={YyY.}

I10=goto(I3,z)=closure({Yz.})={Yz.}

I11=goto(I6,X)=closure({XyX.})={XyX.}

I12=goto(I9,Y)=closure({Yy.Y})={Yy.Y}=I9

LR(0)机器为:

y

I0

z

3.解:

步骤

栈内容

输入串

活前缀

句柄

1

0

wyyz#

2

0w2

yyz#

w

2

0w2y6

yz#

wy

3

0w2y6y6

z#

wyy

4

0w2y6y6z7

#

wyyz

z

5

0w2y6y6X11

#

wyyx

yx

6

0w2y6X11

#

wyx

yx

7

0w2X5

#

wx

wx

8

0E1

#

E

9

0E1#4

#

E#

E#

10

0

accept

步骤

栈内容

输入串

活前缀

句柄

0

0

xyyyz#

1

0x3

yyyz#

x

2

0x3y9

yyz#

xy

3

0x3y9y9

yz#

xyy

4

0x3y9y9y9

z#

xyyy

5

0x3y9y9y9z10

#

xyyyz

z

6

0x3y9y9y9Y12

#

xyyyY

yY

7

0x3y9y9Y12

#

xyyY

yY

8

0x3y9Y12

#

xyY

yY

9

0x3Y8

#

xY

xY

10

0E1

#

E

11

0E1#4

#

E#

E#

12

0

accept

P116

1.给定下列产生式的文法:

S→E#E→T|E+TT→P|T*PP→F|F↑PF→i|(E)

(a)为该文法构造LR(0)机器。

(b)证明该文法是SLR

(1)。

(c)为该文法构造SLR

(1)分析表。

解:

(a)构造LR(0)机器

C0:

{S→.E#,E→.T,E→.E+T,T→.P,T→.T*P,P→.F,P→.F↑P,F→.i,F→.(E)}

C1:

{S→E.#,E→E.+T}

C2:

{E→T.,T→T.*P}

C3:

{T→P.}

C4:

{P→F.,P→F.↑P}

C5:

{F→i.}

C6:

{F→(.E),E→.T,E→.E+T,T→.P,T→.T*P,P→.F,P→.F↑P,F→.i,F→.(E)}

C7:

{S→E#.}

C8:

{E→E+.T,T→.P,T→.T*P,P→.F,P→.F↑P,F→.i,F→.(E)}

C9:

{T→T*.P,P→.F,P→.F↑P,F→.i,F→.(E)}

C10:

{P→F↑.P,P→.F,P→.F↑P,F→.i,F→.(E)}

C11:

{F→(E.),E→E.+T}

C12:

{E→E+T.,T→T.*P}

C13:

{T→T*P.}

C14:

{P→F↑P.}

C15:

{F→(E).}

(b)对于状态C2:

{E→T.,T→T.*P}

Follow(E)={#,+,>}*不属于Follow(E)

C4:

{P→F.,P→F.↑P}

Follow(P)={#,+,>,*}↑不属于Follow(P)

C12:

{E→E+T.,T→T.*P}

Follow(E)={#,+,>}*不属于Follow(E)

∴该文法构成的分析表不会出现多重定义出口。

它是SLR

(1)文法。

(c)构造分析表为:

状态

S

E

T

P

F

+

*

i

#

C0

C1

C2

C3

C4

S5

S6

C1

S8

S7

C2

r1

S9

r1

r1

C3

r3

r3

r3

r3

C4

r5

r5

S10

r5

r5

C5

r7

r7

r7

r7

r7

C6

C11

C2

C3

C4

S5

S6

C7

A

C8

C12

C3

C4

S5

S6

C9

C13

C4

S5

S6

C10

C14

C4

S5

S6

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

当前位置:首页 > 农林牧渔 > 林学

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

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