版權(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)報(bào)告實(shí)驗(yàn)題目:詞法分析器構(gòu)造指導(dǎo)教師:楊建,趙會(huì)群姓名: 班級(jí):學(xué)號(hào):實(shí)驗(yàn)成績(jī):實(shí)驗(yàn)題目語(yǔ)法分析器構(gòu)造實(shí)驗(yàn)?zāi)康暮鸵蠼柚谠~法分析程序提供的分析結(jié)果,編寫一個(gè)算符優(yōu)先語(yǔ)法分析程序,程序能進(jìn)行語(yǔ)法結(jié)構(gòu)分析和錯(cuò)誤檢查并產(chǎn)生相應(yīng)的歸約信息。同時(shí)給出出錯(cuò)信息和錯(cuò)誤類型,從而加深對(duì)語(yǔ)法分析的理解。設(shè)計(jì)思想與框架1.本實(shí)驗(yàn)的優(yōu)先表可以手工先設(shè)計(jì)好:算符優(yōu)先關(guān)系表- + - * / ( ) i #+ - * / ( = ? ? i ? ? # ? 項(xiàng)|算術(shù)表達(dá)式+項(xiàng)|算術(shù)表達(dá)式-項(xiàng)項(xiàng)-因子|項(xiàng)*因子|項(xiàng)/因子因子-變量|常數(shù)|(算術(shù)表達(dá)式)2.本實(shí)驗(yàn)要求中提出的“產(chǎn)出相應(yīng)的歸約信息”意指在語(yǔ)法分
2、析的過(guò)程中,一旦產(chǎn)生歸約,在程序上產(chǎn)生并最終輸出歸約產(chǎn)生式序號(hào)。3.出錯(cuò)類型的產(chǎn)生可預(yù)先對(duì)應(yīng)優(yōu)先表中出錯(cuò)欄列表說(shuō)明其出錯(cuò)類型,并分別編序,當(dāng)分析中產(chǎn)生錯(cuò)誤時(shí)以字符串輸出相應(yīng)表中錯(cuò)誤信息。核心算法算法采用一個(gè)符號(hào)棧的數(shù)據(jù)結(jié)構(gòu),既用它存放終結(jié)符,也用它存放非終結(jié)符。設(shè)K為符號(hào)棧使用深度,其參考算法如下:K:=1 SK:=#Repeat把下一人輸入符讀入a中If SKVT then j:=K else j:=K-1While Sja doBeginRepeatQ:=SjIf Sj-1VT then j:=j-1 else j:=j-2Until SjQ把Sj+1SK歸約為某個(gè)N記錄歸約產(chǎn)生式序號(hào)K:
3、=j+1SK:=NEnd of while If Sja OR Sj=a thenBeginK:=K+1; SK:=aEnd Else ERROR 查表打印出錯(cuò)信息Until a=#輸出歸約產(chǎn)生式序列號(hào);源程序及注釋#include #include #include using namespace std;#define N 100#define NULL 0FILE *fp;/預(yù)處理文件指針/定義符號(hào)棧的大小與輸入字符串的大小以及算術(shù)表達(dá)式字符串的大小char stackN,stringsN,oldstringsN;char a;int top=-1,k=0,step=1,n=0,NoN,
4、id=1;/二維數(shù)組定義字符之間的優(yōu)先關(guān)系(1表示,-1表示,0表示=,-2表示錯(cuò)誤)int MNN=1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,0,-1,-2,1,1,1,1,-2,1,-2,1,1,1,1,1,-2,1,-2,1,-1,-1,-1,-1,-1,-2,-1,0; char *word6=N+N,N-N,N*N,N/N,)N(,i;/可歸約字符串int print(int t,int m) coutn step+setw(10); couts
5、tacksetw(10); if(m=1) coutsetw(8); else if(m=0) cout=setw(8); else coutsetw(8); coutasetw(10); cout&stringsksetw(10); if(t) cout歸約setw(8); Non+=step-1; else cout移進(jìn)setw(8); return 0;void push(char ch) stack+top=ch;char pop()char a;a=stacktop-;stacktop+1=0; return a;int ch_di(char ch) switch(ch) case+
6、: return 1; case-: return 2; case*: return 3; case/: return 4; case(: return 5; case): return 6; casei: return 7;case#: return 8; default: return 0;int IsVT(char ch) if(ch=N) return 0; else return 1;int readvt(char *a) if(IsVT(stringsk) (*a)=stringsk; k+; return 1; else k+; return 0;int big(int t,ch
7、ar a) if(Mch_di(stackt)-1ch_di(a)-1=1)return 1;elsereturn 0;int less(int t,char a) if(Mch_di(stackt)-1ch_di(a)-1=-1)return 1;elsereturn 0;int equal(int t,char a) if(Mch_di(stackt)-1ch_di(a)-1=0)return 1;elsereturn 0;void error(int t) if(ch_di(stackt)=6|ch_di(stackt)=7) printf(n錯(cuò)誤e2:缺少運(yùn)算符!);else if(c
8、h_di(stackt)=5)printf(n錯(cuò)誤e1:非法左括號(hào)!);else printf(n錯(cuò)誤e3:非法右括號(hào)!);void prior_analysis() int i,j,m; char q,str,ch20; push(#);print(0,-1);for(;)/*u:*/ readvt(&a); if(IsVT(stacktop) j=top; else j=top-1;do while(big(j,a)&strcmp(stack,#N)!=0) do q=stackj; if(IsVT(stackj-1) j=j-1; else j=j-2;while(!less(j,q);
9、i=-1;while(top-j)!=0) ch+i=pop();chi+1=0;for (m=0;m=5;m+)if(strcmp(wordm,ch)=0)str=N;push(str); print(1,1); if(less(j,a) push(a);print(0,-1);if(stacktop!=#)/goto u;break; else if(equal(j,a) push(a);print(0,0); if(stacktop!=#)/goto u;break;elseerror(j);a=#;while(a!=#);if(a=#)break;void main() cout*算符
10、優(yōu)先語(yǔ)法分析程序*endl;coutE+T|E-T|Tendl;coutT*F|T/F|Fendl;cout(E)|iendl;cout E表示算術(shù)表達(dá)式.T表示項(xiàng).F表示因子.i表示變量或常數(shù).endl;cout 優(yōu)先表endl;cout + - * / ( ) i #endl;cout endl; cout endl;cout endl;cout endl;cout ( = e1endl;cout e2 e2 endl;cout e2 e2 endl;cout # e3 =endl;if(fp=fopen(預(yù)處理.txt,r)=NULL)cout請(qǐng)先將實(shí)驗(yàn)文件夾中的預(yù)處理.txt文件復(fù)制到
11、實(shí)驗(yàn)文件夾中!|ch1=)&ch=)ch=fgetc(fp); if(ch=#) cout算符優(yōu)先語(yǔ)法分析結(jié)束!endl;fclose(fp); system(pause);exit(0); while(ch!= &ch!=#) ch=fgetc(fp); oldstrings+i=ch; oldstringsi=0; if(isalnum(oldstringsj) strings+m=i; else strings+m=oldstringsj; j+; while(oldstringsj!=0) if(isalnum(oldstringsj) if(isalnum(oldstringsj-1
12、)=0) strings+m=i; else strings+m=oldstringsj; j+; stringsm+1=#; stringsm+2=0; cout算術(shù)表達(dá)式id為: oldstringsendl; cout轉(zhuǎn)換為輸入串: stringsendl; cout 步驟號(hào)符號(hào)棧優(yōu)先關(guān)系當(dāng)前分析符剩余輸入串動(dòng)作; prior_analysis(); n=0; coutendl; cout算術(shù)表達(dá)式id+的歸約產(chǎn)生式步驟號(hào)為:; while(Non) cout Non; n+;coutendl; while(stack0!=0) pop();while(No-n)Non=0; top=-
13、1; a=0; k=0; step=1; n=0;cout算符優(yōu)先語(yǔ)法分析結(jié)束!endl;fclose(fp);system(pause);exit(0);問(wèn)題及處理Goto語(yǔ)句修改成for循環(huán)的時(shí)候,有兩種情形能從while循環(huán)中跳出,接下來(lái)要做的有對(duì)應(yīng)的兩條路:一是根據(jù)循環(huán)條件,當(dāng)a=#時(shí)循環(huán)結(jié)束,此時(shí)函數(shù)prior_analysis應(yīng)該執(zhí)行完畢;二是滿足循環(huán)體中的判斷條件stacktop!=#,跳出while循環(huán),此時(shí)接下來(lái)要做的是readvt(&a),而不是結(jié)束函數(shù)。一開始我只考慮到了第二種情況,每次從while中跳出后都去做readvt(&a);,造成程序陷入死循環(huán)。后來(lái)經(jīng)過(guò)仔細(xì)的思考,在while循環(huán)結(jié)束后加上了判斷條件 if(a=#) break; 就能在第一種情況
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公務(wù)員2011年國(guó)考《申論》真題卷及答案(副省級(jí))
- 新穎青春演講稿三分鐘左右20篇(全文)
- 文明標(biāo)兵的事跡5篇
- 科室工作總結(jié)(16篇)
- 幼兒園元旦活動(dòng)總結(jié)(匯編15篇)
- 小學(xué)資產(chǎn)清查工作報(bào)告(3篇)
- 南芳廚房標(biāo)識(shí) - 副本
- 江蘇省蘇州市吳江區(qū)運(yùn)河實(shí)驗(yàn)初級(jí)中學(xué)2024屆九年級(jí)上學(xué)期10月月考數(shù)學(xué)試卷(含答案)
- 鑿巖設(shè)備機(jī)械加工自動(dòng)化生產(chǎn)線項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)備案
- 年產(chǎn)6000萬(wàn)平方米高端新型建筑材料項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)備案
- 化妝品(原料)安全性風(fēng)險(xiǎn)評(píng)估
- 《吃飯有講究》同步課堂設(shè)計(jì)第1課時(shí)
- 電商園區(qū)招商方案
- 《平衡記分卡BSC》課件
- 酒精引起的其他精神和行為障礙個(gè)案護(hù)理
- 皮膚淋巴瘤病理診斷和鑒別診斷課件
- 醫(yī)療器械法規(guī)知識(shí)培訓(xùn)
- 大數(shù)據(jù)與智能交通簡(jiǎn)介
- 全國(guó)優(yōu)質(zhì)課一等獎(jiǎng)小學(xué)四年級(jí)教科版科學(xué)《用氣球驅(qū)動(dòng)小車》公開課課件(內(nèi)嵌音頻視頻)
- 1-癌癥篩查課后作業(yè)
- 《最短路徑問(wèn)題》教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論