




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1. 實驗?zāi)康募耙?本次實驗通過用C語言 設(shè)計、編制、調(diào)試一個詞法分析子程序,識別單詞,實現(xiàn)一個C語言詞法分析器,經(jīng)過此過程可以加深對編譯器解析單詞流的過程的了解。運行環(huán)境:硬件:windows xp軟件:visual c+6.02. 實驗步驟1. 查詢資料,了解詞法分析器的工作過程與原理。2. 分析題目,整理出基本設(shè)計思路。3. 實踐編碼,將設(shè)計思想轉(zhuǎn)換用c語言編碼實現(xiàn),編譯運行。4.測試功能,多次設(shè)置包含不同字符,關(guān)鍵字的待解析文件,仔細察看運行結(jié)果,檢測該分析器的分析結(jié)果是否正確。通過最終的測試發(fā)現(xiàn)問題,逐漸完善代碼中設(shè)置的分析對象與關(guān)鍵字表,拓寬分析范圍提高分析能力。3. 實驗內(nèi)容
2、本實驗中將c語言單詞符號分成了四類:關(guān)鍵字key(特別的將main說明為主函數(shù))、普通標示符、常數(shù)和界符。將關(guān)鍵字初始化在一個字符型指針數(shù)組*key中,將界符分別由程序中的case列出。在詞法分析過程中,關(guān)鍵字表和case列出的界符的內(nèi)容是固定不變的(由程序中的初始化確定),因此,從源文件字符串中識別出現(xiàn)的關(guān)鍵字,界符只能從其中選取。標識符、常數(shù)是在分析過程中不斷形成的。對于一個具體源程序而言,在掃描字符串時識別出一個單詞,若這個單詞的類型是關(guān)鍵字、普通標示符、常數(shù)或界符中之一,那么就將此單詞以文字說明的形式輸出每次調(diào)用詞法分析程序,它均能自動繼續(xù)掃描下去,形成下一個單詞,直到整個源程序全部掃
3、描完畢,從而形成相應(yīng)的單詞串。輸出形式例如:void $關(guān)鍵字流程圖 、程序流程圖:程序:#include#include#include#include /定義關(guān)鍵字char *Key10=main,void,int,char,printf,scanf,else,if,return;char Word20,ch; / 存儲識別出的單詞流int IsAlpha(char c) /判斷是否為字母if(c=a)|(c=A) return 1;else return 0; int IsNum(char c) /判斷是否為數(shù)字if(c=0&c=9) return 1;else return 0;int
4、 IsKey(char *Word) /識別關(guān)鍵字函數(shù)int m,i;for(i=0;i9;i+)if(m=strcmp(Word,Keyi)=0)if(i=0)return 2;return 1; return 0;void scanner(FILE *fp) /掃描函數(shù)char Word20=0;char ch;int i,c;ch=fgetc(fp); /獲取字符,指針fp并自動指向下一個字符if(IsAlpha(ch) /判斷該字符是否是字母Word0=ch;ch=fgetc(fp);i=1;while(IsNum(ch)|IsAlpha(ch) /判斷該字符是否是字母或數(shù)字Wordi
5、=ch;i+;ch=fgetc(fp); Wordi=0; /0 代表字符結(jié)束(空格)fseek(fp,-1,1); /回退一個字符c=IsKey(Word); /判斷是否是關(guān)鍵字if(c=0) printf(%st$普通標識符nn,Word);/不是關(guān)鍵字else if(c=2) printf(%st$主函數(shù)nn,Word);else printf(%st$關(guān)鍵字nn,Word); /輸出關(guān)鍵字 else /開始判斷的字符不是字母 if(IsNum(ch) /判斷是否是數(shù)字 Word0=ch; ch=fgetc(fp); i=1; while(IsNum(ch) Wordi=ch; i+;
6、ch=fgetc(fp); Wordi=0; fseek(fp,-1,1); /回退 printf(%st$無符號實數(shù)nn,Word); else /開始判斷的字符不是字母也不是數(shù)字 Word0=ch; switch(ch) case: case: case(: case): case: case: case,: case: case;:printf(%st$界符nn,Word); break; case+:ch=fgetc(fp); Word1=ch; if(ch=) printf(%st$運算符nn,Word);/運算符“+=” else if(ch=+) printf(%st$運算符nn
7、,Word); /判斷結(jié)果為“+” else fseek(fp,-1,1); printf(%st$運算符nn,Word); /判斷結(jié)果為“+” break; case-:ch=fgetc(fp); Word1=ch; if(ch=) printf(%st$運算符nn,Word); else if(ch=-) printf(%st$運算符nn,Word); /判斷結(jié)果為“-” else fseek(fp,-1,1); printf(%st$運算符nn,Word); /判斷結(jié)果為“-” break; case*: case/: case!: case=:ch=fgetc(fp); if(ch=)
8、 printf(%st$運算符nn,Word); else fseek(fp,-1,1); printf(%st$運算符nn,Word); break; case:ch=fgetc(fp); Word1=ch; if(ch=) printf(%st$運算符nn,Word); /判斷結(jié)果為運算符“=” else if(ch=) printf(%st$運算符nn,Word); /判斷結(jié)果為“” else fseek(fp,-1,1); printf(%st$運算符nn,Word); /判斷結(jié)果為“:ch=fgetc(fp); Word1=ch; if(ch=) printf(%st$運算符nn,W
9、ord); else fseek(fp,-1,1); printf(%st$運算符nn,Word); break; case%:ch=fgetc(fp); Word1=ch; if(ch=)printf(%st$運算符nn,Word); if(IsAlpha(ch) printf(%st$類型標識符nn,Word); else fseek(fp,-1,1); printf(%st$取余運算符nn,Word); break; default:printf(無法識別字符!nn); break; main()char in_fn30; /文件路徑 FILE *fp; printf(n請輸入源文件名(
10、包括路徑和后綴名):); while(1)gets(in_fn);/scanf(%s,in_fn); if(fp=fopen(in_fn,r)!=NULL) break; /讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個字符 else printf(文件路徑錯誤!請重新輸入:); printf(n* 詞法分析結(jié)果如下 *n); do ch=fgetc(fp); if(ch=#) break; /文件以#結(jié)尾,作為掃描結(jié)束條件 else if(ch= |ch=t|ch=n) /忽略空格,空白,和換行 else fseek(fp,-1,1); /回退一個字節(jié)開始識別單詞流 scanner(f
11、p); while(ch!=#); return(0);4. 實驗結(jié)果解析源文件:void main() int a=3; a+=b; printf(%d,a); return;#解析結(jié)果:5. 實驗總結(jié)分析通過本次實驗,讓再次瀏覽了有關(guān)c語言的一些基本知識,特別是對文件,字符串進行基本操作的方法。C語言中沒有string類型,因此本實驗中的對字符串提取與識別均借助#include及字符型數(shù)組來實現(xiàn)。讓我練習(xí)對字符串函數(shù)應(yīng)用的同時也提高了自己的邏輯思維能力。 在本次實驗中,我糾正了一個一直以來的概念錯誤:main不是關(guān)鍵字,它定義為程序的入口,是主函數(shù)!在本實驗中,雖然我把main初始化在關(guān)鍵字表(字符指針類型數(shù)組)*Key10中,當與該數(shù)組中字符串進行比較時,若
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房產(chǎn)代持合同協(xié)議書范本
- 汽車內(nèi)飾配件采購合同
- 離婚后住房分配合同樣本
- 二手施工設(shè)備購銷合同
- 家族遺產(chǎn)分配合同
- 借款擔(dān)保反擔(dān)保合同樣本
- 學(xué)校裝修合同案例
- 門面房屋買賣合同
- 太陽能發(fā)電政策考核試卷
- 新材料在新能源領(lǐng)域的應(yīng)用考核試卷
- 中央2025年中國科協(xié)所屬單位招聘社會在職人員14人筆試歷年參考題庫附帶答案詳解-1
- 殯儀服務(wù)員職業(yè)技能鑒定考試題(附答案)
- 電動葫蘆吊裝方案計劃
- 2025年山東電工電氣集團招聘筆試參考題庫含答案解析
- 造價咨詢服務(wù)方案進度計劃安排及保證措施
- 2024年認證行業(yè)法律法規(guī)及認證基礎(chǔ)知識 CCAA年度確認 試題與答案
- 2024年濰坊工程職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- JIS C9335-1-2014 家用和類似用途電器.安全性.第1部分:通用要求
- 甲溝炎治療的護理與預(yù)防
- 哈工大微電子工藝緒論01單晶硅
- 供養(yǎng)直系親屬有關(guān)文件
評論
0/150
提交評論