下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、編譯原理 -詞法分析器的設(shè)計(jì)一 設(shè)計(jì)說明及設(shè)計(jì)要求 一般來說,編譯程序的整個過程可以劃分為五個階段: 詞法分析、語法分析、 中間代碼生成、 優(yōu)化和目標(biāo)代碼生成。 本課程設(shè)計(jì)即為詞法分析階段。 詞法分析 階段是編譯過程的第一個階段。 這個階段的任務(wù)是從左到右一個字符一個字符地 讀入源程序,對構(gòu)成源程序的字符流進(jìn)行掃描和分解, 從而識別出一個個單詞 (也 稱單詞符號或符號) 。如保留字(關(guān)鍵字或基本字) 、標(biāo)志符、常數(shù)、算符和界符 等等。二 設(shè)計(jì)中相關(guān)關(guān)鍵字說明1. 基本字:也稱關(guān)鍵字,女口 C語言中的if , else , while , do ,for,case,break,return 等。
2、2. 標(biāo)志符:用來表示各種名字,如常量名、變量名和過程名等。3. 常數(shù):各種類型的常數(shù),如 12, 6.88,和“ ABC ”等。4. 運(yùn)算符:如 + , - , * , / ,%, < , > ,<= , >= 等。5. 界符,如逗點(diǎn),冒號,分號,括號, # , , 等。三 、程序分析詞法分析是編譯的第一個階段, 它的主要任務(wù)是從左到右逐個字符地對源 程序進(jìn)行掃描,產(chǎn)生一個個單詞序列, 用以語法分析。 詞法分析工作可以是獨(dú)立的 一遍,把字符流的源程序變?yōu)閱卧~序列, 輸出在一個中間文件上, 這個文 件做為語法分析程序的輸入而繼續(xù)編譯過程。 然而,更一般的情況, 常將 詞
3、法分析程序設(shè)計(jì)成一個子程序, 每當(dāng)語法分析程序需要一個單詞時, 則 調(diào)用該子程序。 詞法分析程序每得到一次調(diào)用, 便從源程序文件中讀入一 些字符,直到識別出一個單詞,或說直到下一個單詞的第一個字符為止。四、模塊設(shè)計(jì) 下面是程序的流程圖匚主函數(shù))91謬取文件掃摘一令字待H-取單詞逅回UI用輸出五、程序介紹在程序當(dāng)前目錄里建立一個文本文檔,取名為infile.txt,所有需要分析的程序都寫 在此文本文檔里,程序的結(jié)尾必須以“ ”標(biāo)志符結(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語言中自定義的標(biāo)示符(單詞種別為33)(3) 能識別C語言中的常數(shù)(單詞種別為0)(4) 能識別C語言中幾乎所有運(yùn)算符(單詞種別分別為41 54)(5)能識別C語言中絕大多數(shù)界符(單詞種別分別為55 66)六、運(yùn)行結(jié)果輸入文件infile.txt運(yùn)行結(jié)果(輸出文件 outfile.txt)七
5、、設(shè)計(jì)體會八、附錄部分(程序代碼)單詞符號類別編碼單詞符號類別編碼單詞符號類別編碼單詞符號類別編碼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標(biāo)識符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, 寫進(jìn)的內(nèi)容 ) 比如下面的調(diào)用 fprintf(outfile,"abcdn") 是把字符串 “abcd ”寫到文件 outfile 的 末尾,并且在后面加上了一個換行標(biāo)志 文件讀寫完成后要用函數(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中英語語法總結(jié)大全之形容詞和副詞的比較級
- 《學(xué)前兒童衛(wèi)生保健》 教案 17 托幼園所的生活制度
- 高中英語語法典型性習(xí)題測試
- 學(xué)校體育產(chǎn)品線介紹課件
- 會計(jì)數(shù)據(jù)分析 課件 第4章 可視化:使用可視化工具和書面報(bào)告等向利益相關(guān)者分享分析結(jié)果
- 2024 大中華區(qū) ETF投資者調(diào)查
- 2024屆山西省運(yùn)城市臨猗中學(xué)高三下學(xué)期期中模擬統(tǒng)練(七)數(shù)學(xué)試題
- 小學(xué)語文說課課件
- 5年中考3年模擬試卷初中生物八年級下冊第三節(jié)生物進(jìn)化的原因
- 高中語文《過秦論》隨堂練習(xí)(含答案)
- 中國電視DTMB頻道頻率劃分表
- 科技園區(qū)研發(fā)中心項(xiàng)目建議書范文
- 采暖水力計(jì)算書
- 江蘇省電廠一覽表
- 出口食品生產(chǎn)車間的衛(wèi)生要求精品文檔
- 空壓機(jī)改造項(xiàng)目可行性研究報(bào)告寫作范文
- 企業(yè)員工團(tuán)隊(duì)目標(biāo)計(jì)劃管理培訓(xùn)教育PPT講解資料
- 電動單梁起重機(jī)年自檢報(bào)告
- 機(jī)組啟動試運(yùn)行工作報(bào)告
- 模擬深海高壓艙試驗(yàn)系統(tǒng)設(shè)計(jì)方案
- 加熱管制作工藝
評論
0/150
提交評論