實驗1-2《編譯原理》詞法分析程序設計方案.doc
《實驗1-2《編譯原理》詞法分析程序設計方案.doc》由會員分享,可在線閱讀,更多相關《實驗1-2《編譯原理》詞法分析程序設計方案.doc(6頁珍藏版)》請在裝配圖網(wǎng)上搜索。
實驗2-3 《編譯原理》S語言詞法分析程序設計方案 一、實驗目的 了解詞法分析程序的兩種設計方法:根據(jù)狀態(tài)轉換圖直接編程的方式;利用DFA編寫通用的詞法分析程序. 二、實驗內(nèi)容 1.根據(jù)狀態(tài)轉換圖直接編程 編寫一個詞法分析程序,它從左到右逐個字符的對源程序進行掃描,產(chǎn)生一個個的單詞的二元式,形成二元式(記號)流文件輸出。在此,詞法分析程序作為單獨的一遍,如下圖所示。 具體任務有: (1)組織源程序的輸入 (2)拼出單詞并查找其類別編號,形成二元式輸出,得到單詞流文件 (3)刪除注釋、空格和無用符號 (4)發(fā)現(xiàn)并定位詞法錯誤,需要輸出錯誤的位置在源程序中的第幾行。將錯誤信息輸出到屏幕上。 (5)對于普通標識符和常量,分別建立標識符表和常量表(使用線性表存儲),當遇到一個標識符或常量時,查找標識符表或常量表,若存在,則返回位置,否則返回0并且填寫符號表或常量表。 標識符表結構:變量名,類型(整型、實型、字符型),分配的數(shù)據(jù)區(qū)地址 注:詞法分析階段只填寫變量名,其它部分在語法分析、語義分析、代碼生成等階段逐步填入。 常量表結構:常量名,常量值 2. 編寫DFA模擬程序 算法如下: DFA(S=S0,MOVE[][],F[],ALPHABET[],ALLS[]) /*S為狀態(tài),初值為DFA的初態(tài),MOVE[][]為狀態(tài)轉換矩陣,F(xiàn)[] 為終態(tài)集,ALPHABET[] 為字母表,其中的字母順序與MOVE[][] 中列標題的字母順序一致。ALLS[]為狀態(tài)集*/ { Char Wordbuffer[10]=“”//單詞緩沖區(qū)置空 Nextchar=getchar();//讀字符 i=0; while(nextchar!=NULL)//NULL代表此類單詞 { if (nextchar!∈ALPHABET[]) {ERROR(“非法字符”),return(“非法字符”);} S=MOVE[S][nextchar] //下一狀態(tài) if(S=NULL)return(“不接受”);//下一狀態(tài)為空,不能識別,單詞錯誤 wordbuffer[i]=nextchar ; //保存單詞符號 i++; nextchar=getchar(); } Wordbuffer[i]=‘\0’; If(S∈F)return(wordbuffer); //接受 Else return(“不接受”); } 該算法要求:實現(xiàn)DFA算法,給定一個DFA(初態(tài)、狀態(tài)轉換矩陣、終態(tài)集、字母表、狀態(tài)集),調(diào)用DFA(),識別給定源程序中的單詞,查看結果是否正確。 三、實驗要求 1.能對任何S語言源程序進行分析 在運行詞法分析程序時,應該用問答形式輸入要被分析的S源語言程序的文件名,然后對該程序完成詞法分析任務。 2.能檢查并處理某些詞法分析錯誤 詞法分析程序能給出的錯誤信息包括:總的出錯個數(shù),每個錯誤所在的行號,錯誤的編號及錯誤信息。 本實驗要求處理以下兩種錯誤(編號分別為1,2): 1:非法字符:單詞表中不存在的字符處理為非法字符,處理方式是刪除該字符,給出錯誤信息,“某某字符非法”。 2:源程序文件結束而注釋未結束。注釋格式為:/* …… */ 四、保留字和特殊符號表 單詞代碼 1 2 3 4 5 6 7 8 9 單詞 int char float void const for if else then 單詞助記符 int char float void const for if else then 內(nèi)碼值 - - - - - - - - - 單詞代碼 10 11 12 13 14 15 16 17 18 單詞 while switch break begin end 標識符 數(shù)字(包括整數(shù)和實數(shù)) 單詞助記符 while switch break begin end id num 內(nèi)碼值 - - - - - 在符號表中的位置 在常數(shù)表中的位置 單詞代碼 19 20 21 22 23 24 25 26 27 單詞 + - * / % ( ) [ ] 單詞助記符 + - * / % ( ) [ ] 內(nèi)碼值 - - - - - - - - - 單詞代碼 28 28 29 30 單詞 != < > <= >= = ; { } 單詞助記符 rlop ; { } 內(nèi)碼值 != < > <= >= = - - 單詞代碼 37 38 39 40 41 42 43 44 45 單詞 /= += -= *= %= || && ! = 單詞助記符 /= += -= *= %= or and not = 內(nèi)碼值 - - - - - - - - - 單詞的構詞規(guī)則: 字母=[A-Za-z] 數(shù)字=[0-9] 標識符=(字母|_)(字母|數(shù)字)* 數(shù)字=數(shù)字(數(shù)字)*(.數(shù)字+|e) 四、S語言表達式和語句說明 1.算術表達式:+、-、*、/、% 2.關系運算符:>、>=、<、<=、==、!= 3.賦值運算符:=,+=、-=、*=、/=、%= 4.變量說明:類型標識符 變量名表; 5.類型標識符:int char float 6.If語句:if 表達式then 語句 [else 語句] 7.For語句:for(表達式1;表達式2;表達式3) 語句 8.While語句:while 表達式 do 語句 9.S語言程序:由函數(shù)構成,函數(shù)不能嵌套定義。 函數(shù)格式為: 返回值 函數(shù)名(參數(shù)) { 數(shù)據(jù)說明 語句 } 五、程序參考結構說明 1.Initscanner函數(shù):程序初始化:輸入并打開源程序文件和目標程序文件,初始化保留字表 2.Scanner函數(shù):若文件未結束,反復調(diào)用lexscan函數(shù)識別單詞。 3.Lexscan函數(shù):根據(jù)讀入的單詞的第一個字符確定調(diào)用不同的單詞識別函數(shù) 4.Isalpha函數(shù):識別保留字和標識符 5.Isnumber函數(shù):識別整數(shù),如有精力,可加入識別實數(shù)部分工功能 6.Isanotation函數(shù):處理除號/和注釋 7.Isother函數(shù)識別其他特殊字符 8.Output函數(shù):輸出單詞的二元式到目標文件,輸出格式(單詞助記符,單詞內(nèi)碼值),如(int,-)(rlop,>)…… 9.Error函數(shù):輸出錯誤信息到屏幕 10.除此之外,還可以設置查符號表,填寫符號表等函數(shù),學生可自行設計。 六、實驗過程說明 1.每人單獨完成。 2.完成后,由老師驗收,并給出成績。 3.實驗完成后,寫出實驗報告(要求交打印稿)。報告內(nèi)容要求如下: 完成人:班級、學號、姓名 一、實驗名稱:簡化S語言詞法分析器 二、實驗目的:通過手工編寫簡化C語言詞法分析器,熟悉并深入理解編譯程序詞法分析器的工作原理。 三、實驗內(nèi)容: 1.根據(jù)保留字和特殊符號表能區(qū)分出源文件中的保留字、普通標識符和特殊符號,并能進行簡單的錯誤處理。 ………… 2.設計詞法分析器模塊調(diào)用結構圖和各模塊流程圖。 3.程序源代碼。 4.程序的執(zhí)行結果:輸入文件,輸出結果文件及屏幕信息。 四、實驗中出現(xiàn)的問題及解決方法。 五、體會、意見或建議。 七、測試源程序示例: //aa.c void aa( ) { float rate,circle; rate=3; circle=3.14*rate*rate; } 輸出結果: (1)輸出結果文件: (void,-)(id, 0) ((,-) (),-) ({,- ) ( float,-) (id,1)…… (2)標識符的符號表: Name type address 0 aa 1 rate 2 circle 3 4 5 (3)常數(shù)表: Name value 0 3 1 3.14 2 3 實驗地點:教10五樓計算機學院軟一機房 實驗時間:第5周周二、二單元、第六周周一、五單元(晚上7:30-9:00)- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 編譯原理 實驗 編譯 原理 詞法 分析 程序 設計方案
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.appdesigncorp.com/p-9256974.html