詞法分析器文檔_第1頁
詞法分析器文檔_第2頁
詞法分析器文檔_第3頁
詞法分析器文檔_第4頁
詞法分析器文檔_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、詞法分析程序文檔說明:該詞法分析器實現(xiàn)對C語言源代碼進行詞法分析的功能,由文件輸入,將輸入的源代碼輸出為token序列,用二元組形式由文件和屏幕輸出,文件輸出首先輸入源文件路徑和文件名稱,將注釋過濾,能夠報告不合法字符,并且記錄源代碼的行數(shù),單詞數(shù)(包括關鍵字,標識符和常量)和字符數(shù)(包括字母,數(shù)字,標點符號,運算符,空格和換行符)。程序設計:具體見源代碼源代碼:#include <stdio.h>#include <string>#include <iostream>#include <cstdlib>using namespace std;#

2、define MAX 32char ch =' 'int line=1,zifu=1,word=0;/*line記錄行數(shù)zifu記錄字符數(shù)(包括字母,數(shù)字,標點符號,運算符,空格和換行符)word記錄單詞數(shù)(包括關鍵字,標識符和常量)*/ string key32= "auto","break","case","char","const","continue","default","do","double&qu

3、ot;, "else","enum","extern","float","for","goto","if","int","long","register", "return","short","signed","sizeof","static","struct","sw

4、itch","typedef", "union","unsigned","void","volatile","while" ;/c語言中的所有關鍵字int Iskey(string c) /關鍵字判斷 int i; for(i=0; i<MAX; i+) if(pare(c)=0) /將字符串與關鍵字一一進行比較 return 1; return 0;int IsLetter(char c) /判斷是否為字母 if(c<='z&#

5、39;)&&(c>='a')|(c<='Z')&&(c>='A') return 1; else return 0;int IsDigit(char c) /判斷是否為數(shù)字 if(c>='0'&&c<='9') return 1; else return 0;void analyse(FILE *fpin,FILE *fpout) string arr=""string str="" while(c

6、h=fgetc(fpin)!=EOF) zifu+;/將文件中的字符逐一進行掃描,包括字母,數(shù)字,標點符號,運算符,空格和換行符 arr="" if(IsLetter(ch)/對開頭是字母或數(shù)字的字符串進行判斷 while(IsLetter(ch)|IsDigit(ch)|ch='_')/符合標識符或者關鍵字標準的字符串進行判斷 if(ch<='Z')&&(ch>='A') ch=ch+32; arr=arr+ch;/將每個單個讀取的字符連成字符串 ch=fgetc(fpin); fseek(fpi

7、n,-1L,SEEK_CUR);/不滿足條件的多讀取的字符回退一格 if (Iskey(arr)/判斷字符串是否是關鍵字 fprintf(fpout,"(%s %s)n",arr.c_str(),"key"); printf("(%s %s)n",arr.c_str(),"key");word+; else/字符串不是關鍵字則判定為標識符 fprintf(fpout,"(%s %s)n",arr.c_str(),"id"); printf("(%s %s)n&quo

8、t;,arr.c_str(),"id");word+; else if(IsDigit(ch)/開頭為數(shù)字的串即為常量 while(IsDigit(ch)|ch='.'&&IsDigit(fgetc(fpin) arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); fprintf(fpout,"(%s %s)n",arr.c_str(),"num"); printf("(%s %s)n",arr.c_str(),"num

9、");word+; else switch(ch)/既不是數(shù)字也不是字母的符號判定 case'+': ch=fgetc(fpin);/判定+,+=,+ if(ch='+') fprintf(fpout,"(%s %s)n","+","-"); printf("(%s %s)n","+","-");zifu+; if(ch='=') fprintf(fpout,"(%s %s)n","+=&

10、quot;,"-"); printf("(%s %s)n","+=","-");zifu+; else fprintf(fpout,"(%s %s)n","+","-"); printf("(%s %s)n","+","-"); fseek(fpin,-1L,SEEK_CUR); break; case'-' : ch=fgetc(fpin); if(ch='-')

11、/判定-,-=,- fprintf(fpout,"(%s %s)n","-","-"); printf("(%s %s)n","-","-");zifu+; if(ch='=') fprintf(fpout,"(%s %s)n","-=","-"); printf("(%s %s)n","-=","-");zifu+; else fprint

12、f(fpout,"(%s %s)n","-","-"); printf("(%s %s)n","-","-"); fseek(fpin,-1L,SEEK_CUR); break; case'*' : fprintf(fpout,"(%s %s)n","*","-"); printf("(%s %s)n","*","-"); break; ca

13、se'=' : ch=fgetc(fpin);/判定=,= if(ch='=') fprintf(fpout,"(%s %s)n","=","-"); printf("(%s %s)n","=","-");zifu+; else fprintf(fpout,"(%s %s)n","=","EQ"); printf("(%s %s)n","=",&

14、quot;EQ"); fseek(fpin,-1L,SEEK_CUR); break; case'/' : ch=fgetc(fpin);/判定是注釋還是運算符/ if(ch='*')/形如/* */的注釋,將注釋過濾 zifu-; ch=fgetc(fpin); while(ch!='*')&&(ch=fgetc(fpin)='/') ; else if(ch='/')/形如/的注釋,將注釋過濾 zifu-; ch=fgetc(fpin); while(ch!='n')

15、ch=fgetc(fpin);line+; else fprintf(fpout,"(%s %s)n","/","-"); printf("(%s %s)n","/","-"); fseek(fpin,-1L,SEEK_CUR); break; case '%': fprintf(fpout,"(%s %s)n","%","-"); printf("(%s %s)n","

16、%","-"); break; case '#': fprintf(fpout,"(%s %s)n","#","-"); printf("(%s %s)n","#","-"); break; case '!': ch=fgetc(fpin);/判定!=還是! if(ch='=') fprintf(fpout,"(%s %s)n","!=","-&qu

17、ot;); printf("(%s %s)n","!=","-");zifu+; else fprintf(fpout,"(%s %s)n","!","-"); printf("(%s %s)n","!","-"); fseek(fpin,-1L,SEEK_CUR); break; case '|': ch=fgetc(fpin); if(ch='|')/判定|還是| fprintf(

18、fpout,"(%s %s)n","|","-"); printf("(%s %s)n","|","-");zifu+; else fprintf(fpout,"(%s %s)n","|","-"); printf("(%s %s)n","|","-"); fseek(fpin,-1L,SEEK_CUR); break; case '&

19、9;: ch=fgetc(fpin); if(ch='&')/判定&&還是& fprintf(fpout,"(%s %s)n","&&","-"); printf("(%s %s)n","&&","-");zifu+; else fprintf(fpout,"(%s %s)n","&","-"); printf("(%s

20、 %s)n","&","-"); fseek(fpin,-1L,SEEK_CUR); break; case'(' : fprintf(fpout,"(%s %s)n","(","-"); printf("(%s %s)n","(","-"); break; case')' : fprintf(fpout,"(%s %s)n",")","

21、-"); printf("(%s %s)n",")","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-");

22、 printf("(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case'.' : fprintf(fpout,"(%s %s)n",".","-"); printf(

23、"(%s %s)n",".","-"); break; case',' : fprintf(fpout,"(%s %s)n",",","-"); printf("(%s %s)n",",","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("

24、(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case '"':fprintf(fpout,"(%s %s)n","引號","-"); printf("(%s

25、 %s)n","引號","-"); break; case '?': fprintf(fpout,"(%s %s)n","?","-"); printf("(%s %s)n","?","-"); break; case':' : fprintf(fpout,"(%s %s)n",":","-"); printf("(%s %s

26、)n",":","-"); break; case'>' : ch=fgetc(fpin); if(ch='=')/判定>=還是> fprintf(fpout,"(%s %s)n",">=","GE"); printf("(%s %s)n",">=","GE");zifu+; else fprintf(fpout,"(%s %s)n","

27、;>","GT"); printf("(%s %s)n",">","GT"); fseek(fpin,-1L,SEEK_CUR); break; case'<' : ch=fgetc(fpin);/判定<=還是<還是<> if(ch='=') fprintf(fpout,"(%s %s)n","<=","LE"); printf("(%s %s)n","<=","LE"); zifu+; else if(ch='>') fprintf(fpout,"(%s %s)n","<>","NE"); printf("(%s %s)n","<>","NE"); zifu+; else

溫馨提示

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

評論

0/150

提交評論