實(shí)驗(yàn)1-3 《編譯原理》詞法分析程序設(shè)計(jì)方案_第1頁
實(shí)驗(yàn)1-3 《編譯原理》詞法分析程序設(shè)計(jì)方案_第2頁
實(shí)驗(yàn)1-3 《編譯原理》詞法分析程序設(shè)計(jì)方案_第3頁
實(shí)驗(yàn)1-3 《編譯原理》詞法分析程序設(shè)計(jì)方案_第4頁
實(shí)驗(yàn)1-3 《編譯原理》詞法分析程序設(shè)計(jì)方案_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論