語(yǔ)法分析器報(bào)告[學(xué)術(shù)參考]_第1頁(yè)
語(yǔ)法分析器報(bào)告[學(xué)術(shù)參考]_第2頁(yè)
語(yǔ)法分析器報(bào)告[學(xué)術(shù)參考]_第3頁(yè)
語(yǔ)法分析器報(bào)告[學(xué)術(shù)參考]_第4頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論