




版權(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)?zāi)康呐c要求: 1、了解字符串編碼組成的詞的內(nèi)涵,感覺(jué)一下字符串編碼的方法和解讀 2、了解和掌握自動(dòng)機(jī)理論和正規(guī)式理論在詞法分析程序和控制理論中的應(yīng)用二、實(shí)驗(yàn)內(nèi)容: 構(gòu)造一個(gè)自己設(shè)計(jì)的小語(yǔ)言的詞法分析器: 1、這個(gè)小語(yǔ)言能說(shuō)明一些簡(jiǎn)單的變量 識(shí)別諸如begin,end,if,while等保留字;識(shí)別非保留字的一般標(biāo)識(shí)符(有下劃線、字符、數(shù)字,且第一個(gè)字符不能是數(shù)字)。識(shí)別數(shù)字序列(整數(shù)和小數(shù));識(shí)別:=,<=,>=之類的特殊符號(hào)以及;,(,)等界符。2、相關(guān)過(guò)程(函數(shù)): Scanner()詞法掃描程序,提取標(biāo)識(shí)符并填入display表中 3、這個(gè)小語(yǔ)言有順序
2、結(jié)構(gòu)的語(yǔ)句 4、這個(gè)小語(yǔ)言能表達(dá)分支結(jié)構(gòu)的語(yǔ)句 5、這個(gè)小語(yǔ)言能夠輸出結(jié)果總之這個(gè)小語(yǔ)言詞法分析器能提供以上所說(shuō)明到的語(yǔ)法描述的功能三、實(shí)驗(yàn)步驟:1、測(cè)試評(píng)價(jià)(1)、測(cè)試1:能說(shuō)明一些簡(jiǎn)單的變量,如關(guān)鍵字、一般標(biāo)識(shí)符、界符等;(2)、測(cè)試2:能輸出結(jié)果:?jiǎn)卧~符號(hào)(內(nèi)碼形式)、各種信息表(如符號(hào)表、常量表等);(3)、測(cè)試程序: var x,y,z; begin x:=2; y:=3; if (x+5>=y*y) then begin z:=y*y-x; z:=z+x*x; end else z:=x+y; prn z; end.(4)、結(jié)果:、從鍵盤(pán)讀入;部分結(jié)果如下:(類型:該標(biāo)識(shí)符所
3、屬的類型,如關(guān)鍵字,變量等;下標(biāo):該標(biāo)識(shí)符所對(duì)應(yīng)表(如變量標(biāo)識(shí)符表,常量標(biāo)識(shí)符表等)中其相應(yīng)的位置,下同)、從文件讀入,輸出到文件;部分結(jié)果如下: 其他測(cè)試及結(jié)果如下:、出錯(cuò)處理;注:若有錯(cuò)誤,則只指出錯(cuò)誤,不輸出各個(gè)表;(5)、評(píng)價(jià): 這個(gè)小語(yǔ)言程序基本上能完成詞法分析階段的工作,識(shí)別諸如begin,if等保留字;識(shí)別非保留字的一般標(biāo)識(shí)符(有下劃線、字符、數(shù)字,且第一個(gè)字符不能是數(shù)字)。識(shí)別數(shù)字序列(整數(shù)和小數(shù));識(shí)別:=,<=,>=之類的特殊符號(hào)以及;,(,)等界符。在掃描源程序串的同時(shí),能進(jìn)行一些簡(jiǎn)單的處理,如刪除空格、tab、換行等無(wú)效字符,也進(jìn)行了一些基本的錯(cuò)誤處理,如變
4、量長(zhǎng)度的判別等。遇到的問(wèn)題:(a)、判別標(biāo)識(shí)符超過(guò)規(guī)定長(zhǎng)度(20)時(shí),未輸出處理結(jié)果;(b)、整數(shù)長(zhǎng)度過(guò)長(zhǎng)輸出結(jié)果仍為整數(shù)類型3;(c)、對(duì)于小數(shù)如045,被解釋為界符和整數(shù);(d)、對(duì)以數(shù)字開(kāi)頭的一般標(biāo)識(shí)符的處理,如100nuts被解釋為整數(shù)類型和標(biāo)識(shí)符,未給出錯(cuò)誤提示。如上測(cè)試,出現(xiàn)前兩個(gè)問(wèn)題時(shí)已報(bào)錯(cuò)并輸出所在行,而后兩個(gè)問(wèn)題待解決。2、對(duì)小語(yǔ)言的詞法規(guī)則(正規(guī)式)畫(huà)出一個(gè)確定的有限自動(dòng)機(jī)(見(jiàn)附錄2、3)四、實(shí)驗(yàn)的源代碼:(見(jiàn)附錄1)五、實(shí)驗(yàn)中發(fā)現(xiàn)的問(wèn)題和遇到的困難及解決方法: 由于以前未曾接觸過(guò)編譯原理,在該實(shí)驗(yàn)的設(shè)計(jì)中,的確遇到一定的困難。主要是display表結(jié)構(gòu)的設(shè)計(jì),由于語(yǔ)法分析
5、和語(yǔ)義分析還未學(xué)習(xí),無(wú)法站在全局的角度統(tǒng)籌兼顧, 在表結(jié)構(gòu)設(shè)計(jì)時(shí),不知該往表結(jié)構(gòu)體中添加哪些內(nèi)容,可以為后續(xù)的工作做鋪墊,這是剛開(kāi)始就遇到的最大的困難,也是最難的。經(jīng)過(guò)分析,我們?cè)诂F(xiàn)有局限性的基礎(chǔ)上,設(shè)計(jì)出一種折中的表結(jié)構(gòu),即在表結(jié)構(gòu)中只添加標(biāo)識(shí)符在其相應(yīng)表中的對(duì)應(yīng)下表,標(biāo)記符類型碼等關(guān)鍵的幾處,這樣既能 唯一確定一標(biāo)識(shí)符,達(dá)到該實(shí)驗(yàn)的要求,同時(shí)又為表保留了很好的擴(kuò)充性,以達(dá)到后續(xù)實(shí)驗(yàn)的要求。表結(jié)構(gòu)設(shè)計(jì)好后,其余的工作就是提取字符串和寫(xiě)入display表,在提取單字符還是雙字符組成的運(yùn)算符時(shí)有些麻煩,不過(guò)利用數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí)也是容易做到。六、總結(jié): 詞法分析是構(gòu)造編譯器的起始階段,也是相應(yīng)比
6、較簡(jiǎn)單的一個(gè)環(huán)節(jié)。詞法分析的主要任務(wù)是:根據(jù)構(gòu)造的狀態(tài)轉(zhuǎn)換圖,從左到右逐個(gè)字符地対源程序進(jìn)行掃描,識(shí)別開(kāi)源程序中具有獨(dú)立含義的最小語(yǔ)法單位符號(hào)或單詞,如變量標(biāo)識(shí)符,關(guān)鍵字,常量,運(yùn)算符,界符等。然后將提取出的標(biāo)識(shí)符以內(nèi)碼的形式表示,即用int類型的數(shù)字來(lái)表示其類型和在display表中的位置,而無(wú)須保留原來(lái)標(biāo)識(shí)符本身的字符串,這不僅節(jié)省了內(nèi)存空間,也有利于下一階段的分析工作。當(dāng)然,在掃描源程序串的同時(shí),進(jìn)行一些簡(jiǎn)單的處理,如刪除空格、tab、換行等無(wú)效字符,也進(jìn)行了一些基本的錯(cuò)誤處理,如變量長(zhǎng)度的判別,有些不合詞法規(guī)則的標(biāo)識(shí)符判別等。總之,嚴(yán)格說(shuō)來(lái),詞法分析程序只進(jìn)行和詞法分析相關(guān)的工作。七、
7、實(shí)驗(yàn)感想: 通過(guò)此次實(shí)驗(yàn),讓我了解到如何設(shè)計(jì)、編制并調(diào)試詞法分析程序,加深對(duì)詞法分析原理的理解;熟悉了構(gòu)造詞法分析程序的手工方式的相關(guān)原理,使用某種高級(jí)語(yǔ)言(例如C+語(yǔ)言)直接編寫(xiě)此法分析程序。另外,也讓我重新熟悉了C+語(yǔ)言的相關(guān)內(nèi)容,加深了對(duì)C+語(yǔ)言的用途的理解。附錄1(代碼)#include <iostream>#include <fstream>#include <string>#include <math.h>#include <ctype.h>#include <cstdlib>using namespace s
8、td;#define Max 655 /最大代碼長(zhǎng)度#define WordMaxNum 256 /變量最大個(gè)數(shù)#define DigitNum 256/常量最大個(gè)數(shù)#define MaxKeyWord32/關(guān)鍵字?jǐn)?shù)量#define MaxOptANum 8/運(yùn)算符最大個(gè)數(shù)#define MaxOptBNum 4/運(yùn)算符最大個(gè)數(shù)#define MaxEndNum 11/界符最大個(gè)數(shù)typedef struct DisplayTableint Index; /標(biāo)識(shí)符所在表的下標(biāo)int type;/標(biāo)識(shí)符的類型int line;/標(biāo)識(shí)符所在表的行數(shù)char symbol20;/標(biāo)識(shí)符所在表的名稱T
9、able; int TableNum = 0; /display表的下標(biāo) char WordWordMaxNum20; /標(biāo)識(shí)符表 char DigitWordMaxNum20; /數(shù)字表 int WordNum = 0; /變量表的下標(biāo) int DigNum = 0; /常量表的下標(biāo) bool errorFlag = 0; /錯(cuò)誤標(biāo)志 const char* const KeyWordMaxKeyWord = "and", "array", "begin", "case","char" &qu
10、ot;constant", "do", "else", "end", "false","for", "if", "input", "integer", "not", "of", "or", "output","packed","procedure", "program", "re
11、ad", "real","repeat", "set", "then", "to", "type", "until", "var","while", "with","prn" /關(guān)鍵字 const char OptA = '+','-','*','/','=','#',
12、39;<','>' / 單目運(yùn)算 const char *OptB = "<=",">=",":=","<>"/雙目運(yùn)算符 const char End = '(', ')' , ',' , '' , '.' , '' , '' , ':' , '' , '' , '"'
13、/ 界符 void error(char str20,int nLine, int errorType) cout <<" nError : " switch(errorType) case 1:cout << "第" << nLine-1 <<"行" << str << " 變量的長(zhǎng)度超過(guò)限制!n"errorFlag = 1;break; case 2:cout << "第" << nLine-1
14、<<"行" << str << " 小數(shù)點(diǎn)錯(cuò)誤!n"errorFlag = 1;break; case 3:cout << "第" << nLine-1 <<"行" << str << " 常量的長(zhǎng)度超過(guò)限制!n"errorFlag = 1;break; /error void Scanner(char ch,int chLen,Table tableMax,int nLine) int chInde
15、x = 0; while(chIndex < chLen) /對(duì)輸入的字符掃描 /*處理空格和tab */while(chchIndex = ' ' | chchIndex = 9 ) /忽略空格和tab chIndex +; /*處理?yè)Q行符*/while(chchIndex = 10) /遇到換行符,行數(shù)加1nLine+;chIndex +;/*標(biāo)識(shí)符*/if( isalpha(chchIndex) /以字母、下劃線開(kāi)頭char str256;int strLen = 0;while(isalpha(chchIndex) | chchIndex = '_'
16、; ) /是字母、下劃線strstrLen + = chchIndex;chIndex +;while(isdigit(chchIndex)/不是第一位,可以為數(shù)字strstrLen + = chchIndex;chIndex +;strstrLen = 0; /字符串結(jié)束符if(strlen(str) > 20) /標(biāo)識(shí)符超過(guò)規(guī)定長(zhǎng)度,報(bào)錯(cuò)處理error(str,nLine,1);elseint i;for(i = 0;i < MaxKeyWord; i+) /與關(guān)鍵字匹配if(strcmp(str, KeyWordi) = 0) /是關(guān)鍵字,寫(xiě)入table表中strcpy(ta
17、bleTableNum.symbol,str);tableTableNum.type = 1; /關(guān)鍵字tableTableNum.line = nLine;tableTableNum.Index = i;TableNum +;break;if(i >= MaxKeyWord) /不是關(guān)鍵字tableTableNum.Index = WordNum;strcpy(WordWordNum+,str); tableTableNum.type = 2; /變量標(biāo)識(shí)符 strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; Ta
18、bleNum +;/*常數(shù)*/else if(isdigit(chchIndex)&&chchIndex!='0') /遇到數(shù)字 else if(isdigit(chchIndex) /遇到數(shù)字int flag = 0;char str256;int strLen = 0;while(isdigit(chchIndex) | chchIndex = '.') /數(shù)字和小數(shù)點(diǎn)if(chchIndex = '.') /flag表記小數(shù)點(diǎn)的個(gè)數(shù),0時(shí)為整數(shù),1時(shí)為小數(shù),2時(shí)出錯(cuò)flag +;strstrLen + = chchIndex
19、; chIndex +;strstrLen = 0;if(strlen(str) > 20) /常量標(biāo)識(shí)符超過(guò)規(guī)定長(zhǎng)度20,報(bào)錯(cuò)處理error(str,nLine,3);if(flag = 0)tableTableNum.type = 3; /整數(shù)if(flag = 1)tableTableNum.type = 4; /小數(shù)if(flag > 1)error(str,nLine,2);tableTableNum.Index = DigNum;strcpy(DigitDigNum +,str);strcpy(tableTableNum.symbol,str);tableTableNu
20、m.line = nLine;TableNum +;/*運(yùn)算符*/elseint errorFlag; /用來(lái)區(qū)分是不是無(wú)法識(shí)別的標(biāo)識(shí)符,0為運(yùn)算符,1為界符char str3;str0 = chchIndex;str1 = chchIndex + 1;str3 = 0;for(int i = 0;i < MaxOptBNum;i+)/MaxOptBNum)if(strcmp(str,OptBi) = 0)errorFlag = 0;tableTableNum.type = 6;strcpy(tableTableNum.symbol,str);tableTableNum.line = n
21、Line;tableTableNum.Index = i;TableNum +;chIndex = chIndex + 2;break;if(i >= MaxOptBNum)for( int k = 0;k < MaxOptANum; k+)if(OptAk = chchIndex)errorFlag = 0;tableTableNum.type = 5;tableTableNum.symbol0 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum.line = nLine;tableTableNum.Index = k;Tabl
22、eNum +;chIndex +;break;/*界符*/for(int j = 0;j < MaxEndNum;j +)if(Endj =chchIndex)errorFlag = 1;tableTableNum.line = nLine;tableTableNum.symbol0 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum.Index = j;tableTableNum.type = 7;TableNum +;chIndex +;/*其他無(wú)法識(shí)別字符*/if(errorFlag != 0 && errorFl
23、ag != 1) /開(kāi)頭的不是字母、數(shù)字、運(yùn)算符、界符char str256;int strLen = -1;strstrLen + = chchIndex; chIndex +;while(*ch != ' ' | *ch != 9 | chchIndex != 10)/strstrLen + = chchIndex;chIndex +;strstrLen = 0;tableTableNum.type = 8;strcpy(tableTableNum.symbol,str);tableTableNum.line = nLine;tableTableNum.Index = -2
24、;TableNum +; void Trans(double x,int p) /把十進(jìn)制小數(shù)轉(zhuǎn)為16進(jìn)制 int i=0; /控制保留的有效位數(shù) while(i<p) if(x=0) /如果小數(shù)部分是0 break; /則退出循環(huán) else int k=int(x*16); /取整數(shù)部分 x=x*16-int(k); /得到小數(shù)部分 if(k<=9) cout<<k; else cout<<char(k+55); ; i+; ; ; int main() ifstream in;ofstream out,outVar,outCon;char in_file
25、_name26,out_file_name26; /讀入文件和寫(xiě)入文件的名稱char chMax; /存放輸入代碼的緩沖區(qū)int nLine = 1;/初始化行數(shù) Table *table = new TableMax; int choice;cout << "請(qǐng)輸入讀入方式:1:從文件中讀,2:從鍵盤(pán)讀(輸入結(jié)束標(biāo)志位#):n"cin >> choice;switch(choice) int i;/*從文件讀取*/ case 1:cout<<"Enter the input file name:n"cin>&g
26、t;in_file_name;in.open(in_file_name);if(in.fail() /打開(kāi)display表讀文件失敗cout<<"Inputput file opening failed.n"exit(1);cout<<"Enter the output file name:n"cin>>out_file_name;out.open(out_file_name);outVar.open("變量表.txt");outCon.open("常量表.txt");if(ou
27、t.fail() /打開(kāi)display表寫(xiě)文件失敗cout<<"Output file opening failed.n"exit(1);if(outVar.fail() /打開(kāi)變量表寫(xiě)文件失敗cout<<"VarOutput file opening failed.n"exit(1);if(outCon.fail() /打開(kāi)常量表寫(xiě)文件失敗cout<<"ConstOutput file opening failed.n"exit(1); in.getline(ch,Max,'#')
28、; Scanner(ch, strlen(ch),table,nLine); /調(diào)用掃描函數(shù) if(errorFlag = 1) /出錯(cuò)處理return 0; /*把結(jié)果打印到各個(gè)表中*/ out <<"類型"<<""<<"下標(biāo)" <<endl; for( i = 0; i < TableNum;i +)/打印displayout<< "(0x" <<hex << tablei.type<< ",&quo
29、t;<< "0x" << hex << tablei.Index<< ")" <<endl; /在文件testout.txt中輸出 outCon << "下標(biāo)" << " " << "常量值" << endl; for(i = 0;i < TableNum;i+) /打印常量表 if(tablei.type = 3) long num1;num1 = atoi(tablei.symb
30、ol);outCon<< "(0x" <<hex << tablei.Index << ","<< "0x" << hex << num1 << ")" <<endl; if(tablei.type = 4) double num2;num2 = atof(tablei.symbol);outCon<< "(0x" <<hex << tablei.Ind
31、ex << ","<< "0x" << hex << num2<< ")" <<endl; outVar <<"類型"<<""<< "變量名稱" <<endl; for( i = 0; i < WordNum;i +)/打印變量表outVar<< "(0x" <<hex << i<<
32、"" << Wordi << ")" <<endl; /在文件testout.txt中輸出in.close();/關(guān)閉文件out.close();outVar.close();outCon.close();break;/*從鍵盤(pán)輸入*/case 2:cin.getline(ch,Max,'#');Scanner(ch, strlen(ch),table,nLine); /調(diào)用掃描函數(shù)if(errorFlag = 1)return 0;cout << "nDisplay表: n&qu
33、ot;cout <<"類型"<<""<<"下標(biāo)" <<endl; /dos界面下 for( i = 0; i < TableNum;i +)cout<< "(0x" <<hex << tablei.type<< ","<< "0x" << hex << tablei.Index<< ")" <<endl; cout << "n常量表:n" << "下標(biāo)" << " " << "常量值" << endl; for(i = 0;i < TableNum;i+) /打印常量表 if(tablei.type = 3) long num1;num1 = atoi(tablei.symbol);cout<< "(0x" <<hex << tablei
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年點(diǎn)膠設(shè)備項(xiàng)目申請(qǐng)報(bào)告
- 攝影課件教學(xué)
- 設(shè)計(jì)類教學(xué)課件
- th發(fā)音教學(xué)課件
- 整數(shù)乘小數(shù)的課件
- 旅行教學(xué)課件
- 大學(xué)生戀愛(ài)與性心理
- 無(wú)水印教學(xué)課件
- 日本教學(xué)課件
- 中式翹睫教學(xué)課件
- 福建省廈門(mén)市雙十中學(xué)2025屆七年級(jí)生物第二學(xué)期期末聯(lián)考模擬試題含解析
- 【小學(xué)】新蘇教版小學(xué)數(shù)學(xué)四年級(jí)下冊(cè)暑假每日一練(02):計(jì)算題-應(yīng)用題(含答案)
- 2025豬藍(lán)耳病防控及凈化指南(第三版)
- TCUWA20059-2022城鎮(zhèn)供水管網(wǎng)模型構(gòu)建與應(yīng)用技術(shù)規(guī)程
- 2025至2030中國(guó)壓縮空氣儲(chǔ)能產(chǎn)業(yè)現(xiàn)狀調(diào)查及項(xiàng)目投資策略建議報(bào)告
- 三臺(tái)縣2024-2025學(xué)年小學(xué)六年級(jí)數(shù)學(xué)畢業(yè)檢測(cè)指導(dǎo)卷含解析
- 宅基地互換合同協(xié)議書(shū)范本
- 2025人教版數(shù)學(xué)四年級(jí)下冊(cè) 第一單元《四則運(yùn)算》單元分層作業(yè)
- 園藝植物育種學(xué)知到課后答案智慧樹(shù)章節(jié)測(cè)試答案2025年春浙江大學(xué)
- 集團(tuán)公司下屬子公司管理制度
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)帶答案
評(píng)論
0/150
提交評(píng)論