版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 25396.1-2025農(nóng)業(yè)機(jī)械拋出物試驗和驗收規(guī)范第1部分:旋轉(zhuǎn)式割草機(jī)
- 醫(yī)學(xué)檢驗一季度三基試題附答案
- 醫(yī)院三基考試模考模擬試題附完整答案詳解
- 《中級個人理財》-中級銀行從業(yè)試題預(yù)測試卷附答案詳解
- 高中休育面試題及答案大全
- 倉庫出庫題庫及答案模板
- 中小學(xué)教師資格證《綜合素質(zhì)》試題及答案
- 史無前例考試試題及答案
- 基金從業(yè)資格考試基金法規(guī)與職業(yè)道德相關(guān)真題試卷含答案
- 2025年事業(yè)單位衛(wèi)生類專業(yè)知識試卷(護(hù)理學(xué))試題(附答案)
- 2026貴州省黔晟國有資產(chǎn)經(jīng)營有限責(zé)任公司面向社會招聘中層管理人員2人備考考試試題及答案解析
- 2025年營養(yǎng)師考試練習(xí)題及答案
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫及答案詳解一套
- 消費者權(quán)益保護(hù)與投訴處理手冊(標(biāo)準(zhǔn)版)
- 南京航空航天大學(xué)飛行器制造工程考試試題及答案
- 陶瓷工藝品彩繪師改進(jìn)水平考核試卷含答案
- 雷達(dá)液位計參考課件
- 手術(shù)標(biāo)本管理護(hù)理質(zhì)量控制考核標(biāo)準(zhǔn)
- GB 30981-2020 工業(yè)防護(hù)涂料中有害物質(zhì)限量
- 鋼結(jié)構(gòu)廠房布置及設(shè)備
- 畢業(yè)設(shè)計(論文)-全自動果蔬切丁機(jī)設(shè)計(含全套CAD圖紙)
評論
0/150
提交評論