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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗1-3《編譯原理》詞法分析程序設計方案實驗1-3《編譯原理》詞法分析程序設計方案/NUMPAGES28實驗1-3《編譯原理》詞法分析程序設計方案實驗1-3《編譯原理》詞法分析程序設計方案實驗1-3《編譯原理》S語言詞法分析程序設計方案一、實驗目的了解詞法分析程序的兩種設計方法之一:根據(jù)狀態(tài)轉換圖直接編程的方式;二、實驗內容 1.根據(jù)狀態(tài)轉換圖直接編程編寫一個詞法分析程序,它從左到右逐個字符的對源程序進行掃描,產生一個個的單詞的二元式,形成二元式(記號)流文件輸出。在此,詞法分析程序作為單獨的一遍,如下圖所示。具體任務有:(1)組織源程序的輸入(2)拼出單詞并查找其類別編號,形成二元式輸出,得到單詞流文件(3)刪除注釋、空格和無用符號(4)發(fā)現(xiàn)并定位詞法錯誤,需要輸出錯誤的位置在源程序中的第幾行。將錯誤信息輸出到屏幕上。(5)對于普通標識符和常量,分別建立標識符表和常量表(使用線性表存儲),當遇到一個標識符或常量時,查找標識符表或常量表,若存在,則返回位置,否則返回0并且填寫符號表或常量表。標識符表結構:變量名,類型(整型、實型、字符型),分配的數(shù)據(jù)區(qū)地址注:詞法分析階段只填寫變量名,其它部分在語法分析、語義分析、代碼生成等階段逐步填入。常量表結構:常量名,常量值三、實驗要求1.能對任何S語言源程序進行分析 在運行詞法分析程序時,應該用問答形式輸入要被分析的S源語言程序的文件名,然后對該程序完成詞法分析任務。2.能檢查并處理某些詞法分析錯誤詞法分析程序能給出的錯誤信息包括:總的出錯個數(shù),每個錯誤所在的行號,錯誤的編號及錯誤信息。 本實驗要求處理以下兩種錯誤(編號分別為1,2): 1:非法字符:單詞表中不存在的字符處理為非法字符,處理方式是刪除該字符,給出錯誤信息,“某某字符非法”。 2:源程序文件結束而注釋未結束。注釋格式為:/*……*/四、保留字和特殊符號表單詞代碼123456789單詞intcharfloatvoidconstforifelsethen單詞助記符intcharfloatvoidconstforifelsethen內碼值單詞代碼101112131415161718單詞whileswitchbreakbeginend標識符數(shù)字(包括整數(shù)和實數(shù))單詞助記符whileswitchbreakbeginendidnum內碼值在符號表中的位置在常數(shù)表中的位置單詞代碼192021222324252627單詞+-*/%()[]單詞助記符+-*/%()[]內碼值單詞代碼28282930單詞!=<><=>===;{}單詞助記符rlop;{}內碼值!=<><=>===--單詞代碼373839404142434445單詞/=+=-=*=%=||&&!=單詞助記符/=+=-=*=%=orandnot=內碼值單詞的構詞規(guī)則:字母=[A-Za-z]數(shù)字=[0-9]標識符=(字母|_)(字母|數(shù)字)*數(shù)字=數(shù)字(數(shù)字)*(.數(shù)字+|)四、S語言表達式和語句說明 1.算術表達式:+、-、*、/、% 2.關系運算符:>、>=、<、<=、==、!= 3.賦值運算符:=,+=、-=、*=、/=、%= 4.變量說明:類型標識符變量名表; 5.類型標識符:intcharfloat 6.If語句:if表達式then語句[else語句] 7.For語句:for(表達式1;表達式2;表達式3)語句 8.While語句:while表達式do語句 9.S語言程序:由函數(shù)構成,函數(shù)不能嵌套定義。函數(shù)格式為:返回值函數(shù)名(參數(shù)){數(shù)據(jù)說明語句}五、程序參考結構說明 1.Initscanner函數(shù):程序初始化:輸入并打開源程序文件和目標程序文件,初始化保留字表 2.Scanner函數(shù):若文件未結束,反復調用lexscan函數(shù)識別單詞。3.Lexscan函數(shù):根據(jù)讀入的單詞的第一個字符確定調用不同的單詞識別函數(shù)4.Isalpha函數(shù):識別保留字和標識符5.Isnumber函數(shù):識別整數(shù),如有精力,可加入識別實數(shù)部分工功能6.Isanotation函數(shù):處理除號/和注釋7.Isother函數(shù)識別其他特殊字符8.Output函數(shù):輸出單詞的二元式到目標文件,輸出格式(單詞助記符,單詞內碼值),如(int,-)(rlop,>)……9.Error函數(shù):輸出錯誤信息到屏幕10.除此之外,還可以設置查符號表,填寫符號表等函數(shù),學生可自行設計。實驗中,可以將某些類型的單詞識別過程利用DFA算法實現(xiàn),DFA算法參考如下:DFA(S=S0,MOVE[][],F[],ALPHABET[],ALLS[])/*S為狀態(tài),初值為DFA的初態(tài),MOVE[][]為狀態(tài)轉換矩陣,F(xiàn)[]為終態(tài)集,ALPHABET[]為字母表,其中的字母順序與MOVE[][]中列標題的字母順序一致。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)為空,不能識別,單詞錯誤wordbuffer[i]=nextchar;//保存單詞符號i++;nextchar=getchar();}Wordbuffer[i]=‘\0’;If(S∈F)return(wordbuffer);//接受Elsereturn(“不接受”);}六、實驗過程說明1.每人單獨完成。2.完成后,由老師驗收,并給出成績。3.實驗完成后,寫出實驗報告(要求交打印稿)。報告內容要求如下:完成人:班級、學號、姓名完成人:班級、學號、姓名一、實驗名稱:簡化S語言詞法分析器二、實驗目的:通過手工編寫簡化C語言詞法分析器,熟悉并深入理解編譯程序詞法分析器的工作原理。三、實驗內容:1.根據(jù)保留字和特殊符號表能區(qū)分出源文件中的保留字、普通標識符和特殊符號,并能進行簡單的錯誤處理?!?.設計詞法分析器模塊調用結構圖和各模塊流程圖。2.設計詞法分析器模塊調用結構圖和各模塊流程圖。3.程序源代碼。4.程序的執(zhí)行結果:輸入文件,輸出結果文件及屏幕信息。四、實驗中出現(xiàn)的問題及解決方法。五、體會、意見或建議。七、測試源程序示例://aa.cvoidaa(){floatrate,circle;rate=3;circle=3.14*rate*rate;}輸出結果:(1)輸出結果文件:(void,-)(id,0)((,-)(),-)({,-)(float,-)(id,1)……(2)標識符的符號表:Nametypeaddress0aa1rate2circle345(3)常數(shù)表:Namevalue0313.1423實驗地點:教10五樓計算機學院軟一機房實驗時間:第4周周二3單元、周四1單元、第五周周二3單元八、實驗代碼#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>#defineMAX10//保留字符號長度#defineMAXSIZE45//保留字和特殊符號表長度#defineNUM30//標識符和常數(shù)的個數(shù)FILE*in,*out;//指向文件的指針charinfile[MAX];//文件名字chartoken[MAX];charWord[NUM][MAX];//標識符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;//行號intnum=0;//錯誤統(tǒng)計數(shù)typedefstructKey_word//保留字和特殊符號表結構{ //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","-"},{"=","=","-"}};//打開關閉文件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);//下標 fputs(")",out);}//Isalpha函數(shù):識別保留字和標識符intIsalpha(){ inti; for(i=0;i<16;i++)//關鍵字 { if(strcmp(token,Key[i].keyWord)==0) { Output(i,-1); return0; } } //標識符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()//掃描指針回退一個字符{fseek(in,-1,SEEK_CUR);}//Isanotation函數(shù):處理除號/和注釋voidIsanotation()//提示第一個字符已經存為/了{ charch,pre; ch=getc(in); if(ch=='=')//"/=" Output(36,-1); elseif(ch=='*')//"/*" { ch=getc(in); do{ if(feof(in)) { num++; printf("\n第(%d)行:注釋錯誤:/*后面的字符全部當做注釋,缺少結束注釋*/\n",n); break; } pre=ch; ch=getc(in); }while(pre!='*'||ch!='/'); } else//"/" { remove();//指針回退一個字符 Output(21,-1); }}//Isother函數(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)行:字符錯誤:%s字符非法\n",n,token); }}voidScanner(){ charch; inti; ch=getc(in); while(!feof(in)) { while(ch==''||ch=='\t'||ch=='\n')//先統(tǒng)計行數(shù) { if(ch=='\n') ++n; ch=getc(in); } if(((ch>='a')&&(ch<='z'))||(ch=='_'))//標識符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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論