《编译原理》西北工业大学第三版课后答案2_第1页
《编译原理》西北工业大学第三版课后答案2_第2页
《编译原理》西北工业大学第三版课后答案2_第3页
《编译原理》西北工业大学第三版课后答案2_第4页
《编译原理》西北工业大学第三版课后答案2_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

目录

第一章习题解答.....................................................................1

第二章习题解答.....................................................................2

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

3.描述语言特点...........................................................3

7.解:....................................................................5

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

11.解:...................................................................7

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

第三章习题解答....................................................................10

第四章习题解答....................................................................24

第四章习题参考答案............................................................24

35解:....................................................................36

36解:....................................................................40

37解:....................................................................41

38解:....................................................................42

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

40解:求LR(1)项目集和状态转换表:......................................53

41解:....................................................................55

42解:....................................................................58

第五章习题解答....................................................................64

5.8解:...................................................................65

第一章习题解答

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

序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程

序。翻译程序是将某种语言翻译成另一种语言的程序的统称。编译程序与

解释程序均为翻译程序,但二者工作方法不同。解释程序的特点是并不先

将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语

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

语句继续进行解释、执行,如此反复。即边解释边执行,翻译所得的指令

序列并不保存。编译程序的特点是先将高级语言程序翻译成机器语言程

序,将其保存到指定的空间中,在用户需要时再执行之。即先翻译、后执

行。

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

程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管

理程序、错误检查处理程序组成。

3.解:C语言的关键字有:autobreakcasecharconstcontinue

defau11dodoubIeeIseenumexternfIoatforgotoifintIong

registerreturnshortsignedsizeofstaticstructswitchtypedef

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

字。

4.解:C语言中括号有三种:{},口,()o其中,{}用于语句括号:口用

于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。

C语言中无END关键字。逗号在C语言中被视为分隔符和运算符,作为优

先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:

(a,b,c,d)的值为d)o

5.略

第二章习题解答

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

(2)答:26*10=260

(3)答:{a,b,c,...,z,a0,a1,...,a9,aa,...,az,...,zz,aOO,a01,…,zzz),

共26+26*36+26*36*36=34658个

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

(1){anbn|n^O}

解:对应文法为G(S)=({S},{a,b},{STE|aSb),S)

(2){anbmcp|n,m,p,0}

解:对应文法为G(S)二({S,X,Y},{a,b,c},{STaS|X,XTbX|Y,YTcY|

G,S)

(3){an#bn|n20}U{cn#dn|n20}

解:对应文法为G(S)=({S,X,Y},{a,b,c,d,#},{STX,STY,XTaXb|#,Y

TcYd|#},S)

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

解:G(S)=({S,W,R},{0,1,#},{STW#,WTOWO|1W1|#},S)

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

解:G(S)=({S,A,B,I,J},{-,0,1,2,3,4,5,6,7,8,9},{S->j|

0B|IB|e,I-4J|2|4|6|8,JT113151719},S)

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

解:对应文法为S-+0A|lB|e,ATOS|1CB-*OC|1SC->1A|0B

3.描述语言特点

(1)S-MOSOSTaAATbAATa

解:本文法构成的语言集为:L(G)={(10)nabmaOn|n,m,0}。

(2)STSSS-MA0AT1A0ATE

解:L(G)={1n10n11n20n21nmOnm|rd,n2,…,nm20;且n1,n2,…nm不

全为零}该语言特点是:产生的句子中,0、1个数相同,并且若干相接的1后必

然紧接数量相同连续的0。

(3)ST1ASTB0A-MAATCBTB0BTCCT1C0CT£

解:本文法构成的语言集为:L(G)={1p1nOn|p^1,n^O}U{1nOnOq|q^1,n

20},特点是具有1p1nOn或InOnOq形式,进一步,可知其具有形式1nOmn,m

》0,且n+m>0o

(4)STbAdcATAGSGTEA-*a

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

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

同。

(5)STaSSSTa

解:L(G)={a(2n-1)|n»1}可知:奇数个a

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

~为运算符,以[、]为分隔符的布尔表达式串

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

5.2证明:略

6.解:

(1)最左推导:

<程序>1■〈分程序>T<标号):<分程序)TL:〈分程序〉

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

TL:L:〈分程序)

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

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

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

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

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<分程序>1"〈标号>:<分程序〉

IX标号):〈标号):〈分程序)

IX标号>:〈标号〉:〈无标号分程序〉

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

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

1标号):<标号):〈分程序首部>;<语句);<语句);end

IX标号):〈标号〉:〈分程序首部〉;〈语句);s;end

丁<标号>:〈标号):<分程序首部>;s;s;end

1标号〉:<标号):<分程序首部〉;说明;s;end

T〈标号〉:〈标号〉:〈分程序首部);d;s;end

丁<标号):〈标号):begin说明;d;s;s;end

丁<标号):<标号):begind;d;s;s;end

T〈标号):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=1时,结论显然成立。设n=k时,对于a1a2...akT*b,

存在Bi:i=1,2,..,k,aiT*bi成立,现在设

a1a2...akak+1T*b,因文法是前后文无关的,所以a1a2...ak可推导

出b的一个前缀b',ak+1可推导出b的一个后缀二b"(不妨称为bk+1)。由归

纳假设,对于b',存在。i:i=1,2,..,k,b'=B102...Bk,使得

aiT*bi成立,另夕卜,我们有ak+1T*b"仁bk+1)。即n=k+1时亦成立。证毕。

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

设:a=a3;B=A3'且a=>*0。

由题意可知:a=a3T…TA3'=B,由于文法是CFG,终结符a不可能被替换

空串或非终结符,因此假设有误。得证;

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

=aco:B=A3'且a=a3T・・・TAco'=(i,与(1)同理,得证。

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

右推导):

STABTAbcTabc

11.解:

(1)STABTAaSbTAacbTbAacbTbbAacbTbbaacb

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

全部的短语:

第一个a(a1)是句子bbaacb相对于非终结符A(A1)(产生式A?a)的短语(直

接短语);

b1a1是句子bbaacb相对于非终结符A2的短语;

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

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

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

b2b1a1a2cb3是句子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.化简下列各个文法

(1)解:STbCACdATcSAlcCCCTcS|c

(2)解:S—aAB|fA|gA-*e|dDADTeABTf

(3)解:STac

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

(1)解:STaAS|aS|bA-*cS

(2)解:STaAA|aA|aA->bAc|be|dAe|de

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

(D消除后的产生式如下:

STaB|BC

BTDB|b

CTb

DTb|DB

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

STSA|SB|()|(S)|[]|[S]

A->0|(S)|[]|[S]

Ba□|[S]

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

E—E+T|T*F|(E)|PTF|i

T-*T*F|(E)|PTF|i

F—PTF|(E)|i

PT(E)|i

第三章习题解答

1.从略

2.

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

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

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

4证明:只须证明文法G:ATaB或ATa(A,BWVN,aGVT+)

等价于G1:ATaB或ATa(aGVT+)

・G1的产生式中ATaB,则B也有BTbC,CTcD….

所以有ATabe…B',a,b,c…6VT,B'eVN

所以与G等价。

2)G的产生式ATaB,aGVT+,因为a是字符串,所以肯定存在着一个终结符

a,使ATaB

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

5

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

L={ambnci|m,n,i=1}

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

P={STaA,A-*aA,A->bB,B->bB,BTcC,CTcC,C->c}

其状态转换图如下:

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

ATOD,B->OA,B-41C,C->111F,C->1|OA,F->01OE11A,D->OB11C,E-*1C|OB

(2)最短输入串011

(3)任意接受的四个串

011,0110,0011,000011

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

8从略。

(2)相应的3型文法

(i)STaASTbSA—aAATbBB-+a|aBB->b|bB

(ii)STaA|aS—bBB-*aB|bBA—aBA—b|bA

(iii)STaAS—bBA—bAA—aCB—aBB—bCC-»a|aCC->b|bC

(iv)S-*bSSTaAA-+aCATbBBTaBB->bCC-*a|aCC-►b|bC

(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的状态转换图:

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

STBb,STDd,DTC,B->Db,C->Bc,BTAb,B-►E,A->a

G2等价的右线性文法:

STdD,S->aB,DTC,BTabC,BTbB,BTbA,B-►E,C->cA,ATa

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

S=>aA=>abB=>abb

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

S=>Bb=>Abb=>abb

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

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

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

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

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

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

。(1)对于G中每一个形如ATaB的产生式且A是开始符,将其变

为BTa,否则若A不是开始符,B-*Aa;

o(2)对于G中每一个形如ATa的产生式,将其变为STAa

12(1)

abv

S(S.A)

A力{A,B}P

B

状态矩阵是:

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

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

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

记{SO,S1,S3)=qO{S1)=q1{S2S3}=q2{S3}=q3

(2)记{S}=qO{Z}=q1{UR}=q2{SX}=q3{YUR}=q4{XSU}=q5{YURZ]=q6

{ZS}=q7

⑵化简后SO和S1作为一个状态,S5和S6作为一个状态。

状态转换图如图

15从略。

16从略。

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

(E|r)*表示的正规式集是{E,EE,•••}U{r,rr,rrr,•••}={E,r,rr,rrr,•••)

e|rr*表示的正规式集是{£,r,rr,rrr,•••)

(r*)*=r*={E,r,rr,rrr,•••)

所以四者是等价的。

(2)(rs)*r表示的正规式集是{E,rs,rsrs,rsrsrs,•••}r

={r,rsr,rsrsr,rsrsrsr,•••)

r(sr)*表示的正规式集是r(E,sr,srsr,srsrsr,•••)

={r,rsr,rsrsr,rsrsrsr,

所以两者等价。

18写成方程组

S=aT+aS(1)

B=cB+c(2)

T=bT+bB(3)

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

S=a*ab*bc*c

・G1:

S=aA+B(1)

B=cC+b(2)

A=abS+bB(3)

C=D(4)

D=bB+d(5)

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

A=abS+b(cb)*(cd|b)把它打入A)得

S=a(abS+b(cb)*(cd|b))+(cb)*(cd|b)

=aabS+ab(cb)*(cd|b)+(cb)*(cd|b)

=(aab)*(ab(cb)*(cd|b)|(cb)*(cd|b))

G2:

S=Aa+B(1)

A=Cc+Bb(2)

B=Bb+a(3)

C=D+Bab(4)

D=d⑸

可得D=dB=ab*C=ab*ab|bA=(ab*ab|b)c+ab*b

S=(ab*ab|b)ca+ab*ba+ab*

=(ab*ab|b)ca|ab*ba|ab*

20

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

•从略。

21从略。

其余从略。

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

%{

#incIude<stdio.h>

#include<string.h>

#incIude<ctype.h>

#define0N1

#defineTW2

#defineTHRE3

#defineTE10

#defineTWENT20

#defineHUNDRE100

#defineWHITE9999

%)

upper[A-Z]

%%

ONEreturnON;

TWOreturnTW;

THREEreturnTHRE;

TENreturnTE;

TWENTYreturnTWENT;

HUNDREDreturnHUNDRE;

""+|\treturnWHITE;

\nreturnO;

%%

main(intargc,char*argv[])

(

intc,1=0;

chartmp[30];

if(argc==2)

(

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

(

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

}

)

while((c=yyIex())!=0)

(

switch(c)

(

caseON:

c=yylex();

if(c~0)goto{i+=1;IabeI;}

c二yylex();

if(c=HUNDRE)

i+=100;

eIsei+=1;

break;

caseTW:c=yylex();

c二yylex();

if(c二二HUNDRE)

i+=200;

eIsei+=2;

break;

caseTWENT:i+=20;

break;

caseTE:i+=10;

break;

default:break;

)

}/*whiIe*/

label:printf("%d\n",i);

return;

1

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

.此正规式的长度是2n

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

25从略。

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

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

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

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

如',,,,'bb',,def,,,,,,,,等等

270[Xx][0-9]*[a-fA-F]*|[0-9]+|(\J

([a-zA-Z]|\\[Xx][0-7][0-7a-fA-F]|\\0[01][0-7][0-7]|\\[a-z])\,)

28"[a-zA-Z_]+[0-9]*[a-zA-Z_]*

29参考程序如下:

%(

#incIude<stdio.h>

#include<string.h>

#incIude<ctype.h>

#defineUPPER2

#defineWHITE3

%!

upper[A-Z]

%%

{upper}+returnllPPER;

\t|""+returnWHITE;

%%

main(intargc,char*argv[])

intc,i;

if(argc==2)

(

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

(

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

}

)

while((c=yylex())!=E0F)

(

if(c==2)

(

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

printf("%c",toIower(yytext[i]));

yytext[0]='\000';

)

if(c==3)

printfC");

eIseprintfyytext);

}

return;

)

yywrapO

return;

)

30从略。

第四章习题解答

第四章习题参考答案

・1.解:

(1)ST(S)Z21|0Z21|[SJZ31|[]Z31

AT(S)Z221()Z221[S]Z321[]Z32

BT(S)Z23|0Z231[S]Z33|[]Z33

Z11-*E|AZ11|BZ21

Z12TAZ121BZ22Z13-+AZ131BZ23

Z21Tzi1Z22T£|Z12

Z23Tzi3Z31Tz21

Z32Tz22Z33TE|Z23

(2)STbZ11|aZ21ATbZ121aZ22

Z11-*E|AZ21Z12TAz22Z21Tsz21Z22Te|SZ22

(3)ST(T)Z11|aZ11|Z11S-4(T)Z12|aZ12|Z12

Z1WE|Z21Z12Tz22Z21T,SZ21Z22TE|,SZ22

・2.解:

S=>AbB1,1.1(表示第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

nedaSdfbbB6,4.2

=eddfbbB5,3.2

=>eddfbbCSd6,3.1

=>eddfbbedSd7,4.1

=>eddfbbaSd7,4.2

=>eddfbbd6,3.2

•3.解:以下Save表示savetoken_pointervalue,Restore表示restore

token_pointervaIueo

(1)文法没有左递归。

FunctionP:boolean;

Begin

Save;

P:=true;

Ifnext_token="begin”then

Ifnext_token='d'then

Ifnext_token=?then

IfXthen

Ifnext_token=vend"thenreturn;

Restore;

P:=faIse;

End;

FunctionX:booIean;

Begin

Save;

X:二true;

Ifnext_token=?d'then

Ifnext_token=,then

IfXthenreturn;

Restore;

Ifnext_token=,s'then

IfYthenreturn;

Restore;

X:二faIse;

End;

FunctionY:boolean;

Begin

Save;

Y二true;

Ifnext_token=,then

Ifnext_token=,s'then

IfYthenreturn;

Restore;

End;

⑵消去文法左递归,并记为:

PTbeginSendSTA|CATV:二ECTifEthenS

ETVE'E'T+VE'|eV-41

FunctionP:boolean;

Begin

Save;

P:二true;

Ifnext_token=nbegin”then

IfSthen

Ifnext_token二”end”thenreturn;;

Restore;

P:二faIse;

End;

FunctionA:boolean;

Beign

Save;

A:二true;

IfVthen

Ifnext_token=“:二”then

IfEthenreturn;

Restore;

A:=flase;

End;

FunctionS:boolean;

Beign

Save;

S:二true;

IfAthenreturn;

Restore;

IfCthenreturn;

Restore;

S:=faIse;

End;

FunctionC:booIean;

Begin

Save;

C:二true;

Ifnext_token="if"then

IfEthen

Ifnext__token=nthen”then

IfSthenreturn;

Restore;

C:二faIse;

End;

FunctionE:boolean;

Begin

Save;

E:二true;

IfVthen

IfEpthenreturn;

Restore;

E:=faIse;

End;

FunctionEp:booIean;

Being

Save;

Ep:二true;

Ifnext_token=,+'then

IfVthen

IfE'thenreturn;

Return;

End;

•4.解:

FIRST集“FOLLOW集“

S—aAB,

f购,{#}Q

fgV{£}Q

A—VaVAZvbW{杂

fg3{少

B-►bB*-1(皿

•f&/{»

・5.证:因为是左递归文法,所以必存在左递归的非终结符A,及形如AT

a|0的产生式,且aT*Ad.

则first(Ad)Dfirst(B)于0,从而

first(a)nfirst(B)于。,即文法不满足LL(1)文法条件。得证。

・6.证:LL(1)文法的分析句子过程的每一步,永远只有唯一的分析动作

可进行。现在,假设LL(1)文法G是二义性文法,则存在句子a,它有两

个不同的语法树。即存在着句子a有两个不同的最左推导。从而可知,用

LL(1)方法进行句子a的分析过程中的某步中,存在两种不同的产生式

替换,且均能正确进行语法分析,即LL(1)分析动作存在不确定性。与

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

・7.解:

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

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

・8.解:

(1)消除左递归性,得:

S-►bZ11|aZ21A->bZ12|aZ22Z1WbZ111EZ12Tbz12

Z21Tbz111aZ21Z22Tbz121az221E

消除无用产生式得:S->bZ11|aZ21Z1WbZ111EZ2WbZ11|aZ21

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

所以G'[S]:S->bZ11|aZ21Z11->bZ11|EZ21->bZ11|aZ21

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

产生式FIRST集FOLLOW集

S->bZ11{b}{#}

TaZ21{a}

Z1WbZ11{b}{#}

TE{E}

Z21-*bZ11{b}{#}

TaZ21{a}

LL⑴分析表为:

ab#

SaZ21bZ11

Z11bZ11E

Z21aZ21bZ11

•9.解:

(1)

产生式first集follow^.

STSaB{b}

{#,a,c)

TbB{b}

ATS{b}

{c}

Ta{a}

B->Ac{a,b}{#,a,c}

(2)将STSaB||bB改写为STbBS',S'TaBS'|3,可验证,新文法是LL(1)

的。

・10.解:

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

为C,〈布尔初等量>为口,原文法可以简化为:

A-4AVB|BBTBAC|CCT-|D|DDT(A)|true|false,

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

ATBA'A'-4VBA'|U)BTCB',

B'-4ACB,|3CT-)D|DDT(A)|true|faIse

⑵略

・证:若LL(1)文法G有形如BTaAAb的产生式,且AT+£及AT*ag,根据

FIRST集FOLLOW集的构造算法可知,FIRST(A)中一切非E加到FOLLOW(A)

中,则aWFOLLOW(A);又因为aWFIRST(ag),所以两集合相交非空,因此,

G不是LL(1)文法:与前提矛盾,假设不成立,得证。

»解:

SA(a)b

S==

A=<=<

仁=<<<

<

a>=<»

>

)>»»

不是简单优先文法。

(2)

SRTOAa,

S>=

R=

T>

(<=«<<

)>>

A>>

a>>

,<=<<<

是简单优先文法。

(3)

SR(a,)

S=«

仁«

尸«

是简单优先文法。

o首先消去无用产生式ZTE,Z-4E+T

SZT#i()

S

Z==

T>>

#=<«

I>>

(=<«

)>>

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

•解:

SA/A

s>>

A—<—

<

/>>

a>>

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

・提示:分析教材中给出的算法,选择一种合适的表示给定文法的方法(尽

量简单),使得对文法的输入比较简单的同时(需要把输入转化为计算机

语言表示,这种转化应该尽量简单),能够比较简单地构造3个基本关系

矩阵(=,LEAD和LAST)。

・证明:设xjxj+1...xi是满足条件xj-1<xj=xj+1=...=xi>xi+1的最左子

串。由=关系的定义,可知xjxj+1...xi必出现在某产生式的右部中。又

因xj-1<xj可知xj-1与xj不处于同一产生式,且xj是某右部的首符。

同理,xi为某产生式的尾符号。即存在产生式UTxjxj+1...xi设ST*aUb

其中,aT*...xj-1,bT*xi+1...对于aUb可构造一语法树,并通过对

其剪枝(归约),直到U出现在句柄中。从而xjxj+1...xi必为句柄。反

之,若xjxj+1...xi是句柄,由简单优先关系的定义,必满足上述条件。

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

<变量),T=<类型>,a=VAR,则消去V,并采用分层法改写文法,得到:DT

aW:T;WTLLTL,i|iT-*r|n|b|c

其全部简单优先关系是:

DWTLa:;ir|n|b|c

D

W=

T=

L>

a=<<

<

>>>

r|n|b|c>

是简单优先文法。

・证:设STna,我们对n用归纳法,证明a不含两个非终结符相邻情况。n=1

时,STa,即STa是文法的产生式,根据定义,它不含上述情况。设n=k

时,上述结论成立,且设STkdAb,由归纳假设,A两侧必为终结符。我们

再进行一步推导,得STkdAbTdub,其中,ATu是文法中的产生式,由定

义,u中不含两个非终结符相邻情况,从而dub两个非终结符相邻情况。

得证。

・证:由于G不是算符文法,G中至少有一个产生式,其右部含有两个非终

结符相邻的情况。不失一般性,设其形为UTxAB%x,yCV*,由于文法不

含无用产生式,则必存在含有U的句型dUb,即存在推导ST*dUbTdxAByb.

得证。

・文法为:E—ETA|AATA*T|A/T|TTTT+V|T-V|VVTi|(E)

•解:

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

-*()i#

»

-<><>

«

*><X

<

(«<=<

)»>>

l»>>

#«<<

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

(3)改写方法:

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

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

・(1)证明:由设句型a=-Ua…中含a的短语不含U,即存在A,K=>*ay,

则a可归约为a="Ua…U*…UA…=b,b是G的一个句型,这与G是算符

文法矛盾,所以,a中含有a的短语必含U。

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

•证:(1)对于a="aU…是句型,必有ST*a(=…all…)T+…ab….即在归

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

・证明略.

・证明略.

・证明略。

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

于某个短语中,从而必使得a,b同时位于同一产生式的右部,所以a=b,

与G是算符优先文法(=与〈不能并存)矛盾。

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

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

存在bx•••by是素短语,其中1<x或者y〈n之一成立。因素短语是短

语,根据短语定义,则必有:1<xTbx-1〈bx或y〈nTby>by+1,与bx-kbx

及by=by+1矛盾,得证。

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

易知道u是句型a的素短语。

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

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

短语只能含有一个非终结符号,否则不符合算符文法定义,得证。

・解:

(1)算符优先矩阵:

+*T()i#

+>«<><>

*»<<><>

T»<<><>

(«<<=<

)»>>>

I»>>>

#«<<<

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

+*T()i#

F3551771

G2466161

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

zbMLa()

f1567747

g1654667

解:

(1)优先矩阵如下:

□a#

[>=

]>>

«

a<

»

#«<

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

g5561

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

•略。

35解:

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

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

状态项目集经过的符号到达的状态

I0S'T・SS11

ST•aSbaI2

S—•aSc

ST-ab

11S'TS•

I2STa•SbsI3

STa•ScaI2

STa•bbI4

ST•aSb

ST•aSc

ST•ab

I3S—aS•bbI5

STaS•ccI6

I4STab•

I5STaSb•

I6S->aSc•

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

状态项目集经过的符号到达的状态

IOS'T•Ss11

ST•cAcI

ST,ccB*

11S'TS•

I2STc•AAI3

STc•cBcI4

AT•cAaI5

AT•a

I3STcA•

I4STcc-BBI6

ATc•AAI5

BT•ccBcI7

BT•bbI8

AT,cAaI5

AT•a

I5ATa•

I6STccB•

I7BTc•cBcI9

ATc•AA110

AT•cAaI5

AT•a

I8B—b•

I9BTcc•BB111

ATc•AA110

BT•ccBcI7

BT•bbI8

AT•cAaI5

AT•a

110ATcA•

111BTccB•

所求的LR(O)项目规范族C={IO,11,111}

(3)

状态项目集经过的符号到达的状态

IOS'T•Ss11

ST•aSSbcI2

ST•aSSSaI3

ST•c

11S'TS•

I2STc•

I3STa•SSbsI4

STa•SSSc12

ST•aSSba13

ST•aSSS

ST•c

14STaS•Sbs15

STaS•SSc12

S

温馨提示

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

评论

0/150

提交评论