編譯原理實(shí)驗(yàn)一.doc_第1頁
編譯原理實(shí)驗(yàn)一.doc_第2頁
編譯原理實(shí)驗(yàn)一.doc_第3頁
編譯原理實(shí)驗(yàn)一.doc_第4頁
編譯原理實(shí)驗(yàn)一.doc_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實(shí)驗(yàn)內(nèi)容: 實(shí)現(xiàn)標(biāo)準(zhǔn)C語言詞法分析器實(shí)驗(yàn)?zāi)康模?掌握程序設(shè)計(jì)語言詞法分析的設(shè)計(jì)方法;2掌握DFA的設(shè)計(jì)與使用方法;3掌握正規(guī)式到有限自動機(jī)的構(gòu)造方法;實(shí)驗(yàn)要求:1單詞種別編碼要求 基本字(關(guān)鍵字)、運(yùn)算符、界符:一符一種; 標(biāo)識符(變量名):統(tǒng)一為一種; 常量():按類型編碼;2詞法分析工作過程中建立符號表、常量表,并以文本文件形式輸出;3詞法分析的最后結(jié)果以文本文件形式輸出;4完成對所設(shè)計(jì)詞法分析器的功能測試,并給出測試數(shù)據(jù)和實(shí)驗(yàn)結(jié)果;5為增加程序可讀性,請?jiān)诔绦蛑羞M(jìn)行適當(dāng)注釋說明;6整理上機(jī)步驟,總結(jié)經(jīng)驗(yàn)和體會;7認(rèn)真完成并按時提交實(shí)驗(yàn)報(bào)告。二、設(shè)計(jì)方案: 這個詞法分析器分析的主要關(guān)鍵字有:main, int, float, char, if, else, for, while, do, switch, case, break; default。選擇要分析的c文件,首先對其去掉注釋和與空格處理,再根據(jù)字符的不同類型分析。1、全局?jǐn)?shù)據(jù)結(jié)構(gòu): *key : 關(guān)鍵字表全局文件指針*fr,*fw, *temp1,*temp2用于文件的讀寫。2、以層次圖模塊的組成及調(diào)用關(guān)系Main ( )check( )isLet ()clock()isBoudany()isKey()isNum()3、主要函數(shù)的設(shè)計(jì)要求(功能、參數(shù)、返回值):isKey:判斷ch中的字符是否為關(guān)鍵字;isLer 和isNum:布爾函數(shù)過程,分別判斷ch中的字符是否為字母和數(shù)字;isBoudany(): 布爾函數(shù)過程,分別判斷ch組成的字符否為邊界符號;check:詞法分析;clock:時間函數(shù),計(jì)算程序運(yùn)行所需的時間main:主函數(shù)。4、狀態(tài)轉(zhuǎn)換圖:61 字母或數(shù)字 字母 非字母或數(shù)字702 數(shù)字 數(shù)字 非數(shù)字83 字符a 字符a94 字符b = 5 字符c字符a包括:= , & , | , + , -字符b包括:- , , | , * 字符c包括:, , : , ( , ) , , , , , ! ,# , % , ” , / , * , + , - , , , .# include# include # include # include # include FILE *fr,*fw,*temp1,*temp2;char *key0=main,printf,scanf,else,if,auto,double,int,struct,break,long,switch,case,enum,register,typedef,char,extern,return,union,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof,volatile,do,while,static;/*關(guān)鍵字表*/char *key1=,(,),;,;/*邊界符表*/ int isLet(char c)/判斷是否是字母 if(c=a& c=A&c=0&c=9)return 1;else return 0;int isKey(char *word)int m,i;for(i=0;i) ch=fgetc(fr); ch=fgetc(fr); fprintf(fw,*跳過頭文件和文件宏定義n); else if (ch=/)/跳過注釋/*/類型 ch=fgetc(fr); if (ch=/)/跳過注釋/類型 while(ch!=n) ch=fgetc(fr); fprintf(fw,*跳過注釋n); else if (ch=*) ch=fgetc(fr); temp=fgetc(fr); do ch=fgetc(fr); temp=fgetc(fr); while (ch!=*|temp!=/); fprintf(fw,*跳過注釋n); ch=fgetc(fr); else if(isLet(ch) word0=ch; ch=fgetc(fr); i=1; while(isNum(ch)|isLet(ch)/判斷該字符是否是字母或數(shù)字 wordi=ch; i+; ch=fgetc(fr); wordi=0; /0 代表字符結(jié)束(空格) fseek(fr,-1,1); c=isKey(word); /判斷是否是關(guān)鍵字 if(c=0) /不是關(guān)鍵字 fprintf(temp1,%s ,word); fprintf(fw,字符%s是:標(biāo)識符,種別編碼為:%dn,word,2); else if(ch!=)/判斷是否是定義的字符 if(c=2) fprintf(fw,字符%s是:*主函數(shù),種別編碼為:%dn,word,0);/主函數(shù) else fprintf(fw,字符%s是:關(guān)鍵字,種別編碼為:%dn,word,1);/關(guān)鍵字 else fprintf(fw,字符%s是:定義的字符常量,種別編碼為:%dnn,word,32); else /開始判斷的字符不是字母 if(isNum(ch) /判斷是否是數(shù)字 word0=ch; ch=fgetc(fr); i=1; while(isNum(ch) wordi=ch; i+; ch=fgetc(fr); wordi=0; fseek(fr,-1,1); /回退 fprintf(fw,字符%s是:常量,種別編碼為:%dn,word,3); else c=isBoudany(ch); /開始判斷的字符不是字母也不是數(shù)字 /邊界符 if(c) if(c=2)/判斷是否是轉(zhuǎn)義字符 word0=ch; ch=fgetc(fr); word1=ch; word2=0; fprintf(fw,字符%s是:轉(zhuǎn)義字符,種別編碼為:%dn,word,4); else if(c=1) fprintf(fw,字符%c是:界符,種別編碼為:%dn,ch,5); fprintf(temp2,%c ,ch); else switch(ch) case+: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:運(yùn)算符,種別編碼為:%dn,word,6);/運(yùn)算符+= else if(ch=+) word2=0; fprintf(fw,字符%s是運(yùn)算符,種別編碼為:%dn,word,7); /判斷結(jié)果為+ else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是運(yùn)算符,種別編碼為:%dn,ch,8); /判斷結(jié)果為+ break; case-: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:運(yùn)算符,種別編碼為:%dn,word,9); else if(ch=-) word2=0; fprintf(fw,字符%s是運(yùn)算符,種別編碼為:%dn,word,10); /判斷結(jié)果為- else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是運(yùn)算符,種別編碼為:%dn,ch,11); /判斷結(jié)果為- break; case*: word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) if(isNum(ch) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是運(yùn)算符,種別編碼為:%dn,ch,12);/判斷結(jié)果為* else /判斷是否是指針 i=2; ch=fgetc(fr); while(isLet(ch) wordi=ch; ch=fgetc(fr); i+; fprintf(fw,字符%s:是指針定義運(yùn)算符,種別編碼為:%dn,word,13); else word2=0; fprintf(fw,字符%s:是運(yùn)算符,種別編碼為:%dn,word,14);/判斷結(jié)果為*= break; case/: word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) if(isNum(ch) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是運(yùn)算符,種別編碼為:%dn,ch,15);/判斷結(jié)果為/ else word2=0; fprintf(fw,字符%s:是運(yùn)算符,種別編碼為:%dn,word,16);/判斷結(jié)果為/= break; case!: case?: case: case.: case=: word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是運(yùn)算符,種別編碼為:%dn,ch,17); else word2=0; fprintf(fw,字符%s:是運(yùn)算符,種別編碼為:%dn,word,18); break; case|: word0=ch; ch=fgetc(fr); word1=ch; if(ch=|) word2=0; fprintf(fw,字符%c是運(yùn)算符,種別編碼為:%dn,ch,19); /判斷結(jié)果為運(yùn)算符| else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是運(yùn)算符,種別編碼為:%dn,ch,20); /判斷結(jié)果為| break; case %: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是運(yùn)算符,種別編碼為:%dn,word,21); elseif(isLet(ch) word2=0; fprintf(fw,字符%s是輸出類型標(biāo)識符,種別編碼為:%dn,word,22); else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是取余運(yùn)算符,種別編碼為:%dn,ch,23); break; case&: word0=ch; ch=fgetc(fr); word1=ch; if(ch=&) word2=0; fprintf(fw,字符%s是:運(yùn)算符,種別編碼為:%dn,word,24); /判斷結(jié)果為運(yùn)算符& else fseek(fr,-2,1); ch=getc(fr); fprintf(fw,字符%c是:運(yùn)算符,種別編碼為:%dn,ch,25); /判斷結(jié)果為& break; case: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:運(yùn)算符,種別編碼為:%dn,word,26); /判斷結(jié)果為運(yùn)算符= else if(ch=) word2=0; fprintf(fw,字符%s是:運(yùn)算符,種別編碼為:%dn,word,27); /判斷結(jié)果為運(yùn)算符 else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是:運(yùn)算符,種別編碼為:%dn,ch,28); /判斷結(jié)果為: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是運(yùn)算符,種別編碼為:%dn,word,29); else if(ch=) word2=0; fprintf(fw,字符%s是運(yùn)算符,種別編碼為:%dn,word,30); else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是運(yùn)算符,種別編碼為:%dn,ch,31); break;default: break; fprintf(fw,n); int main()clock_t start,end;char cr;char str_in25,str_out25,str_out125,str_out225; double duration; start=clock();printf(請輸入文件的讀取路徑(包含文件的后綴名):n);scanf(%s,str_in); fr=fopen(str_in,r);while(fr=NULL)printf(文件路徑輸入錯誤!請重新輸入:n);scanf(%s,str_in);fr=fopen(str_in,r);printf(文件讀入成功!內(nèi)容顯示如下:n);printf(*n);cr=fgetc(fr);while (cr!=EOF) putchar(cr);cr=fgetc(fr);printf(n);printf(*n);printf(請輸入文件的最終結(jié)果的寫入路徑(包含文件的后綴名):n);scanf(%s,str_out);printf(請輸入文件的常量表的寫入路徑(包含文件的后綴名):n);scanf(%s,str_out1);printf(請輸入文件的符號表的寫入路徑(包含文件的后綴名):n);scanf(%s,str_out2);while(str_in=str_out|str_in=str_out1|str_in=str_out2)if(str_out=str_in)printf(請輸入文件的最終結(jié)果的寫入路徑(包含文件的后綴名):n);scanf(%s,str_out);elseif(str_in=str_out1)printf(請輸入文件的常量表的寫入路徑(包含文件的后綴名):n);scanf(%s,str_out1);elseif(str_in=str_out2)printf(請輸入文件的符號表的寫入路徑(包含文件的后綴名):n);scanf(%s,str_out2);fw=fopen(str_out,w);temp1=fopen(str_out1,w);temp2=fopen(s

溫馨提示

  • 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

提交評論