




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、孝中科技火學(xué)課程實(shí)驗(yàn)報(bào)告課程名稱:編譯原理專(zhuān)業(yè)班級(jí):信息安全1302班學(xué) 號(hào):姓 名:指導(dǎo)老師:報(bào)告日期:2015年11月11日計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院目錄實(shí)驗(yàn)一詞法分析11 .實(shí)驗(yàn)?zāi)康?2 .實(shí)驗(yàn)要求13 .算法思想24 .具體實(shí)現(xiàn)45 .結(jié)果分析56 .實(shí)驗(yàn)總結(jié)6實(shí)驗(yàn)二語(yǔ)法分析71 .實(shí)驗(yàn)?zāi)康?2 .實(shí)驗(yàn)要求73 .算法思想84 .具體實(shí)現(xiàn)105 .結(jié)果分析126 .實(shí)驗(yàn)總結(jié)12附錄源程序137 法分析138 法分析18實(shí)驗(yàn)一詞法分析1 .實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。2 .實(shí)驗(yàn)要求2.1 待分析的簡(jiǎn)單的詞法(1)關(guān)鍵字:begin、if、then、whi
2、le、do、end 所有的關(guān)鍵字都是小寫(xiě)。(2)運(yùn)算符和界符:= + -*/<<= <>>>= = ;()#(3)其他單詞是標(biāo)識(shí)符(ID)和整型常數(shù)(SUM),通過(guò)以下正規(guī)式定義:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和換行符組成??崭褚话阌脕?lái)分隔ID、SUM、運(yùn)算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2.2 各單詞符號(hào)的種別碼各種單詞符號(hào)所對(duì)應(yīng)的種別碼如表1所示。2.3 詞法分析程序的功能:輸入:所給文法的源程序字符串。輸出:二元組(syn, token或sum)構(gòu)成的序列
3、。其中:syn為單詞種別碼;token為存放的單詞自身字符串;sum為整型常數(shù)。例如,對(duì)源程序 begin x:=9: if x>9 then x:=2*x+1/3; end # 的源文件,經(jīng)過(guò)詞法分析后輸 出如下序列:(1, begin) (10, x) (18,:=) (11, 9) (26,;) (2, if)表1各種單詞符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼單詞符號(hào)種別碼begin1:17If2:=18Then3<20wile4<>21do5<=22end6>23letter (letter | digit) *10>=24dight dight*11
4、=25+1326一14(27*15)28/16#03 .算法思想算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類(lèi),拼出相應(yīng)的單詞符號(hào)。3.1 主程序框圖主程序框圖如圖1-3-1所示。其中初始包括以下兩個(gè)方面:(1)關(guān)鍵字表的初值。關(guān)鍵字作為特殊標(biāo)識(shí)符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識(shí)別出標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。關(guān)鍵字表為一個(gè)字符串?dāng)?shù)組,其描述如下:Char *rwtab6 = "begin " , "if "
5、; ,"then " , "while " , "do" ,"end” ,;(2)程序中需要用到的主要變量為syn, token和sum。3.2 掃描子程序的算法思想首先設(shè)置3個(gè)變量:token用來(lái)存放構(gòu)成單詞符號(hào)的字符串;sum用來(lái)整型單詞;syn用來(lái)存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如圖1-3-2所示。置初值圖1-3-1詞法分析主程序框圖圖1-3-2詞法分析程序掃描子程序框圖34.具體實(shí)現(xiàn)char *rwtab6 = "begin", "if", "then&q
6、uot;, "while", "do", "end"/ 關(guān)鍵字表/*自選函數(shù)*/char m_getch()/從輸入源讀一個(gè)字符到 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<='
7、z')|(ch>='A'&&ch<='Z') return 1;else return 0;int digit()/判斷是否是數(shù)字if(ch >= '0' && ch <= '9') return 1;else return 0;int reserve()檢索關(guān)鍵字表格int i;for(i=0; i<6; i+)if(!strcmp(rwtabi, token)return i+1;return 10;void retract() / 回退一個(gè)字符p = p-
8、 1;/*主程序*/int main()p = 0;printf("Please input string (end of #): n");doscanf("%c", &ch);4g ? Au 8- 1 %匕 f o- 1 f ofl 1 5, 1 6- - 6 Lr k. -0- 1 1 1 1 7)1 1 .1 1 -no- C"i /Ik-Jfx-/I% fx rL. /IX Jr /%/1% iff 7Lprogp+ = ch;while(ch != '#');p = 0;doscaner();switch(sy
9、n)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;5.結(jié)果分析輸入begin x:=9: if x>9 then x:=2*x+1/3; end #后經(jīng)詞法分析輸出如下序列:(1, begin) (10, x) (18,:=) (11, 9) (26,;)(2, if)如圖1-5-1所示:Please input stri
10、ns (end of t):in y:=9: ii then ¥:+ I/3: nd itbeg in).x),二二) .8) ,J if),),9) then) .x)1:),2) .未),I).3).Jend)圖1-5-1詞法分析實(shí)驗(yàn)結(jié)果6.實(shí)驗(yàn)總結(jié)詞法分析的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類(lèi),拼出相應(yīng)的單詞符號(hào)。 通過(guò)本試驗(yàn)的完成,更加加深了對(duì)詞法分析原理的理解。7實(shí)驗(yàn)二語(yǔ)法分析1 .實(shí)驗(yàn)?zāi)康木幹埔粋€(gè)遞歸下降分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的單詞序列的語(yǔ)法檢查和結(jié)構(gòu) 分析。2 .實(shí)驗(yàn)要求利用c語(yǔ)言編制
11、遞歸下降分析程序,并對(duì)簡(jiǎn)單語(yǔ)言進(jìn)行語(yǔ)法分析。2.1 待分析的簡(jiǎn)單語(yǔ)言的語(yǔ)法用擴(kuò)充的BNF表不如下:(1) 程序: 巾69所語(yǔ)句串end(2) 語(yǔ)句串:=語(yǔ)句; 語(yǔ)句(3) 語(yǔ)句 :=賦值語(yǔ)句(4) 賦值語(yǔ)句:=ID :=表達(dá)式(5) 表達(dá)式:=項(xiàng)+ 項(xiàng) |-項(xiàng)(6) 項(xiàng) :=因子*因子 | /因子(7) 因子:=ID | NUM |(表達(dá)式)2.2 實(shí)驗(yàn)要求說(shuō)明輸入單詞串,以“#"結(jié)束,如果是文法正確的句子,則輸出成功信息,打印"succesS',否則輸出“ error”。例如:輸入 begin a:=9; x:=2*3; b:=a+x end #輸出 succes
12、s!輸入 x:=a+b*c end #輸出 error3 .算法思想(1)主程序示意圖如圖 2-3-1所示。圖2-3-1語(yǔ)法分析主程序框圖(2)遞歸下降分析程序示意圖如圖2-3-2所示。(3)語(yǔ)句串分析過(guò)程示意圖如圖2-3-3所示。圖2-3-2遞歸下降分析程序示意圖8(4) statement語(yǔ)句分析程序流程如圖2-3-4、2-3-5、2-3-6、2-3-7所示。圖2-3-7 factor函數(shù)示意圖9圖2-3-4 statement函數(shù)示意圖 圖2-3-5 expression函數(shù)示意圖4.具體實(shí)現(xiàn)void factor()if(syn=10 | syn=11) scaner();else i
13、f(syn = 27)scaner();/讀下一個(gè)單詞符號(hào)expression。;調(diào)用函數(shù) statement。if(syn = 28) scaner();/ 讀下一個(gè)單詞符號(hào)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();/讀下一個(gè)單詞符號(hào)factor。;調(diào)用函數(shù)
14、factor() return;void expression()term();調(diào)用函數(shù) term()while(syn=13 | syn=14)scaner();/讀下一個(gè)單詞符號(hào)term();調(diào)用函數(shù) term() return;void statement()if(syn=10)scaner();/讀下一個(gè)單詞符號(hào)if(syn=18)scaner();/讀下一個(gè)單詞符號(hào)10expression。;調(diào)用函數(shù)statement。25elseprintf("the symbol ':=' is error!n");kk=1;elseprintf("
15、The sentence is error!n");kk=1; return;void yucu()statement。;/ 調(diào)用函數(shù) statement。while(syn = 26)scaner();/讀下一個(gè)單詞符號(hào)if(syn != 6)statement。;調(diào)用函數(shù) statement。 return;void lrparser()if(syn = 1) scaner(); /讀下一個(gè)單詞符號(hào) yucu(); 調(diào)用 yucu()函數(shù) if(syn = 6)scaner();if(syn=0 && kk=0) printf("Success!n&qu
16、ot;);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;printf("Please input string (end of #): n");doscanf("%c", &ch);progp+ = ch;while(ch !=
17、9;#');p = kk = 0;scaner();lrparser();return 0;5 .結(jié)果分析(1)輸入 begin a:=9; x:=2*3; b:=a+x end # 后,輸出 success!如圖2-5-1所示:PIinput st ring (erd of #): begin a: =9; x:二2抬;b: =a+x end It Success!圖2-5-1語(yǔ)法分析實(shí)驗(yàn)結(jié)果(一)(2)輸入 x:=a+b*c end # 后,輸出 The string is lack of a 'begin'!如圖2-5-2所示:Please input strin
18、g (end of 叉:二a+b裝c邑nd #The st ring is I ack of a ' beg in- 1圖2-5-2語(yǔ)法分析實(shí)驗(yàn)結(jié)果(二)6 .實(shí)驗(yàn)總結(jié)通過(guò)本次試驗(yàn),了解了語(yǔ)法分析的運(yùn)行過(guò)程,主程序大致流程為:“置初值” 調(diào)用scaner函數(shù)讀下一個(gè)單詞符號(hào)調(diào)用IrParse結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”不是則“出錯(cuò)處理”,若是則“調(diào)用scaner函數(shù)”調(diào)用語(yǔ)句串分析函數(shù)“判斷是否為end"不是則"出錯(cuò)處理",若是則"調(diào)用scaner函數(shù)”"判斷syn=0&&kk=0是否成立”
19、成立則說(shuō)明分析成功打印出來(lái)。不成立則“出錯(cuò)處理”。附錄源程序詞法分析#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include<stddef.h>char prog80, token80;char ch;int syn, p, m, n;char *rwtab6 = "begin", "if", "then", "while", "do",
20、 "end"char m_getch() /從輸入源讀一個(gè)字符到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<='z')|(ch>='A'&&ch<='Z
21、39;) return 1;else return 0;int digit()/判斷是否是數(shù)字if(ch >= 'O' && ch <= '9') return 1;else return 0;int reserve。/檢索關(guān)鍵字表格int i;for(i=0; i<6; i+)if(!strcmp(rwtabi, token)return i+1;return 10;void retract() / 回退一個(gè)字符p = p - 1;char *dtb()return NULL;void scaner()m = 0;for(n=
22、0; n<8; n+) tokenn = '0'm_getch();getbc();if(letter()while(letter() | digit() concat();m_getch();retract();syn = reserve。;else if(digit()while(digit()concat();m_getch();retract();syn =11;elseswitch(ch)case '<':concat();m_getch();if(ch ='>')syn = 21;concat();else if(c
23、h ='=')syn = 22;concat();elsesyn = 20; retract();break;case '>':concat();m_getch();if(ch ='=')syn = 24; concat();elsesyn = 23; retract();break;case ':':concat();m_getch();if(ch ='=')syn = 18; concat();elsesyn = 17; retract();break;case '+':syn = 13;
24、token0 = ch;break;case '-':syn = 14;token0 = ch;break;casesyn = 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
25、 = ch;break;case '#':syn = 0;token0 = ch;break;int main()p = 0;printf("Please input string (end of #): n");doscanf("%c", &ch);progp+ = ch;while(ch != '#');p = 0;doscaner();switch(syn)case-1:printf("you have inputed a wrong string!n");getch();exit(0);
26、default:printf("(%d, %s)n", syn, token);break;while(syn != 0);return 0;語(yǔ)法分析#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include<stddef.h>void expression。;char prog80, token80;char ch;int syn, p, m, n, kk;char *rwtab6 = "begin&quo
27、t;, "if", "then", "while", "do", "end"char m_getch()/從輸入源讀一個(gè)字符到CH中ch = progp+;return ch;void getbc() /去掉空白字符while (ch = ' '| ch= 10)ch = progp+;void concat() / 拼接單詞tokenm+ = ch;tokenm = '0'int letter()/判斷是否是字母if(ch>='a'&
28、;&ch<='z')|(ch>='A'&&ch<='Z') return 1;else return 0;int digit()/判斷是否是數(shù)字if(ch >= 'O' && ch <= '9') return 1;else return 0;int reserve。/檢索關(guān)鍵字表格int i;for(i=0; i<6; i+)if(!strcmp(rwtabi, token)return i+1;return 10;void retrac
29、t() / 回退一個(gè)字符p = p - 1;char *dtb()return NULL;void scaner()m = 0;for(n=0; n<8; n+) tokenn = '0'm_getch();getbc();if(letter()while(letter() | digit()concat();m_getch();retract();syn = reserve。;else if(digit()while(digit()concat();m_getch();retract();syn =11;elseswitch(ch)case '<'
30、:concat();m_getch();if(ch ='>')syn = 21;concat();else if(ch ='=')syn = 22;concat();elsesyn = 20;retract();break;case '>':concat();m_getch();if(ch ='=')syn = 24;concat();elsesyn = 23;retract();break;case ':':concat();m_getch();if(ch ='=')syn = 18;
31、concat();elsesyn = 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;token0 = ch;break
32、;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();/讀下一個(gè)單詞符號(hào)expression。;調(diào)用函數(shù) statement。if(syn = 28) scaner(); / 讀下一個(gè)單詞符號(hào) elseprintf("The error is on ')'.n");kk = 1;elseprintf(&qu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45212-2025化妝品中甲基二溴戊二腈的測(cè)定氣相色譜法
- 度小企業(yè)勞動(dòng)合同模板大全
- 專(zhuān)利代理保密合同范本
- 2花的學(xué)校教學(xué)設(shè)計(jì)-2024-2025學(xué)年三年級(jí)上冊(cè)語(yǔ)文統(tǒng)編版
- 銷(xiāo)售優(yōu)惠合同模板
- 合同樣本:租賃合同示范文本
- 土地測(cè)繪項(xiàng)目合同書(shū)模板
- 農(nóng)村林地承包權(quán)交易合同范文
- 內(nèi)河航運(yùn)人身意外傷害保險(xiǎn)合同
- 10牛郎織女(一)(教學(xué)設(shè)計(jì))-2024-2025學(xué)年統(tǒng)編版語(yǔ)文五年級(jí)上冊(cè)
- 團(tuán)員組織關(guān)系轉(zhuǎn)接介紹信(樣表)
- 網(wǎng)絡(luò)安全系統(tǒng)集成高職PPT完整全套教學(xué)課件
- 射頻消融術(shù)介紹【共48張PPT】
- 驗(yàn)證機(jī)械能守恒物理實(shí)驗(yàn)報(bào)告
- 5.13 導(dǎo)游口頭語(yǔ)言表達(dá)技巧《導(dǎo)游業(yè)務(wù)》教學(xué)課件
- 人教版小學(xué)信息技術(shù)教材-課件
- 30萬(wàn)室內(nèi)裝修預(yù)算表
- 拉線的制作詳細(xì)
- 律師報(bào)價(jià)函(訴訟)
- 新生兒沐浴評(píng)分標(biāo)準(zhǔn)
- 潛水作業(yè)指導(dǎo)書(shū)
評(píng)論
0/150
提交評(píng)論