詞法分析報(bào)告_第1頁(yè)
詞法分析報(bào)告_第2頁(yè)
詞法分析報(bào)告_第3頁(yè)
詞法分析報(bào)告_第4頁(yè)
詞法分析報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩8頁(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)介

編譯原理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)一詞法剖析程序的設(shè)計(jì)與實(shí)現(xiàn)指導(dǎo)教師:姓名:學(xué)號(hào):班級(jí):一、實(shí)驗(yàn)?zāi)康幕菊莆沼?jì)算機(jī)語(yǔ)言的詞法剖析程序的開(kāi)發(fā)方法。二、實(shí)驗(yàn)內(nèi)容編制一個(gè)能夠剖析三種整數(shù)、表記符、主要運(yùn)算符和主要重點(diǎn)字的詞法剖析程序。三、實(shí)驗(yàn)要求1.依據(jù)以下的正規(guī)式,編制正規(guī)文法,畫(huà)出狀態(tài)圖;表記符<字母>(<字母>|<數(shù)字字符>)*十進(jìn)制整數(shù)0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*八進(jìn)制整數(shù)0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六進(jìn)制整數(shù)0(x|X)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*運(yùn)算符和分開(kāi)符+-*/><=( );重點(diǎn)字ifthenelsewhiledo2.依據(jù)狀態(tài)圖,設(shè)計(jì)詞法剖析函數(shù)intscan( ),達(dá)成以下功能:1)從輸入流(鍵盤或文件)讀入數(shù)據(jù),剖析出一個(gè)單詞。2)返回單詞種別(用整數(shù)表示),3)返回單詞屬性(不一樣的屬性能夠放在不一樣的全局變量中)。3.編寫(xiě)測(cè)試程序,循環(huán)調(diào)用函數(shù)scan( ),每次調(diào)用,獲取一個(gè)單詞的信息。在測(cè)試程序中,打印輸出單詞種別、屬性(注意:不要在詞法剖析函數(shù)scan中打印輸出?。?。四、實(shí)驗(yàn)環(huán)境微型計(jì)算機(jī)。Windows操作系統(tǒng)/Linux操作系統(tǒng)。編程語(yǔ)言:C/C++/Java/C#。建議使用VisualC++/Netbeans/Eclipse集成開(kāi)發(fā)環(huán)境。五、實(shí)驗(yàn)步驟依據(jù)狀態(tài)圖,設(shè)計(jì)詞法剖析算法設(shè)計(jì)函數(shù)scan( ),實(shí)現(xiàn)該算法編制測(cè)試程序(在本試驗(yàn)中,能夠是主函數(shù)main( ))。調(diào)試程序:輸入一組單詞,檢查輸出結(jié)果。六、狀態(tài)圖七.測(cè)試數(shù)據(jù):092+data>0x3f00while八.測(cè)試結(jié)果九,思慮題詞法剖析可否采納空格來(lái)劃分單詞?答:不可以,由于比方abc+bcd中沒(méi)有空格,但這是三個(gè)單詞。程序設(shè)計(jì)中哪些環(huán)節(jié)影響詞法剖析的效率?怎樣提升效率?答:整個(gè)程序都由狀態(tài)變換圖而來(lái)。由遞歸方法實(shí)現(xiàn)的狀態(tài)變換圖,影響了整個(gè)詞法剖析器的剖析效率,能夠考慮使用棧來(lái)非遞歸的實(shí)現(xiàn)詞法剖析。十.實(shí)驗(yàn)心得經(jīng)過(guò)詞法剖析程序的實(shí)現(xiàn),我理解了計(jì)算機(jī)是怎么去辨別一個(gè)個(gè)單詞的,或許能夠說(shuō)是各樣命令的。此次實(shí)驗(yàn)使我對(duì)語(yǔ)言中文件操作更為認(rèn)識(shí),認(rèn)識(shí)文件指針的運(yùn)轉(zhuǎn)狀況,還認(rèn)識(shí)了編譯c原理中有限自動(dòng)機(jī)的觀點(diǎn),依據(jù)狀態(tài)圖寫(xiě)程序。十一.源代碼#include<iostream>usingnamespacestd;#include<fstream>#defineASG1#defineADD2#defineSUB3#defineMUL4#defineDIV5#defineID6#defineIF7#defineTHEN8#defineWHILE9#defineDO10#defineINT811//八進(jìn)制#defineINT1012//十進(jìn)制#defineINT1613#defineSLP14//左括號(hào)(#defineSRP15//右括號(hào))#defineSEMI16//分號(hào);#defineLP17//左花括號(hào){#defineRP18//右花括號(hào)}#defineINC19//++#defineDECC20//--#defineNEQ21//不等于#defineEQ22//等于#defineJAE23//大于等于#defineJA24//大于#defineJBE25//小于等于#defineJB26//小于structword{intkind;intvalue;};intfpoint;//文件字符指針intnum_token;//一個(gè)單詞中的字符數(shù)目主假如數(shù)字長(zhǎng)度,char*token;fstreamfile;//所要讀取的文件wordhandle_identifier(char*ch)//辦理表記符(包含重點(diǎn)字){structwordre;//返回值//////////////////////////重點(diǎn)字///////////////////////////if(strcmp(ch,"if")==0){re.kind=IF;re.value=0;returnre;}if(strcmp(ch,"then")==0){re.kind=THEN;re.value=0;returnre;}if(strcmp(ch,"while")==0){re.kind=WHILE;re.value=0;returnre;}if(strcmp(ch,"do")==0){re.kind=DO;re.value=0;returnre;}//////////////////////////表記符///////////////////////////re.kind=ID;re.value=0;returnre;}intconvert(charch)//將字符變換成數(shù)字{intnumber;switch(ch){case'0':number=0;break;case'1':number=1;break;case'2':number=2;break;case'3':number=3;break;case'4':number=4;break;case'5':number=5;break;case'6':number=6;break;case'7':number=7;break;case'8':number=8;break;case'9':number=9;break;case'A':number=10;break;case'a':number=10;break;case'B':number=11;break;case'b':number=11;break;case'C':number=12;break;case'c':number=12;break;case'D':number=13;break;case'd':number=13;break;case'E':number=14;break;case'e':number=14;break;case'F':number=15;break;case'f':number=15;break;default:number=-1;break;//非法字符變換成-1}returnnumber;}wordhandle_number(char*ch,intTN)//辦理無(wú)符號(hào)整數(shù){inti,j;intnumber;

//對(duì)應(yīng)每一位上變換后的數(shù)字intdec=0,oct=0,hex=0;wordre;

//最后的數(shù)值,三種進(jìn)制//返回值if(TN==1)

//一位數(shù),只好是十進(jìn)制{number=convert(ch[0]);if(number==-1||number>9)cout<<"Error!";else{re.kind=INT10;re.value=number;returnre;}}if((TN==2)&&(ch[0]=='0'))//兩位數(shù),八進(jìn)制{number=convert(ch[1]);if((number>=0)&&(number<=7)){re.kind=INT8;re.value=number;returnre;}elsecout<<"Error!八進(jìn)制非法";//報(bào)錯(cuò)}if((TN>=2)&&(ch[0]!='0'))//兩位位數(shù)(含)以上,十進(jìn)制{int*num=newint[TN];for(i=0;i<TN;i++){number=convert(ch[i]);num[i]=number;if((number==-1)||(number>9))cout<<"Error!十進(jìn)制非法";//報(bào)錯(cuò)}for(i=0;i<TN;i++){for(j=TN-i-1;j>0;j--)num[i]*=10;dec+=num[i];}re.kind=INT10;re.value=dec;returnre;}elseif((TN>=3)&&(ch[0]=='0')&&(ch[1]!='x')&&(ch[1]!='X'))//三位數(shù)(含)以上,八進(jìn)制{int*num=newint[TN-1];for(i=1;i<TN;i++){number=convert(ch[i]);num[i]=number;if((number==-1)||(number>7))cout<<"Error!八進(jìn)制非法";//報(bào)錯(cuò)}for(i=1;i<TN;i++){for(j=TN-i-1;j>0;j--)num[i]*=8;oct+=num[i];}re.kind=INT8;re.value=oct;returnre;}elseif((TN>=3)&&(ch[0]=='0')&&((ch[1]=='x')||(ch[1]=='X')))//三位數(shù)(含)以上,十六進(jìn)制{int*num=newint[TN-2];for(i=2;i<TN;i++){number=convert(ch[i]);num[i]=number;if(number==-1)cout<<"Error!十六進(jìn)制非法";//報(bào)錯(cuò)}for(i=2;i<TN;i++){for(j=TN-i-1;j>0;j--)num[i]*=16;hex+=num[i];}re.kind=INT16;re.value=hex;returnre;}}wordscan(charch){wordre;//返回值while(ch==''||ch=='\n')//空格或回車{fpoint++;if(ch=='\n')fpoint++;//\n包含回車和換行因此再加1file.get(ch);}num_token=0;//每次要剖析一個(gè)單詞的時(shí)候,都要從頭對(duì)單詞中的字符計(jì)數(shù)token[num_token]=ch;//單詞開(kāi)始的一個(gè)字符都放到寄存單詞的數(shù)組中token[num_token+1]='\0';num_token++;if(isalpha(ch))//第一個(gè)字符是字母的單詞是表記符{file.get(ch);fpoint++;while(isalnum(ch)&&!file.eof( ))//讀取表記符的全部字母和數(shù)字{token[num_token]=ch;token[num_token+1]='\0';num_token++;file.get(ch);fpoint++;}fpoint--;file.seekg(fpoint,ios::beg);//退后re=handle_identifier(token);//辦理表記符returnre;//返回單詞信息(種別和屬性值)}elseif(isdigit(ch))//第一個(gè)字符是數(shù)字的單詞是整數(shù){file.get(ch);fpoint++;while(isalnum(ch)&&!file.eof( ))//十六進(jìn)制中包含字母x和X,因此整數(shù)單詞中不必定只包含數(shù)字{token[num_token]=ch;token[num_token+1]='\0';num_token++;file.get(ch);fpoint++;}fpoint--;file.seekg(fpoint,ios::beg);//退后re=handle_number(token,num_token);returnre;}elseswitch(ch){case':'://賦值符號(hào)file.get(ch);fpoint++;if(ch=='=')//以“:”開(kāi)頭的單詞只好是賦值符號(hào),不然犯錯(cuò){re.kind=ASG;re.value=0;returnre;}elsecout<<"Error!賦值犯錯(cuò)";//報(bào)錯(cuò)break;///////////////////////////各樣運(yùn)算符///////////////////////////////case'+':file.get(ch);fpoint++;if(ch=='+'){re.kind=INC;re.value=0;returnre;}else{fpoint--;file.seekg(fpoint,ios::beg);//退后re.kind=ADD;re.value=0;returnre;}break;case'-':file.get(ch);fpoint++;if(ch=='-'){re.kind=DECC;re.value=0;returnre;;}else{fpoint--;file.seekg(fpoint,ios::beg);re.kind=SUB;re.value=0;returnre;}break;case'*':re.kind=MUL;re.value=0;returnre;break;case'/':re.kind=DIV;re.value=0;returnre;break;case'!':file.get(ch);fpoint++;if(ch=='=')號(hào),不然犯錯(cuò){re.kind=NEQ;re.value=0;returnre;}elsecout<<"Error!";//報(bào)錯(cuò)break;case'='://等號(hào)file.get(ch);fpoint++;if(ch=='=')不然犯錯(cuò){re.kind=EQ;re.value=0;returnre;}elsecout<<"Error!";//報(bào)錯(cuò)break;case'>':file.get(ch);fpoint++;

退后//不等號(hào)以“!”開(kāi)頭的單詞只好是不等以“=”開(kāi)頭的單詞只好是等號(hào),if(ch=='='){re.kind=JAE;re.value=0;returnre;}else{fpoint--;file.seekg(fpoint,ios::beg);re.kind=JA;re.value=0;returnre;}break;case'<':file.get(ch);fpoint++;if(ch=='='){re.kind=JBE;re.value=0;returnre;}else{fpoint--;file.seekg(fpoint,ios::beg);re.kind=JB;re.value=0;returnre;}break;case'(':re.kind=SLP;re.value=0;returnre;break;case')':re.kind=SRP;re.value=0;returnre;break;case'{':re.kind=LP;re.value=0;

退后退后returnre;break;case'}':re.kind=RP;re.value=0;returnre;break;case';':re.kind=SEMI;re.value=0;returnre;break;///////////////////////

不是該語(yǔ)言所能識(shí)其他單詞

////////////////////////////default:cout<<"Error!";

//報(bào)錯(cuò)}//endswitch}////////////////////////////voidmain( ){

主程序////////////////////////////////////////charch;wordreword;fpoint=0;

//接收詞法剖析程序返回的單詞//記錄目前字符的地點(diǎn),用于回退num_token=0;//

記錄一個(gè)單詞中的字符數(shù)目token=newchar[30];

//寄存每個(gè)單詞file.open("word.txt");cout<<"\n詞法程序剖析結(jié)果:"<<endl;while(1){file.get(ch);fpoint++;if(file.eof( )!=0)break;reword=scan(ch);if(reword.kind!=0){switch(reword.kind){case1:cout<<"<ASG";break;case2:cout<<"<ADD";break;case3:cout<<"<SUB";break;case4:cout<<"<MUL";break;case5:cout<<"<DIV";break;case6:cout<<"<ID";break;case7:cout<<"<IF";break;case8:cout<<"<THEN

溫馨提示

  • 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)論