編譯原理課程設計-詞法分析之基于Lex實現詞法分析_第1頁
編譯原理課程設計-詞法分析之基于Lex實現詞法分析_第2頁
編譯原理課程設計-詞法分析之基于Lex實現詞法分析_第3頁
編譯原理課程設計-詞法分析之基于Lex實現詞法分析_第4頁
編譯原理課程設計-詞法分析之基于Lex實現詞法分析_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、課 程 設 計 說 明 書設計題目: 編譯原理課程設計 專 業:計算機科學與技術 班級: 2021-2 設計人: 高世軍 學 號: 202102150210 山 東 科 技 大 學2021年 7 月 12 日課 程 設 計 任 務 書學院 信息科學與工程學院 專業 計算機科學與技術 班級 2021-2 姓名 高世軍 一、課程設計題目: 編譯原理課程設計 二、課程設計主要參考資料1韓太魯等,編譯原理. 石油大學出版社.2007.9 2 3 三、課程設計應解決的主要問題:1詞法分析之基于Lex實現詞法分析 2詞法分析之基于文法的實現 3語法分析之 LL1分析法實現 4 四、課程設計相關附件如:圖紙

2、、軟件等:1 2 Parser Generator 五、任務發出日期: 2021-7-5 課程設計完成日期: 2021-7-12 指導教師簽字: 系主任簽字: 指導教師對課程設計的評語成績: 指導教師簽字: 年 月 日目錄 TOC o 1-3 h z u HYPERLINK l _Toc424394273 詞法分析之基于Lex實現詞法分析 PAGEREF _Toc424394273 h 6 HYPERLINK l _Toc424394274 一、設計目的 PAGEREF _Toc424394274 h 6 HYPERLINK l _Toc424394275 二、設計要求 PAGEREF _To

3、c424394275 h 6 HYPERLINK l _Toc424394276 三、設計說明 PAGEREF _Toc424394276 h 6 HYPERLINK l _Toc424394277 1. 需求分析 PAGEREF _Toc424394277 h 6 HYPERLINK l _Toc424394278 2. 概要設計 PAGEREF _Toc424394278 h 7 HYPERLINK l _Toc424394279 3. 詳細設計 PAGEREF _Toc424394279 h 9 HYPERLINK l _Toc424394280 四、運行結果及分析 PAGEREF _T

4、oc424394280 h 11 HYPERLINK l _Toc424394281 1. 測試數據 PAGEREF _Toc424394281 h 11 HYPERLINK l _Toc424394282 2測試輸出的結果 PAGEREF _Toc424394282 h 12 HYPERLINK l _Toc424394283 3. 設計與思考 PAGEREF _Toc424394283 h 12 HYPERLINK l _Toc424394284 五、總結 PAGEREF _Toc424394284 h 12 HYPERLINK l _Toc424394285 詞法分析之基于文法的實現 P

5、AGEREF _Toc424394285 h 13 HYPERLINK l _Toc424394286 一、設計目的 PAGEREF _Toc424394286 h 13 HYPERLINK l _Toc424394287 二、設計要求 PAGEREF _Toc424394287 h 13 HYPERLINK l _Toc424394288 三、設計說明 PAGEREF _Toc424394288 h 13 HYPERLINK l _Toc424394289 1. 需求分析: PAGEREF _Toc424394289 h 13 HYPERLINK l _Toc424394290 2. 概要設

6、計 PAGEREF _Toc424394290 h 14 HYPERLINK l _Toc424394291 3. 詳細設計 PAGEREF _Toc424394291 h 15 HYPERLINK l _Toc424394292 四、運行結果及分析 PAGEREF _Toc424394292 h 19 HYPERLINK l _Toc424394293 1.測試數據 PAGEREF _Toc424394293 h 19 HYPERLINK l _Toc424394294 2.測試輸出的結果 PAGEREF _Toc424394294 h 20 HYPERLINK l _Toc42439429

7、5 3.設計和思考 PAGEREF _Toc424394295 h 20 HYPERLINK l _Toc424394296 五、總結 PAGEREF _Toc424394296 h 21 HYPERLINK l _Toc424394297 語法分析之 LL1分析法實現 PAGEREF _Toc424394297 h 22 HYPERLINK l _Toc424394298 一、設計目的 PAGEREF _Toc424394298 h 22 HYPERLINK l _Toc424394299 二、設計要求 PAGEREF _Toc424394299 h 22 HYPERLINK l _Toc4

8、24394300 三、設計說明 PAGEREF _Toc424394300 h 23 HYPERLINK l _Toc424394301 1. 需求分析: PAGEREF _Toc424394301 h 23 HYPERLINK l _Toc424394302 2. 概要設計 PAGEREF _Toc424394302 h 24 HYPERLINK l _Toc424394303 3. 詳細設計 PAGEREF _Toc424394303 h 25 HYPERLINK l _Toc424394304 四、運行結果及分析 PAGEREF _Toc424394304 h 26 HYPERLINK

9、l _Toc424394305 1.測試數據 PAGEREF _Toc424394305 h 26 HYPERLINK l _Toc424394306 2.測試輸出的結果 PAGEREF _Toc424394306 h 26 HYPERLINK l _Toc424394307 3.設計和思考 PAGEREF _Toc424394307 h 26 HYPERLINK l _Toc424394308 五、總結 PAGEREF _Toc424394308 h 27詞法分析之基于Lex實現詞法分析 一、設計目的通過編寫并上機調試一個詞法分析程序,掌握在對程序設計語言的源程序進行掃描的過程中,將其分解成

10、各類單詞的詞法分析方法。二、設計要求編制一個讀單詞過程,從輸入的源程序中,識別出各個具有獨立意義的單詞,即根本保存字、標識符、常數、運算符、分隔符五大類。 并依次輸出各個單詞的內部編碼及單詞符號自身值。遇到錯誤時可顯示“Error,然后跳過錯誤局部繼續顯示三、設計說明1. 需求分析a) 輸入及其范圍Lex輸入文件由3個局部組成:定義集definition,規那么集rule和輔助程序集auxiliary routine或用戶程序集user routine。這三個局部由位于新一行第一列的雙百分號分開,因此,Lex輸入文件的格式如下definitions%rules%auxiliary routin

11、es 范圍:識別保存字:if、int、for、while、do、return等保存字類別碼為1。其他的都識別為標識符;單詞類別碼為2。常數為無符號整形數;單詞類別碼為3。運算符包括:+、-、*、/、=、=、=、!= ;類別碼為4。分隔符包括:,、;、(、); 類別碼為5。錯誤字符 類別碼為 6。b) 輸出形式數字,“單詞“數字代表所識別的單詞所屬的類型。c 程序功能讀取文件中的源程序,然后對源程序分析,輸出分析結果。d 測試數據將測試數據寫在文本文件中,測試為程序的輸入數據。2. 概要設計數據類型的定義/定義集,包括頭文件和變量定義%#include #include #include #in

12、clude int lineno=1;/定義行號%/定義正那么表達式letter A-Za-z /字母digit 0-9 /數字id (letter|_)(letter|digit|_)* /開頭為字母的標識符error_id (digit)+(letter)+ /開頭為數字的錯誤標識符num digit+ /數字集合whitespace t+ /空格enter n+ /回車/定義識別規那么% 主程序流程 模塊間的調用關系3. 詳細設計主體代碼局部:%/識別關鍵字key printf(%d 行 ,linenum); /打印行號printf(%s 關鍵字n,yytext);/輸出關鍵字/識別數字

13、num printf(%d 行 ,linenum); /打印行號printf(%s 數字n,yytext);/輸出數字/識別關系運算符guanxi printf(%d 行 ,linenum); /打印行號printf(%s 關系運算符n,yytext);/輸出關系運算符/識別關系運算符suanshu printf(%d 行 ,linenum); /打印行號printf(%s 算術運算符n,yytext);/輸出算術運算符/識別分界符fenjie printf(%d 行 ,linenum); /打印行號printf(%s 關系運算符n,yytext);/輸出分界符/識別注釋符zhushi pri

14、ntf(%d 行 ,linenum); /打印行號printf(%s 注釋符n,yytext);/輸出注釋符號/識別標識符id printf(%d 行 ,linenum);/打印行號 printf(%s 標志符號n,yytext);/打印標識符/識別錯誤的標識符error printf(%d 行 ,linenum);printf(error: %sn,yytext);/識別空格whitespace /忽略空格/識別換行enter linenum+;/遇到回車行號自動加1四、運行結果及分析1. 測試數據在test.txt文件中寫入如下數據。void main() int x;int y; x =

15、 input(); y = intput(); output(gcd(x,y);2測試輸出的結果3. 設計與思考基于lex的詞法分析,一個模塊定義好了之后,其他模塊也就出來了。難點在于正那么表達式的設計,每個模塊都有定義集,規那么集和輔助程序集。而且第一局部用“%和“%括起來。第一和第三個局部為C語言的代碼和函數定義,第二個局部為一些規那么。五、總結通過本次實驗,學會了基于Lex的詞法分析器構造方法。在實驗過程中,萬事開頭難,剛開始不知道怎么做,以及不知道如何使用老師給的軟件,在仔細分析了需求之后,查找了一些關于Parser Genarator 2軟件的使用方法,很快的連接好了VC6.0和Pa

16、rser Genarator2.然后輸入簡單的程序對其進行了測試,成功后,給自己 極大地信心繼續完成接下來的實驗,參考了資料的源程序之后,動手開始寫自己的代碼,最終一步步實現能夠到達要求的程序。經過程序的書寫,使我了解了Lex語言。了解了基于LEX語言的詞法分析程序構造的重要性,對今后的學習和工作有很大的幫助。詞法分析之基于文法的實現 一、設計目的通過設計編制調試一個具體的詞法分析程序,加深對詞法分析原理的理解。并掌握在對程序設計語言源程序進行掃描過程中將其分解為各類單詞的詞法分析方法。二、設計要求編制一個讀單詞過程,從輸入的源程序中,識別出各個具有獨立意義的單詞,即根本保存字、標識符、常數、

17、運算符、分隔符五大類。 并依次輸出各個單詞的內部編碼及單詞符號自身值。遇到錯誤時可顯示“Error,然后跳過錯誤局部繼續顯示三、設計說明1. 需求分析: a 輸入及其范圍識別保存字:if、int、for、while、do、return、break、continue等;保存字類別碼為1。其他的都識別為標識符;單詞類別碼為2。常數為無符號整形數;單詞類別碼為3。運算符包括:+、-、*、/、=、=、,=,=,!=,=;string SeparSEPAR = ,;,(,);b 主程序流程3. 詳細設計void main()vector input;vector:iterator iter;/*將源代碼

18、中的單詞從文件中讀出按成分存放在input中*/ifstream myf;string str = ;myf.open(test.txt);if(myf.fail()couterror!endl;char ch;ch = myf.get();while(!myf.eof()for(int i=0;i | ch= | ch=)/判斷是否為運算符if(str != )input.push_back(str);str = ;str = ch;ch=myf.get();if(ch = =)str += ch;input.push_back(str);ch=myf.get();str = ;elsein

19、put.push_back(str);else if(ch=+ | ch=- | ch=* | ch=/)if(str != )input.push_back(str);str = ;str += ch;input.push_back(str);ch=myf.get();str = ;elsestr += ch;ch=myf.get();myf.close();/*讀文件結束*/*進行詞法分析,并輸出*/for(iter = input.begin();iter != input.end();iter+)int sign = 0;for(int i=0;iRWD;i+)/判斷是否為保存字if(

20、Rwordi = *iter)cout(1,*iter)endl;sign = 1;break;if(sign = 0)/判斷是否為運算符for(int i=0;iOPEAR;i+)if(Opeari = *iter)cout(4,*iter)endl;sign = 1;break;if(sign = 0)/判斷是否為分隔符for(int i=0;iSEPAR;i+)if(Separi = (*iter)cout(5,*iter)0 & (*iter)0=9)cout(3,*iter)endl;elsecout(2,*iter)TG2G-+TG|TG3G-4T-FS5S-*FS|/FS6S-7F-(E)8F-i輸出的格式如下:(1)輸入一以#結束的符號串(包括+*/i#):(2)輸出過程如下: 步驟 分析棧 剩余輸入串 所用產生式 1Ei+i*i#E-TG 3輸入符號串為非法符號串(或者為合法符號串)注意:1.表達式中允許使用運算符+-*/、分割符括號、字符i,結束符#; 2.如果遇到錯誤的表達式,應輸出錯誤提示信息該信息越詳細越好;3.測試用的表達式可以事先放在文本文件中,一行存放一個表達式,同時以分號分割。同時將預期的輸出結果

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論