編譯原理實驗報告3-LL文法構(gòu)造.doc

編譯原理實驗報告3-LL文法構(gòu)造.doc

ID:50401273

大?。?32.50 KB

頁數(shù):18頁

時間:2020-03-05

編譯原理實驗報告3-LL文法構(gòu)造.doc_第1頁
編譯原理實驗報告3-LL文法構(gòu)造.doc_第2頁
編譯原理實驗報告3-LL文法構(gòu)造.doc_第3頁
編譯原理實驗報告3-LL文法構(gòu)造.doc_第4頁
編譯原理實驗報告3-LL文法構(gòu)造.doc_第5頁
資源描述:

《編譯原理實驗報告3-LL文法構(gòu)造.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應用文檔-天天文庫。

1、實驗3LL(1)文法構(gòu)造一、實驗目的熟悉LL(1)文法的分析條件,了解LL(1)文法的構(gòu)造方法。?二、實驗內(nèi)容1、編制一個能夠?qū)⒁粋€非LL(1)文法轉(zhuǎn)換為LL(1)文法;2、消除左遞歸;3、消除回溯。?三、實驗要求1、將一個可轉(zhuǎn)換非LL(1)文法轉(zhuǎn)換為LL(1)文法,要經(jīng)過兩個階段,1)消除文法左遞歸,2)提取左因子,消除回溯。2、提取文法左因子算法:1)對文法G的所有非終結(jié)符進行排序2)按上述順序?qū)γ恳粋€非終結(jié)符Pi依次執(zhí)行:for(j=1;jPiα

2、β

3、,其中β不以Pi開頭,則修改產(chǎn)生式為:Pi—>βPi′Pi′—>αPi′

4、ε3)化簡上述所得文法。3、提取左因子的算法:A—>δβ1

5、δβ2

6、…

7、δβn

8、γ1

9、γ2

10、…

11、γm(其中,每個γ不以δ開頭)那么,可以把這些產(chǎn)生式改寫成A—>δA′

12、γ1

13、γ2…

14、γmA′—>β1

15、β2

16、…

17、βn4、利用上述算法,實現(xiàn)構(gòu)造一個LL(1)文法:1)從文本文件g.txt中讀入文法,利用實驗1的結(jié)果,存入實驗1設計的數(shù)據(jù)結(jié)構(gòu);1)設計函數(shù)remove_left_recursion()和remove_left_gene()實現(xiàn)消除左遞歸和提取左因子算法,分別對文法

18、進行操作,消除文法中的左遞歸和提出左因子;2)整理得到的新文法;3)在一個新的文本文件newg.txt輸出文法,文法輸出按照一個非終結(jié)符號一行,開始符號引出的產(chǎn)生式寫在第一行,同一個非終結(jié)符號的候選式用“

19、”分隔的方式輸出。?四、實驗環(huán)境PC微機DOS操作系統(tǒng)或Windows操作系統(tǒng)TurboC程序集成環(huán)境或VisualC++程序集成環(huán)境?五、實驗步驟1、學習LL(1)文法的分析條件;2、學習構(gòu)造LL(1)文法的算法;3、結(jié)合實驗1給出的數(shù)據(jù)結(jié)構(gòu),編程實現(xiàn)構(gòu)造LL(1)文法的算法;4、結(jié)合實驗1編程和調(diào)試實現(xiàn)對一個具體文法運用上述算法,構(gòu)造它的L

20、L(1)文法形式;2、把實驗結(jié)果寫入一個新建立的文本文件。?六、測試數(shù)據(jù)輸入數(shù)據(jù):編輯一個文本文文件g.txt,在文件中輸入如下內(nèi)容:S->Qc

21、c

22、cab;Q->Rb

23、b;R->Sa

24、a;?正確結(jié)果:本實驗的輸出結(jié)果是不唯一的,根據(jù)消除左遞歸是選擇非終結(jié)符號的順序不同,或選擇新的非終結(jié)符號的不同,可能會得到不同的結(jié)果,下面只是可能的一個結(jié)果:S->Qc

25、cT;T->@

26、ab;//由于無法輸出ε,用@代替Q->Rb

27、b;R->bcaU

28、caU

29、cabaU

30、aU;U->bcaU

31、@;?七、實驗報告要求實驗報告應包括以下幾個部分:1、滿足LL(1)文

32、法的分析條件;轉(zhuǎn)換前要求文法中不含回路(經(jīng)過推導有形如P->P之類的),也不含以ε為右部的產(chǎn)生式。一個文法要能進行LL(1)分析,那么這個文法應該滿足:無二義性,無左遞歸,無左公因子。首先需要定義一些規(guī)則:1.在程序運行前文法就必須輸入進文本文件中,輸入的文法只包含其中的所有產(chǎn)生式,并且默認其為可轉(zhuǎn)換的非LL(1)文法,即通過消除左遞歸和反復提取公共左因子,就轉(zhuǎn)換成了LL(1)文法。2.輸入的產(chǎn)生式為原實驗1的結(jié)果,即一個非終結(jié)符只有一條產(chǎn)生式,候選之間用“

33、”隔開。3.產(chǎn)生式與產(chǎn)生式之間只能以換行符或分號隔開。4.開始符號對應的產(chǎn)生式必須第一個

34、輸入,即默認輸入的第一個產(chǎn)生式的左部的大寫字母是開始符號。5.輸入與輸出都會保存在文本文件中文件名分別是g.txt和newg.txt,本實驗測試數(shù)據(jù)時,將兩個文本放在了桌面。6.ε用@代替,輸入與輸出都使用@。7.新產(chǎn)生的非終結(jié)符統(tǒng)一使用沒有在非終結(jié)符集合中出現(xiàn)的大寫字母。8.規(guī)定產(chǎn)生式最多只有20個。2、構(gòu)造LL(1)文法的算法;算法:1)從文本文件g.txt中讀入文法,存入結(jié)構(gòu)體中。將第一個讀到的大寫字母記為開始符號S,將讀到的包括開始符號在內(nèi)的所有大寫字母判定為非終結(jié)符,并將第一次出現(xiàn)的存入文法的非終結(jié)符集合中,終結(jié)符小寫字母也一樣。將以換

35、行符或分號隔開的字符串判斷為一條產(chǎn)生式存入文法中。實現(xiàn)函數(shù)是scanP()。2)對文法中的產(chǎn)生式消除左遞歸。實現(xiàn)函數(shù)是remove_left_recursion()。3)對文法中的產(chǎn)生式反復提取公共左因子。實現(xiàn)函數(shù)是remove_left_gene()。4)向newg.txt中輸出文法的所有產(chǎn)生式。3、消除左遞歸文法和提取左因子算法實現(xiàn)方法;消除左遞歸文法(包括其中用到其它的子函數(shù)):/*字符串分割函數(shù),將產(chǎn)生式右部的候選返回,識別‘

36、’,從pos位開始分割*/stringstrsplit(stringstrTok,intpos){strings

37、tr;size_tposition;position=strTok.find("

38、",pos);if(position!=string:

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。