




已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
編譯原理課程設(shè)計(jì)報(bào)告題目名稱語法高亮轉(zhuǎn)換軟件班 級(jí)學(xué) 號(hào)姓 名指導(dǎo)教師 編寫時(shí)間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)頁文件時(shí),網(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í)符均由字母或數(shù)字組成。當(dāng)碰到這些標(biāo)識(shí)符時(shí)先讀取,然后與key數(shù)組中的各關(guān)鍵字進(jìn)行匹配,匹配成功則為關(guān)鍵字,并以高亮處理并輸出到目標(biāo)文件(html)中,否則不做處理直接輸出。(2)需要特殊處理的字符的高亮顯示:每次從C+源文件中讀取單個(gè)字符,根據(jù)不同的情形進(jìn)行不同的處理。處理情況如下: 讀到字符+-*/%= 時(shí),以運(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ù)說明針對(duì)上述具體的處理情況,分別定義: 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)識(shí)符、運(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)對(duì)源程序(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)逐個(gè)取出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)行處理,對(duì)符合要求的字符進(jìn)行高亮顯示。5. 程序運(yùn)行結(jié)果6. 測(cè)試報(bào)告7. 存在問題及分析很顯然,本設(shè)計(jì)的實(shí)現(xiàn)關(guān)鍵就是字符的分類問題。對(duì)于不同作用的字符,應(yīng)該用不同的顏色將其分別顯示。在C或者C+中的字符大概可以分為以下幾類:字符集,標(biāo)識(shí)符,關(guān)鍵字,文字,操作符(運(yùn)算符),分隔符,空白符等。其中標(biāo)識(shí)符和關(guān)鍵字都可以當(dāng)作關(guān)鍵字處理,其他的字符則按自己的種類及功能進(jìn)行分類。好的分類為他們的高亮顯示提供了一個(gè)前提條件,讓他們的功能既不會(huì)因?yàn)榉诸惒痪唧w而沖突也不會(huì)因?yàn)榉值锰?xì)而使得某些功能沒有實(shí)現(xiàn),這使得了本設(shè)計(jì)的實(shí)現(xiàn)成為了可能,做好分類問題就相當(dāng)于成功了一半。8. 總結(jié)及體會(huì)本次課程設(shè)計(jì)要求設(shè)計(jì)一個(gè)簡(jiǎn)單的編譯器,用以實(shí)現(xiàn)C+源文件在向HTML文件轉(zhuǎn)換過程中的關(guān)鍵字及特殊字符的高亮顯示功能。在設(shè)計(jì)剛開始時(shí),如做其他課程設(shè)計(jì)一樣,覺得無從下手,整個(gè)人就像是個(gè)無頭蒼蠅到處亂撞,但通過自己耐心搜集資料,向老師和同學(xué)請(qǐng)教,慢慢理出了頭緒,也有了自己的設(shè)計(jì)思想和實(shí)現(xiàn)方法。對(duì)于設(shè)計(jì)題目來說,并非那么得復(fù)雜,帶要設(shè)計(jì)者將所學(xué)轉(zhuǎn)換成相應(yīng)的實(shí)際應(yīng)用卻并非一件容易的事情。本設(shè)計(jì)題目的設(shè)計(jì)思想是簡(jiǎn)單的,只需要將關(guān)鍵字、標(biāo)示符、注釋等分門別類,然后通過定義實(shí)現(xiàn)函數(shù)進(jìn)行字符搜索及字符匹配,匹配成功時(shí)作出相應(yīng)的處理即可。但是如何進(jìn)行分類,如何定義實(shí)現(xiàn)函數(shù),還是需要自己下功夫考慮和實(shí)踐的。在課程設(shè)計(jì)過程中,我深刻地體會(huì)到:編譯原理不同于一般集成環(huán)境的設(shè)計(jì)語言,它具有很強(qiáng)的抽象性。這就要求我們?cè)谠O(shè)計(jì)過程中要真正理解編譯器是如何構(gòu)造,如何實(shí)現(xiàn)功能的,而這相對(duì)普通設(shè)計(jì)語言在難度和抽象程度上有了更大的提升。當(dāng)然這也能使我們對(duì)程序設(shè)計(jì)語言的設(shè)計(jì)和實(shí)現(xiàn)有了更深刻的理解,對(duì)和程序設(shè)計(jì)語言相關(guān)的理論知識(shí)有了更深層次的了解。除此之外,通過實(shí)踐提高學(xué)生的編程能力、協(xié)作能力和創(chuàng)新能力,為以后的學(xué)習(xí)打下良好的基礎(chǔ)。通過本次的課程設(shè)計(jì),我認(rèn)識(shí)到了編譯原理這門課程的重要性,對(duì)編譯原理這門課程有了更深刻地認(rèn)識(shí)。深刻認(rèn)識(shí)到編譯原理課程作為計(jì)算機(jī)專業(yè)本科生的一門重要的專業(yè)基礎(chǔ)課程,對(duì)理論性和實(shí)踐性要求均很高。編譯原理課程設(shè)計(jì)也是計(jì)算機(jī)專業(yè)課編譯原理的后續(xù)實(shí)踐性教學(xué)環(huán)節(jié)。在本次課程設(shè)計(jì)中,雖然我只做了語法高亮顯示軟件。但這一設(shè)計(jì)題目用到了詞法分析,而詞法分析又是跟其他相關(guān)聯(lián)的,所以運(yùn)用的是整個(gè)編譯原理課程的知識(shí),詞法分析作為編譯原理課程的一個(gè)重要問題,它是語法分析,語義分析,中間代碼生成,代碼優(yōu)化,代碼生成等的前提,把這些聯(lián)系了起來才算真正學(xué)到了編譯原理這門課程,把這些運(yùn)用好了,才能做好本次設(shè)計(jì)。另外,通過本次的設(shè)計(jì),使我對(duì)程序設(shè)計(jì)語言的設(shè)計(jì)和實(shí)現(xiàn)有深入的理解,不僅鞏固了計(jì)算機(jī)專業(yè)理論的知識(shí),而且還加強(qiáng)了把理論融入到實(shí)際問題中的能力,提高了我學(xué)習(xí)和實(shí)踐的積極性。更重要的是在本次課程設(shè)計(jì)中,我也發(fā)現(xiàn)了自身存在的一些不足,比如說,對(duì)知識(shí)點(diǎn)掌握不牢固,獨(dú)立思考問題能力還有待提高等??傊敬握n程設(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); /讀入一個(gè)字符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;/讀入下一個(gè)字符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)后退一個(gè)字符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個(gè)字節(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水利水電工程節(jié)水項(xiàng)目的試題及答案
- 設(shè)備租賃經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議
- 環(huán)境科學(xué)中的空氣質(zhì)量檢測(cè)試題
- 行政管理決策系統(tǒng)試題及答案
- 人工智能輔助公共安全預(yù)警系統(tǒng)協(xié)議
- 行政管理中不可不知的公共關(guān)系學(xué)試題及答案
- 精解2025年經(jīng)濟(jì)法概論考題解析試題及答案
- 沈陽認(rèn)證考試試題及答案
- 寶貝未來測(cè)試題及答案
- 高考地理試題及答案
- 簽約儀式背景
- DB4201∕T 646-2021 軌道交通工程運(yùn)營期結(jié)構(gòu)監(jiān)測(cè)技術(shù)規(guī)程
- 國標(biāo)法蘭尺寸對(duì)照表
- 強(qiáng)制執(zhí)行申請(qǐng)書-(工資強(qiáng)制執(zhí)行)
- 華電 電廠招聘化學(xué)試題
- T型賬戶模板(共1頁)
- 上海市住宅修繕施工資料及表式(共251頁)
- 畢業(yè)設(shè)計(jì)--螺旋輸送機(jī)設(shè)計(jì)說明書
- 重慶市歷年中考語文標(biāo)準(zhǔn)答題卡(共2頁)
- 安全評(píng)價(jià)通則 AQ8001
- 附件1內(nèi)蒙古銷售機(jī)具基本信息單
評(píng)論
0/150
提交評(píng)論