語法分析器報告_第1頁
語法分析器報告_第2頁
語法分析器報告_第3頁
語法分析器報告_第4頁
語法分析器報告_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.編譯原理實驗報告實驗題目:詞法分析器構(gòu)造指導教師:楊建,趙會群姓名: 班級:學號:實驗成績:實驗題目語法分析器構(gòu)造實驗目的和要求借助于詞法分析程序提供的分析結(jié)果,編寫一個算符優(yōu)先語法分析程序,程序能進行語法結(jié)構(gòu)分析和錯誤檢查并產(chǎn)生相應的歸約信息。同時給出出錯信息和錯誤類型,從而加深對語法分析的理解。設(shè)計思想與框架1.本實驗的優(yōu)先表可以手工先設(shè)計好:算符優(yōu)先關(guān)系表- + - * / ( ) i #+ - * / ( = ? ? i ? ? # ? 項|算術(shù)表達式+項|算術(shù)表達式-項項-因子|項*因子|項/因子因子-變量|常數(shù)|(算術(shù)表達式)2.本實驗要求中提出的“產(chǎn)出相應的歸約信息”意指在語法

2、分析的過程中,一旦產(chǎn)生歸約,在程序上產(chǎn)生并最終輸出歸約產(chǎn)生式序號。3.出錯類型的產(chǎn)生可預先對應優(yōu)先表中出錯欄列表說明其出錯類型,并分別編序,當分析中產(chǎn)生錯誤時以字符串輸出相應表中錯誤信息。核心算法算法采用一個符號棧的數(shù)據(jù)結(jié)構(gòu),既用它存放終結(jié)符,也用它存放非終結(jié)符。設(shè)K為符號棧使用深度,其參考算法如下: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歸約為某個N記錄歸約產(chǎn)生式序號K

3、:=j+1SK:=NEnd of while If Sja OR Sj=a thenBeginK:=K+1; SK:=aEnd Else ERROR 查表打印出錯信息Until a=#輸出歸約產(chǎn)生式序列號;源程序及注釋#include #include #include using namespace std;#define N 100#define NULL 0FILE *fp;/預處理文件指針/定義符號棧的大小與輸入字符串的大小以及算術(shù)表達式字符串的大小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表示錯誤)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); cout

5、stacksetw(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移進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,c

7、har 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錯誤e2:缺少運算符!);else if(

8、ch_di(stackt)=5)printf(n錯誤e1:非法左括號!);else printf(n錯誤e3:非法右括號!);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)先語法分析程序*endl;coutE+T|E-T|Tendl;coutT*F|T/F|Fendl;cout(E)|iendl;cout E表示算術(shù)表達式.T表示項.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(預處理.txt,r)=NULL)cout請先將實驗文件夾中的預處理.txt文件復制

11、到實驗文件夾中!|ch1=)&ch=)ch=fgetc(fp); if(ch=#) cout算符優(yōu)先語法分析結(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-

12、1)=0) strings+m=i; else strings+m=oldstringsj; j+; stringsm+1=#; stringsm+2=0; cout算術(shù)表達式id為: oldstringsendl; cout轉(zhuǎn)換為輸入串: stringsendl; cout 步驟號符號棧優(yōu)先關(guān)系當前分析符剩余輸入串動作; prior_analysis(); n=0; coutendl; cout算術(shù)表達式id+的歸約產(chǎn)生式步驟號為:; 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)先語法分析結(jié)束!endl;fclose(fp);system(pause);exit(0);問題及處理Goto語句修改成for循環(huán)的時候,有兩種情形能從while循環(huán)中跳出,接下來要做的有對應的兩條路:一是根據(jù)循環(huán)條件,當a=#時循環(huán)結(jié)束,此時函數(shù)prior_analysis應該執(zhí)行完畢;二是滿足循環(huán)體中的判斷條件stacktop!=#,跳出while循環(huán),此時接下來要做的是readvt(&a),而不是結(jié)束函數(shù)。一開始我只考慮到了第二種情況,每次從while中跳出后都去做readvt(&a);,造成程序陷入死循環(huán)。后來經(jīng)過仔細的思考,在while循環(huán)結(jié)束后加上了判斷條件 if(a=#) break; 就能

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論