編譯原理報告 (9)_第1頁
編譯原理報告 (9)_第2頁
編譯原理報告 (9)_第3頁
編譯原理報告 (9)_第4頁
編譯原理報告 (9)_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、課程實驗報告課程名稱:編譯原理專業(yè)班級: 信息安全1302班 學(xué) 號:姓 名:指導(dǎo)老師:報告日期: 2015年11月11日 計算機(jī)科學(xué)與技術(shù)學(xué)院目錄實驗一詞法分析11. 實驗?zāi)康?2. 實驗要求13. 算法思想24. 具體實現(xiàn)45. 結(jié)果分析56. 實驗總結(jié)6實驗二語法分析71. 實驗?zāi)康?2. 實驗要求73. 算法思想84. 具體實現(xiàn)105. 結(jié)果分析126. 實驗總結(jié)12附錄源程序13詞法分析13語法分析18實驗一詞法分析1. 實驗?zāi)康脑O(shè)計、編制并調(diào)試一個詞法分析程序,加深對詞法分析原理的理解。2. 實驗要求2.1 待分析的簡單的詞法(1)關(guān)鍵字:begin、if、then、while、d

2、o、end所有的關(guān)鍵字都是小寫。(2)運算符和界符: = + - * / = = = ; ( ) #(3)其他單詞是標(biāo)識符(ID)和整型常數(shù)(SUM),通過以下正規(guī)式定義:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和換行符組成??崭褚话阌脕矸指鬒D、SUM、運算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2.2 各單詞符號的種別碼各種單詞符號所對應(yīng)的種別碼如表1所示。2.3 詞法分析程序的功能:輸入:所給文法的源程序字符串。輸出:二元組(syn,token或sum)構(gòu)成的序列。其中:syn為單詞種別碼; token為存放

3、的單詞自身字符串; sum為整型常數(shù)。例如,對源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,經(jīng)過詞法分析后輸出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)表1 各種單詞符號對應(yīng)的種別碼單詞符號種別碼單詞符號種別碼begin1:17If2:=18Then320wile421do523letter(letter|digit)*10=24dight dight*11=25+13;2614(27*15)28/16#03. 算法思想算法的基本任務(wù)是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想

4、是根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號。3.1 主程序框圖主程序框圖如圖1-3-1所示。其中初始包括以下兩個方面:(1)關(guān)鍵字表的初值。關(guān)鍵字作為特殊標(biāo)識符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識別出標(biāo)識符時,查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識符。關(guān)鍵字表為一個字符串?dāng)?shù)組,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,;(2)程序中需要用到的主要變量為syn,token和sum。3.2 掃描子程序的算法思想首先設(shè)置3個變量:token用來存

5、放構(gòu)成單詞符號的字符串;sum用來整型單詞;syn用來存放單詞符號的種別碼。掃描子程序主要部分流程如圖1-3-2所示。置初值調(diào)用掃描子程序輸出單詞二元組輸入串結(jié)束否是結(jié)束圖1-3-1詞法分析主程序框圖變量初始化忽略空格返回是否文件結(jié)束? 是否字母拼字符串?dāng)?shù)字其他符號錯誤是否關(guān)鍵字?拼數(shù)對不同符號給出相應(yīng)的syn值否報錯syn=10是syn=11syn為對應(yīng)關(guān)鍵字的單詞種別碼返回圖1-3-2詞法分析程序掃描子程序框圖4. 具體實現(xiàn)char *rwtab6 = begin, if, then, while, do, end; /關(guān)鍵字表/*自選函數(shù)*/char m_getch() /從輸入源讀一個

6、字符到CH中ch = progp+;return ch;void getbc() /去掉空白字符while (ch = | ch= 10)ch = progp+;void concat() /拼接單詞tokenm+ = ch;tokenm = 0;int letter() /判斷是否是字母if(ch=a&ch=A&ch= 0 & ch = 9) return 1;else return 0;int reserve() /檢索關(guān)鍵字表格int i;for(i=0; i9 then x:=2*x+1/3; end # 后經(jīng)詞法分析輸出如下序列:(1,begin)(10,x)(18,:=)(11,9

7、)(26,;)(2,if)如圖1-5-1所示:圖1-5-1詞法分析實驗結(jié)果6. 實驗總結(jié)詞法分析的基本任務(wù)是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號。通過本試驗的完成,更加加深了對詞法分析原理的理解。實驗二語法分析1. 實驗?zāi)康木幹埔粋€遞歸下降分析程序,實現(xiàn)對詞法分析程序所提供的單詞序列的語法檢查和結(jié)構(gòu)分析。2. 實驗要求利用C語言編制遞歸下降分析程序,并對簡單語言進(jìn)行語法分析。2.1 待分析的簡單語言的語法用擴(kuò)充的BNF表示如下:(1):=beginend(2):=;(3):=(4):=ID:=(5):=+ |

8、-(6):=* | /(7):=ID | NUM | ()2.2 實驗要求說明輸入單詞串,以“#”結(jié)束,如果是文法正確的句子,則輸出成功信息,打印“success”,否則輸出“error”。例如:輸入 begin a:=9; x:=2*3; b:=a+x end #輸出 success!輸入 x:=a+b*c end #輸出 error3. 算法思想(1)主程序示意圖如圖2-3-1所示。置初值調(diào)用scaner讀下一個單詞符號調(diào)用lrparser結(jié)束圖2-3-1 語法分析主程序框圖(2)遞歸下降分析程序示意圖如圖2-3-2所示。(3)語句串分析過程示意圖如圖2-3-3所示。是否begin?調(diào)用s

9、tatement函數(shù)否是調(diào)用scaner是否 ;?否調(diào)用語句串分析程序是是否end?調(diào)用scaner否調(diào)用statement函數(shù)是調(diào)用scanersyn=0&kk=0?出錯處理否出錯處理是圖2-3-3語句串分析示意圖打印分析成功圖2-3-2 遞歸下降分析程序示意圖(4)statement語句分析程序流程如圖2-3-4、2-3-5、2-3-6、2-3-7所示。是否標(biāo)識符?調(diào)用term函數(shù)否調(diào)用scaner是否+ , -?否是否:=?是調(diào)用scaner否調(diào)用scaner調(diào)用term函數(shù)調(diào)用expression函數(shù)出錯處理出錯處理圖2-3-4 statement函數(shù)示意圖圖2-3-5 express

10、ion函數(shù)示意圖調(diào)用scaner調(diào)用factor函數(shù)是否標(biāo)識符?是是否* , /?否是否整常數(shù)?否是是是否(?否否調(diào)用factor函數(shù)是出錯處理調(diào)用scaner調(diào)用expression函數(shù)圖2-3-6 term函數(shù)示意圖是否)?否出錯處理調(diào)用scaner調(diào)用scaner是圖2-3-7 factor函數(shù)示意圖4. 具體實現(xiàn)void factor()if(syn=10 | syn=11) scaner();else if(syn = 27) scaner(); /讀下一個單詞符號 expression(); /調(diào)用函數(shù)statement() if(syn = 28) scaner(); /讀下一個

11、單詞符號elseprintf(The error is on ).n);kk = 1; elseprintf(The expression is error!n);kk = 1; return;void term() factor(); /調(diào)用函數(shù)factor()while(syn=15 | syn=16) scaner(); /讀下一個單詞符號 factor(); /調(diào)用函數(shù)factor() return;void expression() term(); /調(diào)用函數(shù)term()while(syn=13 | syn=14) scaner(); /讀下一個單詞符號 term(); /調(diào)用函數(shù)t

12、erm() return;void statement()if(syn=10) scaner(); /讀下一個單詞符號if(syn=18) scaner(); /讀下一個單詞符號 expression(); /調(diào)用函數(shù)statement() elseprintf(the symbol := is error!n);kk=1; elseprintf(The sentence is error!n);kk=1; return;void yucu() statement(); /調(diào)用函數(shù)statement()while(syn = 26) scaner(); /讀下一個單詞符號if(syn != 6

13、) statement(); /調(diào)用函數(shù)statement() return;void lrparser()if(syn = 1) scaner(); /讀下一個單詞符號 yucu(); /調(diào)用yucu()函數(shù)if(syn = 6)scaner();if(syn=0 & kk=0)printf(Success!n); elseif(kk != 1)printf(The string is lack of a end!n);kk = 1; elseprintf(The string is lack of a begin!n);kk = 1; return;int main() p = 0;pri

14、ntf(Please input string (end of #): n);doscanf(%c, &ch);progp+ = ch;while(ch != #); p = kk = 0;scaner();lrparser();return 0;5. 結(jié)果分析(1)輸入 begin a:=9; x:=2*3; b:=a+x end # 后,輸出success!如圖2-5-1所示:圖2-5-1語法分析實驗結(jié)果(一)(2)輸入 x:=a+b*c end # 后,輸出The string is lack of a begin!如圖2-5-2所示:圖2-5-2語法分析實驗結(jié)果(二)6. 實驗總結(jié)通過

15、本次試驗,了解了語法分析的運行過程,主程序大致流程為:“置初值”調(diào)用scaner函數(shù)讀下一個單詞符號調(diào)用IrParse結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”不是則“出錯處理”,若是則“調(diào)用scaner函數(shù)”調(diào)用語句串分析函數(shù)“判斷是否為end”不是則“出錯處理”,若是則“調(diào)用scaner函數(shù)”“判斷syn=0&kk=0是否成立”成立則說明分析成功打印出來。不成立則“出錯處理”。附錄源程序詞法分析#include#include#include#include#includechar prog80, token80;char ch;int syn, p, m, n;char

16、*rwtab6 = begin, if, then, while, do, end;char m_getch() /從輸入源讀一個字符到CH中ch = progp+;return ch;void getbc() /去掉空白字符while (ch = | ch= 10)ch = progp+;void concat() /拼接單詞tokenm+ = ch;tokenm = 0;int letter() /判斷是否是字母if(ch=a&ch=A&ch= 0 & ch = 9) return 1;else return 0;int reserve() /檢索關(guān)鍵字表格int i;for(i=0; i

17、6; i+)if(!strcmp(rwtabi, token)return i+1;return 10;void retract() /回退一個字符p = p - 1;char *dtb()return NULL;void scaner() m = 0;for(n=0; n8; n+) tokenn = 0; m_getch();getbc();if(letter() while(letter() | digit() concat(); m_getch(); retract();syn = reserve(); else if(digit() while(digit() concat(); m

18、_getch(); retract();syn = 11; elseswitch(ch) case ) syn = 21;concat(); else if(ch = =) syn = 22;concat(); else syn = 20;retract(); break;case :concat(); m_getch();if(ch = =) syn = 24;concat(); else syn = 23;retract(); break;case :concat(); m_getch();if(ch = =) syn = 18;concat(); else syn = 17;retrac

19、t(); break;case +:syn = 13;token0 = ch;break;case -:syn = 14;token0 = ch;break;case *:syn = 15;token0 = ch;break;case /:syn = 16;token0 = ch;break;case =:syn = 25;token0 = ch;break;case ;:syn = 26;token0 = ch;break;case (:syn = 27;token0 = ch;break;case ):syn = 28;token0 = ch;break;case #:syn = 0;to

20、ken0 = ch;break; int main() p = 0;printf(Please input string (end of #): n);do scanf(%c, &ch);progp+ = ch;while(ch != #); p = 0;do scaner();switch(syn) case -1:printf(you have inputed a wrong string!n);getch();exit(0);default:printf(%d, %s)n, syn, token);break; while(syn != 0);return 0;語法分析#include#

21、include#include#include#includevoid expression();char prog80, token80;char ch;int syn, p, m, n, kk;char *rwtab6 = begin, if, then, while, do, end;char m_getch() /從輸入源讀一個字符到CH中ch = progp+;return ch;void getbc() /去掉空白字符while (ch = | ch= 10)ch = progp+;void concat() /拼接單詞tokenm+ = ch;tokenm = 0;int let

22、ter() /判斷是否是字母if(ch=a&ch=A&ch= 0 & ch = 9) return 1;else return 0;int reserve() /檢索關(guān)鍵字表格int i;for(i=0; i6; i+)if(!strcmp(rwtabi, token)return i+1;return 10;void retract() /回退一個字符p = p - 1;char *dtb()return NULL;void scaner() m = 0;for(n=0; n8; n+) tokenn = 0; m_getch();getbc();if(letter() while(lett

23、er() | digit() concat(); m_getch(); retract();syn = reserve(); else if(digit() while(digit() concat(); m_getch(); retract();syn = 11; elseswitch(ch) case ) syn = 21;concat(); else if(ch = =) syn = 22;concat(); else syn = 20;retract(); break;case :concat(); m_getch();if(ch = =) syn = 24;concat(); els

24、e syn = 23;retract(); break;case :concat(); m_getch();if(ch = =) syn = 18;concat(); else syn = 17;retract(); break;case +:syn = 13;token0 = ch;break;case -:syn = 14;token0 = ch;break;case *:syn = 15;token0 = ch;break;case /:syn = 16;token0 = ch;break;case =:syn = 25;token0 = ch;break;case ;:syn = 26

25、;token0 = ch;break;case (:syn = 27;token0 = ch;break;case ):syn = 28;token0 = ch;break;case #:syn = 0;token0 = ch;break; void factor()if(syn=10 | syn=11) scaner();else if(syn = 27) scaner(); /讀下一個單詞符號 expression(); /調(diào)用函數(shù)statement() if(syn = 28) scaner(); /讀下一個單詞符號else printf(The error is on ).n);kk = 1; else printf(The expression is error!n);kk = 1; return;void term() factor(); /調(diào)用函數(shù)factor()while(syn=15 | syn=16) scaner(); /讀下一個單詞符號 facto

溫馨提示

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

最新文檔

評論

0/150

提交評論