版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、實用文檔編譯原理實驗報告*水*PLO語言功能簡單、結構清晰、可讀性強,而又具備了一般高級程序設計語言的 必須部分,因而PLO語言的編譯程序能充分體現(xiàn)一個高級語言編譯程序實現(xiàn)的基 本方法和技術。PL/O語言文法的EBNF表示如下: 程序:二分程序分程序:二常量說明變量說明過程說明語句 常量說明:二CONST常量定義,常量定義;常量定義 ::=標識符二無符號整數(shù) 無符號整數(shù):二數(shù)字數(shù)字變量說明:二VAR標識符.標識符;標識符 :=字母字母|數(shù)字 過程說明 :=過程首部分程序;過程說明 ;過程首部:二PROCEDURE標識符;語句:乂賦值語句|條件語句1當循壞語句|過程調用語句賦值語句:復合語句:條
2、件語句:I復合語句I讀語句X寫語句 I空:二標識符:二表達式-BEGIN語句;語句JEND:二表達式關系運算符表達式|ODD表達式表達式 :=+H項加法運算符項項:二因子乘法運算符因子因子 :二標識符|無符號整數(shù)|弋表達式V加法運算符乘法運算符關系運算符二+卜=*|/二=|#|=條件語句:=IF條件THEN語句過程調用語句:二CALL標識符 當循壞語句 :二WHILE條件DO語句讀語句:二READ (標識符,標識符 V寫語句=WRITE CC表達式,表達式 V 字母:=a|b|-|X|Y|Z數(shù)字 :=0|1|-|8|9【預處理】對于一個PI0文法首先應該進行一定的預處理,提取左公因式,消除左遞
3、歸 (直接或間接人接著就可以根據(jù)所得的文法進行編寫代碼?!緦嶒炓弧吭~法分析【實驗目的】給出PL/O文法規(guī),要求編寫PL/O語言的詞法分析程序。【實驗容】已給PL/O語言文法,輸出單詞(關鍵字、專用符號以及其它標記)?!緦嶒炓蟆?. 確定編譯中使用的表格、標識符與關鍵字的區(qū)分方法等。2. 把詞法分析器設計成一個獨立一遍的過程。3. 詞法分析器的輸出形式采用二元式序列,例如:(ident. a)(plus. + )(number. 15)(times. * )(ident. b )【輸入輸出】輸入:PL/O源程序。例:a+15*b輸出:(ident. a)(plus. + )(number, 1
4、5)(times. * )(ident, b )【實驗結果】實驗結果與實驗要求相同,沒有異議,對輸入字符采取一個一個讀入,到 達句柄時,則采取LL(1)文法進行規(guī)約。o |回實驗結果如下:SB C:Windowssystem32crrd.exewritesyn , write lparent rparent end.abce endsyn , end a period . b實驗結果用文本來進行輸入輸出,所以在工程目錄下還會有一個文本輸入, 輸出文件。分別為in. txt out. txt【實驗體會】在編寫這段代碼的過程中,比較麻煩得還是之前的語法預處理階段,將不 滿足11 (1)文法的語法轉
5、化為標準的11 (1)文法。程序在處理詞法分析的過 程就是不斷通過getsym()這個函數(shù)來條用getch (),不斷形成一個一個的 詞匯,供下面語法分析時使用。記錄詞匯類型的sym是一個枚舉類型。使 用起來會方便許多,比較系統(tǒng)。其中還用到了文本輸入輸出的技巧,把讀 出的詞匯保存起來。詞法分析還是比較簡單,在編寫代碼的時候沒有太大 的阻礙。通過此次實驗,讓我了解到如何設計、編制并調試詞法分析程序,加深對 詞法分析原理的理解;熟悉了構造詞法分析程序的手工方式的相關原理, 使用某種高級語言(例如C+語言)直接編寫此法分析程序。另外,也讓 我重新熟悉了 C+語言的相關容,加深了對C+語言的用途的理解
6、?!緦嶒灦空Z法分析【實驗目的】給出PL/O文法規(guī),要求編寫PL/O語言的語法分析程序?!緦嶒炄荨恳呀oPL/O語言文法,構造表達式部分的語法分析器?!緦嶒炓蟆?. 將實驗一 h司法分析”的輸出結果,作為表達式語法分析器的輸入,進行 語法解析,對于語確的表達式,報告“語確J對于語法錯誤的表達式,報 告T吾法錯誤S 指出錯誤原因。2. 把語法分析器設計成一個獨立一遍的過程。3 語法分析器的編寫方法采用遞歸子程序法。【輸入輸出】輸入:PL/O表達式,用實驗一的輸出形式作為輸入。例如:對于PL/O表達式, a+15*b用下列形式作為輸入:(ident. a)(plus. + )(number, 15
7、)(times, * )(ident, b )輸出:對于語確的表達式,報告r吾確”;對于語法錯誤的表達式,報告r吾法錯誤S 指出錯誤原因?!緦嶒灲Y果】實驗結果與實驗要求相同,沒有異議,對輸入字符采取一個一個讀入,對 輸入的一個語句進行判斷,判斷語法的正誤,采用對算法的判斷,若全為 數(shù)字則進行最后的計算G+5)+3 |QB C:Wi n dowssystem 3 2cmd.exe龍尼r法字ro語數(shù)er跟ee錯繼有-N 厭沒一J testd3t3 -記事N:文件(F)離(E)格式(0)宣看(V)群珈 | (2 a+5)+3C:Windowssystem32cmd.exe | 3 testdata
8、記事本文件(F)蒔(E)格式(O)奩看(V)幫助(H)【實驗體會】通過語法分析可以判斷當前輸入語句是否正確,實驗通過對數(shù)學式的處理 來進行對語句的判斷是否正確,若正確則只要輸入F吾句正確“即可,若 語句錯誤則需要根據(jù)錯誤的原因輸出錯誤的理由,以方便編譯員修改自己 的代碼。實現(xiàn)方法是通過對文本文件的輸入,當前數(shù)據(jù)與即將輸入的字符 串進行匹配,若不符合LL (1)文法則判定為錯誤,若符合則繼續(xù)向下完 成語法分析?!驹创a】#include #include #i ncIudestringh #includectype. h#incIude #i ncIude #i ncIudestr i ng #
9、incIude us i ng namespace std;ifstream finC in.txt); ofstream fout (”out.txt);enum symbol/o6172345nul.ident,number,plus.minus.t imes,s 1 ash,oddsymteql.neq,I ss,I eq,gtr,geq,1 paren,rpare ma,Semico Ion,per iod,becomes.begi nsym, endsym.if sym,thensym,wh i 1 esym.wr itesymrreadsym.dosym,ca I I s
10、csym1;#def ine symnum 32char symworksymnum 10 ;/單符號#define norw 13 /key一word num#def i ne a I 10 /maxstr#define nmax 10/number longchar wordnorwaI;/key wordchar ch;/bufferchar getch ()enum symbol sym;char ida1+1;/ identchar a a 1+1;/tempchar IDa 1+1;irrt cc=0r I l=0r num;/當前在行的
11、位置cc,行字符的長度I I, num數(shù)字的 值int nn=0;char Iine81;int f lg=0;/ 正數(shù);/char Iine81; enum symbol ssym256; enum symbol wsymnorw;/int ccr I I;/chccint err;void init ()irrt i :for(i=0;i =255;i+) ssymi=nul;/0ssym+=plus; ssyrnf1-*=minus;ssym*二times; ssym,/,=slash; ssym (*=lparen; ssymt*)1=rparen; ssym,=,=eql; ssym
12、*, =comma; ssymt* 二period; ssym1#r=neq;/not equal ssym*;1=semico I on;strcpy(&symworkplus0, plus);strcpy(&symworkminus0, minus);strcpy(&symworktimes0, times);strcpy(&symworksiash0, slash);strcpy (&symworkIparen0. HIparenH);strcpy (&symworkrparen0. HrparenH);strcpy (&symworkeq I0, HeqIH);strcpy(&symw
13、orkcomma0, comma);strcpy (&symworkneq0, HneqH);strcpy (&symworkper iod0, per iodu);strcpy (&symworksemi co I on0, semi co I on);strcpy(&word0 0, begin) ;/關鍵字小寫字母 strcpy (&word 1 0. Hca II);strcpy (&word2 0, const1);strcpy (&word30, do);strcpy (&word40, end);strcpy (&word50, i f);strcpy (&word60, odd
14、);strcpy (&word70, procedure”);strcpy(&word80, read);strcpy (&word90, then);strcpy (&word100, var);strcpy (&word110, whi le);strcpy (&word120, wr ite);wsym0=begi nsym; wsym1=calIsym; wsym2二constsym; wsym3=dosym; wsym4二endsym; wsym5 = i fsym; wsym6=oddsym; wsym7=procsym;wsym8=readsym; wsym9二thensym;
15、wsym10=varsym; wsym11二wh i Iesym; wsym12=wr i tesym;void WordAna Iyse ()switch(sym)case nul:/fout M ( nul , ilIDi, )Mendl; break;case i dent: fout ( i dent , ID )endl; cout (,ident,nID )endl ;break;case number:fout ( number , num ) end I ; cout (uN numbe rHH,num ) HendI ;break;case pl us: fout ( ,pl
16、usn , IDn ) Hend I ;cout( ,IDH )Hendl;break;case minus:fout ”(,plus,H.,minusHn , HIDn )HendlcoutM (,IDH )Hendl;break;case ti mes:fout n ( cout( nIDn )nendl;break;II II _ H II minus , ,,ID, ),endl,Ht imes,ncase slash:fout M ( cout(,slashnH , HIDn )Hendlslash,IDn )nendl;break;case oddsym:fout ( oddsym
17、 , ID ) end I ; cout (oddsym,ID )endl ;break;case I ss: fout ( I ss , ID )endl; coutH (,,lsst,,,,HIDH )Hendl;break;case eq I : fout H ( ,eq I ,t, , ,IDH )Hendl; cout* (”eql”,HIDH )Hendl;break;case neq: fout ( neq , ID ) end I ; coutH (,Hneq,n,IDN )Hendl;break;case I eq :fout H ( UM leqHHcout(nIDn )n
18、endl;break;case gtr : fout ( gtr cout(leq,ID, )endl;case geq:fout H (I it _ it geq ,IDM )uendl;,IDH )Hendl;break;coutn (,geqt,uIDn )endl ;break;case lparen:fout ( lparent , ID ) end I ; cout ( I parent,ID )endl ;break;case rparen:fout ( ,rparent , ID ) endI ; cout (,rparent,IDK )endl ;break;case com
19、ma: fout ( comma , ID )endl;cout( ID )endl ;break;case semicoI on:foutnIDn )endl; cout(ID )endl ;break; case per i od: fout ( cout(ID )endl ;break; casebecomes:fout,IDH )endl; cout(ID )endl ;break; casebegi nsym:foutnIDn )endl; cout(ID )endl ;break; case endsym: fout ( cout(IDn )endl ;break;case i f
20、sym: fout ( cout(”ID )endl;break;casethensym:foutIDK )endl; cout(ID )endl ;break;”comma,H( semicolon,semico Ion,periodn , ID )*endl;u,periodu,( become s,n,becomes,H(,beginsym,beginsym,,,endsym, , ID )*endl;endsym, ,IDM )Mendl;( ”thensymC ,壯 hensym,case wh iIesym:fout)end I ;cout()endI ;break;casewr
21、i tesym:fout)end I ;cout()endI ;break;casereadsym:fout)Mend I ;cout()endI ;break;H( i,whi lesyml,11HHwhi IesymuHH (nwr itesym,nHwr i tesyml,H(,readsym,”=,a,&ch=*a&ch二0&ch=9)/ 名字或保留字以a.z開頭if (k=0)i=k+1;)whi le (ij) sym=wsymk ; else sym= ident; /* 搜索失敗,則是名字 或數(shù)字*/if(ch=,0,&ch=,0,&chnmax)/error (30);F)e
22、 I seif(ch=:)getchdo;if (ch=, = ,)symbecomes; strcpy(ID,:二); getchdo;symnuI;strcpy(ID. NULL”);1if (ch=)getchdo;if (ch二二二)sym二geq;strcpy (ID, =);getchdo;sym=gtr;strcpy (IDJ“);)1e I seif(ch=y)getchdo;if (ch=, = )symleq;strcpy(ID, =); getchdo;)e I sesym=lss;strcpy (ID, HH);sym=ssymch; strcpy (ID, &ch);
23、/if (sym!=per iod)getchdo;)return 1;/語法分析部分實驗2i nt I p二0;int rp=0;#def ine getsymdoif (一 1=getsymO) return -1#def ine express i on do () i f (-1express i on () return -1#define termdo() if(T= termO) return -1#define factordo() if (1=factor() return Tint expression ();語法分析int factor ()if (sym! = iden
24、t &sym!=number&sym! = lparen)err+;if (err=1) pr intf (語法錯誤:n);pr intf (errorFactor Needs Ident or Number or Lparenn”);)if (sym = ident) | (sym = number) | (sym = Iparen)if (sym 二二 ident)WordAnalyseO ;if (getsym () =T) return -1;)i f(sym!=t imes&sym!=sI ash&sym!二pI us&sym!二mi nus&sym!=rparen) err+;if
25、 (err=1) pr intf (語法錯誤:n); printfC*變量后沒有跟上+-* n”);i f (Ip=0 & sym=rparen)err+;if (err=1) pr intf (語法錯誤:n); printfC沒有左括號匹配rT);)eIse i f (sym = number)WordAnalyseO ;i f (getsym ()=T)return T;)i f (sym!二t imes&sym!二sI ash&sym!二pI us&sym!=mi nus&sym!=rparen) err+;if (err=1) pr intf (語法錯誤:n); printfC1數(shù)字后
26、沒有跟上+-* nM);if(lp=0 & symrparen)err+;if (err=1) pr intf (語法錯誤:n); printf(H沒有左括號匹配rT);)eIse if (sym = I paren)WordAnalyse ();lp+;i f (getsym () =T)Ip-; err+;if (err=1) pr intf (語法錯誤:n);pr intf (errorNeeds Rparen n);return -1;expressiondoO ;i f (sym = rparen)WordAna I yse ();Ip;if (getsym () =T)return -1;)if (sym!i mes&sym!=sI ash&sym!=pIus&sym!=mi nus)err+;if (err=1) pr intf (語法錯誤:nH);printfC1括號后沒有跟上+-* nM);err+;if (err=1) pr intf (語法錯誤:n); pr i ntf (errorNeeds Rparen n”);return 0;int term ()factordoO ;i f(sym!二t i mes&sym!二sI ash&sym!=pIus&sym!=mi nus&sym!二 i dent& sym!=number&sym! =
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級語文上冊《一次成功的實驗》教案
- 中國休閑零食電商行業(yè)市場全景調研及投資規(guī)劃建議報告
- 小班語言公開課《圓》活動教案
- 大學生自我介紹范文集合七篇
- 銀行客服工作總結(15篇)
- 建筑實習報告模板合集七篇
- 乒乓球比賽作文300字匯編十篇
- 消防安全在我心中演講稿5篇
- 后備干部培訓心得體會800字
- 辭職報告范文匯編15篇
- 房租收條格式(3篇)
- 期末試卷(試題)2024-2025學年培智生活語文二年級上冊
- 《技術規(guī)程》范本
- DBJ50T-城鎮(zhèn)排水系統(tǒng)評價標準
- 紅色簡約中國英雄人物李大釗課件
- 小學師德考評細則
- 軟件定義網(wǎng)絡(SDN)實戰(zhàn)教程課件
- 2024版《大學生職業(yè)生涯規(guī)劃與就業(yè)指導》 課程教案
- 專題10閱讀理解、拓展探究-2022-2023學年八年級數(shù)學上冊期末選填解答壓軸題必刷專題訓練(華師大版)(原卷版+解析)
- 西師大版五年級上冊小數(shù)混合運算題100道及答案
- 2024江蘇省鐵路集團限公司春季招聘24人高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
評論
0/150
提交評論