




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實用文檔編譯原理實驗報告*水*PLO語言功能簡單、結構清晰、可讀性強,而又具備了一般高級程序設計語言的 必須部分,因而PLO語言的編譯程序能充分體現一個高級語言編譯程序實現的基 本方法和技術。PL/O語言文法的EBNF表示如下: 程序:二分程序分程序:二常量說明變量說明過程說明語句 常量說明:二CONST常量定義,常量定義;常量定義 ::=標識符二無符號整數 無符號整數:二數字數字變量說明:二VAR標識符.標識符;標識符 :=字母字母|數字 過程說明 :=過程首部分程序;過程說明 ;過程首部:二PROCEDURE標識符;語句:乂賦值語句|條件語句1當循壞語句|過程調用語句賦值語句:復合語句:條
2、件語句:I復合語句I讀語句X寫語句 I空:二標識符:二表達式-BEGIN語句;語句JEND:二表達式關系運算符表達式|ODD表達式表達式 :=+H項加法運算符項項:二因子乘法運算符因子因子 :二標識符|無符號整數|弋表達式V加法運算符乘法運算符關系運算符二+卜=*|/二=|#|=條件語句:=IF條件THEN語句過程調用語句:二CALL標識符 當循壞語句 :二WHILE條件DO語句讀語句:二READ (標識符,標識符 V寫語句=WRITE CC表達式,表達式 V 字母:=a|b|-|X|Y|Z數字 :=0|1|-|8|9【預處理】對于一個PI0文法首先應該進行一定的預處理,提取左公因式,消除左遞
3、歸 (直接或間接人接著就可以根據所得的文法進行編寫代碼。【實驗一】詞法分析【實驗目的】給出PL/O文法規,要求編寫PL/O語言的詞法分析程序。【實驗容】已給PL/O語言文法,輸出單詞(關鍵字、專用符號以及其它標記)。【實驗要求】1. 確定編譯中使用的表格、標識符與關鍵字的區分方法等。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)文法進行規約。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()這個函數來條用getch (),不斷形成一個一個的 詞匯,供下面語法分析時使用。記錄詞匯類型的sym是一個枚舉類型。使 用起來會方便許多,比較系統。其中還用到了文本輸入輸出的技巧,把讀 出的詞匯保存起來。詞法分析還是比較簡單,在編寫代碼的時候沒有太大 的阻礙。通過此次實驗,讓我了解到如何設計、編制并調試詞法分析程序,加深對 詞法分析原理的理解;熟悉了構造詞法分析程序的手工方式的相關原理, 使用某種高級語言(例如C+語言)直接編寫此法分析程序。另外,也讓 我重新熟悉了 C+語言的相關容,加深了對C+語言的用途的理解
6、。【實驗二】語法分析【實驗目的】給出PL/O文法規,要求編寫PL/O語言的語法分析程序。【實驗容】已給PL/O語言文法,構造表達式部分的語法分析器。【實驗要求】1. 將實驗一 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 指出錯誤原因。【實驗結果】實驗結果與實驗要求相同,沒有異議,對輸入字符采取一個一個讀入,對 輸入的一個語句進行判斷,判斷語法的正誤,采用對算法的判斷,若全為 數字則進行最后的計算G+5)+3 |QB C:Wi n dowssystem 3 2cmd.exe龍尼r法字ro語數er跟ee錯繼有-N 厭沒一J testd3t3 -記事N:文件(F)離(E)格式(0)宣看(V)群珈 | (2 a+5)+3C:Windowssystem32cmd.exe | 3 testdata
8、記事本文件(F)蒔(E)格式(O)奩看(V)幫助(H)【實驗體會】通過語法分析可以判斷當前輸入語句是否正確,實驗通過對數學式的處理 來進行對語句的判斷是否正確,若正確則只要輸入F吾句正確“即可,若 語句錯誤則需要根據錯誤的原因輸出錯誤的理由,以方便編譯員修改自己 的代碼。實現方法是通過對文本文件的輸入,當前數據與即將輸入的字符 串進行匹配,若不符合LL (1)文法則判定為錯誤,若符合則繼續向下完 成語法分析。【源代碼】#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數字的 值int nn=0;char Iine81;int f lg=0;/ 正數;/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; /* 搜索失敗,則是名字 或數字*/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數字后
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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 關鍵指標解析的2025年信息系統監理師考試試題及答案
- 信息系統監理師考生心得試題及答案
- 公路工程執照考試在線測試試題及答案
- 鐵合金冶煉中的原料選擇考核試卷
- 組織文化建設與變革管理考核試卷
- 竹材在戶外健身器材的應用考核試卷
- 船用軸系的振動分析與故障處理考核試卷
- 出租展廳車間管理制度
- 完善網絡相關管理制度
- 公司職工福利管理制度
- 2025年福建省廈門市思明區廈門第一中學初三5月二模試題英語試題含答案
- 食品行業銷售助理崗位職責
- 八省聯考陜西試題及答案
- 貨物破損回復函
- 3“貝”的故事 課件
- 消防防汛知識培訓課件
- Unit2 What time is it B let's talk and learn(說課稿)-2023-2024學年人教PEP版英語四年級下冊
- QC實驗室5S現場管理
- 攀成德鐵四院中鐵四院集團績效考核管理制度
- 管制刀具校園安全
- 2024年山東省濟南市中考英語試題卷(含答案解析)
評論
0/150
提交評論