编译原理课后答案(第三版蒋立源康慕宁编)_第1页
编译原理课后答案(第三版蒋立源康慕宁编)_第2页
编译原理课后答案(第三版蒋立源康慕宁编)_第3页
编译原理课后答案(第三版蒋立源康慕宁编)_第4页
编译原理课后答案(第三版蒋立源康慕宁编)_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理课后答案(第三版蒋立源康慕宁编)

第一章习题解答

1解:源程序是指以某种程序设计语言所编写的程序。目标程序是指编译程序(或解释

程序)将源程序处理加工而得的另一种语言(目标语言)的程序。翻译程序是将某种语言翻

译成另一种语言的程序的统称。编译程序与解释程序均为翻译程序,但二者工作方法不同。

解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程

序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行

解释、执行,如此反复。即边解释边执行,翻译所得的指令序列并不保存。编译程序的特点

是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行

之。即先翻译、后执行。

2解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间

代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组

成。

3解:C语言的关键字有:autobreakcasecharconstcontinuedefaultdodoubleelse

enumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedef

unionunsignedvoidvolatilewhile。上述关键字在C语言中均为保留字。

4解:C语言中括号有三种:{},[],()o其中,(}用于语句括号;口用于数组;()用

于函数(定义与调用)及表达式运算(改变运算顺序)。C语言中无END关键字。逗号在C

语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子

表达式的值(如:(a,b,c,d)的值为d)。

5略

第二章习题解答

1.(1)答:26*26=676

(2)答:26*10=260

(3)答:{a,b,c,...,z,a0,al,…,a9,aa,...,az,...,zz,a00,a01,...,zzz},共26+26*36+26*36*36=34658

2.构造产生下列语言的文法

(1){anbnlnNO}

解:对应文法为G(S)=({S},{a,b},{S-elaSb},S)

(2){anbmcpln,m,p20}

解:对应文法为G(S)=({S,X,Y},{a,b,c},{S-aSIX,XfbXIY,Y-cYle),S)

(3){an#bnln^O}U{cn#dnln^O}

解:对应文法为G(S)=({S,X,Y},{a,b,c,d,#},{SfX,S-Y,XfaXbl#,YfcYdl#},S)

(4){w#wr#lw?{0,l}*,wr是w的逆序排列}

解:G(S)=({S,W,R),{O,1,#},{S^W#,W^OWOIlWil#},S)

(5)任何不是以0打头的所有奇整数所组成的集合

解:G(S)=({S,A,B,l,J},{-,0,l,2,3,4,5,6,7,8,9},{SfJIIBJ,BfOBIIBIe,I—JI2I4I6I8,Ja

113151719),S)

(6)所有偶数个0和偶数个1所组成的符号串集合

解:对应文法为S-*OAIlBle,A-OSI1CB^OCIISC-1AIOB

3.描述语言特点

(1)SflOSOSfaAAfbAAfa

解:本文法构成的语言集为:L(G)={(lO)nabmaOnln,m?O}。

(2)SfSSSf1AOA—lAOAfe

解:L(G)={lnl0nlln20n2InmOnmInl,n2,…,nmNO;且nl,n2,…nm不全为零}该语言

特点是:产生的句子中,0、1个数相同,并且若干相接的1后必然紧接数量相同连续的0。

(3)S-*1AS-BOA-1AA-*CB-*BOB-*CC-1C0C-e

解:本文法构成的语言集为:L(G)={1p1nOnlp>1,n>0}U{1nOnOqlq1,n0},特点是具

有IplnOn或InOnOq形式,进一步,可知其具有形式ln0mn,m20,且n+m>0。

(4)SfbAdcAfAGSGfeA-a

解:可知,S=>“=>baSndcn20

该语言特点是:产生的句子中,是以ba开头de结尾的串,月.ba、de个数相同。

(5)SfaSSSfa

解:L(G)={a(2n-l)ln》l}可知:奇数个a

4.解:此文法产生的语言是:以终结符al、a2-an为运算对象,以A、V、~为运算符,

以卜]为分隔符的布尔表达式串

5.5.1解:由于此文法包含以下规则:AA—e,所以此文法是0型文法。

5.2证明:略

6.解:

(1)最左推导:

(程序>T<分程序>T<标号>:〈分程序〉TL:〈分程序〉

TL:<标号>:<分程序)

TL:L:〈分程序〉

TL:L:〈无标号分程序〉

TL:L:〈分程序首部〉;〈复合尾部〉

TL:L:〈分程序首部〉;〈说明〉:〈复合尾部)

TL:L:beginc说明〉;〈说明〉;〈复合尾部〉

TL:L:begind;〈说明〉;〈复合尾部〉

TL:L:begind;d;〈复合尾部〉

TL:L:begind;d;<语句>;〈复合尾部〉

TL:L:begind;d;s;〈复合尾部.

TL:L:begind;d;s;<语句〉end

TL:L:begind;d;s;send

最右推导:

〈程序>T<分程序>T<标号>:〈分程序〉

T〈标号〉:〈标号〉:〈分程序〉

T〈标号〉:〈标号〉:〈无标号分程序〉

Tv标号〉:〈标号〉:〈分程序首部〉;〈复合尾部〉

Tv标号>:<标号》:〈分程序首部〉;〈语句〉;〈复合尾部〉

Tv标号〉:〈标号〉:〈分程序首部〉;〈语句〉;〈语句〉;end

T<标号>:<标号>:〈分程序首部〉;〈语句〉;s;end

Tv标号>:<标号>:〈分程序首部〉;s;s;end

Tv标号〉:〈标号〉:〈分程序首部〉;说明;s;s;end

Tv标号〉:〈标号〉:〈分程序首部》;d;s;s;end

1<标号〉:〈标号》:begin说明;d;s;s;end

Tv标号〉:〈标号〉:begind;d;s;s;end

Tv标号〉:L:begind;d;s;s;end

TL:L:begind;d;s;s;end

(2)句子L:L:begind;d;s;send的相应语法树是:

7.解:

aacb是文法G[S]中的句子,相应语法树是:

最右推导:S=>aAcB=>aAcb=>aacb

最左推导:S=>aAcB=>aacB=>aacb

(2)aabacbadcd不是文法G[S]中的句子

因为文法中的句子不可能以非终结符d结尾

(3)aacbccb不是文法G[S]中的句子

可知,aacbccb仅是文法G[S]的一个句型的一部分,而不是一个句子。

(4)aacabcbcccaacdca不是文法G[S]中的句子

因为终结符d后必然要跟终结符a,所以不可能出现…de…这样的句子。

(5)aacabcbcccaacbca不是文法G[S]中的句子

由(1)可知:aacb可归约为S,由文法的产生式规则可知,终结符c后不可能跟非终结符

S,所以不可能出现…caacb…这样的句子。

8.证明:用归纳法于n,n=l时,结论显然成立。设n=k时,对于a1a2...akT*b,存在Bi:

i=l,2,..,k,aiT*bi成立,现在设

aIa2...akak+lT*b,因文法是前后文无关的,所以a1a2...ak可推导出b的一个前缀

b',ak+1可推导出b的一个后缀=b”(不妨称为bk+1)。由归纳假设,对于b',存在Bi:

i=l,2,..,k,b'=B1B2...Bk,使得

aiT*bi成立,另外,我们有ak+lT*b"(=bk+1)。即n=k+l时亦成立。证毕。

9.证明:(1)用反证法。假设a首符号为终结符时,8的首符号为非终结符。即设:a=a3;

6=A3,月.a=>*0。

由题意可知:a=a3T…TA。,=B,由于文法是CFG,终结符a不可能被替换空串或非

终结符,因此假设有误。得证;

(2)同(1),假设:B的首符号为非终结符时,a首符号为终结符。即设:a=a3;B=A

3,且a=a3T…TA3'=6,与(1)同理,得证。

10.证明:因为存在句子:abc,它对应有两个语法树(或最右推导):

STABTAbeTabe

STDCTDcTabc

所以,本文法具有二义性。

11.解:

(1)STABTAaSbTAacbTbAacbTbbAacbTbbaacb

上面推导中,下划线部分为当前句型的句柄。对应的语法树为:

全部的短语:

第一个231)是句子此222相对于非终结符人(人1)(产生式人?2)的短语(直接短语);

blal是句子bbaacb相对于非终结符A2的短语:

b2blal是句子bbaacb相对于非终结符A3的短语;

c是句子bbaacb相对于非终结符S1(产生式S?c)的短语(直接短语);

a2cb3是句子bbaacb相对于非终结符B的短语;

b2blala2cb3是句子bbaacb相对于非终结符S2的短语;

注:符号的下标是为了描述方便加上去的。

(2)句子(((b)a(a))(b))的最右推导:

ST(AS)T(A(b))T((SaA)(b))T((Sa(a))(b))

T(((b)a(a))(b))

相应的语法树是:

(3)解:iii*i+t对应的语法树略。

最右推导:ETT=>F=>FPtTFEtTFET+tTFEF+tTFEP+tTFEi+t

TFTi+tTFTF*i+tTFTP*i+tTFTi*i+tTFFi*i+tTFPi*i+t

TFii*i+tTPii*i+tTiii*i+t

12.证明:

充分性:当前文法下的每一符号串仅有一个句柄和一个句柄产生式T对当前符号串有唯一

的最左归约T对每一步推导都有唯一的最右推导T有唯一的语法树。

必要性:有唯一的语法树T对每一步推导都有唯一的最右推导T对当前符号串有唯一的最

左归约T当前文法下的每一符号串仅有一个句柄和一个句柄产生式

13.化简下列各个文法

⑴解:S-bCACdA-cSAIcCCC-cSIc

(2)解:S-aABIfAIgA-eIdDAD-eAB-*f

(3)解:S-ac

14.消除下列文法中的e产生式

(1)解:S-aASIaSIbA-cS

⑵解:S-aAAIaAIaA-bAcIbeIdAelde

15.消除下列文法中的无用产生式和单产生式

(1)消除后的产生式如R

SfaBIBC

B-DBlb

C-b

D-bIDB

(2)消除后的产生式如下:

S-SAISBI()I(S)l[]I[S1

Af()l(S)l[]l[S]

Ba[]l[S]

(3)消除后的产生式如F:

E^E+TIT*FI(E)IPtFIi

TfT*FI(E)IPtFIi

F-PtFI(E)Ii

P-(E)Ii

第三章习题解答

1.从略

2.

3假设W:表示载狐狸过河,G:表示我山羊过河,C:表示载白菜过河

用到的状态1:狐狸和山羊在左岸2:狐狸和白菜载左岸3:羊和白菜在左岸4:狐狸和山羊在

右岸5:狐狸和白菜在右岸6:山羊和白菜在右岸F:全在右岸

4证明:只须证明文法G:AfaB或A-a(A,BGVN,aGVT+)

等价于GLAfaB或Afa(aGVT+)

G1的产生式中A-aB,贝B也有B-bC,C-cD….

所以有Afabb“B',a,b,b“GVT,B'eVN

所以与G等价。

2)G的产生式A-oB,aCVT+,因为a是字符串,所以肯定存在着一个终结符a,使A

faB

可见两者等价,所以山此文法产生的语言是正规语言。

5

6根据文法知其产生的语言是

L={ambncilm,n,i=1}

可以构造如下的文法VN={S,A,B,C},VT={a,b,c}

P={S-aA,AfaA,A-*bB,B-*bB,B-cC,C-*cC,C-c}

其状态转换图如下:

7(1)其对应的右线性文法是:

A-OD,B—OA,B-1C,C—WF,CfllOA,FfOlOEIlAQfOBIlC,Ef1CI0B

⑵最短输入串Oil

(3)任意接受的四个串

011,0110,0011,000011

(4)任意以1打头的串.

8从略。

9

(2)相应的3型文法

(i)S-aAS-bSA-aAA-bBB-alaBB-blbB

(ii)S-aAlaS-bBB-aBIbBA-aBA-*blbA

(iii)S-aAS-bBA-bAA-aCB-aBB-bCC-alaCC-*blbC

(iv)S-bSS-aAA-aCA-bBB-aBB-bCC-alaCC-blbC

(3)用自然语言描述输入串的特征

(i)以任意个(包括0)b开头,中间有任意个(大于1)a,跟一个b,还可以有一个山a,b组成

的任意字符串

(ii)以a打头,后跟任意个(包括0)b

(iii)以a打头,中间有任意个(包括0)b,再跟a,最后由一个a,b所组成的任意串结尾或者

以b打头,中间有任意个(包括0)a,再跟b,最后由一个a,b所组成的任意串结尾

(iv)以任意个(包括0)b开头,中间跟aa最后由一个a,b所组成的任意串结尾或者

以任意个(包括0)b开头,中间跟ab后再接任意(包括0)a再接b,最后由一个a,b所组

成的任意串结尾

10(1)G1的状态转换图:

G2的状态转换图:

(2)G1等价的左线性文法:

SfBb,SfDd,DfC,BfDb,C—Bc,BfAb,Bfe,Afa

G2等价的右线性文法:

SfdD,SfaB,DfC,BfabC,BfbB,BfbA,Bf£,CfcA,Afa

(3)对G1文法,abb的推导序列是:

S=>aA=>abB=>abb

对Gl'文法,abb的推导序列是:

S=>Bb=>Abb=>abb

对G2文法,aabca的推导序列是:

S=>Aa=>Cca=>Babca=>aabca

对G2'文法,aabca的推导序列是:

S=>aB=>aabC=>aabcA=>aabca

(4)对串acbd来说,G1,GT文法都不能产生。

11将右线性文法化为左线性文法的算法:

(1)对于G中每一个形如A-aB的产生式且A是开始符,将其变为B-a,否则若A不是

开始符,B-Aa;

(2)对于G中每一个形如A-a的产生式,将其变为S-Aa

12(1)

状态矩阵是:

记[S]=qO[B]=ql[AB]=q2[SA]=q3,最小化和确定化后如图

(2)记[S]=qO,[A]=ql,[BS]=q2最小化和确定化后的状态转换图如下

13(1)将具有e动作的NFA确定化后,其状态转换图如图:

记{SO,Sl,S3}=qO{Sl}=ql{S2S3}=q2{S3}=q3

⑵记{S}=qO{Z}=ql{UR}=q2{SX}=q3{YUR}=q4{XSU}=q5{YURZ}=q6{ZS)=q7

14(1)从略

(2)化简后SO和SI作为一个状态,S5和S6作为一个状态。

状态转换图如图

15从略。

16从略。

(1)r*表示的正规式集是{e,r,rr,rrr,…}

(elr)*表示的正规式集是{£,££,•••}U{r,rr,rrr,•••}={e,r,rr,rrr,--}

eIrr*表示的正规式集是{e,r,rr,rrr,…}

(r*)*=r*={e,r,rr,nr,…}

所以四者是等价的。

(2)(rs)*r表示的正规式集是{£,rs,rsrs,rsrsrs,…}r={r,rsr,rsrsr,rsrsrsr,…}

r(sr)*表示的正规式集是r{£,sr,srsr,srsrsr/**}={r,rsr,rsrsr,rsrsrsr,••,}

所以两者等价。

18写成方程组

S=aT+aS(l)

B=cB+c(2)

T=bT+bB(3)

所以B=c*cT=b*bc*c

S=a*ab*bc*c

Gl:

S=aA+B⑴

B=cC+b(2)

A=abS+bB⑶

C=D(4)

D=bB+d(5)

把(4)(5)代入(2),得B=c(bB+d)+b=cbB+cd+b得B=(cb)*(cdlb),代入(3)得

A=abS+b(cb)*(cdlb)把它打入(1)得

S=a(abS+b(cb)*(cdlb))+(cb)*(cdlb)

=aabS+ab(cb)*(cdlb)+(cb)*(cdlb)

=(aab)*(ab(cb)*(cdlb)l(cb)*(cdlb))

G2:

S=Aa+B(1)

A=Cc+Bb(2)

B=Bb+a⑶

C=D+Bab(4)

D=d(5)

可得D=dB=ab*C=ab*ablbA=(ab*ablb)c+ab*b

S=(ab*ablb)ca+ab*ba+ab*

=(ab*ablb)calab*balab*

20

识别此语言的正规式是S='LABEL,d(dl,d)*;

从略。

21从略。

22构造NFA

其余从略。

23下面举一个能够识别1,2,3/0,20,100的例子,读者可以推而广之。

%{

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#defineON1

#defineTW2

#defineTHRE3

#defineTE10

#defineTWENT20

#defineHUNDRE100

#defineWHITE9999

%}

upper[A-Z]

%%

ONEreturnON;

TWOreturnTW;

THREEreturnTHRE;

TENretumTE;

TWENTYreturnTWENT;

HUNDREDreturnHUNDRE;

""4-l\tretumWHITE;

\nretumO;

%%

main(intargc,char*argv[])

(

intc,i=0;

chartmp[30];

if(argc==2)

if((yyin=fopen(argv[l],"r"))==NULL)

printf("can'topen%s\n",argv[1]);exit(0);

while((c=yylex())!=0)

(

switch(c)

(

caseON:

c=yylex();

if(c==0)goto{i+=l;label;}

c=yylex();

if(c==HUNDRE)

i+=100;

elsei+=l;

break;

caseTW:c=yylex();

c=yylex();

if(c==HUNDRE)

i+=200;

elsei+=2;

break;

caseTWENT:i+=20;

break;

caseTE:i+=10;

break;

default:break;

)

}/*while*/

label:printf(u%d\nH,i);

return;

}

24(1)Dn表示的正规集是长度为2n任意a和b组成的字符串。

此正规式的长度是2n

用来识别Dn的DFA至多需要2n+l个状态。

25从略。

26(1)由{}括住的,中间山任意个非{组成的字符串,如{},{}},{a},{defg}等等。

(2)匹配一行仅由一个大写字母和一个数字组成的串,如A1,F8,Z2等。

(3)识别\r\n和除数字字符外的任何字符。

由‘和’括住的,中间由两个''或者非'和\n组成的任意次的字符串。如,'a'

bb'Jdef',‘'''''等等

27O[Xx][0-9]*[a-fA-F]*l[0-9]+l(\,(fa-zA-Z]IW[Xx][0-7][0-7a-fA-F]l\\0[01][0-7][0-7]l\\[a-z])\,)

28A[a-zA-ZJ+[0-9]*[a-zA-ZJ*

29参考程序如下:

%{

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#defineUPPER2

#defineWHITE3

%)

upper[A-Z]

%%

{upper}+returnUPPER;

\tln"+returnWHITE;

%%

main(intargc,char*argv[])

(

intc,i;

if(argc==2)

(

if((yyin=fopen(argv[1],nr*'))==NULL)

(

printfC'can^open%s\n",argvf1]);exit(0);

while((c=yylex())!=EOF)

if(c==2)

for(i=O;yytext[i];i++)

printf(H%cH,tolower(yytext[i]));

yytext[0]=,\000';

)

if(c==3)

printf(nn);

elseprintf(n%su,yytext);

}

return;

)

yywrapO

(

return;

)

30从略。

第四章习题参考答案

1.解:

(1)S-(S)Z21I()Z21I[S]Z31l[]Z31

A-(S)Z22I()Z22I[S]Z32I[]Z32

B-*(S)Z23I()Z23I[S]Z33I[]Z33

ZU-eIAZ11IBZ21

Z12-AZ12IBZ22Z13-AZ13IBZ23

Z21-Z11Z22-£IZ12

Z23fzi3Z31-Z21

Z32-Z22Z33fe|Z23

(2)SfbZlllaZ21A-bZ121az22

Zllf£IAZ21Z12-AZ22Z21-SZ21Z22feISZ22

(3)S->(T)Z11laZllIZUS-(T)Z12laZ12IZ12

ZU-£IZ21Z12->Z22Z21-,SZ21Z22-el,SZ22

2.解:

SAbBI』.l(表示第1步,用产生式1.1推导,以下同)

CAbbB2,2.1

edAbbB3,4.1

edCAbbB4,2.1

ededAbbbB5,4.1

edaAbbbB5,4.2(不符合,改写第5步,用4.2)

edBfbbB4,2.2

edCSdfbbB5,3.1

ededSdfbbB6,4.1

edaSdfbbB6,4.2

eddfbbB5,3.2

eddfbbCSd6,3.1

eddfbbedSd7,4.1

eddfbbaSd7,4.2

eddfbbd6,3.2

3.解:以下Save表示savetoken_pointervalue,Restore表示restoretoken_pointervalue。

(1)文法没有左递归。

FunctionP:boolean;

Begin

Save;

P:=true;

Ifnext_token=vbegin”then

Ifnext_token=?d'then

Ifnext_token=';'then

IfXthen

Ifnext_token="end“thenreturn;

Restore;

P:=false;

End;

FunctionX:boolean;

Begin

Save;

X:=true;

Ifnext_token=,d'then

Ifnext_token=';'then

IfXthenreturn;

Restore;

Ifnext_token='s'then

IfYthenreturn;

Restore;

X:=false;

End;

FunctionY:boolean;

Begin

Save;

Y=true;

Ifnext_token=';'then

Ifnext_token='s'then

IfYthenreturn;

Restore;

End;

(2)消去文法左递归,并记为:

P-beginSendS-AICA—V:=EC一ifEthenS

E-VE'E'-*+VE,HV-*I

FunctionP:boolean;

Begin

Save;

P:=true;

Ifnext_token="begin”then

IfSthen

Ifnext_token=end“thenreturn;;

Restore;

P:=false;

End;

FunctionA:boolean;

Beign

Save;

A:=true;

IfVthen

Ifnext_token=n:=wthen

IfEthenreturn;

Restore;

A:=flase;

End;

FunctionS:boolean;

Beign

Save;

S:=true;

IfAthenreturn;

Restore;

IfCthenreturn;

Restore;

S:=false;

End;

FunctionCiboolean;

Begin

Save;

C:=true;

Ifnext_token="if“then

IfEthen

Ifnext_token="then“then

IfSthenreturn;

Restore;

C:=false;

End;

FunctionE:boolean;

Begin

Save;

E:=true;

IfVthen

IfEpthenreturn;

Restore;

E:=false;

End;

FunctionEp:boolean;

Being

Save;

Ep:=true;

Ifnext_token=>+'then

IfVthen

IfE,thenreturn;

Return;

End;

4解:

5.证:因为是左递归文法,所以必存在左递归的非终结符A,及形如A-aIB的产生式,且

aT*Ad.

则first(Ad)Afirst(B)W6,从而

first(a)Cfirst(B)关6,即文法不满足LL(1)文法条件。得证。

6.证:LL(1)文法的分析句子过程的每一步,永远只有唯一的分析动作可进行。现在,假

设LL(1)文法G是二义性文法,则存在句子a,它有两个不同的语法树。即存在着句子a有

两个不同的最左推导。从而可知,用LLQ)方法进行句子a的分析过程中的某步中,存在

两种不同的产生式替换,且均能正确进行语法分析,即1X(1)分析动作存在不确定性。与

LL(1)性质矛盾。所以,G不是LL(1)文法。

7解:

(1)D产生式两个候选式2和f的first集交集不为空,所以不是LL⑴的。

⑵此文法具有左递归性,据第5题结论,不是LL(1)的。

8廨:

⑴消除左递归性,得:

S->bZlllaZ21A->bZ12laZ22Zll->bZllleZ12fbz12

Z21-bZ11laZ21Z22-bZ12laZ221e

消除无用产生式得:S-bZlllaZ21Zll-bZllleZ21-bZlllaZ21

此文法已满足LL(1)文法的三个条件,

所以G'[Sl:S-bZlllaZ21Zll^bZllleZ21-bZlllaZ21

(2)G'文法的各非终结符的FIRST集和FOLLOW集:

产生式

FIRST集

FOLLOW集

SfbZll

faZ21

{b}

{a}

{#}

Zll-bZll

fE

{b}

{$}

{#}

Z21-bZll

faZ21

{b}

{a}

{#}

LL(1)分析表为:

a

b

#

s

aZ21

bZH

Zll

bZll

Z21

aZ21

bZll

9.解:

(1)

产生式

first集

follow集

S-SaB

—bB

{b}

{b}

{#,a,c}

A-S

fa

{b}

{a}

{c}

B-*Ac

{a,b}

{#,a,c}

⑵将S-SaBIbB改写为S-bBS',S'-aBS'g,可验证,新文法是LL(1)的。

10.解:

1)为方便书写,记:〈布尔表达式>为A,〈布尔因子〉为B,〈布尔二次量>为C,〈布尔初

等量,为D,原文法可以简化为:

A-AVBIBB-BACICC^nDIDD—(A)ItrueIfalse,

显然,文法含有左递归,消去后等价LL(1)文法为:

AfBA'A'-VBA'|3B—CB',

B'fACB'|3Cf-iDIDD-(A)ltruelfalse

⑵略

证:若LL(1)文法G有形如B-aAAb的产生式,且AT+e及AT*ag,根据FIRST集FOLLOW

集的构造算法可知,FIRST(A)中一切非e加到FOLLOW(A)中,则aEFOLLOW(A);又因

为aGFIRST(ag),所以两集合相交非空,因此,G不是LL(1)文法;与前提矛盾,假设不成立,

得证。

解:

(1)

S

A

(

a

)

b

S

A

<

<

<

<

<

a

>

<

>

<

>

>

)

>

>

>

>

>

b

>

>

不是简单优先文法。

(2)

S

R

T

(

)

A

a

S

R

T

>

<

<

<

<

<

)

>

>

A

>

>

a

>

<

<

<

<

是简单优先文法。

(3)

S

R

(

a

)

S

<

<

R

>

>

(

<

<

a

>

>

<

<

)

>

是简单优先文法。

首先消去无用产生式ZfE,ZfE+T

S

z

T

#

)

Z

T

>

>

#

<

<

<

I

>

>

(

<

<

<

)

>

>

化简后的文法是简单优先文法;

解:

S

A

/

A

S

>

>

A

<

<

>

>

a

>

>

A和/之间同时有关系二和v,所以不是简单优先文法;

提示:分析教材中给出的算法,选择一种合适的表示给定文法的方法(尽量简单),使得对

文法的输入比较简单的同时(需要把输入转化为计算机语言表示,这种转化应该尽量简单),

能够比较简单地构造3个基本关系矩阵(=,LEAD和LAST)。

证明:设xjxj+L..xi是满足条件xj-lvxj=xj+l=♦..=xi>xi+l的最左子串。由=关系的定义,可

知xjxj+l...xi必出现在某产生式的右部中。又因xj-l<xj可知xj-1与xj不处于同一产生式,

且xj是某右部的首符。同理,xi为某产生式的尾符号。即存在产生式U-xjxj+I...xi设ST*

aUb其中,aT*...xj-1,bT*xi+l...对于aUb可构造一语法树,并通过对其剪枝(归约),直

到U出现在句柄中。从而xjxj+l...xi必为句柄。反之,若xjxj+l...xi是句柄,由简单优先关

系的定义,必满足上述条件。

解:为描述方便,用符号表示各非终结符:D=〈变量说明〉,L=〈变量表>,V=<变量>乃=〈类

型〉,a=VAR,则消去V,并采用分层法改写文法,得到:DfaW:T;W-LL-L,iliTf「lnlblc

其全部简单优先关系是:

D

W

T

L

a

rlnlblc

D

W

T

L

>

a

<

<

<

>

>

>

rlnlblc

是简单优先文法。

证:设STna,我们对n用归纳法,证明a不含两个非终结符相邻情况。n=l时,STa,即S-a

是文法的产生式,根据定义,它不含上述情况。设n=k时,上述结论成立,且设STkdAb,

由归纳假设,A两侧必为终结符。我们再进行一步推导,得STkdAbTdub,其中,A-u是文

法中的产生式,山定义,u中不含两个非终结符相邻情况,从而dub两个非终结符相邻情况。

得证。

证:由于G不是算符文法,G中至少有一个产生式,其右部含有两个非终结符相邻的情况。

不失一般性,设其形为U~xABy,x,ydV*,由于文法不含无用产生式,则必存在含有U的句

型dUb,即存在推导ST*dUbTdxAByb.得证。

文法为:E-EfAIAA-A*TIA/TITT-T+VIT-VIVV-iI(E)

解:

(1)构造算符优先矩阵:

*

(

)

#

>

<

>

<

<

>

<

>

*

>

<

>

<

>

<

(

<

<

<

<

)

>

>

>

>

I

>

#

<

<

<

<

(2)在(-,-)、(-,*)和(*,-)处有多重定义元素,不是算符优先文法;

(3)改写方法:

将E-E-T中的减号与F--P中的赋值运算符强制规定优先关系;

或者将F-P中的赋值运算符改为别的符号来表示;

(1)证明:由设句型a=-Ua…中含a的短语不含U,即存在A,A=>*ay,则a可归约为a二…

Ua…(1*…UA3=b,b是G的一个句型,这与G是算符文法矛盾,所以,a中含有a的短语

必含U。

(2)的证明与(1)类似,略。

证:(1)对于a=“・aU…是句型,必有ST*a(=…aU…)T+…ab….即在归约过程中,b先于a被

归约,从而,a<b.对于⑵的情况类似可以证明。

证明略.

证明略.

证明略。

证:(1)用反证法。设没有短语包含b但是不包含a,则a,b一定同时位于某个短语中,从

而必使得a,b同时位于同一产生式的右部,所以a=b,与G是算符优先文法(=与<不能并存)

矛盾。

(2)、(3)类似可证。

证:只要证u中不含有除自身以外的素短语。设有这样的素短语存在,即存在bx・・・by是

素短语,其中l<x或者y<n之一成立。因素短语是短语,根据短语定义,则必有:kxTbx-l<bx

或y<nTby>by+l,与bx-l=bx及by=by+l矛盾,得证。

提示:根据27题的结论,只要证u是句型a的短语,根据=关系的定义容易知道u是句型

a的素短语。

证:与28题的不同点只是aO,an+l可以是‘#',不影响结论。

证:设不能含有素短语,则只能是含有短语(不能含有终结符号),则该短语只能含有一个

非终结符号,否则不符合算符文法定义,得证。

解:

(1)算符优先矩阵:

+

*

)

#

+

>

<

<

<

>

<

>

>

>

<

<

>

<

>

t

>

>

<

<

>

<

<

<

<

<

<

)

>

>

>

>

I

>

>

>

>

>

#

<

<

<

<

<

(2)用Floyd方法将优先矩阵线性化得到得的优先函数为:

+

*

)

i

#

F

3

5

5

1

7

7

I

G

2

4

6

6

1

6

1

解:用Floyd方法对已知的优先矩阵构造的优先函数为:

z

b

M

L

a

(

)

5

6

7

7

4

7

1

6

5

4

6

6

7

解:

(1)优先矩阵如下:

a

#

>

>

a

<

>

<

>

<

#

<

<

<

(2)用Bell方法求优先函数的过程如下:

]

a

#

5

7

5

1

g

5

5

6

(3)显然,文法不是算符优先文法,所以不能线性化。

略。

解:

(1)识别全部活前缀的DFA如下:(以表格的形式来表示,很容易可以转化为图的形式,

本章中其余的题目也是采用这种形式表示。)

状态

项目集

经过的符号

到达的状态

10

S'f•S

Sf•aSb

S—•aSc

S-**ab

S

a

II

12

II

S'一S・

12

S—a•Sb

S—a•Sc

S-*a•b

Sf-aSb

S—•aSc

S—•ab

S

a

b

13

12

14

13

SfaS•b

SfaS•c

b

15

16

14

S-*ab•

15

S-aSb•

16

S-^aSc•

(2)识别全部活前缀的DFA如下:

状态

项目集

经过的符号

到达的状态

10

S'f•S

Sf•cA

S—,ccB

S

II

I

Il

S'-s•

12

S-*c•A

Sfc,cB

A-•cA

A一•a

A

c

a

13

14

15

13

S—cA•

14

S-*cc•B

A—c,A

Bf•ccB

B一•b

Af•cA

Af•a

B

A

b

a

16

15

17

18

15

15

A—a•

16

SfccB•

17

B-c,cB

A-*c•A

A—•cA

A—•a

C

A

a

19

110

15

18

B-b•

19

B-*cc•B

A-*c•A

B—•ccB

B->・b

A—•cA

A一•a

B

A

c

b

a

Ill

IIO

17

18

15

IIO

A-cA・

Ill

B-*ccB,

所求的LR(O)项目规范族C={IO,I1,-,I11}

(3)

状态

项目集

经过的符号

到达的状态

10

s•s

S一・aSSb

Sf・aSSS

S一•c

S

a

II

12

13

II

S,-S•

12

S-c•

13

S-a•SSb

Sfa•SSS

Sf•aSSb

S-・aSSS

S—•c

S

a

14

12

13

14

SfaS•Sb

S-aS-SS

Sf・aSSb

S—・aSSS

S一•c

S

c

a

15

12

13

15

S-aSS・b

S-aSS•S

Sf•aSSb

Sf•aSSS

S-*•c

S

a

b

c

17

13

16

12

16

S-aSSb・

17

S-aSSS•

(4)

状态

项目集

经过的符号

到达的状态

10

S'f•S

S一・A

Af•Ab

A一,a

S

A

a

II

12

13

II

S'-S•

12

S-A•

S-*A•b

b

14

13

A-*a•

14

SfAb•

解:

(1)是LR(O)文法,其SLR(l)分析表如下:FOLLOW(S)={#,b,c}

ACTION

GOTO

a

b

c

#

S

0

S2

1

ACC

2

S2

S4

3

3

S5

S6

4

R3

R3

R3

5

RI

RI

R2

R2

R2

(2)是LR(O)文法,其SLR(l)分析表如下:

FOLLOW(S)=FOLLOW(A)=FOLLOW(B)={#)

ACTION

GOTO

b

c

#

S

A

B

S2

1

ACC

S5

S4

3

RI

S5

S8

S7

3

6

R4

R2

S5

S9

10

R6

S5

S8

S7

10

R3

R5

(3)是LR(0)文法,其SLR(l)分析表如下:FOLLOW(S)={#,a,b,c)

ACTION

GOTO

#

S

S3

S2

1

ACC

R3

R3

R3

R3

S3

S2

4

S3

S2

5

S3

S6

S2

7

RI

RI

RI

RI

R2

R2

R2

R2

(4)因为12中含有冲突项目,所以不是LR(O)文法,其SLR(l)分析表如下:

FOLLOW(S)={#}n{b}=6(所以可以用SLR(l)规则解决冲突),FOLLOW(A)={b,#}

ACTION

GOTO

a

b

#

S

A

S3

1

2

ACC

S4

RI

R3

R3

R2

R2

解:

状态

项目集

经过的符号

到达的状态

10

S'一•S

S一•(SR

S一•a

S

a

II

12

13

II

S'-S•

12

S->(•SR

S-•(SR

S—•a

S

(

a

14

12

13

13

S-a•

14

S-(S•R

Sf•(SR

Sf•a

Rf•,SR

R一•)

R

)

13

12

15

16

17

15

Sf(SR・

16

Rf,•SR

S一•(SR

S一•a

S

(

a

18

12

13

17

R一)•

18

R-,S•R

Rf•,SR

R-•)

)

R

17

16

19

19

Rf,SR•

LR(O)分析表如F:

ACTION

GOTO

a

)

#

S

R

0

S3

S2

ACC

2

S3

S2

4

3

R2

R2

R2

R2

R2

S3

S2

S7

S6

5

RI

RI

RI

RI

RI

S3

S2

R4

R4

R4

R4

R4

S7

S6

9

R3

R3

R3

R3

R3

可见是LR(O)文法。

解:

(1)

状态

项目集

经过的符号

到达的状态

10

S'f•S

S一•Sab

S一•bR

S

b

II

12

II

(冲突项目)

S'-s•

SfS・ab

a

acc

13

12

S-b•R

R—・S

R-**a

S—,Sab

S一•bR

R

S

a

b

14

15

16

12

13

S-Sa•b

b

17

14

SfbR•

r2

15

RfS・

S-*S,ab

a

13

16

Rfa•

17

SfSab•

项目11,15同时具有移进和归约项目,对于15={R-S•,S-S•ab),follow(R)={a},follow(R)

n{a}={a},所以SLR(l)规则不能解决冲突,从而该文法不是SLR(l)文法。

(2)

状态

项目集

经过的符号

到达的状态

10

S'一•S

S—・aSAB

S一・BA

B一・b

S

a

B

b

II

12

13

14

II

S,—S•

12

S->a・SAB

S—•aSAB

S->•BA

B-•b

S

a

B

b

15

12

13

14

13

S-*B•A

A—•aA

A—•B

B—•b

A

a

B

b

16

17

18

14

14

B—b•

r5

15

S-aS•AB

A一•aA

A一•B

B一•b

A

a

B

b

19

17

18

14

16

S-BA•

r2

17

A-^a•A

A—・B

A—•aA

B-・b

A

B

a

b

IIO

18

17

14

18

A—B•

19

S-aSA•B

B一•b

B

Ill

14

IIO

A—aA•

r3

Ill

S-aSAB•

rl

不存在冲突项目,故该文法是LR(O)文法,也是SLR(l)文法。

SLR(l)分析表如下:

ACTION

GOTO

a

b

#

S

A

B

S2

S4

1

3

1

ACC

S2

S4

5

3

S7

S4

6

8

R5

R5

R5

S7

S4

9

8

R2

R2

R2

S7

S4

8

R4

R4

R4

S4

11

10

R3

R3

R3

11

RI

RI

RI

(3)先求识别全部活前缀的DFA:

状态

项目集

经过的符号

到达的状态

10

S'一・S

S-*•aSb

S一・bSa

S-**ab

S

II

12

13

II

S'—S•

acc

12

S—a•SB

Sfa•b

S--aSb

S-・bSa

Sf•ab

S

b

a

14

15

12

13

Si-Sa

S-*•aSb

S一・bSa

S-**ab

S

a

b

16

12

13

14

S-aS•b

b

17

15

Sfab,

16

S-bS•a

a

18

17

S-*aSb-

18

S-bSa•

r2

不存在冲突项目,故该文法是LR(O)文法,也是SLR(l)文法。

SLR⑴分析表如下:

ACTION

GOTO

a

b

#

S

S2

S3

1

ACC

S2

S5

4

S2

S3

6

S7

R3

R3

R3

S8

RI

RI

RI

R2

R2

R2

(4)先求识别全部活前缀的DFA:

状态

项目集

经过的符号

到达的状态

10

S'f•S

S-**aA

S-•bB

S

II

12

13

II

S'一S•

acc

12

(冲突)

Sfa•A

Af,cAd

A一•

A

c

14

15

r4

13

(冲突)

S-b-B

B—•cBdd

B—•

B

c

16

17

r6

14

SfaA•

15

(冲突)

A-*c•Ad

Af,cAd

A一•

A

c

18

15

r4

16

S-bB•

r2

17

(冲突)

Bfc•Bdd

B--c•Bdd

B--

B

c

19

17

r6

18

A—cA,d

d

IIO

19

B—cB•dd

d

III

110

A->cAd•

r3

Ill

BfcBd•d

d

112

112

B-*cBdd•

r5

因为follow(A)=follow(B)={#,d},所以冲突项目12,13,15,17可以用SLR⑴规则得以解决,从而

该文法为SLR⑴文法。其SLR(l)分析表如下:

ACTION

GOTO

a

b

c

d

#

S

A

B

S2

S3

1

1

Acc

2

S5

R4

R4

4

3

S7

R6

R6

6

4

RI

5

S5

R4

R4

8

6

R2

7

S7

R6

R6

9

8

S10

9

Sil

10

R3

R3

11

S12

12

R5

R5

(5)解:原文法等价化为ql-q2,ql-q3,q2fq4;q5,q4->beginD,q4fq4;D,q5fsend,q5

fS;q5,q3-beginq5,

先求识别全部活前缀的DFA:

状态

项目集

经过的符号

到达的状态

10

qT—•q]

ql-**q2

ql~**q3

q2f•q4;q5

q3f•beginq5

q4f•beginD

q4f•q4;D

qi

q2

q3

q4

begin

II

12

13

14

15

II

ql'-ql•

ACC

12

ql->q2•

RI

13

ql一q3•

R2

14

q2fq4•;q5

q4fq4,;D

D

16

15

q3-*begin,q5

q3-*begin•D

q5f•Send

q5f,S;q5

q5

D

S

17

18

19

16

q2fq4;•q5

q4fq4;•D

q5f•Send

q5f・S;q5

q5

D

S

IIO

Ill

19

17

q3-*beginq5•

R8

18

q3-*beginD•

R4

19

q5fs•end

q5fs•;q5

end

112

113

IIO

q2fq4;q5•

R3

Ill

q4—q4;D•

R5

112

q5fSend•

R6

113

q5fs;•q5

q5f•Send

q5f•S;q5

q5

S

114

19

114

q5fs;q5・

R7

不存在冲突项目,故该文法是LR(O)文法,也是SLR(l)文法。

SLR(l)分析表如下:

ACTION

GOTO

begin

D

S

end

#

qi

q2

q3

q4

q5

0

2

3

4

1

Acc

2

RI

3

R2

4

S6

5

S8

S9

7

6

S7

S9

10

7

R8

8

R4

9

S13

S12

10

R3

11

R5

12

R6

13

S9

14

14

R7

(6)解:原文法可化为等价形式:qLbeginq2q3end,q2fq2d;,q2f£,q3fq3;q4,q3fq4,

q4fS,q4f£,

先求识别全部活前缀的DFA:

状态

项目集

经过的符号

到达的状态

10

qrf・ql

ql—•beginq2q3end

qi

begin

II

12

II

ql'-ql•

ACC

12

ql_*begin•q2q3end

q2f•q2d;

q2一•

q2

q2

13

R3

13

(冲突项目)

Ql-*beginq2•q3end

q2fq2,d;

q3f,q3;q4

q3f•q4

q4f•S

q4f•

q3

Dd

q4

S

14

IIO

15

16

R7

14

ql->beginq2q3•end

q3fq3,;q4

end

17

18

15

q3fq4•

R5

16

q4fs•

R6

17

ql->beginq2q3end•

RI

18

(冲突项目)

q3fq3;,q4

q4f・S

q4f•

q4

S

19

16

R7

19

q3fq3;q4•

R4

IIO

q2fq2d•;

Ill

Ill

q2—q2d;,

R2

因为folk)w(q4)={end,#},故冲突项目可以通过SLR(l)规则来解决,从而文法为SLR(l)文法。

SLR(l)分析表如下:

action

goto

begin

end

d

S

#

qi

q2

q3

q4

S2

R3

R3

R3

R3

R7

S10

R7

S6

L

5

S7

S8

R5

R5

R6

R6

RI

R7

R7

S6

9

R4

R4

10

11

R2

R2

R2

R2

解:识别活前缀的DFA及LR(0)分析表:

状态

项目集

经过的符号

到达的状态

10

S'-*•S

S—•AAd

Sf•cAd

S-•b

A一•ASc

Af•Sb

A-**cd

A—•a

S

A

a

b

c

10

16

15

14

13

II

S'—S•

A-S・b

b

12

12

A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论