詞法分析器-計算器-設(shè)計及實現(xiàn)實驗報告_第1頁
詞法分析器-計算器-設(shè)計及實現(xiàn)實驗報告_第2頁
詞法分析器-計算器-設(shè)計及實現(xiàn)實驗報告_第3頁
詞法分析器-計算器-設(shè)計及實現(xiàn)實驗報告_第4頁
詞法分析器-計算器-設(shè)計及實現(xiàn)實驗報告_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

輔導(dǎo)教師

張靜

成績

:詞法分析器的設(shè)計與實現(xiàn)(1)掌握語言單詞符號的劃分、正規(guī)式、狀態(tài)轉(zhuǎn)換圖及詞法分析器的實現(xiàn)。(2)掌握詞法分析程序的作用。(1)對任給的一個語言源程序,能夠濾掉空格、回車換行符、tab鍵及注釋。(2)識別各類單詞符號,如關(guān)鍵字、標(biāo)識符、運(yùn)算符、常數(shù)、界符,結(jié)果以二元式形式輸出,并構(gòu)造符號表。(3)輸出有詞法錯誤的單詞及所在行號此階段只能識別有限的詞法錯誤)根據(jù)掃描到的單詞符號的第一個字符的種類,分別轉(zhuǎn)到相應(yīng)的程序進(jìn)行處理。這些程序的功能就是識別以相應(yīng)字符開頭的各類單詞符號。()根據(jù)C語言各類單詞的正規(guī)式,構(gòu)造能識別各類單詞的狀態(tài)轉(zhuǎn)換圖。(2)根據(jù)狀態(tài)轉(zhuǎn)換圖,構(gòu)造識別各類單詞的詞法分析器狀態(tài)轉(zhuǎn)換圖:

。

空白

字母或數(shù)字字母非字母與數(shù)字2

*數(shù)字

非數(shù)字

*運(yùn)算符界符其他序#include<stdlib.h>#include<iostream>namespacestd;string

***","break","continue","for","do","while","printf","scanf","begin","end","return"};";stringid[10000];intpp=0;stringintqq=0;intchoice1(char//判斷是否是字母{1;0;}intchoice2(char//判斷是否是數(shù)字{if(a>='0'&&a<='9')1;0;

}int//識保留字和標(biāo)識符{wordbuf[20]="";intfor(;;){wordbuf[n]=rz[st];st++;n++;if((choice2(rz[st])==1)||(choice1(rz[st])==1)||(rz[st]=='_'))wordbuf[n]=rz[st];break;}intflag=0;for(intk=0;k<20;k++){}if(flag==0){intfor(intt=0;t<pp;t++){{}}if(flagg!=-1)printf("(id,%d)",flagg);{id[pp]=wordbuf;printf("(id,%d)",pp);pp++;}}{printf("(");for(inti=0;i<n;i++){printf("%c",wordbuf[i]);

}");}}intnumber(int//別整數(shù){";intintk=0;intflag=0;for(;;){numbuf[n]=rz[st];st++;n++;if(choice2(rz[st])==1){numbuf[n]=rz[st];}{numbuf[n]=rz[st];k++;}if(choice1(rz[st])==1){numbuf[n]=rz[st];flag=1;continue;}break;}if(flag==0){intfor(intt=0;t<qq;t++)if(strcmp(nu[t].c_str(),numbuf)==0)if(flagg!=-1)printf("(nu,%d)",flagg);{printf("(nu,%d)",qq);

qq++;}}{printf("(");for(inti=0;i<n;i++)printf("%c",numbuf[i]);digital!)");}}intanotation(intst)//處理除號和注釋{tabuf[9999]="";intst++;if(rz[st]=='/'){printf("(//,-)");st++;while(rz[st]!=10){tabuf[n]=rz[st];st++;n++;}printf("注釋"for(inti=0;i<n;i++)printf("%c",tabuf[i]);}if(rz[st]=='*'){printf("(/*,-)");st++;intwhile(1){break;tabuf[n]=rz[st];st++;n++;if(rz[st+1]=='\0'){printf("(/*error!!\n)");

}}printf("注釋");for(inti=0;i<n;i++)printf("%c",tabuf[i]);printf("(*/,-)");st=st+2;}if(rz[st]=='='){st++;printf("(/*,-)");}printf("(/,-)");}int//函數(shù)識別其他特殊字符{switch(rz[st]){'=':if(rz[st]=='='){st++;printf("");}printf("(rlop,=)");break;'+':if(rz[st]=='='){st++;printf("");}if(rz[st]=='+'){st++;printf("");}printf("(+,-)");break;'-':st++;if(rz[st]=='='){

st++;printf("(-=,-)");}if(rz[st]=='-'){st++;printf("(--,-)");}printf("");break;'*':st++;if(rz[st]=='='){st++;printf("");}printf("(*,-)");break;'>':if(rz[st]=='='){st++;printf("");}printf("(rlop,>)");break;'<':if(rz[st]=='='){st++;printf("");}printf("(rlop,<)");break;st++;if(rz[st]=='='){st++;printf("(\%=,-)");}printf("(\%,-)");break;'!':st++;if(rz[st]=='=')

{st++;printf("");}printf("(!,wrongthing!)");break;'&':st++;if(rz[st]=='&'){st++;printf("(&&,-)");}printf("(&,worng");break;'|':st++;if(rz[st]=='|'){st++;printf("(||,-)");}printf("(|,worngword!)");break;'{':printf("({,-)");break;'}':printf("(},-)");break;'(':st++;printf("");break;')':st++;printf("");break;'[':st++;printf("([,-)");break;']':st++;printf("(],-)");break;st++;printf("");break;st++;

printf("");break;st++;printf("");break;st++;printf("");break;st++;printf("");break;'st++;break;'':st++;break;10:printf("\n");break;34:printf("");break;39:printf("(',-)");break;default:printf("thing)",rz[st]);st++;}}int//根據(jù)讀入的單詞的第一個字符確定調(diào)用不同的單詞識別函數(shù){if(choice1(rz[st])==1)st=alpha(st);if(choice2(rz[st])==1)st=number(st);if(rz[st]=='/')st=anotation(st);}int{

inti=0;FILE*fp;輸入文件名:\n");scanf("%s",&name);if((fp=fopen(name,"r"))==NULL){error!");exit(0);}ch=fgetc(fp);while(ch!=EOF){rz[i]=ch;i++;ch=fgetc(fp);}fclose(fp);intj=0;j=choice(j);cout<<endl<<"程序中標(biāo)示符如下for(inti=0;i<pp;i++)"<<id[i]<<endl;程序中數(shù)字如下"for(intj=0;j<qq;j++)"<<nu[j]<<endl;}測試代碼:int//根據(jù)讀入的單詞的第一個字符確定調(diào)用不同的單詞識別函數(shù){if(choice1(rz[st])==1)st=alpha(st);if(choice2(rz[st])==1)

st=number(st);if(rz[st]=='/')st=anotation(st);}測試結(jié)果:通過本次的實驗,使我真正的了解詞法分析器的實現(xiàn)過程,讓我更加深刻領(lǐng)悟詞法分析器的實現(xiàn)原理。雖然在本次實驗中遇到了各種各樣的困難和錯誤,但在同學(xué)們的幫助下我都一一克服了得詞法分析器能夠正確的識別相應(yīng)的詞法和表達(dá)式。在做實驗的過程中總是會忽略各種細(xì)節(jié)從而導(dǎo)致經(jīng)常修改一些很小的低級錯誤才能使程序正常運(yùn)行不僅浪費(fèi)時間還影響對其他地方的修改并且在很多步驟處理上方法不正確使結(jié)果不能符合要求深刻體會到了自己在編程方面與別人的差距在今后的學(xué)習(xí)中我會注意改正自己在這方面的缺點(diǎn)促使自己的編程水平不斷進(jìn)步編譯原理是一門專業(yè)學(xué)科對于現(xiàn)階段的我來說只

能掌握它的一些基本原理和概念于一些更深層的知識還是有很多難以理解的地方但在這次實驗過程中鍛煉了自己的思考能力也鍛煉了自己的動手編程能力,對于將知識的轉(zhuǎn)化有了很大的幫助。

輔導(dǎo)教師

張靜

成績

掌握自上而下語法分析方法、自下而上語法分析方法(1)實驗內(nèi)容設(shè)計及實現(xiàn)計算表達(dá)式的計算器。表達(dá)式中可包含+、-、*、/運(yùn)算符。(2)實驗要求:對已給的一個二元式形式表達(dá)式,能夠檢查有無語法錯誤。并指定出錯位置。將表達(dá)式的語法樹輸出(或?qū)⒄Z法分析過程輸出根據(jù)算符優(yōu)先分析思想實現(xiàn)語法分析程序。(1)根據(jù)文法構(gòu)造語法分析表。(2)編寫總控程序?qū)崿F(xiàn)語法分析。算符優(yōu)先分析表:

序#include<stdlib.h>MaxSize99str[],charexp[])/*算術(shù)表達(dá)式轉(zhuǎn)換成后綴表達(dá)式/{{data[MaxSize];inttop;/*top為棧頂*/}op;/*定義一個top結(jié)構(gòu)體*inti=0,t=0;op.top=ch=str[i];/*將str的每一個數(shù)轉(zhuǎn)換ch*/i++;while(ch!='\0')/*ch對應(yīng)不同的符號的時候?qū)?yīng)的轉(zhuǎn)換情況*{switch(ch){'(':/*當(dāng)是

的時候

將此括號存入

棧op*/break;')':!=/*號內(nèi)的轉(zhuǎn)換優(yōu)先級最高故先提取表達(dá)式*{t++;}break;'+':'-':!=-1&&op.data[op.top]

!={=op.data[op.top];t++;}op.top++;/*恢復(fù)可插入位置*/

op.data[op.top]=break;'*':=='/'||op.top=='*')/*優(yōu)先級*{=op.data[op.top];t++;}op.top++;op.data[op.top]=break;'/*忽略空格

排除誤操作*break;default:while(ch>='9'){=ch;t++;ch=str[i];i++;}

i--;/*分操作數(shù)觀也為了以后好分隔操作數(shù)*t++;}ch=str[i];i++;}!=-1)/*得到剩下的部分*{=op.data[op.top];t++;}='\0';/*表達(dá)式結(jié)束*}floatcal_value(char{{floatdata[MaxSize];

為了美

inttop;}st;floatd;intt=0;st.top=-1;ch=exp[t];t++;while(ch'\0'){

操作數(shù)棧*switch(ch)/*運(yùn)算主體*/{'+':st.data[st.top-1]break;'-':st.data[st.top-1]st.data[st.top-1]-st.data[st.top];break;'*':st.data[st.top-1]

break;!={printf("\n\t0錯誤的"}break;default:d=0;while(ch>=<='9')/*從后綴表達(dá)式中獲取操作數(shù)#作用在此現(xiàn)*{d=10*d+ch-'0';ch=exp[t];t++;}d;

}ch=exp[t];t++;}st.data[st.top];}int{

可以提到前

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論