資源描述:
《編譯原理 LR分析法實(shí)驗(yàn)報(bào)告.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、實(shí)驗(yàn)五、LR分析法實(shí)驗(yàn)報(bào)告計(jì)算機(jī)與信息技術(shù)學(xué)院程序功能描述通過設(shè)計(jì)、編寫和構(gòu)造LR(0)項(xiàng)目集規(guī)范簇和LR分析表、對給定的符號串進(jìn)行LR分析的程序,了解構(gòu)造LR(0)分析表的步驟,對文法的要求,能夠從文法G出發(fā)生成LR(0)分析表,并對給定的符號串進(jìn)行分析。要求以表格或圖形的方式實(shí)現(xiàn)。G[E]:E→aA∣bBA→cA∣dB→cB∣d設(shè)計(jì)要求:(1)構(gòu)造LR(0)項(xiàng)目集規(guī)范簇;要求輸入LR(0)文法時(shí),可以直接輸入,也可以讀取文件,并能夠以表格的形式輸出項(xiàng)目集規(guī)范簇集識別活前綴的有窮自動(dòng)機(jī)(2)構(gòu)造LR(0)分析表。要求要求輸入LR(0)文法時(shí),可以直接輸入,也可以讀取文件;
2、輸出項(xiàng)目集規(guī)范簇,可以調(diào)用前一處理部分的結(jié)果,輸出為LR(0)分析表(3)LR(0)分析過程【移進(jìn)、歸約、接受、報(bào)錯(cuò)】的實(shí)現(xiàn)。要求調(diào)用前一部分處理結(jié)果的分析表,輸入一個(gè)符號串,依據(jù)LR(0)分析表輸出與句子對應(yīng)的語法樹,或直接以表格形式輸出分析過程。主要數(shù)據(jù)結(jié)構(gòu)描述數(shù)據(jù)名稱數(shù)據(jù)類型數(shù)據(jù)描述scint終結(jié)符個(gè)數(shù)ncint非終結(jié)符個(gè)數(shù)SC字符數(shù)組存放終結(jié)符NC字符數(shù)組存放非終結(jié)符CAProduction數(shù)組存放產(chǎn)生式excel_actionAction數(shù)組存放Action分析表excel_goto整型數(shù)組存放Goto分析表state整型數(shù)組狀態(tài)棧stack字符數(shù)組分析棧TOKE
3、N字符數(shù)組輸入序列currentint當(dāng)前輸入指針topint狀態(tài)棧頂指針inint分析棧頂指針numint輸入串長度Pcount整型數(shù)組每個(gè)狀態(tài)里項(xiàng)目集數(shù)目Pnumint產(chǎn)生式個(gè)數(shù)Pcint狀態(tài)集個(gè)數(shù)PParadigm數(shù)組存放狀態(tài)集項(xiàng)目集程序結(jié)構(gòu)描述1.首先要求用戶輸入規(guī)則,并保存,分析出規(guī)則的數(shù)目,規(guī)則里的非終結(jié)符號和終結(jié)符號等信息,為下一步分析備用。2.根據(jù)產(chǎn)生式構(gòu)造分析表,首先分析每個(gè)狀態(tài)里有哪些產(chǎn)生式,逐步將狀態(tài)構(gòu)造完整,最后的規(guī)約狀態(tài)數(shù)應(yīng)該等于產(chǎn)生式的個(gè)數(shù)。3.在構(gòu)造狀態(tài)的時(shí)候,首先將所有的內(nèi)容均填為出錯(cuò)情況,在每一步狀態(tài)轉(zhuǎn)換時(shí)可以將移進(jìn)項(xiàng)目填進(jìn)action表中
4、,對于最后的規(guī)約項(xiàng)目,則再用規(guī)約覆蓋掉之前填的移進(jìn)。4.要求用戶輸入分析串,并保存在輸入序列數(shù)組中。5.每一步根據(jù)當(dāng)前的狀態(tài)棧棧頂狀態(tài)和輸入符號查分析表,若是移進(jìn),則直接將符號和相應(yīng)的狀態(tài)添進(jìn)棧中,否則彈出與產(chǎn)生式右部相同個(gè)數(shù)的字符和狀態(tài),并用剩下的狀態(tài)和產(chǎn)生式的左部在goto表中進(jìn)行查找,將非終結(jié)符和得到的狀態(tài)壓入兩個(gè)棧內(nèi)。6.無論是規(guī)約還是移進(jìn)都要輸出當(dāng)前三個(gè)棧內(nèi)保存內(nèi)容的情況。7.如果碰到acc則輸出accept,若碰到error則輸出error,否則則繼續(xù)進(jìn)行規(guī)約和移進(jìn),不進(jìn)行結(jié)果輸出,直至輸出接受或出錯(cuò)。程序測試:測試1:E→aA∣bBA→cA∣dB→cB∣dE2
5、aAE2bBA2cAB2cBA1dB1dS0輸入:bcd#輸出:輸入二:acccccd#輸出:輸入三:acccccd#輸出:學(xué)習(xí)總結(jié)對各個(gè)棧的操作很容易出錯(cuò),是直接覆蓋掉棧頂?shù)臓顟B(tài)還是彈出幾個(gè)狀態(tài)覆蓋掉一個(gè)狀態(tài),對于彈出的狀態(tài),原數(shù)組當(dāng)中的內(nèi)容要清空,出棧入棧的字符數(shù)目很容易出錯(cuò)。構(gòu)造分析表很難,遇到很多問題,用程序?qū)崿F(xiàn)比用手工操作要考慮更多的問題,有很多種情況,本實(shí)驗(yàn)給的規(guī)則比較簡單,比如對于E→aA和E→bB,輸入a和輸入b都只有一個(gè)對應(yīng)產(chǎn)生式可以選擇,也沒有太長的字符重復(fù)多次的序列,但是也要對LR(0)分析法有很熟練的掌握。實(shí)驗(yàn)實(shí)現(xiàn)的相當(dāng)不完善,對著給定的序列寫,不夠
6、具有通用性,也不夠完備,對于程序,我首先將分析表置入,實(shí)現(xiàn)了有了分析表如何判定輸入序列是否合法的部分,然后再實(shí)現(xiàn)輸入產(chǎn)生式的功能,分析出終結(jié)符和非終結(jié)符,實(shí)現(xiàn)了分析表橫坐標(biāo)和縱坐標(biāo)的排序,再實(shí)現(xiàn)項(xiàng)目集規(guī)范族的狀態(tài)分析,邊分析邊構(gòu)造分析表。