版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 一 、 實(shí)驗(yàn)?zāi)康?通過(guò)在實(shí)驗(yàn)二的基礎(chǔ)上,增加中間代碼生成部分,使程序能夠?qū)?shí)驗(yàn)二中的識(shí)別出的賦值語(yǔ)句,if語(yǔ)句和while語(yǔ)句進(jìn)行語(yǔ)義分析,生成四元式中間代碼。二 、 實(shí)驗(yàn)方法 實(shí)驗(yàn)程序由c語(yǔ)言完成,在Turboc 2.0環(huán)境中調(diào)試通過(guò)。 語(yǔ)義分析程序的基本做法是對(duì)文法中的每個(gè)產(chǎn)生式分別編寫(xiě)一個(gè)語(yǔ)義分析子程序,當(dāng)程序語(yǔ)法部分進(jìn)行推倒或規(guī)約時(shí),就分別調(diào)用各自的語(yǔ)義分析程序。當(dāng)語(yǔ)法分析結(jié)束時(shí),語(yǔ)義分析也就結(jié)束了。 在本實(shí)驗(yàn)程序中,當(dāng)語(yǔ)法分析部分識(shí)別出語(yǔ)法正確的句子時(shí),就進(jìn)入content函數(shù)(當(dāng)語(yǔ)法分析識(shí)別出不正確的句子時(shí),不進(jìn)入content函數(shù),也就是不進(jìn)行語(yǔ)義分析),然后根據(jù)句子的類(lèi)型進(jìn)行
2、分類(lèi),進(jìn)入不同的語(yǔ)義處理部分。 對(duì)于賦值語(yǔ)句,關(guān)鍵是產(chǎn)生正確的處理算術(shù)表達(dá)式E的四元式。程序中的ec函數(shù)的功能就是產(chǎn)生算術(shù)表達(dá)式的四元式,在ec函數(shù)中使用了兩個(gè)棧idshed,opshed,分別是算術(shù)表達(dá)式的數(shù)據(jù)棧和符號(hào)棧。每次提取一個(gè)數(shù)字和一個(gè)算符,然后將算符與與棧頂算符進(jìn)行優(yōu)先級(jí)比較,優(yōu)先級(jí)高則將單前數(shù)字和算符進(jìn)棧,低或者相等的話則將當(dāng)前棧頂元素進(jìn)行合并,產(chǎn)生四元式。直至整個(gè)算術(shù)表達(dá)式結(jié)束。其中還有一些細(xì)節(jié)問(wèn)題,具體的做法可以參看程序。 對(duì)于實(shí)驗(yàn)給定的if語(yǔ)句的文法格式,條件判斷式C只中可能是或者89+56*67 then f:=7*7+4; ff:=6+6*6-6%4+8; if sl+
3、78*7689*56+67 then while a-798+45*45 do f:=7*7+4; . 四 、 運(yùn)行結(jié)果 首先對(duì)測(cè)試程序進(jìn)行語(yǔ)法分析,識(shí)別出正確的句子,當(dāng)識(shí)別出正確的句子時(shí),就對(duì)當(dāng)前句子進(jìn)行語(yǔ)義分析,而語(yǔ)法不正確的句子不進(jìn)行語(yǔ)義分析。ff:=6+6*6- Error(4):Except ID or NUM ; Error(2):Syntax error if sl89+56*67 then f:=7*7+4; success!(1) *, 56, 67, T1 (2) +, 89, T1, T2 (3) j, sl, T2, (4) (4) *, 7, 7, T3 (5) +,
4、 T3, 4, T4 (6) :=, T4, -, f ff:=6+6*6-6%4+8; success!(7) *, 6, 6, T5 (8) +, 6, T5, T6 (9) %, 6, 4, T7 (10) -, T6, T7, T8 (11) +, T8, 8, T9 (12) :=, T9, -, ff if sl+78*7689*56+67 then while a-798+45*45 do f:=7*7+4; success!(13) *, 78, 76, T10 (14) +, sl,T10, T11 (15) *, 89, 56, T12 (16) +,T12, 67, T1
5、3 (17) j, T11, T13, (18) (18) -, a, 7, T14 (19) *, 45, 45, T15 (20) +, 98,T15, T16 (21) j, T14, T16, (22) (22) *, 7, 7, T17 (23) +,T17, 4, T18 (24) :=, T18, -, f (25) j, _, _, (18). Error(2):Syntax error 五 、 實(shí)驗(yàn)小結(jié) 終于完成了編譯原理的三次實(shí)驗(yàn),這幾次實(shí)驗(yàn)使我們更徹底地鞏固了編譯原理。從詷?lè)ǚ治龅秸Z(yǔ)法分析直到這次的中間代碼都是看似簡(jiǎn)單的基礎(chǔ)知識(shí),卻花了不少時(shí)間對(duì)課本多次反復(fù)研究、請(qǐng)教學(xué)習(xí)
6、,進(jìn)行深層次地探討才找出編程時(shí)出現(xiàn)的種種問(wèn)題。還有很多程序方面很細(xì)節(jié)的問(wèn)題,很容易被突略,卻往往又是關(guān)鍵。 總地來(lái)說(shuō),雖然實(shí)驗(yàn)做得很辛苦,但真的可以從實(shí)驗(yàn)當(dāng)中學(xué)習(xí)到很多,認(rèn)識(shí)到很多。并對(duì)編譯理解也透徹了許多,比較清晰地掌握了編譯程序的原理和方法。 附錄: #include#include#include #define reser 20 char *charstring=abcdefghijklmnopqrstuvwxyz; char *numstring=; char *strstring=abcdefghijklmnopqrstuvwxyz; char reservereser10; ch
7、ar idshed4010,opshed4010; char token15,id15,sym15; char line80,tempp240; char ch,ch1,temp,tem; char tx10; char tn4,signt120,signt220,ju20; int cc,ii,k,num,kind,t,e4=0,e3=0,judge=1,row1=0; int startc,idsh=0,opsh=0,tt=1,nn=1,signwh,over=0,adds=0,whs=0,pp=0; int li=0; char filename15; FILE *fp;void get
8、ch() if(li=0) if (cc=ii) cc=1; ii=0; if (row1=1) fseek(fp,-1,1); /*讀行首字符將指針退回一格,若是整個(gè)文本的開(kāi)頭,則不需要*/ line0=fgetc(fp); row1=1; while(temp=fgetc(fp)!=n) & (temp!=EOF) linecc=temp;cc+; tempppp=temp;pp+; linecc= ; /*將緩沖帶后加上一個(gè)空字符,以便行和行之間號(hào)區(qū)分 */ cc+; tempppp= ; pp+; while(temp=fgetc(fp)=n) & (temp!=EOF); /* 跳過(guò)
9、空行*/ linecc=0; tem=lineii; ii+; ch=tem; else ch=tempppp; pp+; void getnbc()getch();while (ch= ) getch(); if (ch=) do getch(); while( ch=); getnbc(); void retract() ii-; void ret() pp-;int jchar(char ch) /* 判斷ch是不是字母 */if(strchr(charstring,ch)=0) return 0; else return 1;int jnum(char ch) /* 判斷ch是不是數(shù)字
10、 */if(strchr(numstring,ch)=0) return 0; else return 1;int jstr(char ch) /* 判斷ch是不是字母或數(shù)字 */if(strchr(strstring,ch)=0) return 0; else return 1;void advance() getnbc(); kind=0; if (jchar(ch)=1) k=0; do if(k15) tokenk=ch; k+;getch(); while(jstr(ch)=1); if (li=0) retract(); else ret(); tokenk=0; /*截去toke
11、n中的無(wú)用字符*/ strcpy(id,token); for(t =0;t=20;t+) if(strcmp(reservet,id)=0) break; if ( t=20 ) kind=t ; else kind=21; strcpy(sym,id); else if (jnum(ch)=1) k=0;do if ( k15 ) tokenk=ch; k+; getch(); while( jstr(ch)=1); if (li=0) retract(); else ret();kind=22;tokenk=0;strcpy(sym,token); else if(ch=.) kind=
12、26; k=0; do symk= ; k+; while(k!=15); sym0=ch; sym1=0; void error(int n) judge=0; /*出錯(cuò)退出,將judge0*/ switch(n) case 0:printf( Error(0):Expect : n); break; case 1:printf( Error(1):Expect = n); break; case 2:printf( Error(2):Syntax error n);break; case 3:printf( Error(3):Except Operater n);break; case 4
13、:printf( Error(4):Except ID or NUM n);break; case 5:printf( Error(5):Except ; n);break; case 6:printf( Error(6):Except n);break; case 7:printf( Error(7):Except = n );break; case 8:printf( Error(8):Except then n);break; case 9:printf( Error(9):Except Condition Expressionn );break; case 10:printf( Err
14、or(10):Except do );break; default: ; void e() advance(); if(strcmp(sym,+)=0)|(strcmp(sym,-)=0)|(strcmp(sym,*)=0)|(strcmp(sym,%)=0) printf(%s,sym); advance(); if(kind=21) | (kind=22) /* kind為21,22分別表示的是標(biāo)志符和數(shù)字 */ printf(%s,sym); e(); else e4=1 ;error(4); /*出錯(cuò)退出,e4=1*/ void c() advance(); if(kind=21) |
15、 (kind=22) printf(%s,sym); e(); if(e4=1); /*e4的作用是判斷程序從e()中是不是出錯(cuò)退出*/else if(strcmp(sym,)=0) printf(%s,sym); advance(); if(kind=21) | (kind=22) printf(%s,sym); e(); elseerror(4); else if(strcmp(sym,)=0) strcpy(ju,j); else strcpy(ju,j)=0) strcpy(ju,j); else strcpy(ju,j=); advance(); idsh=0; opsh=0; ad
16、vance(); pushid(); advance(); if(strcmp(sym,+)=0)|(strcmp(sym,-)=0)|(strcmp(sym,*)=0)|(strcmp(sym,%)=0) if (li=0) retract(); else ret(); ec(); if (adds=1) gen(opshedopsh-1,idshedidsh-2,idshedidsh-1); adds=0; strcpy(signt2,tx); idsh=0; opsh=0; else strcpy(signt2,idshed0); printf(%d) %s, %s, %s, (%d) n,nn,ju,signt1,signt2,nn+1); nn+; advance(); idsh=0; opsh=0; if(kind=21) pushid(); content(); printf(%d) j, _, _, (%d)n,nn,reu); nn+;break; default:break; main() strcpy(reserve8,if); strcpy(reserve19,while); strcpy(reserve4,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 應(yīng)城市七年級(jí)上學(xué)期語(yǔ)文期中試題
- 四年級(jí)數(shù)學(xué)(四則混合運(yùn)算)計(jì)算題專(zhuān)項(xiàng)練習(xí)與答案匯編
- 分?jǐn)?shù)的初步認(rèn)識(shí)的說(shuō)課稿
- 蹲踞式跳遠(yuǎn)說(shuō)課稿初中
- 南京工業(yè)大學(xué)浦江學(xué)院《汽車(chē)構(gòu)造(下)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《相交線》初中數(shù)學(xué)說(shuō)課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《房屋建筑學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 約定工資結(jié)清協(xié)議書(shū)(2篇)
- 南京工業(yè)大學(xué)《巖體力學(xué)與工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 對(duì)課件分析教學(xué)課件
- 河南省南陽(yáng)市2023-2024學(xué)年高一上學(xué)期期中數(shù)學(xué)試題含答案
- 2024年河南省軍隊(duì)文職(臨床醫(yī)學(xué))高頻備考核心試題庫(kù)(含答案詳解)
- 2023年國(guó)家公務(wù)員錄用考試《行測(cè)》副省級(jí)卷-解析
- 2024年銀行考試-招商銀行考試近5年真題附答案
- 2024年公開(kāi)招聘大社區(qū)工作人員報(bào)名表
- 2024年上海市普通高中學(xué)業(yè)水平等級(jí)性考試(物理)附試卷分析
- 服務(wù)營(yíng)銷(xiāo)《(第6版)》 課件 第5章 服務(wù)產(chǎn)品與服務(wù)品牌
- 甘肅省慶陽(yáng)市2023-2024學(xué)年六年級(jí)上學(xué)期語(yǔ)文期中試卷(含答案)
- 廣州中醫(yī)藥大學(xué)-中藥學(xué)模擬試題
- 2024年高考政治考試題海南卷及參考答案
- 食品供應(yīng)商遴選制度(一)
評(píng)論
0/150
提交評(píng)論