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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、計算機科學與工程系編譯原理課程設計實驗報告姓名:_ *_ 學號_ *_ 年級專業(yè)及班級_08計算機科學與技術 成績 實驗名稱詞法分析程序設計與實現(xiàn)完成日期2011/4/12指導教師*實驗目的:能夠采用C編程語言實現(xiàn)簡單的詞法分析程序;設計、編制并調試一個詞法分析程序,加深對詞法分析原理的理解實驗要求: 1. 對單詞的構詞規(guī)則有明確的定義;2. 編寫的分析程序能夠正確識別源程序中的單詞符號; 3. 識別出的單詞以的形式保存在符號表中(鏈表);4. 詞法分析中源程序的輸入以.c格式,分析后的符號表,將二元組保存在.txt文件中。實驗內容:選擇高級語言(C語言),編制它的詞法分析程序。詞法分析程序的

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

3、UM、運算符、界符和關鍵字,詞法分析階段通常被忽略。 (5)注釋被忽略(6)各種單詞符號對應的種別碼(如下):單詞符號種別碼單詞符號種別碼auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29while30static31if32a33b34f35n

4、36t37v3839?4041”42043ddd44 xhh45數(shù)字46標識符47#48(49)505152535455*56:5758%5960+61?62=63|64&65!6668=69=7071!=7273&7481“82%A(A可為dsc)83;84_85/868788899091其他類別99實驗流程圖(由于流程圖過大因此各部分分開寫):整體:掃描注釋:掃描數(shù)字:掃描引號:掃描單詞:掃描其他字符:實驗環(huán)境:需要TC、VC+ 6.0等開發(fā)工具作為本次試驗的環(huán)境。實驗步驟:1、準備: 用TC、VC+等開發(fā)工具;2、對本實驗的任務進行分析,確定實現(xiàn)功能的函數(shù);3、寫好程序,仔細修改函數(shù);4

5、、上機操作:輸入源程序,修改、調試,運行。5、寫好試驗報告。實驗調試過程及測試結果/*源代碼*/#include#include#include #includevoid main()FILE *fp,*fp1;int hanjsq=1;/行計數(shù)器,保存行號int guanjz(char ch1);/關鍵字和標識符判斷char ch,infile15,outfile15;/定義輸入和輸出文件名printf(*Enter the infile name*n);scanf(%s,infile);/輸入需要掃描的文件名printf(*Enter the outfile name*n);scanf(%

6、s,outfile);/輸入需要另存為的文件名if(fp = fopen(infile,r) = NULL)/打開需要掃描的文件printf(cannot open filen);exit(0);if(fp1 = fopen(outfile,w) = NULL)/打開需要存入的文件printf(cannot open filen);exit(0);printf(n*n);printf(* 開始進行詞法分析 *n);printf(*n);printf(n*n);printf(行號字符串種別碼n);printf(*n);fprintf(fp1,*n);fprintf(fp1,行號字符串種別碼n);

7、fprintf(fp1,*n);while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*掃描頭文件單詞及保留字*/if(isalpha(ch) | ch=_)/如果第一個字符為字母或下劃線則判斷為標識符int i=0;char ch130;/假定每個標識符最長為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放到ch1

8、i中并使i自加1ch1i+=ch;if(ch=.)/如果ch為小數(shù)點則判斷是否為頭文件 if(ch=fgetc(fp)=h)/如果小數(shù)點后一位為h則判定其為頭文件if(ch=10)hanjsq+;ch1i+=.;ch1i+=h;ch1i=0;/把結束標志放到ch1i中作為單詞結束標志printf(line %d:%s83n,hanjsq,ch1);/以字符串形式輸出ch1fprintf(fp1,line %d:%s83n,hanjsq,ch1);break;else/如果小數(shù)點后一位不是h則判定其為標識符fseek(fp,-1,1);/fp回退1ch1i=0;/把結束標志放到ch1i中作為單詞

9、結束標志printf(line %d:%s%dn,hanjsq,ch1,guanjz(ch1);/以字符串形式輸出ch1fprintf(fp1,line %d:%s%dn,hanjsq,ch1,guanjz(ch1);break;if(!isalpha(ch) & !isdigit(ch) & ch!=_ & ch!=.)/如果ch不為字母、數(shù)字、下劃線和點時判斷其為標識符ch1i=0;printf(line %d:%s%dn,hanjsq,ch1,guanjz(ch1);fprintf(fp1,line %d:%s%dn,hanjsq,ch1,guanjz(ch1);break;/*掃描數(shù)字

10、*/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);/預讀一位如果ch為數(shù)字和點則循環(huán)輸出if(isdigit(ch) | ch=.)printf(%c,ch);fprintf(fp1,%c,ch);else/否則視為數(shù)字結束printf(46n);fprintf(fp1,46n);fseek(fp,-1,1);/回退一位ch=0;/置ch為0,以免影響下

11、面誤判并順利退出掃描數(shù)字break;if(ch=-)/如果ch為-ch=fgetc(fp);/預讀一位if(ch=-)/如果ch還是為-則判斷為自減符-printf(line %d:-80n,hanjsq);fprintf(fp1,line %d:-80n,hanjsq);if(ch=)/如果ch為,則判斷為結構體運算符-printf(line %d:-81n,hanjsq);fprintf(fp1,line %d:-81n,hanjsq);if(isdigit(ch)/如果ch為數(shù)字則可能為減號或負號fseek(fp,-3,1);/回退3為判斷ch=fgetc(fp);if(isdigit(

12、ch)/如果ch為數(shù)字則判斷-為減號 ch=fgetc(fp);printf(line %d:%c79n,hanjsq,ch);fprintf(fp1,line %d:%c79n,hanjsq,ch);else /否則判斷-為負號ch=fgetc(fp);printf(line %d:%c,hanjsq,ch);fprintf(fp1,line %d:%c,hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/預讀一位如果ch為數(shù)字和點則循環(huán)輸出if(isdigit(ch) | ch=.)printf(%c,ch);fprintf(fp1,%c,ch);else/否則

13、視為數(shù)字結束printf(46n);fprintf(fp1,46n);fseek(fp,-1,1);/回退1break;/*掃描注釋*/if(ch=/)/如果ch為/則可能為注釋ch=fgetc(fp);/讀下一個字符if(ch=10)hanjsq+;if(ch=/)/如果該字符也為/則判斷為注釋一行while(fgetc(fp)!=10);if(ch=10)hanjsq+;/直到遇到換行符出現(xiàn)才認為注釋結束if(ch=*)/如果該字符為*則判斷為注釋多行/直到出現(xiàn)*/才認為注釋結束while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;if(ch=*)/出現(xiàn)

14、*/且接著出現(xiàn)/if(ch=fgetc(fp)=/)break;else/否則原樣輸出/printf(line %d:/83n,hanjsq);fprintf(fp1,line %d:/83n,hanjsq);fseek(fp,-1,1);/回退1break;/*掃描引號*/if(ch=)/出現(xiàn)引號int i=0;printf(line %d:%c82n,hanjsq,ch);fprintf(fp1,line %d:%c82n,hanjsq,ch);printf(line %d:,hanjsq);fprintf(fp1,line %d:,hanjsq);while(!feof(fp)/先整體輸

15、出引號內所有字符并定為第99類ch=fgetc(fp);i+;/用于積累回退長度if(ch=10)hanjsq+;if(ch!=)if(ch!=32)printf(%c,ch);fprintf(fp1,%c,ch);else break;printf(99n);fprintf(fp1,99n);fseek(fp,-i,1);/回退到引號開始for(;i0;i-)ch=fgetc(fp);if(ch=92)/如果ch為則可能為轉義字符char ch513=abfntv?0;/轉義字符集ch=fgetc(fp);/預讀一位for(int k=0;k12;k+)/如果為轉義字符則輸出if(ch=ch

16、5k)printf(line %d:%c%dn,hanjsq,ch,k+33);fprintf(fp1,line %d:%c%dn,hanjsq,ch,k+33);if(ch=d & isdigit(fgetc(fp) & isdigit(fgetc(fp)/任意字符轉換為三位八進制 fseek(fp,-2,1);printf(line %d:%c%c44n,hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,line %d:%c%c44n,hanjsq,fgetc(fp),fgetc(fp);if(ch=x & isdigit(fgetc(fp) & isdigit

17、(fgetc(fp)/任意字符轉換為二位十六進制 fseek(fp,-2,1);printf(line %d:%c%c45n,hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,line %d:%c%c45n,hanjsq,fgetc(fp),fgetc(fp);if(ch=%)/如果為%則可能為%s%c%dch=fgetc(fp);char bfh4=dcs;for(i=0;i3;i+)if(bfhi=ch)printf(line %d:%c83n,hanjsq,ch);fprintf(fp1,line %d:%c83n,hanjsq,ch);/*掃描其他符號*/i

18、f(!isdigit(ch) & !isalpha(ch) & ch!=_ & ch!= & ch!=/)char ch214=#()*:%;/定義部分單符號集char ch39=+?=|&!;/定義部分單符號或雙符號(前半部分)集char ch49=+=|&=;/定義部分雙符號(后半部分)for(int i=0;i13;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;j8;j+)/判斷雙符號if(ch=ch3j)/如果

19、ch與ch3中第j個字符匹配ch=fgetc(fp);/預讀一位/if(ch=10)hanjsq+;if(ch=ch4j)/且ch與ch4第j個匹配,則表示ch3j與ch4j連起來為一個雙符號printf(line %d:%c%c%dn,hanjsq,ch3j,ch4j,i+69);fprintf(fp1,line %d:%c%c%dn,hanjsq,ch3j,ch4j,i+69);if(ch= & ch3j=)/判斷符printf(line %d:77n,hanjsq);fprintf(fp1,line %d: & ch3j=)/判斷符printf(line %d:78n,hanjsq);fprintf(fp1,line %d:78n,hanjsq);else/否則表示ch3j為單符號,不是雙符號的一部分printf(line %d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論