版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)1-3《編譯原理》詞法分析程序設(shè)計(jì)方案實(shí)驗(yàn)1-3《編譯原理》詞法分析程序設(shè)計(jì)方案/NUMPAGES28實(shí)驗(yàn)1-3《編譯原理》詞法分析程序設(shè)計(jì)方案實(shí)驗(yàn)1-3《編譯原理》詞法分析程序設(shè)計(jì)方案實(shí)驗(yàn)1-3《編譯原理》S語言詞法分析程序設(shè)計(jì)方案一、實(shí)驗(yàn)?zāi)康牧私庠~法分析程序的兩種設(shè)計(jì)方法之一:根據(jù)狀態(tài)轉(zhuǎn)換圖直接編程的方式;二、實(shí)驗(yàn)內(nèi)容 1.根據(jù)狀態(tài)轉(zhuǎn)換圖直接編程編寫一個(gè)詞法分析程序,它從左到右逐個(gè)字符的對源程序進(jìn)行掃描,產(chǎn)生一個(gè)個(gè)的單詞的二元式,形成二元式(記號(hào))流文件輸出。在此,詞法分析程序作為單獨(dú)的一遍,如下圖所示。具體任務(wù)有:(1)組織源程序的輸入(2)拼出單詞并查找其類別編號(hào),形成二元式輸出,得到單詞流文件(3)刪除注釋、空格和無用符號(hào)(4)發(fā)現(xiàn)并定位詞法錯(cuò)誤,需要輸出錯(cuò)誤的位置在源程序中的第幾行。將錯(cuò)誤信息輸出到屏幕上。(5)對于普通標(biāo)識(shí)符和常量,分別建立標(biāo)識(shí)符表和常量表(使用線性表存儲(chǔ)),當(dāng)遇到一個(gè)標(biāo)識(shí)符或常量時(shí),查找標(biāo)識(shí)符表或常量表,若存在,則返回位置,否則返回0并且填寫符號(hào)表或常量表。標(biāo)識(shí)符表結(jié)構(gòu):變量名,類型(整型、實(shí)型、字符型),分配的數(shù)據(jù)區(qū)地址注:詞法分析階段只填寫變量名,其它部分在語法分析、語義分析、代碼生成等階段逐步填入。常量表結(jié)構(gòu):常量名,常量值三、實(shí)驗(yàn)要求1.能對任何S語言源程序進(jìn)行分析 在運(yùn)行詞法分析程序時(shí),應(yīng)該用問答形式輸入要被分析的S源語言程序的文件名,然后對該程序完成詞法分析任務(wù)。2.能檢查并處理某些詞法分析錯(cuò)誤詞法分析程序能給出的錯(cuò)誤信息包括:總的出錯(cuò)個(gè)數(shù),每個(gè)錯(cuò)誤所在的行號(hào),錯(cuò)誤的編號(hào)及錯(cuò)誤信息。 本實(shí)驗(yàn)要求處理以下兩種錯(cuò)誤(編號(hào)分別為1,2): 1:非法字符:單詞表中不存在的字符處理為非法字符,處理方式是刪除該字符,給出錯(cuò)誤信息,“某某字符非法”。 2:源程序文件結(jié)束而注釋未結(jié)束。注釋格式為:/*……*/四、保留字和特殊符號(hào)表單詞代碼123456789單詞intcharfloatvoidconstforifelsethen單詞助記符intcharfloatvoidconstforifelsethen內(nèi)碼值單詞代碼101112131415161718單詞whileswitchbreakbeginend標(biāo)識(shí)符數(shù)字(包括整數(shù)和實(shí)數(shù))單詞助記符whileswitchbreakbeginendidnum內(nèi)碼值在符號(hào)表中的位置在常數(shù)表中的位置單詞代碼192021222324252627單詞+-*/%()[]單詞助記符+-*/%()[]內(nèi)碼值單詞代碼28282930單詞!=<><=>===;{}單詞助記符rlop;{}內(nèi)碼值!=<><=>===--單詞代碼373839404142434445單詞/=+=-=*=%=||&&!=單詞助記符/=+=-=*=%=orandnot=內(nèi)碼值單詞的構(gòu)詞規(guī)則:字母=[A-Za-z]數(shù)字=[0-9]標(biāo)識(shí)符=(字母|_)(字母|數(shù)字)*數(shù)字=數(shù)字(數(shù)字)*(.數(shù)字+|)四、S語言表達(dá)式和語句說明 1.算術(shù)表達(dá)式:+、-、*、/、% 2.關(guān)系運(yùn)算符:>、>=、<、<=、==、!= 3.賦值運(yùn)算符:=,+=、-=、*=、/=、%= 4.變量說明:類型標(biāo)識(shí)符變量名表; 5.類型標(biāo)識(shí)符:intcharfloat 6.If語句:if表達(dá)式then語句[else語句] 7.For語句:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句 8.While語句:while表達(dá)式do語句 9.S語言程序:由函數(shù)構(gòu)成,函數(shù)不能嵌套定義。函數(shù)格式為:返回值函數(shù)名(參數(shù)){數(shù)據(jù)說明語句}五、程序參考結(jié)構(gòu)說明 1.Initscanner函數(shù):程序初始化:輸入并打開源程序文件和目標(biāo)程序文件,初始化保留字表 2.Scanner函數(shù):若文件未結(jié)束,反復(fù)調(diào)用lexscan函數(shù)識(shí)別單詞。3.Lexscan函數(shù):根據(jù)讀入的單詞的第一個(gè)字符確定調(diào)用不同的單詞識(shí)別函數(shù)4.Isalpha函數(shù):識(shí)別保留字和標(biāo)識(shí)符5.Isnumber函數(shù):識(shí)別整數(shù),如有精力,可加入識(shí)別實(shí)數(shù)部分工功能6.Isanotation函數(shù):處理除號(hào)/和注釋7.Isother函數(shù)識(shí)別其他特殊字符8.Output函數(shù):輸出單詞的二元式到目標(biāo)文件,輸出格式(單詞助記符,單詞內(nèi)碼值),如(int,-)(rlop,>)……9.Error函數(shù):輸出錯(cuò)誤信息到屏幕10.除此之外,還可以設(shè)置查符號(hào)表,填寫符號(hào)表等函數(shù),學(xué)生可自行設(shè)計(jì)。實(shí)驗(yàn)中,可以將某些類型的單詞識(shí)別過程利用DFA算法實(shí)現(xiàn),DFA算法參考如下:DFA(S=S0,MOVE[][],F[],ALPHABET[],ALLS[])/*S為狀態(tài),初值為DFA的初態(tài),MOVE[][]為狀態(tài)轉(zhuǎn)換矩陣,F(xiàn)[]為終態(tài)集,ALPHABET[]為字母表,其中的字母順序與MOVE[][]中列標(biāo)題的字母順序一致。ALLS[]為狀態(tài)集*/{CharWordbuffer[10]=“”//單詞緩沖區(qū)置空Nextchar=getchar();//讀字符i=0;while(nextchar!=NULL)//NULL代表此類單詞{if(nextchar!∈ALPHABET[]){ERROR(“非法字符”),return(“非法字符”);}S=MOVE[S][nextchar]//下一狀態(tài)if(S=NULL)return(“不接受”);//下一狀態(tài)為空,不能識(shí)別,單詞錯(cuò)誤wordbuffer[i]=nextchar;//保存單詞符號(hào)i++;nextchar=getchar();}Wordbuffer[i]=‘\0’;If(S∈F)return(wordbuffer);//接受Elsereturn(“不接受”);}六、實(shí)驗(yàn)過程說明1.每人單獨(dú)完成。2.完成后,由老師驗(yàn)收,并給出成績。3.實(shí)驗(yàn)完成后,寫出實(shí)驗(yàn)報(bào)告(要求交打印稿)。報(bào)告內(nèi)容要求如下:完成人:班級(jí)、學(xué)號(hào)、姓名完成人:班級(jí)、學(xué)號(hào)、姓名一、實(shí)驗(yàn)名稱:簡化S語言詞法分析器二、實(shí)驗(yàn)?zāi)康模和ㄟ^手工編寫簡化C語言詞法分析器,熟悉并深入理解編譯程序詞法分析器的工作原理。三、實(shí)驗(yàn)內(nèi)容:1.根據(jù)保留字和特殊符號(hào)表能區(qū)分出源文件中的保留字、普通標(biāo)識(shí)符和特殊符號(hào),并能進(jìn)行簡單的錯(cuò)誤處理。…………2.設(shè)計(jì)詞法分析器模塊調(diào)用結(jié)構(gòu)圖和各模塊流程圖。2.設(shè)計(jì)詞法分析器模塊調(diào)用結(jié)構(gòu)圖和各模塊流程圖。3.程序源代碼。4.程序的執(zhí)行結(jié)果:輸入文件,輸出結(jié)果文件及屏幕信息。四、實(shí)驗(yàn)中出現(xiàn)的問題及解決方法。五、體會(huì)、意見或建議。七、測試源程序示例://aa.cvoidaa(){floatrate,circle;rate=3;circle=3.14*rate*rate;}輸出結(jié)果:(1)輸出結(jié)果文件:(void,-)(id,0)((,-)(),-)({,-)(float,-)(id,1)……(2)標(biāo)識(shí)符的符號(hào)表:Nametypeaddress0aa1rate2circle345(3)常數(shù)表:Namevalue0313.1423實(shí)驗(yàn)地點(diǎn):教10五樓計(jì)算機(jī)學(xué)院軟一機(jī)房實(shí)驗(yàn)時(shí)間:第4周周二3單元、周四1單元、第五周周二3單元八、實(shí)驗(yàn)代碼#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>#defineMAX10//保留字符號(hào)長度#defineMAXSIZE45//保留字和特殊符號(hào)表長度#defineNUM30//標(biāo)識(shí)符和常數(shù)的個(gè)數(shù)FILE*in,*out;//指向文件的指針charinfile[MAX];//文件名字chartoken[MAX];charWord[NUM][MAX];//標(biāo)識(shí)符charconsts[NUM][MAX];//常數(shù)charlownum[NUM][MAX]={"0","1","2","3","4","5","6","7","8","9", "10","11","12","13","14","15","16","17","18","19" "20","21","22","23","24","25","26","27","28","29"};//自定義表intn=1;//行號(hào)intnum=0;//錯(cuò)誤統(tǒng)計(jì)數(shù)typedefstructKey_word//保留字和特殊符號(hào)表結(jié)構(gòu){ //intkeyNum; charkeyWord[MAX]; charkeySign[MAX]; charkeyValue[MAX];}Key_word;//初始化保留字表Key_wordKey[MAXSIZE]={{"int","int","-"},{"char","char","-"},{"float","float","-"}, {"void","void","-"},{"const","const","-"},{"for","for","-"}, {"if","if","-"},{"else","else","-"},{"then","then","-"}, {"while","while","-"},{"switch","switch","-"},{"break","break","-"}, {"begin","begin","-"},{"end","end","-"},{"","",""}, {"","",""},{"","id",""},{"","num",""}, {"+","+","-"},{"-","-","-"},{"*","*","-"}, {"/","/","-"},{"%","%","-"},{"(","(","-"}, {")",")","-"},{"[","[","-"},{"]","]","-"}, {"","",""},{"<","rlop","<"},{">","rlop",">"}, {"<=","rlop","<="},{">=","rlop",">="},{"=","rlop","="}, {"!=","rlop","!="},{";",";","-"},{"","",""}, {"/=","/=","-"},{"+=","+=","-"},{"-=","-=","-"}, {"*=","*=","-"},{"%=","%=","-"},{"||","or","-"}, {"&&","and","-"},{"!","not","-"},{"=","=","-"}};//打開關(guān)閉文件intInitscanner(){ printf("請輸入要輸入的文件:\n"); scanf("%s",infile); if((in=fopen(infile,"r"))==NULL) { printf("cannotopeninfile!\n"); return0; } if((out=fopen("word.txt","a+"))==NULL) { printf("cannotopenoutfile!\n"); return0; } return0;}//寫入文件voidOutput(intn,intm){ fputs("(",out); fputs(Key[n].keySign,out); fputs(",",out); if(m==-1) fputs(Key[n].keyValue,out); else fputs(lownum[m],out);//下標(biāo) fputs(")",out);}//Isalpha函數(shù):識(shí)別保留字和標(biāo)識(shí)符intIsalpha(){ inti; for(i=0;i<16;i++)//關(guān)鍵字 { if(strcmp(token,Key[i].keyWord)==0) { Output(i,-1); return0; } } //標(biāo)識(shí)符Word[NUM][MAX] for(i=0;i<NUM;i++) { if((Word[i][0]!=NULL)&&strcmp(token,Word[i])==0) { Output(16,i); return0; } if(Word[i][0]==NULL) { strcpy(Word[i],token); Output(16,i); return0; } } return0;}intIsnumber()//Isnumber函數(shù):consts[NUM][MAX]{ inti; for(i=0;i<NUM;i++) { if((consts[i][0]!=NULL)&&strcmp(token,consts[i])==0) { Output(17,i); return0; } if(consts[i][0]==NULL) { strcpy(consts[i],token); Output(17,i); return0; } } return0;}voidremove()//掃描指針回退一個(gè)字符{fseek(in,-1,SEEK_CUR);}//Isanotation函數(shù):處理除號(hào)/和注釋voidIsanotation()//提示第一個(gè)字符已經(jīng)存為/了{(lán) charch,pre; ch=getc(in); if(ch=='=')//"/=" Output(36,-1); elseif(ch=='*')//"/*" { ch=getc(in); do{ if(feof(in)) { num++; printf("\n第(%d)行:注釋錯(cuò)誤:/*后面的字符全部當(dāng)做注釋,缺少結(jié)束注釋*/\n",n); break; } pre=ch; ch=getc(in); }while(pre!='*'||ch!='/'); } else//"/" { remove();//指針回退一個(gè)字符 Output(21,-1); }}//Isother函數(shù)識(shí)別其他特殊字符voidIsother(){ inti=1;intj=0; charch; if(token[0]=='<'||token[0]=='>'||token[0]=='!'||token[0]=='%'){ ch=getc(in); if(ch=='=') token[i++]=ch; elseremove(); }else if(token[0]=='|') { ch=getc(in); if(ch=='|') token[i++]=ch; else remove(); }else if(token[0]=='&') { ch=getc(in); if(ch=='&') token[i++]=ch; else remove(); } token[i]='\0'; for(i=18;i<45;i++) { if(strcmp(token,Key[i].keyWord)==0) { Output(i,-1); break; } } if(i==45) { num++; printf("\n第(%d)行:字符錯(cuò)誤:%s字符非法\n",n,token); }}voidScanner(){ charch; inti; ch=getc(in); while(!feof(in)) { while(ch==''||ch=='\t'||ch=='\n')//先統(tǒng)計(jì)行數(shù) { if(ch=='\n') ++n; ch=getc(in); } if(((ch>='a')&&(ch<='z'))||(ch=='_'))//標(biāo)識(shí)符isalpha(ch)單詞 { i=1; token[0]=ch; ch=getc(in); while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))//wordnumber { token[i++]=ch; ch=getc(in); } token[i]='\0'; Isalpha(); } elseif((ch>='0')&&(ch<='9'))//整數(shù) { i=1; token[0]=ch; ch=getc(in); while(isdigit(ch)) { token[i++]=ch; ch=getc(in); } token[i]='\0'; Isnumber(); } elseif(ch=='/')//區(qū)分"/","/=","/*" { token[0]=ch; Isanotation(); ch=getc(in); } else
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年中國微電流放大器數(shù)據(jù)監(jiān)測研究報(bào)告
- 2011-2015年太子參行業(yè)市場研究與競爭力分析報(bào)告
- 2024至2030年中國客車有無人標(biāo)示鎖數(shù)據(jù)監(jiān)測研究報(bào)告
- 2024至2030年中國全銅升降式防臭地漏行業(yè)投資前景及策略咨詢研究報(bào)告
- 自然科學(xué)如何撰寫和發(fā)表高水平的科研論文
- 2024年中國木醋液市場調(diào)查研究報(bào)告
- 2024年中國冰箱用石英管加熱器市場調(diào)查研究報(bào)告
- 高中語文摹形傳神千載如生第13課滑稽列傳課件蘇教版選修史記蚜
- 理發(fā)美容店租賃合同三篇
- 輪胎市場開發(fā)與步驟
- 集成電路芯片項(xiàng)目計(jì)劃書(參考范文)
- 閘門水封更換方案(共4頁)
- 《匆匆》教學(xué)實(shí)錄 (2)
- 1塔吊6515安裝方案
- (完整版)《鴻門宴》知識(shí)點(diǎn)歸納梳理
- 認(rèn)識(shí)總體國家安全觀ppt課件
- 倒計(jì)時(shí)(1、2、3、4、5、6、7、8、9分鐘)
- 體質(zhì)健康成績測試全自動(dòng)化計(jì)算模板--更新
- 急性腎小球腎炎病例討論-
- 壓力管道材料等級(jí)表
- 三年級(jí)數(shù)學(xué)上冊 加號(hào)、減號(hào)的來源課外拓素材 冀教版 素材
評(píng)論
0/150
提交評(píng)論