




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023.11.30LL(1)文法的判斷及轉(zhuǎn)換
目錄一、實(shí)驗(yàn)名稱(chēng) 2二、實(shí)驗(yàn)?zāi)康?2三、實(shí)驗(yàn)原理 21、First集定義 22、Follow集定義 23、Select集定義 34、含左遞歸文法 3四、實(shí)驗(yàn)思路 31、求非終結(jié)符是否能導(dǎo)出空 32、求First集算法 33、求Follow集算法 34、求Select集算法 4五、實(shí)驗(yàn)小結(jié) 4六、附件 41、源代碼 42、運(yùn)行結(jié)果截圖 10
輸入:任意一個(gè)文法輸出:(1)是否為L(zhǎng)L(1)文法(2)若是,給出每條產(chǎn)生式的select集(3)若不是,看看是否含有左公共因子或者含有左遞歸,并用相應(yīng)的方法將非LL(1)文法變成LL(1)文法,并輸出新文法中每條產(chǎn)生式的select集。三、實(shí)驗(yàn)原理1、First集定義令X為一個(gè)文法符號(hào)(終止符或非終止符)或ε,則集合First(X)有終止符組成,此外可能還有ε,它的定義如下:1.
若X是終止符或ε,則First(X)=
{X}。2.
若X是非終結(jié)符,則對(duì)于每個(gè)產(chǎn)生式X—>X1X2…Xn,F(xiàn)irst(X)包含了First(X1)-{ε}。若對(duì)于某個(gè)i
<
n,所有的集合First(X1),...
,F(xiàn)irst(Xi)都包含了ε,則First(X)也包括了First(Xi+1)-
{ε}。若所有集合First(X1),...,F(xiàn)irst(Xn)都包括了ε,則First(X)也包括了ε。2、Follow集定義給出一個(gè)非終結(jié)符A,那么集合Follow(A)則是由終結(jié)符組成,此外可能還含有#(#是題目約定的字符串結(jié)束符)。集合Follow(A)的定義如下:1.若A是開(kāi)始符號(hào),則#在Follow(A)中。2.若存在產(chǎn)生式B—>αAγ,則First(γ)-{ε}在Follow(A)中。3.若存在產(chǎn)生式B—>αAγ,且ε在First(γ)中,則Follow(A)包括Follow(B)。3、Select集定義4、含左遞歸文法一個(gè)文法G,若存在P經(jīng)過(guò)一次或多次推導(dǎo)得到Pa(即能推導(dǎo)出以P開(kāi)頭的式子),則稱(chēng)G是左遞歸的。左遞歸分為直接左遞歸和間接左遞歸。直接左遞歸經(jīng)過(guò)一次推導(dǎo)就可以看出文法存在左遞歸,如P→Pa|b。間接左遞歸側(cè)需多次推導(dǎo)才可以看出文法存在左遞歸,如文法:S→Qc|c(diǎn),Q→Rb|b,R→Sa|a有S=>Qc=>Rbc=>Sabc四、實(shí)驗(yàn)思路本次實(shí)驗(yàn)采用python完成。1、求非終結(jié)符是否能導(dǎo)出空a.第一輪掃描。當(dāng)前的產(chǎn)生式還沒(méi)被刪除,非終結(jié)符lp可以導(dǎo)出空,將以該非終結(jié)符為左部的產(chǎn)生式標(biāo)記為要?jiǎng)h除的。產(chǎn)生式右部分解,若該產(chǎn)生式右部包含終結(jié)符,刪除該產(chǎn)生式因?yàn)橛伤粫?huì)導(dǎo)出空。判斷沒(méi)有被刪除的產(chǎn)生式中是否還有以該非終結(jié)符為左部的產(chǎn)生式。 b.第二輪掃描。逐一掃描每一條產(chǎn)生右部的每一個(gè)符號(hào),循化直至每個(gè)非終結(jié)符的狀態(tài)都確定下來(lái)。2、求First集算法存儲(chǔ)每一個(gè)非終結(jié)符對(duì)應(yīng)的First集,掃描每一條產(chǎn)生式,記錄每一輪掃描是每個(gè)非終結(jié)符First集是否增大過(guò)。全部初始化為沒(méi)有增大的狀態(tài),對(duì)于課本的五種類(lèi)型依次求解,每次將結(jié)果加入對(duì)應(yīng)的集合中,若一次掃描First集沒(méi)有增大,則說(shuō)明循環(huán)結(jié)束。3、求Follow集算法存儲(chǔ)每一個(gè)非終結(jié)符對(duì)應(yīng)的Follow集,將'#'加入文法的開(kāi)始符號(hào)的Follow集合4、求Select集算法初始化每條產(chǎn)生式對(duì)應(yīng)的Select集合為空,若產(chǎn)生式右部不能推導(dǎo)出空,則將右部的First集加入Select集,如果可以推出空,則需要同時(shí)將左部的Follow集合右部的First集去掉空的部分加入Select集。五、實(shí)驗(yàn)小結(jié)通過(guò)本次實(shí)驗(yàn),知道了如何判斷一個(gè)文法是不是LL(1)文法,同時(shí)對(duì)于First、Follow以及Select集的求解原理變得更加熟悉,并且知道了如何用計(jì)算機(jī)語(yǔ)言求解First,F(xiàn)ollow以及Select集。不足之處是,沒(méi)有完成判斷文法是否為左遞歸文法以及左遞歸文法的轉(zhuǎn)換部分。六、附件1、源代碼classGw:def__init__(self):withopen('Gw.txt')asf:content=f.readlines()content=[line.strip()forlineincontent]self.Vn=content[0].split('')self.Vt=content[1].split('')self.start=content[2]duce=[]self.left=[]self.right=[]foriinrange(3,len(content)):duce.append(content[i])self.left.append(content[i].split('->')[0])self.right.append(content[i].split('->')[1])defshowGw(self):print('非終結(jié)符:',self.Vn)defcanEmpty(self):self.isEmpty=dict()foriinrange(len(self.Vn)):self.isEmpty[self.Vn[i]]=-1print(self.isEmpty)temp=duce[::]deleteIndex=[]pointer=0whilepointer<len(temp):ifpointernotindeleteIndex:lp=temp[pointer].split('->')[0]rp=temp[pointer].split('->')[1]ifrp=='!':self.isEmpty[lp]=1foriinrange(len(temp)):iftemp[i].split('->')[0]==lpandinotindeleteIndex:deleteIndex.append(i)l=list(rp)isContainVt=[iinself.Vtforiinl]ifTrueinisContainVt:deleteIndex.append(pointer)forkinrange(len(temp)):ifknotindeleteIndex:iftemp[k].split('->')[0]==lp:breakelse:self.isEmpty[lp]=0pointer=pointer+1while-1inself.isEmpty.values():foriinrange(len(temp)):ifinotindeleteIndex:lp=temp[i].split('->')[0]rp=temp[i].split('->')[1]rlsit=list(rp)forjinrange(len(rlsit)):ifself.isEmpty[rlsit[j]]==1:ifj==len(rlsit)-1:self.isEmpty[lp]=1else:self.isEmpty[lp]=0else:continuedefshow(self):print('非終結(jié)符能否推導(dǎo)出空的信息:')forvinself.Vn:ifself.isEmpty[v]==1:yon='是'else:yon='否'print('%s:%s'%(v,yon))defgetFirst(self):self.First=dict()foriinself.Vn:self.First[i]=list()isChange=dict()whileTrue:forkinself.Vn:isChange[k]=0foriinrange(len(duce)):lp=duce[i].split('->')[0]rp=duce[i].split('->')[1]rlist=list(rp)ifrlist[0]=='!'orrlist[0]inself.Vt:ifrlist[0]notinself.First[lp]:self.First[lp].append(rlist[0])isChange[lp]=1else:forjinrlist:ifjinself.Vn:ifself.isEmpty[j]==1:oldsize=len(self.First[lp])templist=self.First[j][::]if'!'intemplist:templist.remove('!')forxintemplist:else:oldsize=len(self.First[lp])ifjinself.Vn:templist=self.First[j][::]forxintemplist:ifxnotinself.First[lp]:self.First[lp].append(x)else:ifjnotinself.First[lp]:self.First[lp].append(x)newsize=len(self.First[lp])ifoldsize!=newsize:isChange[lp]=1breakif1notinisChange.values():print('First集合不在增大!')breakelse:print('First集合有增大!')passdefshowFirst(self):print('First集合信息:')forvinself.Vn:print(v,self.First[v])defcanCauseEmpty(self,plist):first=list()iflen(plist)==0:first.append('!')else:foriinplist:ifiinself.Vn:ifself.isEmpty[i]==1:t=self.First[i][::]if'!'int:t.remove('!')forkint:breakelse:ifinotinfirst:first.append(i)breakreturnfirstdefgetFollow(self):self.Follow=dict()foriinself.Vn:self.Follow[i]=list()self.Follow[self.start].append('#')isChange=dict()whileTrue:forkinself.Vn:isChange[k]=0foriinrange(len(duce)):lp=duce[i].split('->')[0]rp=duce[i].split('->')[1]rlist=list(rp)forjinrange(len(rlist)):ifrlist[j]inself.Vn:reslist=self.canCauseEmpty(rlist[j+1::])if'!'inreslist:oldsize=len(self.Follow[rlist[j]])foryinself.Follow[lp]:ifynotinself.Follow[rlist[j]]:self.Follow[rlist[j]].append(y)newsize=len(self.Follow[rlist[j]])ifoldsize!=newsize:isChange[rlist[j]]=1else:passoldsize=len(self.Follow[rlist[j]])forxinreslist:ifx!='!'andxnotinself.Follow[rlist[j]]:if1notinisChange.values():breakdefshowFollow(self):print('Follow集合信息:')forkeyinself.Vn:print(key,self.Follow[key])defgetSelect(self):self.Select=dict()foriinduce:self.Select[i]=list()foriinrange(len(duce)):lp=duce[i].split('->')[0]rp=duce[i].split('->')[1]rlist=list(rp)ifrlist[0]=='!':forvinself.Follow[lp]:ifvnotinself.Select[duce[i]]:self.Select[duce[i]].append(v)elifrlist[0]inself.Vt:self.Select[duce[i]].append(rlist[0])else:res=self.canCauseEmpty(rlist)if'!'notinres:forvinres:ifvnotinself.Select[duce[i]]:self.Select[duce[i]].append(v)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勘察合同范例 付款方式
- 公司有效合同范例
- 協(xié)調(diào)員 合同范例
- 廠區(qū)維修框架合同范例
- 賣(mài)舊貨合同范例
- 口罩訂購(gòu)合同范例
- 參茸購(gòu)銷(xiāo)合同范例
- 發(fā)貨送貨合同范例
- 博羅網(wǎng)簽合同范例
- 化糞池合作合同范本
- 2025年浙江省中考英語(yǔ)二輪題型突破講義:選擇型閱讀
- 2025年皖西衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)及答案1套
- 頜面骨囊腫腫瘤和瘤樣病變影像診斷講解
- 逐夢(mèng)青春共創(chuàng)未來(lái)
- 【物理】彈力 同步練習(xí)+2024-2025學(xué)年人教版物理八年級(jí)下冊(cè)
- 口腔醫(yī)學(xué)主治醫(yī)師職稱(chēng)考試統(tǒng)考?xì)v年真題及答案
- 2025年中國(guó)中信集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 部編版六年級(jí)語(yǔ)文下冊(cè)基礎(chǔ)知識(shí)專(zhuān)項(xiàng)練習(xí)(帶答案)
- 2024-2030年中國(guó)除濕機(jī)行業(yè)發(fā)展現(xiàn)狀及銷(xiāo)售模式分析報(bào)告版
- 財(cái)經(jīng)法規(guī)和會(huì)計(jì)職業(yè)道德試題庫(kù)(含答案)
- 幼兒園教職員工健康監(jiān)測(cè)方案
評(píng)論
0/150
提交評(píng)論