版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、詞法分析程序文檔說明:該詞法分析器實現(xiàn)對C語言源代碼進行詞法分析的功能,由文件輸入,將輸入的源代碼輸出為token序列,用二元組形式由文件和屏幕輸出,文件輸出首先輸入源文件路徑和文件名稱,將注釋過濾,能夠報告不合法字符,并且記錄源代碼的行數(shù),單詞數(shù)(包括關鍵字,標識符和常量)和字符數(shù)(包括字母,數(shù)字,標點符號,運算符,空格和換行符)。程序設計:具體見源代碼源代碼:#include #include #include #include using namespace std;#define MAX 32char ch = ;int line=1,zifu=1,word=0;/*line記錄行數(shù)z
2、ifu記錄字符數(shù)(包括字母,數(shù)字,標點符號,運算符,空格和換行符)word記錄單詞數(shù)(包括關鍵字,標識符和常量)*/ string key32= auto,break,case,char,const,continue,default,do,double, else,enum,extern,float,for,goto,if,int,long,register, return,short,signed,sizeof,static,struct,switch,typedef, union,unsigned,void,volatile,while ;/c語言中的所有關鍵字int Iskey(stri
3、ng c) /關鍵字判斷 int i; for(i=0; iMAX; i+) if(pare(c)=0) /將字符串與關鍵字一一進行比較 return 1; return 0;int IsLetter(char c) /判斷是否為字母 if(c=a)|(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(ch=
4、fgetc(fpin)!=EOF) zifu+;/將文件中的字符逐一進行掃描,包括字母,數(shù)字,標點符號,運算符,空格和換行符 arr=; if(IsLetter(ch)/對開頭是字母或數(shù)字的字符串進行判斷 while(IsLetter(ch)|IsDigit(ch)|ch=_)/符合標識符或者關鍵字標準的字符串進行判斷 if(ch=A) ch=ch+32; arr=arr+ch;/將每個單個讀取的字符連成字符串 ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR);/不滿足條件的多讀取的字符回退一格 if (Iskey(arr)/判斷字符串是否是關鍵字 fprint
5、f(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,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)
6、; fprintf(fpout,(%s %s)n,arr.c_str(),num); printf(%s %s)n,arr.c_str(),num);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,+=,-); printf(%s %s)n,+=,-);zifu+; else fprintf(fpout,(%s
7、%s)n,+,-); printf(%s %s)n,+,-); fseek(fpin,-1L,SEEK_CUR); break; case- : ch=fgetc(fpin); if(ch=-)/判定-,-=,- fprintf(fpout,(%s %s)n,-,-); printf(%s %s)n,-,-);zifu+; if(ch=) fprintf(fpout,(%s %s)n,-=,-); printf(%s %s)n,-=,-);zifu+; else fprintf(fpout,(%s %s)n,-,-); printf(%s %s)n,-,-); fseek(fpin,-1L,S
8、EEK_CUR); break; case* : fprintf(fpout,(%s %s)n,*,-); printf(%s %s)n,*,-); break; case= : 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,=,EQ); fseek(fpin,-1L,SEEK_CUR); break; case/ : ch=fgetc(fpin);/判定是注釋還是運算符
9、/ if(ch=*)/形如/* */的注釋,將注釋過濾 zifu-; ch=fgetc(fpin); while(ch!=*)&(ch=fgetc(fpin)=/) ; else if(ch=/)/形如/的注釋,將注釋過濾 zifu-; ch=fgetc(fpin); while(ch!=n) 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,%,-); print
10、f(%s %s)n,%,-); break; case #: fprintf(fpout,(%s %s)n,#,-); printf(%s %s)n,#,-); break; case !: ch=fgetc(fpin);/判定!=還是! if(ch=) fprintf(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 |: ch=fgetc(fpin); if
11、(ch=|)/判定|還是| fprintf(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 &: ch=fgetc(fpin); if(ch=&)/判定&還是& fprintf(fpout,(%s %s)n,&,-); printf(%s %s)n,&,-);zifu+; else fprintf(fpout,(%s %s)n,&,-); printf(%s %s
12、)n,&,-); fseek(fpin,-1L,SEEK_CUR); break; case( : fprintf(fpout,(%s %s)n,(,-); printf(%s %s)n,(,-); break; case) : fprintf(fpout,(%s %s)n,),-); printf(%s %s)n,),-); break; case : fprintf(fpout,(%s %s)n,-); printf(%s %s)n,-); break; case : fprintf(fpout,(%s %s)n,-); printf(%s %s)n,-); break; case; :
13、fprintf(fpout,(%s %s)n,;,-); printf(%s %s)n,;,-); break; case. : fprintf(fpout,(%s %s)n,.,-); printf(%s %s)n,.,-); break; case, : fprintf(fpout,(%s %s)n,-); printf(%s %s)n,-); break; case : fprintf(fpout,(%s %s)n,-); printf(%s %s)n,-); break; case : fprintf(fpout,(%s %s)n,-); printf(%s %s)n,-); brea
14、k; case :fprintf(fpout,(%s %s)n,引號,-); printf(%s %s)n,引號,-); break; case ?: fprintf(fpout,(%s %s)n,?,-); printf(%s %s)n,?,-); break; case: : fprintf(fpout,(%s %s)n,:,-); printf(%s %s)n,:,-); break; case : ch=fgetc(fpin); if(ch=)/判定=還是 fprintf(fpout,(%s %s)n,=,GE); printf(%s %s)n,=,GE);zifu+; else fp
15、rintf(fpout,(%s %s)n,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,) fprintf(fpout,(%s %s)n,NE); printf(%s %s)n,NE); zifu+; else fprintf(fpout,(%s %s)n,LT); printf(%s %s)n,LT); fseek(fpin,-1L,SEEK_CUR); break; case : break; case n: line+;/每讀到n,記錄行數(shù) break; default : fprintf(fpout,(%c %s)n,ch,不合法); printf(%c %s)n,ch,不合法); break; int main() char in_fn30; FILE * fpin,*fpout; fpout = fopen(playov
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高三數(shù)學(理)一輪總復習:第九篇 統(tǒng)計與算法 含解析
- 離婚合同小說全文在線閱讀下載
- 個人汽車租賃簡單合同
- 路燈承包合同
- 軟件開發(fā)簽約合同
- pso算法讀書筆記
- 屋頂翻修安全合同模板
- 醫(yī)療行業(yè)的市場拓展經(jīng)驗總結(jié)
- 2025年人教五四新版選修歷史下冊月考試卷含答案
- 2025年新世紀版九年級生物下冊月考試卷含答案
- 地震應急救援培訓課件
- 初中物理光學難題難度含解析答案
- 《霍爾效應測量磁場》課件
- 《瘋狂動物城》全本臺詞中英文對照
- 中專數(shù)學(基礎模塊)上冊課件
- 高考作文復習任務驅(qū)動型作文的審題立意課件73張
- 品質(zhì)部經(jīng)理KRA KPI考核表
- 《馬克思主義與社會科學方法論》授課教案
- 一個28歲的漂亮小媳婦在某公司打工-被老板看上之后
- 馬工程教育哲學課件第十章 教育哲學與教師發(fā)展
- GB/T 11376-2020金屬及其他無機覆蓋層金屬的磷化膜
評論
0/150
提交評論