C語言詞法分析器實驗報告_第1頁
C語言詞法分析器實驗報告_第2頁
C語言詞法分析器實驗報告_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余25頁可下載查看

下載本文檔

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

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

4、ile28do29while30static31if32a33b34f35n36t37v3839?404142043ddd44 xhh45數(shù)字46標(biāo)識符47#48(49)5051525354C55*56:5758%59A60+61?62=63164&65!66<67>68>=69=70>>71!=72<<73&&74<=75II76+77?=78-79-80->81a82%A (A 可為 d's'c)838485/868788899091其他類別99掃描數(shù)字:是Ch是否為 數(shù)字或'判別為”-&

5、gt;判別為自減符Ch1i+=ch判別為減號預(yù)讀ch預(yù)讀ch預(yù)讀ch判別為負(fù)號認(rèn)為數(shù)字結(jié)束回退1位回退3Ch為數(shù)字或以的形式輸 出chi返回到p處否 T預(yù)讀ch掃描引號:6為引號冋一止 fg>elcfp)HJiUi?mW7Fl足it掃描單詞:實驗步驟:1、準(zhǔn)備:用TC、VC+等開發(fā)工具;2、對本實驗的任務(wù)進(jìn)行分析,確定實現(xiàn)功能的函數(shù);3、寫好程序,仔細(xì)修改函數(shù);4、上機(jī)操作:輸入源程序,修改、調(diào)試,運(yùn)行。5、寫好試驗報告。/*實驗調(diào)試過程及測試結(jié)果代碼 */#in clude<stdio.h> #in clude<stdlib.h> #in elude <c

6、type.h> #in clude<stri ng.h> void mai n()FILE *fp,*fp1;int hanjsq=1;行計數(shù)器,保存行號int guanjz(char ch1);關(guān)鍵字和標(biāo)識符判斷char ch,i nfile15,outfile15;定義輸入和輸出文件名prin tf("*E nter the infile name*sca nf("%s",i nfile);/輸入需要掃描的文件名printf(Enter the outfile n ame* n");scan f("%s",out

7、file);/輸入需要另存為的文件名if(fp = fope n(i nfile,"r") = NULL)/prin tf("ca nnot ope n filen"); exit(0);if(fp1 = fope n(outfile,"w") = NULL)/打開需要掃描的文件打開需要存入的文件printf("cannot open file'n"); exit(O);printf("n*printf("* 開始進(jìn)行詞法分析* n");printf( "*print

8、f("n*printf(”行號字符串種別碼n");printf( "*fprin tf(fp1, "*fprin tf(fp1,"行號字符串種別碼n");* n");fprin tf(fp1, while(!feof(fp)ch=fgetc(fp);if(ch=1O)hanjsq+;掃描頭文件單詞及保留字*if(isalpha(ch) | ch='_')如果第一個字符為字母或下劃線則判斷為標(biāo)識符int i=0;char ch130;假疋母個標(biāo)識付取長為ch1i+=ch;將ch保存到ch10中并使i自加1whi

9、le(!feof(fp)ch=fgetc(fp);if(ch=1O)hanjsq+; 如果ch為換行符,則行計數(shù)器自加1if(isalpha(ch) | isdigit(ch) | ch='')/如果ch為字母、數(shù)字或下劃線就把ch放到ch1i中并使i自加1ch1i+=ch;if(ch='.')如果ch為小數(shù)點(diǎn)則判斷是否為頭文件if(ch=fgetc(fp)='h')如果小數(shù)點(diǎn)后一位為 h則判定其為頭文件if(ch=10)hanjsq+;chii+='.'chii+='h'ch1i='0'把結(jié)束標(biāo)志

10、放到chii中作為單詞結(jié)束標(biāo)志prin tf("li ne %d:%s83n",hanjsq,ch1);以字符串形式輸出 ch1fprin tf(fp1,"li ne %d:%s83n",hanjsq,ch1);break;else/如果小數(shù)點(diǎn)后一位不是h則判定其為標(biāo)識符fseek(fp,-1,1);/fp回退 1ch1i='0'把結(jié)束標(biāo)志放到ch1i中作為單詞結(jié)束標(biāo)志出chiprin tf("li ne %d:%s%dn",hanjsq,ch1,guanjz(ch1);以字符串形式輸fprin tf(fp1,&quo

11、t;li ne %d:%s%dn" ,hanjsq,ch1,guanjz(ch1);break; if(!isalpha(ch) && !isdigit(ch) && ch!='_' && ch!='.')/如果ch不為字母、數(shù)字、下劃線和點(diǎn)時判斷其為標(biāo)識符%s%dn",hanjsq,ch1,guanjz(ch1);ch1i='0' prin tf("li ne %d:%dn ”,hanjsq,ch1,guanjz(ch1);fprin tf(fp1,"li

12、ne %d:%sbreak;/*j掃描數(shù)*/if(isdigit(ch) | ch='-')如果ch為數(shù)字或'-'if(isdigit(ch)/如果ch為數(shù)字prin tf("li ne %d:%c",hanjsq,ch);fprintf(fp1,"line %d:%c",hanjsq,ch);while(!feof(fp)ch=fgetc(fp);預(yù)讀一位如果ch為數(shù)字和點(diǎn)則循環(huán)輸出if(isdigit(ch) | ch='.')prin tf("%c",ch);fprin tf(fp

13、1,"%c",ch);else/否則視為數(shù)字結(jié)束46n");46n");printf(”fprin tf(fp1,"fseek(fp,-1,1);回退一位ch='O: 置ch為0,以免影響下面誤判并順利退出掃描數(shù)字break;if(ch='-')如果ch為'-'ch=fgetc(fp);預(yù)讀一位if(ch='-') 如果ch還是為'-'則判斷為自減符'-'80n",hanjsq);80n",hanjsq);prin tf("li

14、 ne %d: fprintf(fp1,"line %d: 如果ch為'>',則判斷為結(jié)構(gòu)體運(yùn)算符->'prin tf("li ne %d:->fprin tf(fp1,"li ne %d:->if(ch='>')81 n",hanjsq);81 n",hanjsq);if(isdigit(ch)如果ch為數(shù)字則可能為減號或負(fù)號fseek(fp,-3,1);回退 3 為判斷ch=fgetc(fp);if(isdigit(ch)如果ch為數(shù)字則判斷'-'為減號預(yù)

15、讀一位如果%c",hanjsq,ch);%c",hanjsq,ch);ch為數(shù)字和點(diǎn)則循環(huán)輸出ch=fgetc(fp);prin tf("li ne %d:%cfprin tf(fp1,"li ne %d:else /否則判斷'-'為負(fù)號ch=fgetc(fp);prin tf("li ne %d:fprin tf(fp1,"li ne %d:while(!feof(fp)ch=fgetc(fp);79n" ,hanjsq,ch);%c79n",hanjsq,ch);if(isdigit(ch) |

16、 ch='.') prin tf("%c",ch);fprin tf(fp1,"%c",ch);掃描注釋*else/否則視為數(shù)字結(jié)束printf(”46n");fprin tf(fp1,"46n");fseek(fp,-1,1);/回退1break;if(ch='/') 如果ch為'/'則可能為注釋ch=fgetc(fp); 讀下一個字符if(ch=10)hanjsq+;if(ch='/')如果該字符也為'/'則判斷為注釋一行while(fget

17、c(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)='/')break;else/否則原樣輸出'/'prin tf("li ne %d:fprintf(fp1,"

18、;line %d:83n",hanjsq);83n",hanjsq);fseek(fp,-1,1);回退1break;/*掃描引號*/if(ch=”)出現(xiàn)引號int i=0;prin tf("li ne %d:%cfprin tf(fp1,"li ne %d:%c82n",hanjsq,ch);82n",hanjsq,ch);prin tf("li ne %d:",hanjsq);fprin tf(fp1,"li ne %d:",hanjsq);while(!feof(fp)/先整體輸出引號內(nèi)所

19、有字符并定為第99類ch=fgetc(fp);i+;用于積累回退長度if(ch=10)hanjsq+;if(ch!=”)if(ch!=32)prin tf("%c",ch);fprin tf(fp1,"%c",ch);else break;99n");99n");回退到引號開始printf(”fprin tf(fp1," fseek(fp,-i,1);/ for(;i>0;i-)ch=fgetc(fp);if(ch=92)/ 如果ch為''則可能為轉(zhuǎn)義字符char ch513="abfntv?

20、'"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:%cfprin tf(fp1,"li ne %d:%cif(ch='d' && isdigit(fgetc(fp) && isdigit(fgetc(fp)fseek(fp,-2,1);prin tf("line %d:%c%cfprin tf(fp1,"l

21、ine %d:%c%cif(ch='x' && isdigit(fgetc(fp) && isdigit(fgetc(fp)/fseek(fp,-2,1);prin tf("line %d:%c%cfprin tf(fp1,"line %d:%c%cif(ch='%') 如果為'%'則可能為%s%c%d%dn",hanjsq,ch,k+33);任意字符轉(zhuǎn)換為三位八進(jìn)制44n",hanjsq,fgetc(fp),fgetc(fp);44n “,hanjsq,fgetc(fp),

22、fgetc(fp);任意字符轉(zhuǎn)換為二位十六進(jìn)制45n",hanjsq,fgetc(fp),fgetc(fp);45n",hanjsq,fgetc(fp),fgetc(fp);ch=fgetc(fp);char bfh4="dcs"for(i=0;i<3;i+)if(bfhi=ch)prin tf("line %d:%cfprin tf(fp1,"line %d:%c83n",hanjsq,ch);83n",hanjsq,ch);/*char ch39="+?=|&!<>"

23、;/定義部分單符號或雙符號(前半部分)集char ch49="+=|&="/定義部分雙符號(后半部分)描其他符號 */if(!isdigit(ch) && !isalpha(ch) && ch!='_' && ch!=” && ch!='/')定義部分單符號集char ch214="#()'*:%A"for(i nt i=0;i<13;i+) /判斷單個符號if(ch=ch2i)prin tf("li ne %d:%c%dn&q

24、uot; ,hanjsq,ch,i+48);fprintf(fp1,"line %d:%c%dn",hanjsq,ch,i+48);for(i nt j=0;j<8;j+) /判斷雙符號if(ch=ch3j)/如果ch與ch3中第j個字符匹配ch=fgetc(fp);/預(yù)讀一位/if(ch=10)hanjsq+;if(ch=ch4j)連起來為一個雙符號/且ch與ch4第j個匹配,則表示 ch3j與ch4jprin tf("li ne %d:%c%c%dn",hanjsq,ch3j,ch4j,i+69);fprin tf(fp1,"li n

25、e %d:%c%c%dn",hanjsq,ch3j,ch4j,i+69);判斷'<<'符if(ch='<' && ch3j='<')prin tf("li ne %d:fprin tf(fp1,"li ne %d:if(ch='>' && ch3j='>')prin tf("li ne %d:fprin tf(fp1,"li ne %d:else/否則表示ch3jprin tf("li n

26、e %d:fprin tf(fp1,"li ne %d:fseek(fp,-1,1);<<<<判斷'>>'符>>>>為單符號,不是雙符號的%c%c77n",hanjsq);77n",hanjsq);78n",hanjsq);78n",hanjsq);部分%dn",hanjsq,ch3j,j+61);%dn" ,hanjsq,ch3j,j+61)*printf(*n");prin tf("*詞法分析結(jié)束prin tf("*

27、分析結(jié)果保存在文件$中prin tf("*歡迎下次使用,謝謝!*n");* n",outfile);*n");printf(*n");fprin tf(fp1,* n");fprin tf(fp1,"*詞法分析結(jié)束* n");fprin tf(fp1,"*歡迎下次使用,謝謝!* n");* n");in t guanjz(char ch1)關(guān)鍵字和標(biāo)識符判斷char ch2329="auto","double","i nt",

28、"struct","break","else","lo ng","switch","case","e num","register","typedef","char","extern","return","u nio n","co nst","float","short", &q

29、uot;un sig ned","co nti nue","for","sig ned","void","default","goto","sizeof',定義關(guān)鍵字集"volatile","do","while","static","if"for(int i=0;i<32;i+)/逐個比對如果為關(guān)鍵字則返回類別i+1if(!strcmp(ch

30、1,ch2i)return i+1;return 47;/否則返回一般標(biāo)識符類竝船悅Q)動勒卜1 Inc1:u4Sline12iniclude4?1 ine1*<b'fline1 =. IliB3linois>hVlliw2sU4Rlima2sinaludo47a Im2?<67line2satAlib.hlinfi2:>GSline3;voidlinemain<17line3:<J. inc3 =>baline3:S31 incSsriLE471 Irte5:limeS;s4?test曹:m曹Entei' t hs outf ile ri之盯日*-¥*< cf Fmqi, txtat waw at it at at ituif at it at u tguit at ac n unit ar at a

溫馨提示

  • 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

提交評論