




版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公安警察申論試題及答案
- 合同換貨協(xié)議書模板圖片
- 合同協(xié)議書如何蓋章圖片
- 2025屆山西省臨汾市高三三模歷史試題(含答案)
- 2025年北京市商業(yè)店鋪租賃合同
- 2025年能源行業(yè)新風口:儲能技術多元化發(fā)展路徑與格局分析報告
- 零售行業(yè)的嵌入式解決方案試題及答案
- 軟件測試工具的實踐應用經(jīng)驗試題及答案
- 信息系統(tǒng)監(jiān)理師備考清單與試題答案解析
- 軟件測試工程師應對考試的技巧試題及答案
- 生產(chǎn)良率系統(tǒng)統(tǒng)計表
- 用TOC理論提高生產(chǎn)制造的競爭力課件
- SketchUp (草圖大師) 基礎培訓PPT課件
- 生命線安裝方案
- 代理機構服務質(zhì)量考核評價表
- 淺談打擊樂器在小學低段音樂課堂中的運用
- 電廠保安人員管理制度
- 2018年瀘州市生物中考試題含答案
- ge核磁共振機房專用精密空調(diào)機技術要求
- 新干縣人民醫(yī)院血液透析治療患者告知書
- 消防電氣檢驗批質(zhì)量驗收記錄表
評論
0/150
提交評論