編譯原理習(xí)題解答_第1頁
編譯原理習(xí)題解答_第2頁
編譯原理習(xí)題解答_第3頁
編譯原理習(xí)題解答_第4頁
編譯原理習(xí)題解答_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、編譯原理習(xí)題解答 頁31/31第二章:習(xí)題2-4 Table表var x,y;procedure p; var a; procedure q; var b; begin b:=10; end; procedure s; var c,d; procedure r; var e,f; begin call q; end; begin call r; end; begin call s; end;begin call p;end根據(jù):Page289,變量table:array0.txmax of record 結(jié)構(gòu)體以及block函數(shù)得到下表,而表中各部分的含義,見教材Page18,Page19Na

2、meKinkVal /LevelAdrSizexvariable030yvariable040pprocedur010avariable130qprocedur134sprocedur170cvariable230dvariable240rprocedur200第三章 文法和語言5. 寫一文法,使其語言是偶正整數(shù)的集合要求:(1) 允許0打頭(2) 不允許0打頭解:(1) GS=(S,P,D,N,0,1,2,9,P,S)P:SPD|DP-NP|ND0|2|4|6|8N-0|1|2|3|4|5|6|7|8|9(2) GS=(S,P,R,D,N,Q ,0,1,2,9,P,S)P:SPD|P0|DP

3、-NR|NR-QR|QD2|4|6|8N-1|2|3|4|5|6|7|8|9Q-0|1|2|3|4|5|6|7|8|96. 已知文法G::=|+|-:=|*|/:=()|i。試給出下述表達(dá)式的推導(dǎo)及語法樹。(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語

4、法樹見下圖:7. 為句子i+i*i構(gòu)造兩棵語法樹,從而證明下述文法G是二義的。i( )i * ii + * iii + i( ) + ii + i * ii(1)i(2)(i)(3)i*i(4) i*i+i(5) i+(i+i)(6) i+i*i:=i|()|:=+|-|*|/解:為句子i+i*i構(gòu)造的兩棵語法樹如下: + i * ii * + iii所以,該文法是二義的。8. 習(xí)題1中的文法GS是二義的嗎?為什么?答:是二義的。因?yàn)閷τ诰渥觓bc可以有兩種不同的生成樹,即:S=Ac=abc和S=aB=abc11. 令文法GE為:ET|E+T|E-TTF|T*F|T/FF(E)|i證明E+T*

5、F是它的一個句型,指出這個句型的所有短語、直接短語和句柄。解:可為E+T*F構(gòu)造一棵語法樹(見下圖),所以它是句型。EE + TT * F從語法樹中容易看出,E+T*F的短語有:T*F是句型E+T*F的相對于T的短語,也是相對于規(guī)則TT*F的直接短語。E+T*F是句型E+T*F的相對于E的短語。句型E+T*F的句柄(最左直接短語)是T*F。12. 下述文法GE生成的語言是什么?給出該文法的一個句子,該句子至少含五個終結(jié)符,構(gòu)造該句子的語法樹。證明:是G的句型,并指出該句型的所有短語、直接短語和句柄。|a|b|c+|-*|/解:(1)計(jì)算文法GE的語言:由于L(T)=(a|b|c)(a|b|c)

6、(*|/)n|n=0所以L(E)=L(T)(L(T)(+|-)n|n=0(2)該文法的一個句子是aab*+,它的語法樹是: aab*+(3) 證明:是G的句型,并指出該句型的所有短語、直接短語和句柄。由于下面的語法樹可以生成,所以它是G的句型。 由于 = ,且 = ,所以是句型相對于的短語,也是相對于規(guī)則 的直接短語。由于 = 且 = ,所以是句型相對于的短語。顯然,句型的句柄是。14. 給出生成下述語言的上下文無關(guān)文法:(1)anbnambm|n,m=0(2)1n0m1m0n|n,m=0(3)WaWt|W屬于0|a*,W表示W(wǎng)t的逆解:(1)所求文法為GS=(S,A,a,b,P,S),其中P

7、為:SAAAaAb|(2)所求文法為GS=(S,A,0,1,P,S),其中P為:S1S0|AA0A1|(3)W屬于0|a*是指W可以的取值為,0,a,00,a0,aa0,00aa,a0a0,如果W=aa0a00,則Wt=00a0aa。所求文法為GS=(S,P,Q,0,a,P,S),其中P為:S0S0|aSa|a15. 語言WaW和anbmcndm是上下文無關(guān)的嗎?能看出它們反映程序設(shè)計(jì)語言的什么特性嗎?答:生成語言WaW的文法非常簡單,如GS: SWaWWaW|bW|可見GS是上下文無關(guān)的。生成語言anbmcndm的文法非常復(fù)雜,用上下文無關(guān)文法不可能辦到,只能用上下文有關(guān)文法。這是因?yàn)橐赼

8、ncn的中間插入bm而同時要在其后面插入dm。即a,c相關(guān)聯(lián),b,d相關(guān)聯(lián)。這說明對語言的限定越多(特別是語言中的符號前后關(guān)聯(lián)越多),生成它的文法越復(fù)雜,甚至于很難找到一個上下文法無關(guān)文法。16給出生成下述語言的三型文法:(1)an|n=0(2)anbm|n,m=1(3)anbmck|n,m,k=0解:(1) 生成的3型文法是:GS:SaS|(2) 生成的2型文法是:GS: SABAaA|aBbB|b生成的3型文法是:GS:SaPPaP|bDDbD|(3) 生成的2型文法是:GS: SABCAaA|BbB|C-cC|生成的3型方法是:GS:AaA|bB|cC|BbB|cC|CcC|第四章 詞法

9、分析1構(gòu)造下列正規(guī)式相應(yīng)的DFA:(1) 1(0|1)* 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對應(yīng)的NFA為01231104110下表由子集法將NFA轉(zhuǎn)換為DFA:II0 = -closure(MoveTo(I,0)I1 = -closure(MoveTo(I,1)A0B1B1B1C1,2C1,2D1,3C1,2D1,3B1E1,4E1,4B1B1ABCD110E11000,11(2)1(1010* | 1(010)* 1)* 0對應(yīng)的NFA為02451101

10、010361079810011下表由子集法將NFA轉(zhuǎn)換為DFA:II0 = -closure(MoveTo(I,0)I1 = -closure(MoveTo(I,1)A0B1,6B1,6C10D2,5,7C10D2,5,7E3,8B1,6E3,8F1,4,6,9F1,4,6,9G1,2,5,6,9,10D2,5,7G1,2,5,6,9,10H1,3,6,9,10I1,2,5,6,7H1,3,6,9,10J1,6,9,10K2,4,5,7I1,2,5,6,7L3,8,10I1,2,5,6,7J1,6,9,10J1,6,9,10D2,5,7K2,4,5,7M2,3,5,8B1,6L3,8,10F1

11、,4,6,9M2,3,5,8N3F1,4,6,9N3O4O4P2,5P2,5N3B1,6AB1C0D1E01F101H0G1I0K1J10L01M0011NOP011001(3)a(a|b)*|ab*a)* b (略)(4)b(ab)* | bb)* ab (略)2已知NFA=(x,y,z,0,1,M,x,z)其中:M(x,0)=z,M(y,0)=x,y,M(z,0)=x,z,M(x,1)=x, M(y,1)=,M(z,1)=y,構(gòu)造相應(yīng)的DFA。xy0z010010解:根據(jù)題意有NFA圖如下下表由子集法將NFA轉(zhuǎn)換為DFA:II0 = -closure(MoveTo(I,0)I1 = -cl

12、osure(MoveTo(I,1)AxBzAxBzCx,zDyCx,zCx,zEx,yDyEx,yEx,yFx,y,zAxFx,y,zFx,y,zEx,y01100BCEF00DA1101下面將該DFA最小化:(1) 首先將它的狀態(tài)集分成兩個子集:P1=A,D,E,P2=B,C,F(2) 區(qū)分P2:由于F(F,1)=F(C,1)=E,F(F,0)=F并且F(C,0)=C,所以F,C等價(jià)。由于F(B,0)=F(C,0)=C, F(B,1)=D,F(C,1)=E,而D,E不等價(jià)(見下步),從而B與C,F(xiàn)可以區(qū)分。有P21=C,F,P22=B。(3) 區(qū)分P1:由于A,E輸入0到終態(tài),而D輸入0不到

13、終態(tài),所以D與A,E可以區(qū)分,有P11=A,E,P12=D。(4) 由于F(A,0)=B,F(E,0)=F,而B,F(xiàn)不等價(jià),所以A,E可以區(qū)分。(5) 綜上所述,DFA可以區(qū)分為P=A,B,D,E,C,F(xiàn)。所以最小化的DFA如下:11010F0BE10DA03.將圖4.16確定化:S0,1Z1V11U0Q0,1001圖4.16解:下表由子集法將NFA轉(zhuǎn)換為DFA:II0 = -closure(MoveTo(I,0)I1 = -closure(MoveTo(I,1)ASBQ,VCQ,UBQ,VDV,ZCQ,UCQ,UEVFQ,U,ZDV,ZGZGZEVGZFQ,U,ZDV,ZFQ,U,ZGZGZ

14、GZAGDB0,10C110E010F010,14.把圖4.17的(a)和(b)分別確定化和最小化:12435bbbbaaa0abaab01aa,ba(a) (b)解:(a):下表由子集法將NFA轉(zhuǎn)換為DFA:IIa = -closure(MoveTo(I,a)Ib = -closure(MoveTo(I,b)A0B0,1C1B0,1B0,1C1C1A0可得圖(a1),由于F(A,b)=F(B,b)=C,并且F(A,a)=F(B,a)=B,所以A,B等價(jià),可將DFA最小化,即:刪除B,將原來引向B的引線引向與其等價(jià)的狀態(tài)A,有圖(a2)。(DFA的最小化,也可看作將上表中的B全部替換為A,然后

15、刪除B所在的行。)AabCaBbaAbCaa(a1)確定化的DFA (a2)最小化的DFA(b):該圖已經(jīng)是DFA。下面將該DFA最小化:(6) 首先將它的狀態(tài)集分成兩個子集:P1=0,P2=1,2,3,4,5(7) 區(qū)分P2:由于F(4,a)=0屬于終態(tài)集,而其他狀態(tài)輸入a后都是非終態(tài)集,所以區(qū)分P2如下:P21=4,P22=1,2,3,5。(8) 區(qū)分P22:由于F(1,b)=F(5,b)=4屬于P21,而F(2,b)與F(3,b)不等于4,即不屬于P21,所以區(qū)分P22如下:P221=1,5,P222=2,3。(9) 區(qū)分P221:由于F(1,b)=F(5,b)=4,即F(1,a)=1,

16、F(5,a)=5,所以1,5等價(jià)。(10) 區(qū)分P222:由于F(2,a)=1屬于P221,而F(3,a)=3屬于P222,所以2,3可區(qū)分。P222區(qū)分為P22212,P22223。1243bbaa0abaabb(11) 結(jié)論:該DFA的狀態(tài)集可分為:P= 0,1,5,2,3,4 ,其中1,5等價(jià)。刪去狀態(tài)5,將原來引向5的引線引向與其等價(jià)的狀態(tài)1,有圖(b1)。(b1)最小化的DFA5構(gòu)造一個DFA,它接收=0,1上所有滿足如下條件的字符串:每個1都有0直接跟在右邊。然后再構(gòu)造該語言的正則文法。解:根據(jù)題意,DFA所對應(yīng)的正規(guī)式應(yīng)為:(0|(10)*。所以,接收該串的NFA如下:01210

17、0下表由子集法將NFA轉(zhuǎn)換為DFA:II0 = -closure(MoveTo(I,0)I1 = -closure(MoveTo(I,1)A0B0,2C1B0,2B0,2C1C1B0,211000BCA顯然,A,B等價(jià),所以將上述DFA最小化后有:0C1A0對應(yīng)的正規(guī)文法為:GA:A1C|0A|C0A6設(shè)無符號數(shù)的正規(guī)式為:=dd*|dd*.dd*|.dd*|dd*e(s|)dd*|e(s|)dd*|.dd*e(s|)dd*|dd*.dd*e(s|)dd* 化簡,畫出的DFA,其中d=0,1,2,9,s=+,-解:把原正規(guī)式的每2,3項(xiàng),4,5項(xiàng),6,7項(xiàng)分別合并后化簡有:=dd*|d*.dd

18、*|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*下面構(gòu)造化簡后的對應(yīng)的NFA:57ed421.3dd6sdd.0 下表由子集法將NFA轉(zhuǎn)換為DFA:IId =-closure(MoveTo(I,d)Ie=-closure(MoveTo(I,e)Is=-closure(MoveTo(I,s)I.=-closure(MoveTo(I,.)A0,1,4,6B1,7C5,6D2,6B1,7B1,7D2,6C5,6E7F6D2,6G3,4

19、,7E7E7F6E7G3,4,7G3,4,7C5,6ED.ddCGdBd.AeesFddd7給文法GS:SaA|bQAaA|bB|bBbD|aQQaQ|bD|bDbB|aAEaB|bFFbD|aE|b構(gòu)造相應(yīng)的最小的DFA。解:由于從S出發(fā)任何輸入串都不能到達(dá)狀態(tài)E和F,所以,狀態(tài)E,F(xiàn)為多余的狀態(tài),不予考慮。這樣,可以寫出文法GS對應(yīng)的NFA:aZSADQBbbbababbbaa下表由子集法將NFA轉(zhuǎn)換為DFA:IIa = -closure(MoveTo(I,a)Ib = -closure(MoveTo(I,b)1S2A3Q2A2A4B,Z3Q3Q5D,Z4B,Z3Q6D5D,Z2A7B6D

20、2A7B7B3Q6D由上表可知:(1)因?yàn)?,5是DFA的終態(tài),其他是非終態(tài),可將狀態(tài)集分成兩個子集:P1=1,2,3,6,7,P2=4,5 (2)在P1中因?yàn)?,3輸入b后是終態(tài),而1,6,7輸入b后是非終態(tài),所以P1可區(qū)分為:P11=1,6,7,P12=2,3 (3)在P11中由于1輸入b后為3,6輸入b后為7,而3,7分屬P11和P12,所以1與6不等價(jià),同理,1與7不等價(jià)。所以P11可區(qū)分為:P111=1,P112=6,7(4)查看P112=6,7,由于輸入a后為2,3,所以6,7是否等價(jià)由2,3是否等價(jià)決定。(5)查看P12=2,3,由于輸入b后為4,5,所以2,3是否等價(jià)由4,5是

21、否等價(jià)決定。(6)查看P2=4,5 , 顯然4,5是否等價(jià)由2,3與6,7是否同時等價(jià)決定。由于有(4)即6,7是否等價(jià)由2,3是否等價(jià)決定,所以,4,5是否等價(jià)由2,3是否等價(jià)決定。由于有(5)即2,3是否等價(jià)由4,5是否等價(jià)決定,所以有4,5等價(jià),2,3等價(jià),進(jìn)而6,7也等價(jià)。(7)刪除上表中的第3,5,7行,并將剩余行中的3,5,7分別改為對應(yīng)的等價(jià)狀態(tài)為2,4,6有下表:IIa Ib 1S2A2A2A2A4B,Z4B,Z2A6D6D2A6D這樣可得最小化的DFA如下:a41b2aaabb6b8給出下述文法所對應(yīng)的正規(guī)式:S0A|1BA1S|1B0S|0解:把后兩個產(chǎn)生式代入第一個產(chǎn)生式

22、有:S=01|01SS=10|10S有:S=01S|10S|01|10=(01|10)S|(01|10)=(01|10)*(01|10)即:(01|10)*(01|10)為所求的正規(guī)式。9將圖4.18的DFA最小化,并用正規(guī)式描述它所識別的語言:a72bcbdb134c6aabbd5b圖 4.18解:(1) 因?yàn)?,7是DFA的終態(tài),其他是非終態(tài),可將狀態(tài)集分成兩個子集:P1=1,2,3,4,5,P2=6,7。(2) 由于F(6,b)=F(7,b)=6,而6,7又沒有其他輸入,所以6,7等價(jià)。(3) 由于F(3,c)=F(4,c)=3,F(3,d)=F(4,d)=5,F(3,b)=6,F(4,

23、b)=7,而6,7等價(jià),所以3,4等價(jià)。(4) 由于F(1,b)=F(2,b)=2,F(1,a)=3,F(2,a)=4,而3,4等價(jià),所以1,2等價(jià)。(5) 由于狀態(tài)5沒有輸入字符b,所以與1,2,3,4都不等價(jià)。(6) 綜上所述,上圖DFA的狀態(tài)可最細(xì)分解為:P=1,2,3,4,5,6,7。abb13c6bd5a該DFA用正規(guī)式表示為:b*a(c|da)*bb*10構(gòu)造下述文法GS的自動機(jī):SA0AA0|S1|0該自動機(jī)是確定的嗎?若不確定,則對它確定化。該自動機(jī)相應(yīng)的語言是什么?解:由于該文法的產(chǎn)生式SA0,AA0|S1中沒有字符集VT的輸入,所以不是確定的自動機(jī)。要將其他確定化,必須先用

24、代入法得到它對應(yīng)的正規(guī)式。把SA0代入產(chǎn)生式AS1有:A=A0|A01|0=A(0|01)|0=0(0|01)*。代入SA0有該文法的正規(guī)式:0(0|01)*0,所以,改寫該文法為確定的自動機(jī)為:0WX0Z00Y1由于狀態(tài)A有3次輸入0的重復(fù)輸入,所以上圖只是NFA,下面將它確定化:下表由子集法將NFA轉(zhuǎn)換為DFA:II0 = -closure(MoveTo(I,0)Ib = -closure(MoveTo(I,1)AWBXBXCX,Y,ZCX,Y,ZCX,Y,ZBX100CBA0由上表可知DFA為:第五章 自頂向下語法分析方法1對文法GSSa|(T)TT,S|S(1) 給出(a,(a,a)和

25、(a,a),(a),a)的最左推導(dǎo)。(2) 對文法G,進(jìn)行改寫,然后對每個非終結(jié)符寫出不帶回溯的遞歸子程序。(3) 經(jīng)改寫后的文法是否是LL(1)的?給出它的預(yù)測分析表。(4) 給出輸入串(a,a)#的分析過程,并說明該串是否為G的句子。解:(1) (a,(a,a)的最左推導(dǎo)為S(T)(T,S)(S,S)(a,(T)(a,(T,S)(a,(S,a)(a,(a,a)(a,a),(a),a)的最左推導(dǎo)為S(T)(T,S)(S,a)(T),a)(T,S),a)(T,S,S),a)(S,(T),a)(T),(S),a) (T,S),(a),a)(S,a),(a),a)(a,a),(a),a)(2)由于

26、有TT,S的產(chǎn)生式,所以消除該產(chǎn)生式的左遞歸,增中一個非終結(jié)符U有新的文法G/S:Sa|(T)TSUU,SU|分析子程序的構(gòu)造方法對滿足條件的文法按如下方法構(gòu)造相應(yīng)的語法分析子程序。(1) 對于每個非終結(jié)號U,編寫一個相應(yīng)的子程序P(U);(2) 對于規(guī)則U:=x1|x2|.|xn,有一個關(guān)于U的子程序P(U),P(U)按如下方法構(gòu)造:IF CH IN FIRST(x1) THEN P(x1)ELSE IF CH IN FIRST(x2) THEN P(x2)ELSE .IF CH IN FIRST(xn) THEN P(xn)ELSE ERROR其中,CH存放當(dāng)前的輸入符號,是一個全程變量;

27、ERROR是一段處理出錯信息的程序;P(xj)為相應(yīng)的子程序。(3) 對于符號串x=y1y2.yn;p(x)的含義為:BEGIN P(y1);P(y2);.P(yn);END如果yi是非終結(jié)符,則P(yi)代表調(diào)用處理yi的子程序;如果yi是終結(jié)符,則P(yi)為形如下述語句的一段子程序IF CH=yi THEN READ(CH) ELSE ERROR即如果當(dāng)前文法中的符號與輸入符號匹配,則繼續(xù)讀入下一個待輸入符號到CH中,否則表明出錯。(4) 如果文法中有空規(guī)則U:=EPSILON,則算法中的語句IF CH IN FIRST(xn) THEN P(xn)ELSE ERROR改寫為:IF CH

28、 IN FIRST(xn) THEN P(xn)ELSE IF CH IN FOLLOW(U) THEN RETURN ERROR(5) 要分析一個OrgStr,應(yīng)在該串的后面加上一個串括號#,并從子程序P(S)(S為文法的開始符號)開始,如果中途沒有產(chǎn)生錯誤,并且最后CH=#,則說明OrgStr串合法,否則該串不合法。對每個非終結(jié)符寫出不帶回溯的遞歸子程序如下:char CH;/存放當(dāng)前的輸入符號void P_S()/非終結(jié)符S的子程序if(CH=a) READ(CH);/產(chǎn)生式Saelse if(CH=) READ(CH);/產(chǎn)生式Selse if(CH=()/產(chǎn)生式S(T)READ(CH

29、);P_T();IF (CH=) THEN READ(CH) else ERRORelse ERR;void P_T()/非終結(jié)符S的子程序if(IsIn(CH,FIRST_SU) /FIRST_SU為TSU的右部的FIRST集合P_S();P_U();void P_U()/非終結(jié)符U的子程序if(CH=,)/產(chǎn)生式U,SUREAD(CH);P_S();P_U();else/產(chǎn)生式Uif(IsIn(CH,FOLLOW_U) /FOLLOW_U為U的FOLLOW集合return ;else ERR;(3)判斷文法G/S是否為LL(1)文法。各非終結(jié)符的FIRST集合如下:FIRST(S)=a,(

30、FIRST(T)=FIRST(S)=a,(FIRST(U)=,,各非終結(jié)符的FOLLOW集合如下:FOLLOW(S)=# FIRST(U) FOLLOW(T) FOLLOW(U)=#,,,)FOLLOW(T)=)FOLLOW(U)=FOLLOW(T)=)每個產(chǎn)生式的SELECT集合如下:SELECT(Sa)=aSELECT(S)=SELECT(S(T)=(SELECT(TSU)=FIRST(S)=a,(SELECT(U,SU)=,SELECT(U)=FOLLOW(U)=)可見,相同左部產(chǎn)生式的SELECT集的交集均為空,所以文法G/S是LL(1)文法。文法G/S的預(yù)測分析表如下:a(),#Sa

31、(T)TSUSUSUU,SU(5) 給出輸入串(a,a)#的分析過程步驟分析棧剩余輸入串所用產(chǎn)生式123456789101112#S#)T(#)T#)US#)Ua#)U#)US,#)US#)Ua#)U#)#(a,a)#(a,a)#a,a)#a,a)#a,a)#,a)#,a)#a)#a)#)#)#S(T)( 匹配TSUSaa匹配U,SU,匹配Saa匹配U)匹配接受2對下面的文法G:ETE/E/+E|TFT/T/T|FPF/F/*F/|P(E)|a|b|(1) 計(jì)算這個文法的每個非終結(jié)符的FIRST集和FOLLOW集。(2) 證明這個方法是LL(1)的。(3) 構(gòu)造它的預(yù)測分析表。(4) 構(gòu)造它的

32、遞歸下降分析程序。解:(1)計(jì)算這個文法的每個非終結(jié)符的FIRST集和FOLLOW集。FIRST集合有:FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)=(,a,b,;FIRST(E/)=+,FIRST(T)=FIRST(F)=FIRST(P)=(,a,b,;FIRST(T/)=FIRST(T)=(,a,b,;FIRST(F)=FIRST(P)=(,a,b,;FIRST(F/)=FIRST(P)=*,;FIRST(P)=(,a,b,;FOLLOW集合有:FOLLOW(E)=),#;FOLLOW(E/)=FOLLOW(E)=),#;FOLLOW(T)=FIRST(E/)FO

33、LLOW(E)=+,),#;/不包含F(xiàn)OLLOW(T/)=FOLLOW(T)=FIRST(E/)FOLLOW(E)=+,),#;FOLLOW(F)=FIRST(T/)FOLLOW(T)=(,a,b,+,),#;/不包含F(xiàn)OLLOW(F/)=FOLLOW(F)=FIRST(T/)FOLLOW(T)=(,a,b,+,),#;FOLLOW(P)=FIRST(F/)FOLLOW(F)=*,(,a,b,+,),#;/不包含(2)證明這個方法是LL(1)的。各產(chǎn)生式的SELECT集合有:SELECT(ETE/)=FIRST(T)=(,a,b,;SELECT(E/+E)=+;SELECT(E/)=FOLLO

34、W(E/)=),#SELECT(TFT/)=FIRST(F)=(,a,b,;SELECT(T/T)=FIRST(T)=(,a,b,;SELECT(T/)=FOLLOW(T/)=+,),#;SELECT(FPF/)=FIRST(P)=(,a,b,;SELECT(F/*F/)=*;SELECT(F/)=FOLLOW(F/)=(,a,b,+,),#;SELECT(P(E)=(SELECT(Pa)=aSELECT(Pb)=bSELECT(P)=可見,相同左部產(chǎn)生式的SELECT集的交集均為空,所以文法GE是LL(1)文法。(3)構(gòu)造它的預(yù)測分析表。文法GE的預(yù)測分析表如下:+*()ab#ETE/TE/

35、TE/TE/E/+ETFT/FT/FT/FT/T/TTTTFPF/PF/PF/PF/F/*F/P(E)ab(4)構(gòu)造它的遞歸下降分析程序。對每個非終結(jié)符寫出不帶回溯的遞歸子程序如下:char CH;/存放當(dāng)前的輸入符號void P_E()/非終結(jié)符E的子程序if(IsIn(CH,FIRST_TEP) /FIRST_TEP為TTE/ 的右部的FIRST集合,產(chǎn)生式ETE/P_T();P_EP();else ERR;void P_EP()/非終結(jié)符E/的子程序if(CH=+) /產(chǎn)生式E/+EREAD(CH);P_E();else/產(chǎn)生式E/if(IsIn(CH,FOLLOW_EP) /FOLLO

36、W_EP為E/的FOLLOW集合return ;else ERR;void P_T()/非終結(jié)符T的子程序if(IsIn(CH,FIRST_FTP) /FIRST_TEP為TFT/ 的右部的FIRST集合,產(chǎn)生式TFT/P_F();P_TP();else ERR;void P_TP()/非終結(jié)符T/的子程序if(IsIn(CH,FIRST_T) /FIRST_T為產(chǎn)生式T/T 的右部的FIRST集合,產(chǎn)生式T/TP_T();else/產(chǎn)生式T/if(IsIn(CH,FOLLOW_TP) /FOLLOW_TP為T/的FOLLOW集合return ;else ERR;void P_F()/非終結(jié)符

37、F的子程序if(IsIn(CH,FIRST_PFP) /FIRST_PFP為FPF/ 的右部的FIRST集合,產(chǎn)生式FPF/ P_P();P_FP();else ERR;void P_FP()/非終結(jié)符F/的子程序if(CH=*) /產(chǎn)生式F/*F/READ(CH);P_FP();else/產(chǎn)生式F/if(IsIn(CH,FOLLOW_FP) /FOLLOW_FP為F/的FOLLOW集合return ;else ERR;void P_P()/非終結(jié)符P的子程序if(CH=()READ(CH);P_E();if(CH=) READCH(CH);elseERR;else if(CH=a) READ

38、(CH);else if(CH=b) READ(CH);else if(CH=) READ(CH);else ERR;3已知文法GS:SMH|aHLSo|KdML|LeHfMK|bLM判斷G是否是LL(1)文法,如果是,構(gòu)造LL(1)分析表。解:首先求各非終結(jié)符的FIRST集合:FIRST(S)=aFIRST(M)FIRST(H)=ab,d,e,=a,b,d,e,;FIRST(H)=FIRST(L)=e,;FIRST(K)=d,;FIRST(L)=e;FIRST(M)=FIRST(K)b=b,d,;然后求非終結(jié)符的FOLLOW集合:FOLLOW(S)=o,#FOLLOW(H)=FOLLOW(S

39、)f=f,o,#FOLLOW(K)=FOLLOW(M)=FIRST(H)FOLLOW(S)=e,o,#;/不包含F(xiàn)OLLOW(L)=FIRST(S)oFOLLOW(K)FIRST(M)FOLLOW(M)=a,b,d,e,o,#FOLLOW(M)=a,b,d,e,o,#;/不包含F(xiàn)OLLOW(M)=FIRST(L)FIRST(H)FOLLOW(S)=e,o,#/不包含最后求各產(chǎn)生式的SELECT集合:SELECT(SMH)=(FIRST(MH)-)FOLLOW(S)=b,d,eo,#=b,d,e,o,#;SELECT(Sa)=aSELECT(HLSo)=eSELECT(H)=FOLLOW(H)=f,o,#SELECT(KdML)=dSELECT(K)=FOLLOW(K)=e,o,#SELECT(LeHf)=eSELECT(MK)=(FIRST(K)-)FOLLOW(M)=d,e,o,#SELECT(MbLM)=b可見,相同左部產(chǎn)生式的SELECT集的交集均為空,所以文法GS是LL(1)文法。文法GE的預(yù)測分析表如下:aodefb#SaMHMHMHMHMHHLSoKdMLLeHfMKKKbLMK7對于一個文法若消除了左遞歸,提取了左公

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論