




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
編譯原理課程設(shè)計報告設(shè)計題目遞歸下降分析程序的實現(xiàn)學生姓名 學號 專業(yè)班級計算機科學與技術(shù)指導(dǎo)教師
2011年12月2日
一、實驗?zāi)康模赫莆兆陨隙抡Z法分析的要求與特點。掌握遞歸下降語法分析的基本原理和方法。掌握相應(yīng)數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法。實驗內(nèi)容:設(shè)計內(nèi)容及要求:對文法G設(shè)計內(nèi)容及要求:對文法G:E-E+TITT-T*F|FFf(E)|i構(gòu)造岀G的遞歸下降分析程序。程序顯示輸出匹配過程(即自上而下生成語法分析樹的步驟,輸出各匹配產(chǎn)生式序號即可)。三、設(shè)計思路:語法分析:語法分析是編譯程序的核心部分,任務(wù)是分析一個文法的句子結(jié)構(gòu)。遞歸下降分析程序的實現(xiàn)的功能:按照文法的產(chǎn)生式(語言的語法規(guī)則),識別輸入符號串是否為一個句子(合式程序)。自上而下分析:從文法的開始符號出發(fā),向下推導(dǎo),推出句子??煞譃閹А盎厮荨钡暮筒粠Щ厮莸倪f歸子程序(遞歸下降)分析方法。它的主旨是對任何輸入串,試圖用一切可能的辦法,從文法開始符號(根結(jié)點)出發(fā),自上而下地為輸入串建立一棵語法樹?;蛘哒f,為輸入串尋找一個最左推導(dǎo)。也即從文法的開始符號出發(fā),反復(fù)使用各種產(chǎn)生式,尋找〃匹配“的推導(dǎo)。遞歸下降分析法:對每一語法變量(非終結(jié)符)構(gòu)造一個相應(yīng)的子程序,每個子程序識別一定的語法單位,通過子程序間的信息反饋和聯(lián)合作用實現(xiàn)對輸入串的識別。分析過程中遇到的問題:分析過程中,當一個非終結(jié)符用某一個候選匹配成功時,這種匹配可能是暫時的。出錯時,不得不“回溯”o文法左遞歸問題。含有左遞歸的文法將使自上而下的分析陷入無限循環(huán)。構(gòu)造不帶回溯的自上而下分析算法:a.要消除文法的左遞歸性:一個文法可以消除左遞歸的條件是①不含以£為右部的產(chǎn)生式②不含回路。
b?克服回溯,構(gòu)造不帶回溯的自上而下分析的文法條件(6)滿足LL(1)文法的三個條件:?文法不含左遞歸,.對于文法中每一個非終結(jié)符A的各個產(chǎn)生式的候選首符集兩兩不相交。即,若A-cc1a2???|an 則FIRST(ai)QFIRST(aj)=f(iHj).對文法中的每個非終結(jié)符A,若它存在某個候選首符集包含£,則FIRST(ai)DFOLLOW(A)=f i=l,2,.?.,n(7)因此我們可以把設(shè)計要求的文法首先改寫為LL(1)文法E-TE'E'f+TE:sT-FT'Ff(E)Ff(E)然后構(gòu)造每個非終結(jié)符的FIRST和然后構(gòu)造每個非終結(jié)符的FIRST和FOLLOW集合:FIRST(E)={( ,i}FIRST(Ez)={+,e}FIRST(T) ={ (,I}FIRST(T')={*,s}FOLLOW(E) ={), #}FOLLOW(EO={),#}FOLLOW(T)={+,),#}FOLLOW(F)二{+,),#}FIRST(F)={(,I}FOLLOW(F)FIRST(F)={(,I}FOLLOW(F)二{*, +,),#}確定改寫后的文法為LL(1)文法;然后為每一個非終結(jié)符,構(gòu)造相應(yīng)的遞歸過程,過程的名字表示規(guī)則左部的非終結(jié)符;過程體按規(guī)則右部符號吊的順序編寫。然后再為每個非終結(jié)符設(shè)計一個對應(yīng)的函數(shù),通過各函數(shù)之間的遞歸調(diào)用從而實現(xiàn)遞歸下降語法分析的功能。(8)編寫C++代碼用到的變量和幾個功能識別函數(shù):.advanced; //字符串小標,表示使IP指向下一輸入符號。?voidE(); //功能識別函數(shù),表示規(guī)則E->TE,voidEl(); //功能識別函數(shù),表示規(guī)則E—>+TE'/£voidT(); //功能識別函數(shù),表示規(guī)則?FT,VOidTl(); //功能識別函數(shù),表示規(guī)則r-XFT/evoidF(); //功能識別函數(shù),表示規(guī)則F->(E)/i因為每個非終結(jié)符有對應(yīng)的子程序的定義,功能識別函數(shù)的編寫過程中,當需要從某個非終結(jié)符出發(fā)進行展開(推導(dǎo))時,就調(diào)用這個非終結(jié)符對應(yīng)的子程序。功能識別函數(shù)的設(shè)計與編寫:(1)當遇到終結(jié)符a時,則編寫語句If(當前讀到的輸入符號=&)讀入下一個輸入符號(2)當遇到非終結(jié)符A時,則編寫語句調(diào)用A()o
(3)當遇到A~>e規(guī)則時,則編寫語句If(X前讀到的輸入符號不屬于Follow(A))error()(4)當某個非終結(jié)符的規(guī)則有多個候選式時,按LL(1)文法的條件能唯一地選擇一個候選式進行推導(dǎo).結(jié)果截圖:1、輸入一個正確的句子:2、輸入一個錯誤句子■inputsentence.txt本文件㈢編捐㈢格式9)查看?幫助但)i*i*(i+#|
Boutputrule.tx仁遲事本文件㈢編輯㈢格式9)查看遡幫助凹pleaseinputtherightsentence(endwith#):E->TE‘t-》ftF->iT->問F->iT-冶E->TE,t->ft"F->i『-〉eE‘-〉+TE'T->FT5(〉isnotmatching,error!3、輸入一個無#結(jié)束的錯誤句子:診inputsenterKe.txt-12爭本文件㈢編輯?格式9)查看2幫肋?i*i*iBoutputrule.txt?記爭本文件㈢編輯⑥格式9)查看⑷幫助凹bTFTFTFTEinputtherightsentence(endwith#):E~>TEbTFTFTFTEsignalofU.fail!代碼:#include<iostream>#include<fstream>usingnamespacestd;0}0}#include<string>chara[10];intadvance=0;voidE();voidEI();voidT();//字符串的存入//字符串小標,表示使IF指向下一輸入符號//功能識別函數(shù),表示規(guī)則E->TE,//功能識別函數(shù),表示規(guī)則E'->+TE‘/e//功能識別函數(shù),表示規(guī)則T->FT‘ifstreamimport(Hinputsentence.txtn);ofstreamexport(,zoutputrule?txt");voidTl(); //功能識別函數(shù),表示規(guī)則T—XFT'/voidF();intmain()//功能識別函數(shù),表示規(guī)則F->(E)/i//主函數(shù)吃xport<</zp1easeinputtherightsentence(endwith#) /輸入提示import?a;E(); //從首個推導(dǎo)式E開始if((a[advance]—#'))export<<Z/Thesentenceisright,success!\n";e1seexport?,,Nothesignalof#,fail!\n";°return0;}VOidE() //功能識別函數(shù){export?,/E->TE,\n';TO;E10;}voidE1(){if(a[advance]二二'){export?,,E,->+TE,\nH; //輸出使用E‘規(guī)則0advance++; //如果是”,則讀取下一字符T();〃根據(jù)E'—>+TE規(guī)則右部符號串的順序,調(diào)用其他非終結(jié)符的規(guī)則oEl();eIseexport?,,Er~>£\n";}voidT()export?,,T->FT,\rT;F();〃根據(jù)T—>FT規(guī)則右部符號串的順序,調(diào)用其他非終結(jié)符的規(guī)則T10;}voidT1(){if(a[advance]==? ) //如果是,則讀取下一字符{export<〈"T->*FT,\n";advance++;F0;//根據(jù)T‘-XFT'規(guī)則右部符號串的順序,調(diào)用其他非終結(jié)符的規(guī)則呵1();}elseexport?,ZT"—>e\n";}voidF(){if(a[advance]=='i,) //如果是“i”,則讀取下一字符{export?,,F(xiàn)—>i\nz,;advance++;}e1seif(a[advance]=‘(')〃如果是“(J則讀取下一字符{。advance++;E(); //根據(jù)F-XE)規(guī)則右部符號串的順序,調(diào)用非終結(jié)符E的規(guī)則if(a[advance]=')'){Q export?,zF—>(E)\nH;advance++;ooo)Qelse{0 export<<,z\n()isnotmatching,error!\nM;exit(0);〃正常結(jié)束程序運行}}else{export<<n\n()isnotmatehing,error!\n";exit(O); 〃正常結(jié)束程序運行六、心得體會:一個星期的課程設(shè)計,當中有苦也有樂,但從苦樂中我學到了很多東西。通過這次課程設(shè)計我看到了自己的與別人的差距,有很多我自己不明白的地方別人都會。當我自己一開始進行遞歸下降分析程序的課程設(shè)計時,我發(fā)現(xiàn)我有好多相關(guān)的小知識點還不太熟悉,于是我在結(jié)合書本和圖書館相關(guān)資料基礎(chǔ)上,將課堂學習的知識予以真正的吸收和應(yīng)用,功夫不負有心人,我最終琢磨出了解決該設(shè)計題的基本思路和方法。這次課程設(shè)計,不僅鞏固了課堂知識,很好的復(fù)習了一下編譯原理所學的內(nèi)容,而且提高了自己的上機實踐能力,有效的和實際結(jié)合在了一起,加強了我的動手、思考、解決問題的能力,并擴展了所學知識。同時在設(shè)計過程中也發(fā)現(xiàn)了我的許多不足之處,比如對以前所學的知識理解的不夠深刻,掌握的不夠牢固。此外,因為設(shè)計程序的各項流程需要心靜下來慢慢思考,所以克服了最近比較浮躁的心態(tài),同時也讓自己充實了很多。在設(shè)計過程中也遇到了一些問題,比如編寫程序時,每讀入一個字符,要執(zhí)行相應(yīng)的遞歸函數(shù),因為調(diào)用過程中有再次調(diào)用,我有好兒次把函數(shù)的調(diào)用搞混,導(dǎo)致得出的結(jié)果不是我想要的。所以要在草稿紙上先畫出程序的流程圖,理順各子程序之間的調(diào)用關(guān)系,才能避免程序出錯。還有不僅要知道文法要改為LL(1)文法,還要明白為什么要改,修
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年專升本思政理論挑戰(zhàn)試題及答案
- 注射用羅普司亭-藥品臨床應(yīng)用解讀
- 2024年思政理論的評估分析試題及答案
- 網(wǎng)絡(luò)安全管理員-初級工題庫含參考答案
- 馬工學的決策分析工具試題及答案
- 汽車維修工高級工復(fù)習試卷復(fù)習試題有答案
- 汽車裝調(diào)工練習卷附答案
- 2024-2025學年高中歷史 第三單元 歐美資產(chǎn)階級革命時代的杰出人物 第3課 一代雄獅拿破侖教學教學實錄2 新人教版選修4
- 寵物殯葬行業(yè)的社會責任考核試題及答案
- 數(shù)學三-2018年全國碩士研究生入學考試《數(shù)學三》真題
- 實驗室病原微生物危害 評估報告
- 實用通用英語答題卡word模板
- 二年級下冊心理健康教案-第二十四課 幫爸爸媽媽分擔 媽媽謝謝您|北師大版
- GB∕T 22117-2018 信用 基本術(shù)語
- 未篩分碎石施工方案
- 汽車尾氣污染的產(chǎn)生及綜合治理PPT課件
- 貝雷橋設(shè)計及施工方案(精選)
- 仿宋字練習字帖
- 紙漿技術(shù)指標大全
- 化工儀表英文縮寫及實例
- 醫(yī)學影像科診療技術(shù)人員授權(quán)申請表模板
評論
0/150
提交評論