


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.編譯原理實(shí)驗(yàn)報(bào)告*PL0 語言功能簡單、結(jié)構(gòu)清晰、可讀性強(qiáng),而又具備了一般高級程序設(shè)計(jì)語言的必須部分,因而 PL0 語言的編譯程序能充分體現(xiàn)一個(gè)高級語言編譯程序?qū)崿F(xiàn)的基本方法和技術(shù)。 PL/0 語言文法的 EBNF 表示如下:<程序 >:=<分程序 >.<分程序 > :=< 常量說明 >< 變量說明 >< 過程說明 >< 語句 > <常量說明 > :=CONST< 常量定義 > , <常量定義 > <常量定義 > :=<標(biāo)識符 >=<無符號整數(shù)
2、 > <無符號整數(shù) > := <數(shù)字 >< 數(shù)字 ><變量說明 > :=VAR <標(biāo)識符 >, < 標(biāo)識符 ><標(biāo)識符 > :=<字母 >< 字母 >|<數(shù)字 ><過程說明 > :=<過程首部 ><分程序 > < 過程說明 > ; <過程首部 > :=PROCEDURE <標(biāo)識符 ><語句 > :=<賦值語句 >|<條件語句 >|<當(dāng)循環(huán)語句 >|&l
3、t;過程調(diào)用語句 >|<復(fù)合語句 >|<讀語句 ><寫語句 >|<空> <賦值語句 > :=<標(biāo)識符 >:=<表達(dá)式 ><復(fù)合語句 > :=BEGIN < 語句 > ;< 語句 > END<條件語句 > := <表達(dá)式 > <關(guān)系運(yùn)算符 > <表達(dá)式 > |ODD<表達(dá)式 > <表達(dá)式 > := +|-< 項(xiàng)>< 加法運(yùn)算符 > <項(xiàng) > <項(xiàng)> :=
4、 <因子 >< 乘法運(yùn)算符 > <因子 ><因子 > := <標(biāo)識符 >|<無符號整數(shù) >| (<表達(dá)式 >) <加法運(yùn)算符 > := +|-<乘法運(yùn)算符 > := *|/<關(guān)系運(yùn)算符 > := =|#|<|<=|>|>=<條件語句 > := IF <條件 > THEN < 語句><過程調(diào)用語句 > := CALL標(biāo)識符<當(dāng)循環(huán)語句 > := WHILE < 條件 > DO <
5、; 語句 ><讀語句 > := READ (<標(biāo)識符 >,< 標(biāo)識符 > ) <寫語句 > := WRITE (<表達(dá)式 >,< 表達(dá)式 > ) <字母 > := a|b| |X|Y|Z<數(shù)字 > := 0|1|8|9【預(yù)處理】對于一個(gè) pl0 文法首先應(yīng)該進(jìn)行一定的預(yù)處理,提取左公因式,消除左遞歸(直接或間接),接著就可以根據(jù)所得的文法進(jìn)行編寫代碼?!緦?shí)驗(yàn)一】詞法分析【實(shí)驗(yàn)?zāi)康摹拷o出PL/0 文法規(guī)范,要求編寫PL/0 語言的詞法分析程序?!緦?shí)驗(yàn)內(nèi)容】已給 PL/0 語言文法,輸出單詞(關(guān)鍵
6、字、專用符號以及其它標(biāo)記) 。.【實(shí)驗(yàn)要求】1. 確定編譯中使用的表格、標(biāo)識符與關(guān)鍵字的區(qū)分方法等。2. 把詞法分析器設(shè)計(jì)成一個(gè)獨(dú)立一遍的過程。3. 詞法分析器的輸出形式采用二元式序列,例如:(ident, a) (plus, + )(number, 15)(times,* )(ident,b )【輸入輸出】輸入:PL/0 源程序。例 : a+15*b輸出:(ident, a)(plus,+ )(number, 15)(times,* )(ident,b )【實(shí)驗(yàn)結(jié)果】實(shí)驗(yàn)結(jié)果與實(shí)驗(yàn)要求相同,沒有異議,對輸入字符采取一個(gè)一個(gè)讀入,到達(dá)句柄時(shí),則采取 LL(1) 文法進(jìn)行規(guī)約。實(shí)驗(yàn)結(jié)果如下:實(shí)驗(yàn)
7、結(jié)果用文本來進(jìn)行輸入輸出, 所以在工程目錄下還會有一個(gè)文本輸入,輸出文件。分別為 in.txt out.txt.【實(shí)驗(yàn)體會】在編寫這段代碼的過程中,比較麻煩得還是之前的語法預(yù)處理階段,將不滿足 ll(1) 文法的語法轉(zhuǎn)化為標(biāo)準(zhǔn)的 ll(1) 文法。程序在處理詞法分析的過程就是不斷通過 getsym()這個(gè)函數(shù)來?xiàng)l用 getch(),不斷形成一個(gè)一個(gè)的詞匯,供下面語法分析時(shí)使用。記錄詞匯類型的 sym 是一個(gè)枚舉類型。使用起來會方便許多,比較系統(tǒng)。其中還用到了文本輸入輸出的技巧,把讀出的詞匯保存起來。詞法分析還是比較簡單, 在編寫代碼的時(shí)候沒有太大的阻礙。通過此次實(shí)驗(yàn),讓我了解到如何設(shè)計(jì)、編制并
8、調(diào)試詞法分析程序,加深對詞法分析原理的理解;熟悉了構(gòu)造詞法分析程序的手工方式的相關(guān)原理,使用某種高級語言(例如 C+語言)直接編寫此法分析程序。另外,也讓我重新熟悉了 C+語言的相關(guān)內(nèi)容,加深了對 C+語言的用途的理解?!緦?shí)驗(yàn)二】語法分析【實(shí)驗(yàn)?zāi)康摹拷o出PL/0 文法規(guī)范,要求編寫PL/0 語言的語法分析程序。【實(shí)驗(yàn)內(nèi)容】已給PL/0 語言文法,構(gòu)造表達(dá)式部分的語法分析器。【實(shí)驗(yàn)要求】1. 將實(shí)驗(yàn)一“詞法分析”的輸出結(jié)果,作為表達(dá)式語法分析器的輸入,進(jìn)行語法解析,對于語法正確的表達(dá)式,報(bào)告“語法正確” ;對于語法錯(cuò)誤的表達(dá)式,報(bào)告“語法錯(cuò)誤” , 指出錯(cuò)誤原因。2. 把語法分析器設(shè)計(jì)成一個(gè)獨(dú)立
9、一遍的過程。3. 語法分析器的編寫方法采用遞歸子程序法?!据斎胼敵觥枯斎耄篜L/0 表達(dá)式,用實(shí)驗(yàn)一的輸出形式作為輸入。例如 : 對于 PL/0 表達(dá)式, a+15*b 用下列形式作為輸入:(ident, a)(plus,+ )(number, 15)(times,* )(ident,b )輸出:對于語法正確的表達(dá)式,報(bào)告“語法正確”;對于語法錯(cuò)誤的表達(dá)式,報(bào)告“語法錯(cuò)誤”, 指出錯(cuò)誤原因?!緦?shí)驗(yàn)結(jié)果】實(shí)驗(yàn)結(jié)果與實(shí)驗(yàn)要求相同,沒有異議,對輸入字符采取一個(gè)一個(gè)讀入,對輸入的一個(gè)語句進(jìn)行判斷,判斷語法的正誤,采用對算法的判斷,若全為數(shù)字則進(jìn)行最后的計(jì)算.【實(shí)驗(yàn)體會】通過語法分析可以判斷當(dāng)前輸入語句
10、是否正確,實(shí)驗(yàn)通過對數(shù)學(xué)式的處理來進(jìn)行對語句的判斷是否正確,若正確則只要輸入“語句正確”即可,若語句錯(cuò)誤則需要根據(jù)錯(cuò)誤的原因輸出錯(cuò)誤的理由,以方便編譯員修改自己的代碼。實(shí)現(xiàn)方法是通過對文本文件的輸入,當(dāng)前數(shù)據(jù)與即將輸入的字符串進(jìn)行匹配,若不符合 LL (1)文法則判定為錯(cuò)誤,若符合則繼續(xù)向下完成語法分析?!驹创a】#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <iostream>#include <stack&
11、gt;#include <string>#include <fstream>using namespace std;ifstreamfin("in.txt");ofstreamfout("out.txt");.enum symbol /01234567nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,beginsym, endsym,ifsym,the
12、nsym,whilesym, writesym,readsym,dosym,callsym, constsym,varsym,procsym;#define symnum 32char symworksymnum10;/ 單符號#define norw 13 /key_word num#define al 10 /maxstr#define nmax 10/number longchar wordnorwal;/key wordchar ch;/bufferchar getch()enum symbol sym;char idal+1;/ identchar aal+1;/tempchar I
13、Dal+1;int cc=0,ll=0,num;/ 當(dāng)前在行的位置 cc,行字符的長度ll ,num 數(shù)字的值int nn=0;char line81;int flg=0;/正數(shù);/char line81;enum symbol ssym256;enum symbol wsymnorw;/int cc,ll;/chccint err;void init()int i;for(i=0;i<=255;i+)ssymi=nul;/0ssym'+'=plus;ssym'-'=minus;ssym'*'=times;ssym'/'=s
14、lash;.ssym'('=lparen;ssym')'=rparen;ssym'='=eql;ssym','=comma;ssym'.'=period;ssym'#'=neq;/not equalssym''=semicolon;strcpy(&symworkplus0,"plus");strcpy(&symworkminus0,"minus");strcpy(&symworktimes0,"times&qu
15、ot;);strcpy(&symworkslash0,"slash");strcpy(&symworklparen0,"lparen");strcpy(&symworkrparen0,"rparen");strcpy(&symworkeql0,"eql");strcpy(&symworkcomma0,"comma");strcpy(&symworkneq0,"neq");strcpy(&symworkperiod0,&q
16、uot;period");strcpy(&symworksemicolon0,"semicolon");strcpy(&word00,"begin");/ 關(guān)鍵字小寫字母strcpy(&word10,"call");strcpy(&word20,"const");strcpy(&word30,"do");strcpy(&word40,"end");strcpy(&word50,"if");s
17、trcpy(&word60,"odd");strcpy(&word70,"procedure");strcpy(&word80,"read");strcpy(&word90,"then");strcpy(&word100,"var");strcpy(&word110,"while");strcpy(&word120,"write");wsym0=beginsym;wsym1=callsym;wsym2
18、=constsym;wsym3=dosym;wsym4=endsym;wsym5=ifsym;wsym6=oddsym;wsym7=procsym;wsym8=readsym;wsym9=thensym;.wsym10=varsym;wsym11=whilesym;wsym12=writesym;void WordAnalyse()switch(sym)case nul:/fout <<"( "<<"nul"<<" , "<<ID<<" )"<<
19、;endl;break;case ident:fout <<"( "<<"ident"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"ident"<<" , "<<ID<<" )"<<endl;break;case number:fout <<"(
20、 "<<"number"<<" , "<<num<<" )"<<endl;cout<<"("<<"number"<<","<<num<<" )"<<endl;break;case plus:fout <<"( "<<"plus"<<"
21、; , "<<ID<<" )"<<endl;cout<<"( "<<"plus"<<" , "<<ID<<" )"<<endl;break;case minus:fout <<"( "<<"minus"<<" , "<<ID<<" )"<
22、;<endl;cout<<"( "<<"minus"<<" , "<<ID<<" )"<<endl;break;case times:fout <<"( "<<"times"<<" , "<<ID<<" )"<<endl;cout<<"( "<<
23、"times"<<" , "<<ID<<" )"<<endl;break;case slash:fout <<"( "<<"slash"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"slash"<<" , "<
24、<ID<<" )"<<endl;break;case oddsym:fout <<"( "<<"oddsym"<<" , "<<ID<<" )"<<endl;cout<<"("<<"oddsym"<<","<<ID<<" )"<<endl;bre
25、ak;case lss:fout <<"( "<<"lss"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"lsst"<<" , "<<ID<<" )"<<endl;break;case eql:fout <<"( "<<&q
26、uot;eql"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"eql"<<" , "<<ID<<" )"<<endl;break;case neq:fout <<"( "<<"neq"<<" , "<<ID<
27、<" )"<<endl; cout<<"( "<<"neq"<<" , "<<ID<<" )"<<endl;break;case leq:fout <<"( "<<"leq"<<" , "<<ID<<" )"<<endl;cout<<"
28、( "<<"leq"<<" , "<<ID<<" )"<<endl;break;case gtr:fout <<"( "<<"gtr"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"gtr"<<" , &q
29、uot;<<ID<<" )"<<endl;break;case geq:fout <<"( "<<"geq"<<" , "<<ID<<" )"<<endl; cout<<"( "<<"geqt"<<" , "<<ID<<" )"<<endl
30、;break;case lparen:fout <<"( "<<"lparent"<<" , "<<ID<<" )"<<endl; cout<<"( "<<"lparent"<<" , "<<ID<<" )"<<endl;break;case rparen:fout <<"
31、( "<<"rparent"<<" , "<<ID<<" )"<<endl;.cout<<"( "<<"rparent"<<" , "<<ID<<" )"<<endl;break;case comma:fout <<"( "<<"comma"<&l
32、t;" , "<<ID<<" )"<<endl;cout<<"( "<<"comma"<<" , "<<ID<<" )"<<endl;break;case semicolon:fout <<"( "<<"semicolon"<<" , "<<ID<<&
33、quot; )"<<endl;cout<<"("<<"semicolon"<<","<<ID<<" )"<<endl;break;case period:fout <<"( "<<"period"<<" , "<<ID<<" )"<<endl;cout<<&qu
34、ot;( "<<"period"<<" , "<<ID<<" )"<<endl;break;case becomes:fout <<"( "<<"becomes"<<" , "<<ID<<" )"<<endl;cout<<"("<<"becomes"&l
35、t;<","<<ID<<" )"<<endl;break;case beginsym:fout <<"( "<<"beginsym"<<" , "<<ID<<" )"<<endl;cout<<"("<<"beginsym"<<","<<ID<<&
36、quot; )"<<endl;break;case endsym:fout <<"( "<<"endsym"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"endsym"<<" , "<<ID<<" )"<<endl;break;case ifsy
37、m:fout <<"( "<<"ifsym"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"ifsym"<<" , "<<ID<<" )"<<endl;break; case thensym:fout <<"( "<<&quo
38、t;thensym"<<" , "<<ID<<" )"<<endl;cout<<"("<<"thensym"<<","<<ID<<" )"<<endl;break;case whilesym:fout <<"( "<<"whilesym"<<" , "&
39、lt;<ID<<" )"<<endl;cout<<"("<<"whilesym"<<","<<ID<<" )"<<endl;break;case writesym:fout <<"( "<<"writesym"<<" , "<<ID<<" )"<<
40、;endl;cout<<"("<<"writesym"<<","<<ID<<" )"<<endl;break;case readsym:fout <<"( "<<"readsym"<<" , "<<ID<<" )"<<endl;cout<<"("<<&
41、quot;readsym"<<","<<ID<<" )"<<endl;break;case dosym:fout <<"( "<<"dosym"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"dosym"<<" , "<&
42、lt;ID<<" )"<<endl;break;case callsym:fout <<"( "<<"callsym"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"callsym"<<" , "<<ID<<" )"<<end
43、l;break;case constsym:fout <<"( "<<"constsym"<<" , "<<ID<<" )"<<endl;cout<<"("<<"constsym"<<","<<ID<<" )"<<endl;strcpy(ID,"");break;case v
44、arsym:fout <<"( "<<"varsym"<<" , "<<ID<<" )"<<endl;cout<<"( "<<"varsym"<<" , "<<ID<<" )"<<endl;break;case procsym:fout <<"( "<<
45、;"procsym"<<" , "<<ID<<" )"<<endl;cout<<"("<<"procsym"<<","<<ID<<" )"<<endl;break;default :break;.int getch()if(cc=ll)if(fin.eof()cout<<"program incpmplete!&qu
46、ot;<<endl;return -1;ll=cc=0;fin.getline(line,81);ll=strlen(line);ch=' 'return 0;if(cc=0)ch=linecc;cout <<line<<endl;cout<<ch<<endl;cc+;nn=cc;return 0;#define getchdoif(-1=getch() return -1/詞法分析部分實(shí)驗(yàn)int getsym()/讀符號1大寫字母不要出現(xiàn)int i,j,k;/用于循環(huán)等輔助計(jì)數(shù)while(ch=' '
47、|ch=9|ch=10)/getchdo;if(ch>='a'&&ch<='z')k=0;while(ch>='a'&&ch<='z'|ch>='0'&&ch<='9')/名字或保留字以 a.z 開頭if(k<al)IDk=ch;.k+;getchdo;IDk=0;i=0;j=norw;do /* 搜索當(dāng)前符號是否為保留字*/k=(i+j)/2;if(strcmp(ID,wordk)<=0)j=k-1;i
48、f(strcmp(ID,wordk)>=0)i=k+1;while(i<=j);if(i-1>j)sym=wsymk; else sym=ident; /*搜索失敗,則是名字或數(shù)字*/elseif(ch>='0'&&ch<='9')k=0;num=0;sym=number;doIDk=ch;num=num*10+ch-'0'k+;getchdo;while(ch>='0'&&ch<='9');if(flg=1) num=-num;flg=0;
49、IDk=0;k-;if(k>nmax)/error(30);.elseif(ch=':')getchdo;if(ch='=')sym=becomes;strcpy(ID,":=");getchdo;elsesym=nul;strcpy(ID,"NULL");elseif(ch='>')getchdo;if(ch='=')sym=geq;strcpy(ID,">=");getchdo;elsesym=gtr;strcpy(ID,">&quo
50、t;);elseif(ch='<')getchdo;if(ch='=')sym=leq;strcpy(ID,"<=");getchdo;.elsesym=lss;strcpy(ID,"<");elsesym=ssymch;strcpy(ID,&ch);/if(sym!=period)getchdo;return 1;/語法分析部分實(shí)驗(yàn) 2int lp=0;int rp=0;#define getsymdo if(-1=getsym() return -1 #define expressiondo(
51、) if(-1=expression() return -1 #define termdo() if(-1=term() return -1 #define factordo() if(-1=factor() return -1int expression();/語法分析int factor()if(sym!=ident &&sym!=number&&sym!=lparen)err+;if(err=1) printf(" 語法錯(cuò)誤 : n");printf("error-Factor Needs Ident or Number or
52、 Lparenn");if (sym = ident) | (sym = number) | (sym = lparen).if (sym = ident)WordAnalyse();if(getsym()=-1)return -1;if(sym!=times&&sym!=slash&&sym!=plus&&sym!=minus&&sym!=rparen)err+;if(err=1) printf(" 語法錯(cuò)誤 : n");printf(" 變量后沒有跟上 +-* n");if(l
53、p=0 && sym=rparen)err+;if(err=1) printf(" 語法錯(cuò)誤 : n");printf(" 沒有左括號匹配 n");else if (sym = number)WordAnalyse();if(getsym()=-1)return -1;if(sym!=times&&sym!=slash&&sym!=plus&&sym!=minus&&sym!=rparen)err+;if(err=1) printf(" 語法錯(cuò)誤 : n");printf(" 數(shù)字后沒有跟上 +-* n");if(lp=0 && sym=rparen)err+;.if(err=1) printf(" 語法錯(cuò)誤 : n");printf("
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)意廣告長期合同范本
- 二手房自行購買合同范本
- 買賣企業(yè)房產(chǎn)合同范例
- 農(nóng)民種地出租合同范本
- 包裝木箱供貨合同范本
- 北京政府采購合同范本
- 出售轉(zhuǎn)讓凍干機(jī)合同范本
- 分?jǐn)傎M(fèi)用合同范本
- 企業(yè)生產(chǎn)訂單合同范本
- 分期購車購車合同范本
- (完整版)污水管道施工方案
- 國際法與國際爭端解決 課件全套 人大 第1-18章 導(dǎo)論、國際法淵源-國際人權(quán)法
- 發(fā)展?jié)h語初級口語I-第18課課件
- GB/T 43200-2023機(jī)器人一體化關(guān)節(jié)性能及試驗(yàn)方法
- XX森林康養(yǎng)度假建設(shè)項(xiàng)目可行性研究報(bào)告
- 新教科版四年級上冊科學(xué)全冊重點(diǎn)題型練習(xí)課件(含答案)
- 防災(zāi)減災(zāi)地質(zhì)災(zāi)害防御應(yīng)對講座培訓(xùn)課件ppt
- 小學(xué)奧數(shù)七大模塊思維導(dǎo)圖課件
- 2023年天津高考英語聽力試題及原文
- 火力發(fā)電廠OVATION 與西門子控制系統(tǒng)之間通訊實(shí)現(xiàn)
- 2022公務(wù)員錄用體檢操作手冊(試行)
評論
0/150
提交評論