編譯原理課程設計報告--語法高亮轉換軟件.docx_第1頁
編譯原理課程設計報告--語法高亮轉換軟件.docx_第2頁
編譯原理課程設計報告--語法高亮轉換軟件.docx_第3頁
編譯原理課程設計報告--語法高亮轉換軟件.docx_第4頁
編譯原理課程設計報告--語法高亮轉換軟件.docx_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

編譯原理課程設計報告題目名稱語法高亮轉換軟件班 級學 號姓 名指導教師 編寫時間2009-12-311. 課程設計題目名稱語法高亮轉換軟件2. 課程設計任務目的與任務u 問題描述:在我們使用的集成化編譯環(huán)境(IDE)中,C+語言的源代碼通常使用高亮語法表示,例如關鍵字的顯示。但是如果我們將這段代碼發(fā)布到網頁中,它的高亮語法表示將消失,這樣看起來非常不直觀,我們希望在網頁中代碼仍然能保持原來的高亮語法表示。u 課程設計要求:將輸入為C+源代碼的文件,即后綴為cpp的文件,用網頁文件輸出,即用后綴為html的文件輸出。u 課程設計實現功能:基于詞法分析語法高亮轉換軟件將C+源代碼轉換為網頁文件,在瀏覽器中打開網頁文件時,網頁中顯示C+源代碼并以高亮語法表示顯示。3. 設計思想和實現方法(一)、設計思想 要將C+源文件轉換成高亮顯示的HTML文件,主要設計思想為:(1)關鍵字的高亮顯示:源程序中需高亮顯示的字符都是關鍵字或一些特殊字符,因此可以將這些關鍵字都存入key數組中。key數組為: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+語言中的標識符均由字母或數字組成。當碰到這些標識符時先讀取,然后與key數組中的各關鍵字進行匹配,匹配成功則為關鍵字,并以高亮處理并輸出到目標文件(html)中,否則不做處理直接輸出。(2)需要特殊處理的字符的高亮顯示:每次從C+源文件中讀取單個字符,根據不同的情形進行不同的處理。處理情況如下: 讀到字符+-*/%= 時,以運算符樣式顯示出來。 讀到字符,以既定樣式顯示。 讀到字符! $ % & ( ) * + - , . : ; = ? | 這些字符,直接以既定樣式顯示。 如果讀入,則一直讀到再次出現為止,然后將這些字符以字符串樣式輸出。 如果讀入,則一直讀到再次出現為止,然后將這些字符以字符樣式輸出。 如果讀入19,則連續(xù)讀到非數字出現,然后將這些數字以正常數字樣式輸出。 如果讀入,繼續(xù)讀入字符,直到出現 、n或t為止,以開頭的字符串樣式輸出。(二)、實現方法(1)實現函數說明針對上述具體的處理情況,分別定義: is_keyword(char *str)、is_identifier(char *type)、is_operator(char ch)、is_seprator(char ch)、is_notes(char ch)這五種函數分別處理關鍵字、標識符、運算符、分界符、注釋語句。函數getstr(fstream & src) 用來讀取字符,函數get(fstream src)用來讀入空格符。根據源程序中的不同字符分別調用相應的函數進行處理。用lex(ifstream &src, ofstream &dst)來分析函數。在主程序中通過ifstream src(rensha.cpp,ios:in)和ofstream dst(Output.html,ios:out);來實現對源程序(rensha.cpp)的讀取以及目標文件的輸出。(2)主程序流程圖開 始輸入C+源文件調用ifstream函數取字符調用lex函數是字符是空格符字符/空格符與key數組內容匹配N直接輸出Y是否相同關鍵字或標示符處理判別字符類型是注釋語句是字符串是單目算符是整數或實 數是 分界 符整數或實數處理分界符處理單目運算符處理注釋語句處理字符串處理Y是否還有字符N輸出HTML文件結 束4. 程序說明通過函數getstr(fstream & src) 和函數get(fstream src)逐個取出rensha.cpp中的字符,通過與bool is_keyword(char *str)函數中定義的char *key數組內容比較,進行關鍵字匹配,匹配成功則按關鍵字方式顯示,如果不成功再按運算符、分界符、注釋語句、分界符、字符串等做出相應的處理。其中,運算符、分界符、注釋語句、分界符、字符串等均單獨定義了相應函數進行處理,對符合要求的字符進行高亮顯示。5. 程序運行結果6. 測試報告7. 存在問題及分析很顯然,本設計的實現關鍵就是字符的分類問題。對于不同作用的字符,應該用不同的顏色將其分別顯示。在C或者C+中的字符大概可以分為以下幾類:字符集,標識符,關鍵字,文字,操作符(運算符),分隔符,空白符等。其中標識符和關鍵字都可以當作關鍵字處理,其他的字符則按自己的種類及功能進行分類。好的分類為他們的高亮顯示提供了一個前提條件,讓他們的功能既不會因為分類不具體而沖突也不會因為分得太細而使得某些功能沒有實現,這使得了本設計的實現成為了可能,做好分類問題就相當于成功了一半。8. 總結及體會本次課程設計要求設計一個簡單的編譯器,用以實現C+源文件在向HTML文件轉換過程中的關鍵字及特殊字符的高亮顯示功能。在設計剛開始時,如做其他課程設計一樣,覺得無從下手,整個人就像是個無頭蒼蠅到處亂撞,但通過自己耐心搜集資料,向老師和同學請教,慢慢理出了頭緒,也有了自己的設計思想和實現方法。對于設計題目來說,并非那么得復雜,帶要設計者將所學轉換成相應的實際應用卻并非一件容易的事情。本設計題目的設計思想是簡單的,只需要將關鍵字、標示符、注釋等分門別類,然后通過定義實現函數進行字符搜索及字符匹配,匹配成功時作出相應的處理即可。但是如何進行分類,如何定義實現函數,還是需要自己下功夫考慮和實踐的。在課程設計過程中,我深刻地體會到:編譯原理不同于一般集成環(huán)境的設計語言,它具有很強的抽象性。這就要求我們在設計過程中要真正理解編譯器是如何構造,如何實現功能的,而這相對普通設計語言在難度和抽象程度上有了更大的提升。當然這也能使我們對程序設計語言的設計和實現有了更深刻的理解,對和程序設計語言相關的理論知識有了更深層次的了解。除此之外,通過實踐提高學生的編程能力、協(xié)作能力和創(chuàng)新能力,為以后的學習打下良好的基礎。通過本次的課程設計,我認識到了編譯原理這門課程的重要性,對編譯原理這門課程有了更深刻地認識。深刻認識到編譯原理課程作為計算機專業(yè)本科生的一門重要的專業(yè)基礎課程,對理論性和實踐性要求均很高。編譯原理課程設計也是計算機專業(yè)課編譯原理的后續(xù)實踐性教學環(huán)節(jié)。在本次課程設計中,雖然我只做了語法高亮顯示軟件。但這一設計題目用到了詞法分析,而詞法分析又是跟其他相關聯(lián)的,所以運用的是整個編譯原理課程的知識,詞法分析作為編譯原理課程的一個重要問題,它是語法分析,語義分析,中間代碼生成,代碼優(yōu)化,代碼生成等的前提,把這些聯(lián)系了起來才算真正學到了編譯原理這門課程,把這些運用好了,才能做好本次設計。另外,通過本次的設計,使我對程序設計語言的設計和實現有深入的理解,不僅鞏固了計算機專業(yè)理論的知識,而且還加強了把理論融入到實際問題中的能力,提高了我學習和實踐的積極性。更重要的是在本次課程設計中,我也發(fā)現了自身存在的一些不足,比如說,對知識點掌握不牢固,獨立思考問題能力還有待提高等??傊敬握n程設計中我受益匪淺。參考文獻1 陳意云 張昱 ,編譯原理,高等教育出版社2 李建中 姜守旭,編譯原理,機械工業(yè)出版社附錄:(1)主程序代碼:#include #include #include #include#include using namespace std;bool is_keyword(char *str); /為關鍵字bool is_identifier(char *type); /為標志符bool is_operator(char ch); /運算符bool is_seprator(char ch); /分界符bool is_notes(char ch);/注釋char getstr(fstream & src); /讀入一個字符char get(fstream src) ; /讀入空格符/ 判斷是否為關鍵字bool is_keyword(char *str) bool Flag= false; /做標記用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語言關鍵字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; / 光標后退一個字符void back(ifstream& src) src.seekg(-1, ios:cur); /分析函數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)/判斷為關鍵字形式或標志符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所指內存區(qū)域復制i個字節(jié)到temp所指內存區(qū)域。tempi=0;if(is_keyword(temp) dsttemp ;else dsttemp;back(src);/判斷為整數或實數形式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 ;/判斷單目運算符情形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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論