C語言詞法分析器實驗報告匯總_第1頁
C語言詞法分析器實驗報告匯總_第2頁
C語言詞法分析器實驗報告匯總_第3頁
C語言詞法分析器實驗報告匯總_第4頁
C語言詞法分析器實驗報告匯總_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機(jī)科學(xué)與工程系編譯原理課程設(shè)計實驗報告姓名: * 學(xué)號 * 年級專業(yè)及班級08計算機(jī)科學(xué)與技術(shù) 成績實驗名稱詞法分析程序設(shè)計與實現(xiàn)完成日期2011/4/12指導(dǎo)教師*實驗?zāi)康模耗軌蛎子肅編程諦言實現(xiàn)簡單的詞法分析程序;設(shè)計、編制并調(diào)試一個詞法分析程序,加深對詞法 分析原理的理解實驗要求:1.對單詞的構(gòu)詞規(guī)則有明確的定義;2 .編寫的分析程序能夠止確識別源程序中的單詞符號;3 .識別出的單詞以 <單詞符號,種別碼 >的形式保存在符號表中(鏈表);4.詞法分析中源程序的輸入以.c格式,分析后的符號表,將二元組保存在.txt文件中。實驗內(nèi)容:選擇高級諦言(C諦言),編制它的詞法分析程

2、序。詞法分析程序的實現(xiàn)可以采用任何一種編程工具實驗原理:1、算法的基本任務(wù)是從字符串表示的源程序中識別出具有獨立意義的單詞符號;2、其基本思想是根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號。實驗分析:(1)關(guān)鍵字:if else while do case int break等所有的關(guān)鍵字都是小寫。(2)運算符和界符:=+ - * / < <= <> > >=;()等(3)其他單詞是標(biāo)識符(ID)和整型常數(shù)(SUM ,通過以下正規(guī)式定義:ID = _ | letter (letter | digit)*NUM = digit digit*(4)空

3、格有空白、制表符和換行符組成??崭褚话阌脕矸指鬒D、SUM運算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。(5)注釋被忽略(6)各種單詞符號對應(yīng)的種別碼(如下):單詞符號種別碼單詞符號種別碼auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29whil

4、e30static31if32a33b34f35n36t37v3839?40,4142043ddd44 xhh45數(shù)字46標(biāo)識符47#48(49)50-29 -5152535455*56:5758%59八60+61?62=63I64&65!66<67>68>=69=70>>71!=72<<73&&74<=75II76+77?=78-79-80->8182%A (A 可為 d's'c)83;8485/868788899091其他類別99實驗流程圖(由于流程圖過大因此各部分分開寫)整體:掃描注釋:掃描數(shù)字

5、:判別為減號預(yù)讀ch預(yù)讀ch預(yù)讀ch判別為負(fù)號回退3Ch»數(shù)字或-'嬴+="I數(shù)Chs*,認(rèn)為數(shù)字結(jié)束以由勺形式輸出chi回退1位返回到p處掃描引號:掃描單詞:3門山uh領(lǐng)讀一位rh是否:t.tT '': 照關(guān)忘字的廣 程序并調(diào)用詼W或散字或否是*Lh是否為h判斷為一般類別,輸出種別碼回返1判斷為頭文 件,輸出種別 碼否是返M關(guān)鋪字種 別碼并輸出該 關(guān)鍵字字否為關(guān)返回一眼類刎 種別碼實驗步驟:1、準(zhǔn)備:用TC、VC+等開發(fā)工具;2、對本實驗的任務(wù)進(jìn)行分析,確定實現(xiàn)功能的函數(shù);3、寫好程序,仔細(xì)修改函數(shù);4、上機(jī)操作:輸入源程序,修改、調(diào)試,運行。5、

6、寫好試驗報告。實驗調(diào)試過程及測試結(jié)果/*源代碼 */#include<stdio.h> #include<stdlib.h> #include <ctype.h> #include<string.h> void main()FILE *fp,*fp1;int hanjsq=1;行計數(shù)器,保存行號int guanjz(char ch1);關(guān)鍵字和標(biāo)識符判斷定義輸入和輸出文件名scanf("%s",infile);輸入需要掃描的文件名char ch,infile15,oufile15;printf("*Enter the

7、 infile name*n");printf("*Enter the outfile name*n");scanf("%s",outfile);輸入需要另存為的文件名打開需要掃描的文件打開需要存入的文件if(fp = fopen(infile,"r") = NULL)/printf("cannot open filen");exit(0);if(fp1 = fopen(outfile,"w") = NULL)/printf("cannot open filen")

8、;exit(0);printf("n*printf("* »開始進(jìn)行詞法分析«*n");printf(printf("行號種別碼n");”*printf("n*printf( "*fprintf(fp1,"*fprintf(fp1," 行號種別碼n");fprintf(fp1,"* while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*掃描頭文件單詞及保留字*/if(isalpha(ch) | ch='_')/

9、如果第一個字符為字母或下劃線則判斷為標(biāo)識符int i=0;char ch130;/假定每個標(biāo)識符最長為ch1i+=ch;/ 將ch保存到ch10中并使i自加1while(!feof(fp) ch=fgetc(fp);if(ch=10)hanjsq+;/ 如果ch為換行符,則行計數(shù)器自加1if(isalpha(ch) | isdigit(ch) | ch='')/如果ch為字母、數(shù)字或下劃線就把ch放到ch1i中并使i自加1ch1i+=ch; if(ch='.') 如果ch為小數(shù)點則判斷是否為頭文件 if(ch=fgetc(fp)='h')如果小數(shù)

10、點后一位為h則判定其為頭文件 if(ch=10)hanjsq+; ch1i+尸.'; ch1i+='h' ch1i尸0'/把結(jié)束標(biāo)志放到 ch1i中作為單詞結(jié)束標(biāo)志printf("line %d:%s83n",hanjsq,ch1);/以字符串形式輸出chifprintf(fp1,"line %d:%s83n",hanjsq,ch1);break; else/如果小數(shù)點后一位不是h則判定其為標(biāo)識符 fseek(fp,-1,1);/fp 回退 1 ch1i尸0'/把結(jié)束標(biāo)志放到 ch1i中作為單詞結(jié)束標(biāo)志printf

11、("line %d:%s%dn",hanjsq,ch1,guanjz(ch1);/以字符串形式輸出chi fprintf(fp1,"line %d:%s%dn",hanjsq,ch1,guanjz(ch1);break; if(!isalpha(ch) && !isdigit(ch) && ch!='_' && ch!='.') /如果ch不為字母、數(shù)字、下劃線和點時判斷其為標(biāo)識符 ch1i='0' printf("line %d:%s%dn&quo

12、t;,hanjsq,ch1,guanjz(ch1);fprintf(fpi,"line %d:%s%dn”,hanjsq,chi,guanjz(chi);/*break;掃描數(shù)字 */if(isdigit(ch) | ch='-')如果ch為數(shù)字或'-'if(isdigit(ch)如果ch為數(shù)字printf("line %d:%c",hanjsq,ch);fprintf(fp1,"line %d:%c",hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/預(yù)讀一位如果ch為數(shù)字和點則循

13、環(huán)輸出if(isdigit(ch) | ch='.')printf("%c",ch);fprintf(fp1,"%c",ch);else/否則視為數(shù)字結(jié)束printf("46'n");fprintf(fp1,"46n");fseek(fp,-1,1);/ 回退一位ch='0'/ 置ch為0,以免影響下面誤判并順利退出掃描數(shù)字 break;if(ch='-')如果 ch 為'-'ch=fgetc(fp);預(yù)讀一位if(ch='_'

14、)如果ch還是為'-'則判斷為自減符'-'printf("line %d:-80n",hanjsq);fprintf(fp1,"line %d:-80n",hanjsq);if(ch='>,)/ 如果ch為'>',則判斷為結(jié)構(gòu)體運算符'->'81n",hanjsq);81n",hanjsq);printf("line %d:->fprintf(fp1,"line %d:->if(isdigit(ch)/ 如果ch為

15、數(shù)字則可能為減號或負(fù)號fseek(fp,-3,1);/回退 3 為判斷ch=fgetc(fp);if(isdigit(ch)/如果ch為數(shù)字則判斷-'為減號ch=fgetc(fp);printf("line %d:%c79n",hanjsq,ch);fprintf(fp1,"line %d:%c79n",hanjsq,ch);ch=fgetc(fp);printf("line %d:fprintf(fp1,"line %d: while(!feof(fp)ch=fgetc(fp);else /否則判斷'-'為負(fù)

16、號%c",hanjsq,ch);%c",hanjsq,ch);預(yù)讀一位如果ch為數(shù)字和點則循環(huán)輸出if(isdigit(ch) | ch='.')printf("%c",ch);fprintf(fp1,"%c",ch);else/否則視為數(shù)字結(jié)束printf("46'n");fprintf(fp1,"46n");fseek(fp,-1,1);/ 回退 1 break;/*掃描注釋*/if(ch='/') 如果ch為'/'則可能為注釋ch=f

17、getc(fp);/ 讀下一個字符if(ch=10)hanjsq+;if(Ch='/')如果該字符也為'/'則判斷為注釋一行while(fgetc(fp)!=10);if(ch=10)hanjsq+;/直到遇到換行符出現(xiàn)才認(rèn)為注釋結(jié)束if(ch='*')如果該字符為'*'則判斷為注釋多行/直到出現(xiàn)*/'才認(rèn)為注釋結(jié)束while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;if(ch='*')出現(xiàn)'*'/且接著出現(xiàn)/'if(ch=fgetc(fp)=&

18、#39;/')break;else/否則原樣輸出'/'printf("line %d:fprintf(fp1,"line %d:83n",hanjsq);83n",hanjsq);fseek(fp,-1,1);/回退1break;/*掃描引號*/if(ch="")出現(xiàn)引號int i=0;printf("line %d:%cfprintf(fp1,"line %d:%c82n",hanjsq,ch);82n",hanjsq,ch);printf("line %d:

19、",hanjsq);fprintf(fp1,"line %d:”,hanjsq);while(!feof(fp)/先整體輸出引號內(nèi)所有字符并定為第99類ch=fgetc(fp);i+;用于積累回退長度if(ch=10)hanjsq+;if(ch!='"')if(ch!=32)printf("%c",ch);fprintf(fp1,"%c",ch);else break;printf("99'n");fprintf(fp1,"99n");fseek(fp,-i,1

20、);/回退到引號開始for(;i>0;i-)ch=fgetc(fp);if(ch=92)/ 如果ch為''則可能為轉(zhuǎn)義字符char ch513="abfntv?'"0" /轉(zhuǎn)義字符集ch=fgetc(fp);/預(yù)讀一位for(int k=0;k<12;k+)/如果為轉(zhuǎn)義字符則輸出if(ch=ch5k)%dn",hanjsq,ch,k+33);printf(" line %d:%cfprintf(fp1,line %d:%c%dn",hanjsq,ch,k+33);if(ch='d'

21、&& isdigit(fgetc(fp) && isdigit(fgetc(fp)/fseek(fp,-2,1);printf(" line %d:%c%cfprintf(fp1," line %d:%c%cif(ch='x' && isdigit(fgetc(fp) && isdigit(fgetc(fp)/fseek(fp,-2,1);printf(" line %d:%c%cfprintf(fp1," line %d:%c%cif(ch='%')/ 如果

22、為'%'則可能為 s%c%dch=fgetc(fp);char bfh4="dcs"for(i=0;i<3;i+)if(bfhi=ch)printf(" line %d:%cfprintf(fp1," line %d:%c任意字符轉(zhuǎn)換為三位八進(jìn)制44n",hanjsq,fgetc(fp),fgetc(fp);44n",hanjsq,fgetc(fp),fgetc(fp);任意字符轉(zhuǎn)換為二位十六進(jìn)制45'n",hanjsq,fgetc(fp),fgetc(fp);45'n",ha

23、njsq,fgetc(fp),fgetc(fp);83n",hanjsq,ch);83n",hanjsq,ch);/*掃描其他符號*/定義部分單符號集定義部分單符號或雙符號(前半部分)集char ch49="+=|&="定義部分雙符號(后半部分)if(!isdigit(ch) && !isalpha(ch) && ch!='_' && ch!='"' && ch!='/')char ch214="#()'*:

24、%A" char ch39="+?=|&!<>"for(int i=0;i<13;i+)/判斷單個符號if(ch=ch2i) printf("line %d:%c%dn",hanjsq,ch,i+48);fprintf(fp1,"line %d:%c%dn",hanjsq,ch,i+48);for(int j=0;j<8;j+)/判斷雙符號if(ch=ch3j)/如果ch與ch3中第j個字符匹配ch=fgetc(fp);/預(yù)讀一位if(ch=10)hanjsq+;if(ch=ch4j)連起來為

25、一個雙符號%dn",hanjsq,ch3j,ch4j,i+69);%dn",hanjsq,ch3j,ch4j,i+69);/且ch與ch4第j個匹配,則表示 ch3j與ch4jprintf("line %d:%c%cfprintf(fp1,"line %d:%c%cif(ch='<' && ch3j='<')判斷'<<'符printf("line %d:fprintf(fp1,"line %d:if(ch='>' &&

26、amp; ch3j='>')printf("line %d:fprintf(fp1,"line %d:else/否則表示ch3jprintf("line %d:fprintf(fp1,"line %d:<<<<判斷'>>'符>>>>為單符號,不是雙符號的%c%c77'n",hanjsq);77'n",hanjsq);78n",hanjsq);78n",hanjsq);部分%dn",hanjsq

27、,ch3j,j+61);%dn",hanjsq,ch3j,j+61)fseek(fp,-1,1);/*/printf(”*n");printf("*»詞法分析結(jié)束printf("* »分析結(jié)果保存在文件$中printf("*»歡迎下次使用,謝謝!«*n");«*n",outfile);«*n");printf(”*n");fprintf(fp1,”*n");fprintf(fp1,"* »詞法分析結(jié)束fprintf(

28、fp1,"* 歡迎下次使用,謝謝!« *n");*n");fprintf(fp1,”*n");int guanjz(char chi口)關(guān)鍵字和標(biāo)識符判斷char ch2329="auto","double","int","struct","break","else","long","switch","case","enum",register&q

29、uot;,"typedef","char","extern","return","union","const","float","short",定義關(guān)鍵字集unsigned","continue","for","signed","void","default","goto","sizeof"

30、;, "volatile","do","while","static","if'for(int i=0;i<32;i+)/逐個比對如果為關(guān)鍵字則返回類別i+1if(!strcmp(ch1,ch2i)return i+1;return 47;/否則返回一般標(biāo)識符類inITane1”開始進(jìn)行詞法分析line1墉48line1include47line1<67line1s tdiu.h83line1>GSline248line2include47line:-!<67line2at

31、dlib.hline2>G8line3void24line3maiiri47line3(49line3>50line353line5PILE47line5密56line5fp47test,txtMM M MK M M M M HMMJlFn ft (- f fc 口 U.匕 f J _= Fl O.|T|e M * X M * M M M M K MUMcf f seq; &trxtline 1: 1旅1;line 1:line 1:line 1:line 2: line 2;line 2;line 2: line 2; line S;line 3:line 5: line

32、 3: line 3: line 5: line 5;Jine 5:includes:dio,hincludeTdlihhvoidnainF:LEXpi1" fl戶 1 test<tMt-M M-WW1F-M4* ¥ WWW F-M-aF WMWEn 16 P* 1rhy aat:fFfed.cf fw-txtn Hi fieM M HX ar 看臟:K HM: * M M*W* M * M M瞄* K X if * M It MM,X *“祝 M 開力處行司法分析M * Xi U HX if 片 M1KmK*KMKMM*KMMMJti>tKKKKM>X>M<KM1MM4tMWtKMHKM*M*KM*tM>XMrMKKM1KMhKKKMK*line L :M48line 1 -iviL-lude加line ItKb7li

溫馨提示

  • 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

提交評論