編譯原理課程設(shè)計-詞法分析器(附含源代碼)精選._第1頁
編譯原理課程設(shè)計-詞法分析器(附含源代碼)精選._第2頁
編譯原理課程設(shè)計-詞法分析器(附含源代碼)精選._第3頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、編譯原理 -詞法分析器的設(shè)計一 設(shè)計說明及設(shè)計要求 一般來說,編譯程序的整個過程可以劃分為五個階段: 詞法分析、語法分析、 中間代碼生成、 優(yōu)化和目標代碼生成。 本課程設(shè)計即為詞法分析階段。 詞法分析 階段是編譯過程的第一個階段。 這個階段的任務(wù)是從左到右一個字符一個字符地 讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解, 從而識別出一個個單詞 (也 稱單詞符號或符號) 。如保留字(關(guān)鍵字或基本字) 、標志符、常數(shù)、算符和界符 等等。二 設(shè)計中相關(guān)關(guān)鍵字說明1. 基本字:也稱關(guān)鍵字,女口 C語言中的if , else , while , do ,for,case,break,return 等。

2、2. 標志符:用來表示各種名字,如常量名、變量名和過程名等。3. 常數(shù):各種類型的常數(shù),如 12, 6.88,和“ ABC ”等。4. 運算符:如 + , - , * , / ,%, < , > ,<= , >= 等。5. 界符,如逗點,冒號,分號,括號, # , , 等。三 、程序分析詞法分析是編譯的第一個階段, 它的主要任務(wù)是從左到右逐個字符地對源 程序進行掃描,產(chǎn)生一個個單詞序列, 用以語法分析。 詞法分析工作可以是獨立的 一遍,把字符流的源程序變?yōu)閱卧~序列, 輸出在一個中間文件上, 這個文 件做為語法分析程序的輸入而繼續(xù)編譯過程。 然而,更一般的情況, 常將 詞

3、法分析程序設(shè)計成一個子程序, 每當語法分析程序需要一個單詞時, 則 調(diào)用該子程序。 詞法分析程序每得到一次調(diào)用, 便從源程序文件中讀入一 些字符,直到識別出一個單詞,或說直到下一個單詞的第一個字符為止。四、模塊設(shè)計 下面是程序的流程圖匚主函數(shù))91謬取文件掃摘一令字待H-取單詞逅回UI用輸出五、程序介紹在程序當前目錄里建立一個文本文檔,取名為infile.txt,所有需要分析的程序都寫 在此文本文檔里,程序的結(jié)尾必須以“ ”標志符結(jié)束。程序結(jié)果輸出在同一個 目錄下,文件名為outfile.txt,此文件為自動生成。本程序所輸出的單詞符號采 用以下二元式表示:(單詞種別,單詞自身的值)如程序輸出

4、結(jié)果 (57,"#")(33,"i nclude")(52,"v")(33,"iostream")等。程序的功能:(1) 能識別C語言中所有關(guān)鍵字(共32個)(單詞種別分別為1 32,詳情見程序代碼相關(guān)部分,下同)(2)能識別C語言中自定義的標示符(單詞種別為33)(3) 能識別C語言中的常數(shù)(單詞種別為0)(4) 能識別C語言中幾乎所有運算符(單詞種別分別為41 54)(5)能識別C語言中絕大多數(shù)界符(單詞種別分別為55 66)六、運行結(jié)果輸入文件infile.txt運行結(jié)果(輸出文件 outfile.txt)七

5、、設(shè)計體會八、附錄部分(程序代碼)單詞符號類別編碼單詞符號類別編碼單詞符號類別編碼單詞符號類別編碼if3float21+31#62the n4short22-32.63else5un sig ned23*33J64while6con ti nue24/34:65do7for25<35>=39begi n8sig ned26>36<=38end9void27=37=41long10default2851!=42switch11goto29(52%40case12sizeof30)53標識符1enum13volatile43J54常數(shù)2register14auto4455t

6、ypedef15double4556char16int4657exter n17struct4758return18break48<<59union19static49>>60con st20a61提示:文件的打開和讀寫函數(shù):FILE *fp,*out;/定義文件指針fp=fope n("i nfile.txt","r")如果打開文件"infile.txt"失敗,則函數(shù)返回NULL,即fp=NULL,第二個參數(shù)“ r”表示以只讀方式打開,如果為” W;則以可寫方式打開調(diào)用 fgetc(fp) 這個函數(shù)一次從 f

7、p 所指向的文件讀取一個字符 char ch=fgetc(fp);想文件寫字符的函數(shù)為 fprintf(FILE * fp, 寫進的內(nèi)容 ) 比如下面的調(diào)用 fprintf(outfile,"abcdn") 是把字符串 “abcd ”寫到文件 outfile 的 末尾,并且在后面加上了一個換行標志 文件讀寫完成后要用函數(shù) fclose(fp) 關(guān)閉。源代碼#include "stdio.h"#include "string.h"#include "ctype.h" void analzid(FILE *output

8、,char *p)int i=0;int count=0;if (isalpha(p0)if (strcmp(p,"if")=0) fprintf(output,"(3,if)n"); else if(strcmp(p,"then")=0) fprintf(output,"(4,then)n"); else if(strcmp(p,"else")=0) fprintf(output,"(5,else)n"); else if(strcmp(p,"while"

9、;)=0) fprintf(output,"(6,while)n"); else if(strcmp(p,"do")=0) fprintf(output,"(7,do)n"); else if(strcmp(p,"begin")=0) fprintf(output,"(8,begin)n"); else if(strcmp(p,"end")=0) fprintf(output,"(9,end)n"); else if(strcmp(p,"long

10、")=0) fprintf(output,"(10,long)n"); else if(strcmp(p,"switch")=0) fprintf(output,"(11,switch)n"); else if(strcmp(p,"case")=0) fprintf(output,"(12,case)n"); else if(strcmp(p,"enum")=0) fprintf(output,"(13,enum)n"); else if(str

11、cmp(p,"register")=0) fprintf(output,"(14,register)n"); else if(strcmp(p,"typedef")=0) fprintf(output,"(15,typedef)n"); else if(strcmp(p,"char")=0) fprintf(output,"(16,char)n"); else if(strcmp(p,"extern")=0) fprintf(output,"(1

12、7,extern)n"); else if(strcmp(p,"return")=0) fprintf(output,"(18,return)n"); else if(strcmp(p,"union")=0) fprintf(output,"(19,union)n"); else if(strcmp(p,"const")=0) fprintf(output,"(20,const)n"); else if(strcmp(p,"float")=0)

13、fprintf(output,"(21,float)n"); else if(strcmp(p,"short")=0) fprintf(output,"(22,short)n"); else if(strcmp(p,"unsigned")=0) fprintf(output,"(23,unsigned)n"); else if(strcmp(p,"continue")=0) fprintf(output,"(24,continue)n"); else if

14、(strcmp(p,"for")=0) fprintf(output,"(25,for)n"); else if(strcmp(p,"signed")=0) fprintf(output,"(26,signed)n"); else if(strcmp(p,"void")=0) fprintf(output,"(27,void)n"); else if(strcmp(p,"default")=0) fprintf(output,"(28,defau

15、lt)n"); else if(strcmp(p,"goto")=0) fprintf(output,"(29,goto)n"); else if(strcmp(p,"sizeof")=0) fprintf(output,"(30,sizeof)n"); else if(strcmp(p,"volatile")=0) fprintf(output,"(43,volatile)n"); else if(strcmp(p,"auto")=0) fpr

16、intf(output,"(44,auto)n"); else if(strcmp(p,"double")=0) fprintf(output,"(45,double)n"); else if(strcmp(p,"int")=0) fprintf(output,"(46,int)n"); else if(strcmp(p,"struct")=0) fprintf(output,"(47,struct)n"); else if(strcmp(p,"

17、break")=0) fprintf(output,"(48,break)n"); else if(strcmp(p,"static")=0) fprintf(output,"(49,static)n"); else fprintf(output,"(1,%s)n",p);elsefor(;i<(int)strlen(p);i+) if(isdigit(pi) count+;if (count=(int)strlen(p) fprintf(output,"(2,%s)n",p);

18、 elseif (p0='_'&&(isalpha(p1) fprintf(output,"(1,%s)n",p); else fprintf(output,"%s 未定義 n",p);void analzsy(FILE *outfile,char *p)if (strcmp(p,"=")=0) fprintf(outfile,"(37,=)n"); else if(strcmp(p,"+")=0) fprintf(outfile,"(31,+)n&qu

19、ot;); else if(strcmp(p,"-")=0) fprintf(outfile,"(32,-)n"); else if(strcmp(p,"*")=0) fprintf(outfile,"(33,*)n"); else if(strcmp(p,"/")=0) fprintf(outfile,"(34,/)n"); else if(strcmp(p,"(")=0) fprintf(outfile,"(52,()n"); el

20、se if(strcmp(p,")")=0) fprintf(outfile,"(53,)n"); else if(strcmp(p,"")=0) fprintf(outfile,"(55,)n"); else if(strcmp(p,"")=0) fprintf(outfile,"(56,)n"); else if(strcmp(p,"")=0) fprintf(outfile,"(57,)n"); else if(strcmp(p,

21、"")=0) fprintf(outfile,"(58,)n"); else if(strcmp(p,"<<")=0) fprintf(outfile,"(59,<<)n"); else if(strcmp(p,">>")=0) fprintf(outfile,"(60,>>)n"); else if(strcmp(p,"'")=0) fprintf(outfile,"(61,')n

22、"); else if(strcmp(p,"#")=0) fprintf(outfile,"(62,#)n"); else if(strcmp(p,".")=0) fprintf(outfile,"(64,.)n"); else if(strcmp(p,"*")=0) fprintf(outfile,"(33,*)n"); else if(strcmp(p,"/")=0) fprintf(outfile,"(34,/)n");

23、 else if(strcmp(p,"%")=0) fprintf(outfile,"(40,%)n"); else if(strcmp(p,",")=0) fprintf(outfile,"(64,)n"); else if(strcmp(p,":")=0) fprintf(outfile,"(65,:)n"); else if(strcmp(p,"")=0) fprintf(outfile,"(54,;)n"); else if(s

24、trcmp(p,">")=0) fprintf(outfile,"(36,>)n"); else if(strcmp(p,"<")=0) fprintf(outfile,"(35,<)n"); else if(strcmp(p,">=")=0) fprintf(outfile,"(39,>=)n"); else if(strcmp(p,"<=")=0) fprintf(outfile,"(38,<=

25、)n"); else if(strcmp(p,"=")=0) fprintf(outfile,"(41,=)n"); else if(strcmp(p,"!=")=0) fprintf(outfile,"(42,!=)n"); else if(strcmp(p," ")=0) ;else if(strcmp(p,"n")=0) ;else fprintf(outfile,"%s 未定義 n",p);void main()FILE *fp,*out

26、;int i=0,x=0,y=0;int EA=0;char ch,str10000,idstr10,systr2; if(fp=fopen("infile.txt","r")=NULL)printf("Can not open infile!n"); exit(0);if(out=fopen("outfile.txt","w")=NULL)printf("Can not open outfile!n"); exit(0); ch=fgetc(fp);while(ch!=EO

27、F) stri=ch;stri+1='0'i+;ch=fgetc(fp); i=0;while(1) if(stri='') break;else if(stri>='a'&&stri<='z')|(stri>='A'&&stri<='Z')| (stri>='0'&&stri<='9')|(stri='_') idstrx=stri;idstrx+1='0'x+;i+;EA=1; else x=0;if(strlen(idstr)!=0)&&(EA) ana

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論