




已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
編譯原理課程設(shè)計(jì)報(bào)告題目名稱語法高亮轉(zhuǎn)換軟件班 級學(xué) 號姓 名指導(dǎo)教師 編寫時間2009-12-311. 課程設(shè)計(jì)題目名稱語法高亮轉(zhuǎn)換軟件2. 課程設(shè)計(jì)任務(wù)目的與任務(wù)u 問題描述:在我們使用的集成化編譯環(huán)境(IDE)中,C+語言的源代碼通常使用高亮語法表示,例如關(guān)鍵字的顯示。但是如果我們將這段代碼發(fā)布到網(wǎng)頁中,它的高亮語法表示將消失,這樣看起來非常不直觀,我們希望在網(wǎng)頁中代碼仍然能保持原來的高亮語法表示。u 課程設(shè)計(jì)要求:將輸入為C+源代碼的文件,即后綴為cpp的文件,用網(wǎng)頁文件輸出,即用后綴為html的文件輸出。u 課程設(shè)計(jì)實(shí)現(xiàn)功能:基于詞法分析語法高亮轉(zhuǎn)換軟件將C+源代碼轉(zhuǎn)換為網(wǎng)頁文件,在瀏覽器中打開網(wǎng)頁文件時,網(wǎng)頁中顯示C+源代碼并以高亮語法表示顯示。3. 設(shè)計(jì)思想和實(shí)現(xiàn)方法(一)、設(shè)計(jì)思想 要將C+源文件轉(zhuǎn)換成高亮顯示的HTML文件,主要設(shè)計(jì)思想為:(1)關(guān)鍵字的高亮顯示:源程序中需高亮顯示的字符都是關(guān)鍵字或一些特殊字符,因此可以將這些關(guān)鍵字都存入key數(shù)組中。key數(shù)組為:key=asm, auto, bad_cast, bad_typeid, bool, break, case, catch,char, class, const, const_cast, continue, default, define,delete,do,double, dynamic_cast, else, enum, except, explicit,extern, false, finally, float, for, friend, goto, if,include,inline, int, long, mutable,namespace,new,operator,private,protected,printf,pi,public,register,reinterpret_cast,return, short, signed, sizeof, static, static_cast, struct,switch, template, this, throw, true, try, type_info,typedef, typeid, typename, union, unsigned, using, virtual,void, volatile,whileC+語言中的標(biāo)識符均由字母或數(shù)字組成。當(dāng)碰到這些標(biāo)識符時先讀取,然后與key數(shù)組中的各關(guān)鍵字進(jìn)行匹配,匹配成功則為關(guān)鍵字,并以高亮處理并輸出到目標(biāo)文件(html)中,否則不做處理直接輸出。(2)需要特殊處理的字符的高亮顯示:每次從C+源文件中讀取單個字符,根據(jù)不同的情形進(jìn)行不同的處理。處理情況如下: 讀到字符+-*/%= 時,以運(yùn)算符樣式顯示出來。 讀到字符,以既定樣式顯示。 讀到字符! $ % & ( ) * + - , . : ; = ? | 這些字符,直接以既定樣式顯示。 如果讀入,則一直讀到再次出現(xiàn)為止,然后將這些字符以字符串樣式輸出。 如果讀入,則一直讀到再次出現(xiàn)為止,然后將這些字符以字符樣式輸出。 如果讀入19,則連續(xù)讀到非數(shù)字出現(xiàn),然后將這些數(shù)字以正常數(shù)字樣式輸出。 如果讀入,繼續(xù)讀入字符,直到出現(xiàn) 、n或t為止,以開頭的字符串樣式輸出。(二)、實(shí)現(xiàn)方法(1)實(shí)現(xiàn)函數(shù)說明針對上述具體的處理情況,分別定義: is_keyword(char *str)、is_identifier(char *type)、is_operator(char ch)、is_seprator(char ch)、is_notes(char ch)這五種函數(shù)分別處理關(guān)鍵字、標(biāo)識符、運(yùn)算符、分界符、注釋語句。函數(shù)getstr(fstream & src) 用來讀取字符,函數(shù)get(fstream src)用來讀入空格符。根據(jù)源程序中的不同字符分別調(diào)用相應(yīng)的函數(shù)進(jìn)行處理。用lex(ifstream &src, ofstream &dst)來分析函數(shù)。在主程序中通過ifstream src(rensha.cpp,ios:in)和ofstream dst(Output.html,ios:out);來實(shí)現(xiàn)對源程序(rensha.cpp)的讀取以及目標(biāo)文件的輸出。(2)主程序流程圖開 始輸入C+源文件調(diào)用ifstream函數(shù)取字符調(diào)用lex函數(shù)是字符是空格符字符/空格符與key數(shù)組內(nèi)容匹配N直接輸出Y是否相同關(guān)鍵字或標(biāo)示符處理判別字符類型是注釋語句是字符串是單目算符是整數(shù)或?qū)?數(shù)是 分界 符整數(shù)或?qū)崝?shù)處理分界符處理單目運(yùn)算符處理注釋語句處理字符串處理Y是否還有字符N輸出HTML文件結(jié) 束4. 程序說明通過函數(shù)getstr(fstream & src) 和函數(shù)get(fstream src)逐個取出rensha.cpp中的字符,通過與bool is_keyword(char *str)函數(shù)中定義的char *key數(shù)組內(nèi)容比較,進(jìn)行關(guān)鍵字匹配,匹配成功則按關(guān)鍵字方式顯示,如果不成功再按運(yùn)算符、分界符、注釋語句、分界符、字符串等做出相應(yīng)的處理。其中,運(yùn)算符、分界符、注釋語句、分界符、字符串等均單獨(dú)定義了相應(yīng)函數(shù)進(jìn)行處理,對符合要求的字符進(jìn)行高亮顯示。5. 程序運(yùn)行結(jié)果6. 測試報(bào)告7. 存在問題及分析很顯然,本設(shè)計(jì)的實(shí)現(xiàn)關(guān)鍵就是字符的分類問題。對于不同作用的字符,應(yīng)該用不同的顏色將其分別顯示。在C或者C+中的字符大概可以分為以下幾類:字符集,標(biāo)識符,關(guān)鍵字,文字,操作符(運(yùn)算符),分隔符,空白符等。其中標(biāo)識符和關(guān)鍵字都可以當(dāng)作關(guān)鍵字處理,其他的字符則按自己的種類及功能進(jìn)行分類。好的分類為他們的高亮顯示提供了一個前提條件,讓他們的功能既不會因?yàn)榉诸惒痪唧w而沖突也不會因?yàn)榉值锰?xì)而使得某些功能沒有實(shí)現(xiàn),這使得了本設(shè)計(jì)的實(shí)現(xiàn)成為了可能,做好分類問題就相當(dāng)于成功了一半。8. 總結(jié)及體會本次課程設(shè)計(jì)要求設(shè)計(jì)一個簡單的編譯器,用以實(shí)現(xiàn)C+源文件在向HTML文件轉(zhuǎn)換過程中的關(guān)鍵字及特殊字符的高亮顯示功能。在設(shè)計(jì)剛開始時,如做其他課程設(shè)計(jì)一樣,覺得無從下手,整個人就像是個無頭蒼蠅到處亂撞,但通過自己耐心搜集資料,向老師和同學(xué)請教,慢慢理出了頭緒,也有了自己的設(shè)計(jì)思想和實(shí)現(xiàn)方法。對于設(shè)計(jì)題目來說,并非那么得復(fù)雜,帶要設(shè)計(jì)者將所學(xué)轉(zhuǎn)換成相應(yīng)的實(shí)際應(yīng)用卻并非一件容易的事情。本設(shè)計(jì)題目的設(shè)計(jì)思想是簡單的,只需要將關(guān)鍵字、標(biāo)示符、注釋等分門別類,然后通過定義實(shí)現(xiàn)函數(shù)進(jìn)行字符搜索及字符匹配,匹配成功時作出相應(yīng)的處理即可。但是如何進(jìn)行分類,如何定義實(shí)現(xiàn)函數(shù),還是需要自己下功夫考慮和實(shí)踐的。在課程設(shè)計(jì)過程中,我深刻地體會到:編譯原理不同于一般集成環(huán)境的設(shè)計(jì)語言,它具有很強(qiáng)的抽象性。這就要求我們在設(shè)計(jì)過程中要真正理解編譯器是如何構(gòu)造,如何實(shí)現(xiàn)功能的,而這相對普通設(shè)計(jì)語言在難度和抽象程度上有了更大的提升。當(dāng)然這也能使我們對程序設(shè)計(jì)語言的設(shè)計(jì)和實(shí)現(xiàn)有了更深刻的理解,對和程序設(shè)計(jì)語言相關(guān)的理論知識有了更深層次的了解。除此之外,通過實(shí)踐提高學(xué)生的編程能力、協(xié)作能力和創(chuàng)新能力,為以后的學(xué)習(xí)打下良好的基礎(chǔ)。通過本次的課程設(shè)計(jì),我認(rèn)識到了編譯原理這門課程的重要性,對編譯原理這門課程有了更深刻地認(rèn)識。深刻認(rèn)識到編譯原理課程作為計(jì)算機(jī)專業(yè)本科生的一門重要的專業(yè)基礎(chǔ)課程,對理論性和實(shí)踐性要求均很高。編譯原理課程設(shè)計(jì)也是計(jì)算機(jī)專業(yè)課編譯原理的后續(xù)實(shí)踐性教學(xué)環(huán)節(jié)。在本次課程設(shè)計(jì)中,雖然我只做了語法高亮顯示軟件。但這一設(shè)計(jì)題目用到了詞法分析,而詞法分析又是跟其他相關(guān)聯(lián)的,所以運(yùn)用的是整個編譯原理課程的知識,詞法分析作為編譯原理課程的一個重要問題,它是語法分析,語義分析,中間代碼生成,代碼優(yōu)化,代碼生成等的前提,把這些聯(lián)系了起來才算真正學(xué)到了編譯原理這門課程,把這些運(yùn)用好了,才能做好本次設(shè)計(jì)。另外,通過本次的設(shè)計(jì),使我對程序設(shè)計(jì)語言的設(shè)計(jì)和實(shí)現(xiàn)有深入的理解,不僅鞏固了計(jì)算機(jī)專業(yè)理論的知識,而且還加強(qiáng)了把理論融入到實(shí)際問題中的能力,提高了我學(xué)習(xí)和實(shí)踐的積極性。更重要的是在本次課程設(shè)計(jì)中,我也發(fā)現(xiàn)了自身存在的一些不足,比如說,對知識點(diǎn)掌握不牢固,獨(dú)立思考問題能力還有待提高等??傊?,本次課程設(shè)計(jì)中我受益匪淺。參考文獻(xiàn)1 陳意云 張昱 ,編譯原理,高等教育出版社2 李建中 姜守旭,編譯原理,機(jī)械工業(yè)出版社附錄:(1)主程序代碼:#include #include #include #include#include using namespace std;bool is_keyword(char *str); /為關(guān)鍵字bool is_identifier(char *type); /為標(biāo)志符bool is_operator(char ch); /運(yùn)算符bool is_seprator(char ch); /分界符bool is_notes(char ch);/注釋char getstr(fstream & src); /讀入一個字符char get(fstream src) ; /讀入空格符/ 判斷是否為關(guān)鍵字bool is_keyword(char *str) bool Flag= false; /做標(biāo)記用char *key=asm, auto, bad_cast, bad_typeid, bool, break, case, catch,char, class, const, const_cast, continue, default, define,delete,do,double, dynamic_cast, else, enum, except, explicit,extern, false, finally, float, for, friend, goto, if,include,inline, int, long, mutable, namespace, new, operator,private, protected,printf,pi,public, register, reinterpret_cast,return, short, signed, sizeof, static, static_cast, struct,switch, template, this, throw, true, try, type_info,typedef, typeid, typename, union, unsigned, using, virtual,void, volatile,while;/C語言關(guān)鍵字for(int i=0;i=,ch) return true;else return false;/分界符bool is_seprator(char ch) if(strchr(;:,.()!&?|,ch) return true;else return false;/注釋bool is_notes(char ch)if(strchr(/,ch) return true;else return false;/讀入下一個字符char getstr(ifstream &src) char c=1; if (src.eof() return c;src.get(c); return c; / 讀入空格char get(ifstream &src) char c= ; src.get(c); while(c= ) src.get(c); return c; / 光標(biāo)后退一個字符void back(ifstream& src) src.seekg(-1, ios:cur); /分析函數(shù)void lex(ifstream &src, ofstream &dst)char ch,token1000=0,*temp;int i=0; ch=getstr(src); if (ch=1) return;while(ch= ) ch=getstr(src); if (ch=1) return;if (ch =n) dst;/換行else if (ch =t) dst /空格else if (ch = ) dst if(isalpha(ch)/判斷為關(guān)鍵字形式或標(biāo)志符while(isalpha(ch)|isdigit(ch)|ch=_)tokeni=ch;ch=getstr(src);if (ch=1) return;i+;tokeni=0;cout token endl;temp=new chari;memcpy(temp,token,i);/由token所指內(nèi)存區(qū)域復(fù)制i個字節(jié)到temp所指內(nèi)存區(qū)域。tempi=0;if(is_keyword(temp) dsttemp ;else dsttemp;back(src);/判斷為整數(shù)或?qū)崝?shù)形式else if(isdigit(ch)while(isdigit(ch)|ch=.)tokeni+=ch;ch=getstr(src);if (ch=1) return;temp=new chari+1;memcpy(temp,token,i);tempi=0;dsttoken;back(src); /判斷字符串的情況else if(ch=) tokeni=ch; ch=getstr(src);i+;if (ch=1) return;while(ch!=)tokeni=ch;ch=getstr(src);if (ch=1) return; i+;tokeni=ch;tokeni=0;dsttoken;/判斷注釋語句情形else if(is_notes(ch)if(ch=getstr(src)=/)while(ch!=n) ch=getstr(src);if (ch=1) return;tokeni+=ch;tokeni=0;dst /token ;/判斷單目運(yùn)算符情形else if(is_operator(ch) dstchendl;/為分界符情形else if(is_seprator(ch) dstchendl;else if(ch=#) dstch ;else if(ch=) dstchendl;else if(ch=) dstchendl;else if(ch=) dstchendl;else if(ch=!) dstchendl;else if(ch=$) dstchendl;else if(ch=?) dstchendl;else if(ch=|) dstchendl;else if(ch=:) dstchendl; int main() ifstream src(rensha.cpp,ios:in
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 加油站經(jīng)理述職報(bào)告
- 陜西省西安市育才中學(xué)2025年物理高二下期末考試試題含解析
- 工程項(xiàng)目安全生產(chǎn)責(zé)任制度
- 物業(yè)安全生產(chǎn)制度范本
- 安全生產(chǎn)文明施工保證措施
- 幼兒園安全活動方案
- 農(nóng)業(yè)科學(xué)人才培養(yǎng)方案
- PLC實(shí)訓(xùn):教學(xué)評一體化探索與實(shí)踐
- 傳統(tǒng)文化休閑傳承-洞察及研究
- 安徽省舒城桃溪中學(xué)2025年物理高二下期末檢測模擬試題含解析
- 同等學(xué)力人員申請碩士學(xué)位電子科學(xué)與技術(shù)學(xué)科綜合水平全國統(tǒng)一考試大綱(第二版)
- (高清版)DG∕TJ 08-507-2018 高強(qiáng)混凝土抗壓強(qiáng)度無損檢測技術(shù)標(biāo)準(zhǔn)
- 2024年鐵嶺市三支一扶考試真題
- 2024版機(jī)電工程施工質(zhì)量標(biāo)準(zhǔn)化數(shù)字模型圖集
- 電力行業(yè)安全隱患案例警示教育心得體會
- 廣東省2025年中考英語模擬試卷試題及答案詳解
- 2023年3月26日安徽省中小學(xué)新任教師公開招聘《小學(xué)語文》試題及答案
- 小學(xué)一年級下冊數(shù)學(xué)口算題卡及口算天天練
- 2025新高考數(shù)學(xué)核心母題400道(教師版)
- 特種設(shè)備事故應(yīng)急處置
- 高端SPA會所的內(nèi)外環(huán)境設(shè)計(jì)藝術(shù)與實(shí)踐
評論
0/150
提交評論