




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
編譯原理實驗報告實驗一詞法剖析程序的設(shè)計與實現(xiàn)指導(dǎo)教師:姓名:學(xué)號:班級:一、實驗?zāi)康幕菊莆沼嬎銠C(jī)語言的詞法剖析程序的開發(fā)方法。二、實驗內(nèi)容編制一個能夠剖析三種整數(shù)、表記符、主要運(yùn)算符和主要重點(diǎn)字的詞法剖析程序。三、實驗要求1.依據(jù)以下的正規(guī)式,編制正規(guī)文法,畫出狀態(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)算符和分開符+-*/><=( );重點(diǎn)字ifthenelsewhiledo2.依據(jù)狀態(tài)圖,設(shè)計詞法剖析函數(shù)intscan( ),達(dá)成以下功能:1)從輸入流(鍵盤或文件)讀入數(shù)據(jù),剖析出一個單詞。2)返回單詞種別(用整數(shù)表示),3)返回單詞屬性(不一樣的屬性能夠放在不一樣的全局變量中)。3.編寫測試程序,循環(huán)調(diào)用函數(shù)scan( ),每次調(diào)用,獲取一個單詞的信息。在測試程序中,打印輸出單詞種別、屬性(注意:不要在詞法剖析函數(shù)scan中打印輸出?。?。四、實驗環(huán)境微型計算機(jī)。Windows操作系統(tǒng)/Linux操作系統(tǒng)。編程語言:C/C++/Java/C#。建議使用VisualC++/Netbeans/Eclipse集成開發(fā)環(huán)境。五、實驗步驟依據(jù)狀態(tài)圖,設(shè)計詞法剖析算法設(shè)計函數(shù)scan( ),實現(xiàn)該算法編制測試程序(在本試驗中,能夠是主函數(shù)main( ))。調(diào)試程序:輸入一組單詞,檢查輸出結(jié)果。六、狀態(tài)圖七.測試數(shù)據(jù):092+data>0x3f00while八.測試結(jié)果九,思慮題詞法剖析可否采納空格來劃分單詞?答:不可以,由于比方abc+bcd中沒有空格,但這是三個單詞。程序設(shè)計中哪些環(huán)節(jié)影響詞法剖析的效率?怎樣提升效率?答:整個程序都由狀態(tài)變換圖而來。由遞歸方法實現(xiàn)的狀態(tài)變換圖,影響了整個詞法剖析器的剖析效率,能夠考慮使用棧來非遞歸的實現(xiàn)詞法剖析。十.實驗心得經(jīng)過詞法剖析程序的實現(xiàn),我理解了計算機(jī)是怎么去辨別一個個單詞的,或許能夠說是各樣命令的。此次實驗使我對語言中文件操作更為認(rèn)識,認(rèn)識文件指針的運(yùn)轉(zhuǎn)狀況,還認(rèn)識了編譯c原理中有限自動機(jī)的觀點(diǎn),依據(jù)狀態(tài)圖寫程序。十一.源代碼#include<iostream>usingnamespacestd;#include<fstream>#defineASG1#defineADD2#defineSUB3#defineMUL4#defineDIV5#defineID6#defineIF7#defineTHEN8#defineWHILE9#defineDO10#defineINT811//八進(jìn)制#defineINT1012//十進(jìn)制#defineINT1613#defineSLP14//左括號(#defineSRP15//右括號)#defineSEMI16//分號;#defineLP17//左花括號{#defineRP18//右花括號}#defineINC19//++#defineDECC20//--#defineNEQ21//不等于#defineEQ22//等于#defineJAE23//大于等于#defineJA24//大于#defineJBE25//小于等于#defineJB26//小于structword{intkind;intvalue;};intfpoint;//文件字符指針intnum_token;//一個單詞中的字符數(shù)目主假如數(shù)字長度,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)//辦理無符號整數(shù){inti,j;intnumber;
//對應(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)制非法";//報錯}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)制非法";//報錯}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)制非法";//報錯}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)制非法";//報錯}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;//每次要剖析一個單詞的時候,都要從頭對單詞中的字符計數(shù)token[num_token]=ch;//單詞開始的一個字符都放到寄存單詞的數(shù)組中token[num_token+1]='\0';num_token++;if(isalpha(ch))//第一個字符是字母的單詞是表記符{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))//第一個字符是數(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':'://賦值符號file.get(ch);fpoint++;if(ch=='=')//以“:”開頭的單詞只好是賦值符號,不然犯錯{re.kind=ASG;re.value=0;returnre;}elsecout<<"Error!賦值犯錯";//報錯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=='=')號,不然犯錯{re.kind=NEQ;re.value=0;returnre;}elsecout<<"Error!";//報錯break;case'='://等號file.get(ch);fpoint++;if(ch=='=')不然犯錯{re.kind=EQ;re.value=0;returnre;}elsecout<<"Error!";//報錯break;case'>':file.get(ch);fpoint++;
退后//不等號以“!”開頭的單詞只好是不等以“=”開頭的單詞只好是等號,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;///////////////////////
不是該語言所能識其他單詞
////////////////////////////default:cout<<"Error!";
//報錯}//endswitch}////////////////////////////voidmain( ){
主程序////////////////////////////////////////charch;wordreword;fpoint=0;
//接收詞法剖析程序返回的單詞//記錄目前字符的地點(diǎn),用于回退num_token=0;//
記錄一個單詞中的字符數(shù)目token=newchar[30];
//寄存每個單詞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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 互聯(lián)網(wǎng)平臺運(yùn)營合作協(xié)議
- 瀝青路面攤鋪施工合同
- 檢修承包合同
- 冀教版小學(xué)信息技術(shù)三年級上冊《二畫大熊貓》教學(xué)設(shè)計
- 房屋NFT數(shù)字產(chǎn)權(quán)綁定協(xié)議
- 福建加強(qiáng)型貝雷片施工方案
- 地下石油庫工程施工方案
- 14《小蝸牛》(教學(xué)設(shè)計)2024-2025學(xué)年一年級上冊語文統(tǒng)編版
- 第12課《橋》教學(xué)設(shè)計-2024-2025學(xué)年統(tǒng)編版語文(五四學(xué)制)六年級上冊
- 商品房預(yù)制樓板施工方案
- 冀教版六年級下冊數(shù)學(xué)全冊教案完整版教學(xué)設(shè)計(含教材分析、教學(xué)計劃及進(jìn)度表)
- 西師版六年級下冊數(shù)學(xué)課件(全冊)
- 減數(shù)分裂和受精作用(第二課時)課件-高一下學(xué)期生物人教版必修2
- 房地產(chǎn)標(biāo)準(zhǔn)踩盤表格模板
- 塑膠件承認(rèn)書
- 物聯(lián)網(wǎng)項目實施進(jìn)度計劃表
- 學(xué)校校園安全巡邏情況登記表
- 中國-各省市地圖可編輯課件
- (兒科學(xué)課件)腎病綜合征
- 光纜線路工程段終版施工圖
- 礦井年度災(zāi)害預(yù)防和處理計劃
評論
0/150
提交評論