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