簡單的詞法分析器設(shè)計_第1頁
簡單的詞法分析器設(shè)計_第2頁
簡單的詞法分析器設(shè)計_第3頁
簡單的詞法分析器設(shè)計_第4頁
簡單的詞法分析器設(shè)計_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《編譯原理》課程設(shè)計院系專業(yè)年級11級學(xué)號姓名2023年05月實驗一簡樸的詞法分析器設(shè)計一、設(shè)計內(nèi)容熟悉并實現(xiàn)一個簡樸的詞法分析器二、設(shè)計目的了解高級語言單詞的分類,了解如何辨認(rèn)單詞規(guī)則,掌握狀態(tài)圖到辨認(rèn)程序的編程。源程序中,存在許多編輯用的符號,他們對程序邏輯功能無任何影響。例如:回車,換行,多余空白符,注釋行等。在詞法分析之前,一方面要先剔除掉這些符號,使得詞法分析更為簡樸。三、實驗環(huán)節(jié)1.將每個單詞符號進(jìn)行不同類別的劃分。單詞符號可以劃提成5中。(1)標(biāo)記符:用戶自己定義的名字,常量名,變量名和過程名。(2)常數(shù):各種類型的常數(shù)。(3)保存字(關(guān)鍵字):如if、begin、then、while、do等。(4)運算符:如+、-、*、<、>、=等。(5)界符:如逗號、分號、括號等。2.將所有合法的單詞符號轉(zhuǎn)化為便于計算機(jī)解決的二元組形式:(單詞分類號,單詞自身值);以圖形化界面顯示出來。3.可選擇性地將結(jié)果保存到文獻(xiàn)中。四、概要設(shè)計1.待分析的簡樸語言的詞法(1)關(guān)鍵字:whiledorelopletteridnumber所有關(guān)鍵字都是小寫。(2)運算符和界符::=+–*/<<=<>>>==;()#(3)其他單詞是標(biāo)記符(ID)和整型常數(shù)(NUM),通過以下正規(guī)式定義:如課本P20例2.6空格由空白、制表符和換行符組成??崭褚话阌脕矸指鬒D、NUM,運算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2.詞法分析器的結(jié)構(gòu)源程序源程序輸入緩沖區(qū)預(yù)解決子程序掃描緩沖區(qū)1掃描緩沖區(qū)2詞法分析子程序調(diào)用數(shù)據(jù)返回—單詞圖6.1詞法分析器的結(jié)構(gòu)3.部分單詞的正規(guī)式與狀態(tài)轉(zhuǎn)換圖圖6.2部分單詞的狀態(tài)轉(zhuǎn)換圖4.功能模塊表6.2詞法分析器的C#程序過程或函數(shù)功能表過程或函數(shù)名簡要功能說明voidscaner()分析源程序得到單個單詞并大體區(qū)分其類型,并生成二元組voidmain()輸入源程序五、具體設(shè)計1.流程圖開始開始輸入C語言源程序初始化source逐個遍歷字符,并去除空格符State為0進(jìn)入switch分支循環(huán)判斷根據(jù)state的值選擇適當(dāng)?shù)慕鉀Q調(diào)用相關(guān)函數(shù)輸出解決結(jié)果開始圖7.1程序總體流程圖六、編程調(diào)試1.源代碼#include"stdio.h"#include"string.h"#include"iostream.h"charprog[100],token[20];charch;intsyn,p,m=0,n,row,sum=0;char*rwtab[6]={"while","do","relop","letter","id","number"};voidscaner(){ for(n=0;n<8;n++)token[n]=NULL; ch=prog[p++]; while(ch=='') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } elseif((ch>='0'&&ch<='9')) { { sum=0; while((ch>='0'&&ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; } } p--; syn=11; if(sum>32767) syn=-1; } elseswitch(ch) {case'<':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=21; token[m++]=ch; } elseif(ch=='=') { syn=22; token[m++]=ch; } else { syn=23; p--; } break;case'>':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=20; p--; } break;case':':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; p--; } break;case'*':syn=13;token[0]=ch;break;case'/':syn=14;token[0]=ch;break;case'+':syn=15;token[0]=ch;break;case'-':syn=16;token[0]=ch;break;case'=':syn=25;token[0]=ch;break;case';':syn=26;token[0]=ch;break;case'(':syn=27;token[0]=ch;break;case')':syn=28;token[0]=ch;break;case'#':syn=0;token[0]=ch;break;case'\n':syn=-2;break;default:syn=-1;break; }}voidmain(){ p=0; row=1; cout<<"請輸入字符串(字符#是字符串輸入結(jié)束標(biāo)志):"<<endl; do { cin.get(ch); prog[p++]=ch; } while(ch!='#'); cout<<"字符串輸出結(jié)果為:"<<endl; p=0; do { scaner(); switch(syn) { case11:cout<<"("<<syn<<","<<sum<<")"<<endl;break; case-1:cout<<"Errorinrow"<<row<<"!"<<endl;break; case-2:row=row++;break;default:cout<<"("<<syn<<","<<to

溫馨提示

  • 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

提交評論