編譯原理詞法分析實(shí)驗(yàn)報(bào)告_第1頁(yè)
編譯原理詞法分析實(shí)驗(yàn)報(bào)告_第2頁(yè)
編譯原理詞法分析實(shí)驗(yàn)報(bào)告_第3頁(yè)
編譯原理詞法分析實(shí)驗(yàn)報(bào)告_第4頁(yè)
編譯原理詞法分析實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、詞法分析實(shí)驗(yàn)報(bào)告 學(xué)院:計(jì)算機(jī)科學(xué)與技術(shù) 班級(jí):軟件工程1203班 學(xué)號(hào):1 2 0 8 0 1 0 3 0 3 姓名: 王 青 枝詞法分析實(shí)驗(yàn)報(bào)告一、 題目 詞法分析二、實(shí)驗(yàn)?zāi)康?) 加深對(duì)詞法分析器的工作過(guò)程的理解;2) 加強(qiáng)對(duì)詞法分析方法的掌握;3) 能夠采用一種編程語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的詞法分析程序;4) 能夠使用自己編寫(xiě)的分析程序?qū)?jiǎn)單的程序段進(jìn)行詞法分析。二、 單詞 保留字 運(yùn)算符 界符(表格)1) 編制一個(gè)讀單詞過(guò)程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類(lèi)。2) 依次輸出各個(gè)單詞的內(nèi)部單詞種別及單詞符號(hào)自身值。3) 單詞的文法表示

2、:=;:=|;:=+|-:=*|/:=|#|=:=a|b|X|Y|Z:=0|1|2|8|94) 要求:保留字: 單詞種別碼為1。包括if、int、for、while、do、return、break、continue;標(biāo)識(shí)符: 單詞種別碼為2。常 數(shù): 單詞種別碼為3。(常數(shù)為無(wú)符號(hào)整形數(shù))運(yùn)算符: 單詞種別碼為4。包括+、-、*、/、=、=、=、!= ;分隔符: 單詞種別碼為5。包括,、;、(、);四、實(shí)驗(yàn)要求1實(shí)驗(yàn)環(huán)境要求 在C或C+運(yùn)行環(huán)境中執(zhí)行2. 對(duì)單詞的構(gòu)詞規(guī)則有明確的定義;3. 編寫(xiě)的分析程序能夠正確識(shí)別源程序中的單詞符號(hào);4. 識(shí)別出的單詞以的形式保存在符號(hào)表中;5. 對(duì)于源程序

3、中的詞法錯(cuò)誤,能夠做出簡(jiǎn)單的錯(cuò)誤處理,給出簡(jiǎn)單的錯(cuò)誤提示,保證順利完成整個(gè)源程序的詞法分析;五、詞法分析總體架構(gòu) 大的流程圖 在詞法分析中,先以只讀方式讀取一個(gè)文件,自文件頭開(kāi)始掃描文本,濾去開(kāi)頭的空格、回車(chē)符、換行符等!讀取的字符送入緩沖區(qū)。掃描第一個(gè)字符,看匹配的類(lèi)型,并進(jìn)行相應(yīng)的類(lèi)型分析,滿足判斷類(lèi)型時(shí),輸出其種別碼和值。判斷時(shí)要注意保留字和識(shí)別符之間的不同,單目運(yùn)算符和雙目運(yùn)算符之間的不同。因此可用指針進(jìn)行處理。還必須熟悉字符串函數(shù)的使用。并要對(duì)非法字符作出錯(cuò)誤提示。文本掃描結(jié)束要判斷詞法分析是否成功。最后是關(guān)閉文件,釋放指針。其中:常量、變量、數(shù)據(jù)結(jié)構(gòu)的定義: 本程序中用keywor

4、d數(shù)組來(lái)定義保留字if、int、for、while、do、return、break、continue;用yunsuan數(shù)組來(lái)定義運(yùn)算符+、-、*、/、=、 、=、=、!=;用fenge數(shù)組來(lái)定義分隔符包括:,、;、(、)1- 表示保留字 2-表示標(biāo)識(shí)符 3-表示常數(shù) 4-表示運(yùn)算符 5-表示分隔符Output是輸出函數(shù)。函數(shù)使用:字符函數(shù):int isalpha(int ch)若ch是字母(A-Z,a-z)返回非0值,否則返回0int isalnum(int ch) 若ch是字母(A-Z,a-z)或數(shù)字(0-9)返回非0值,否則返回0int isdigit(int ch) 若ch是數(shù)字(0-9

5、)返回非0值,否則返回0字符串函數(shù):strcmp(const char *s1,const char *s2)比較字符串s1與s2的大小,并返回s1-s2strchr(const char *string, int c)函數(shù)就是在字符串中搜索指定字符。第一個(gè)形參就是要搜索的字符串,第二個(gè)是被搜索的字符。如果找到了該字符就返回該字符第一次出現(xiàn)的內(nèi)存地址。如果沒(méi)有找到就返回NULL(也就是0)。fseek(文件類(lèi)型指針,位移量,起始點(diǎn));起始點(diǎn)指文件開(kāi)頭處,文件當(dāng)前位置,文件尾,分別用0,1,2來(lái)表示 fwrite()讀取字符:讀出單詞的每一個(gè)字符,組成單詞,分析類(lèi)型。讀取單詞前后的多余空白要濾去

6、。程序大的流程圖如下圖:6、 細(xì)化流程圖:七、調(diào)試過(guò)程 抓圖,輸入,輸出,結(jié)果(1)程序無(wú)錯(cuò)誤,正確運(yùn)行時(shí)如下圖:(2)調(diào)試的時(shí)候需要在文件位置建一個(gè)文本文檔wqz.txt文件,內(nèi)容如下:#include void main () int value = 0; while (value !;#define fenge 8char fenfenge=.;();char ch;int i,k;char buff20;void output(int ,char*);void scan(FILE *fp) int j; ch=fgetc(fp); while(ch= |ch=n|ch=t) ch=fg

7、etc(fp); if(isalpha(ch) /*輸入的是字母,進(jìn)行 標(biāo)識(shí)符處理*/ buff0=ch; i=1; ch=fgetc(fp); while(isalnum(ch) /*如果是字母數(shù)字則組合,否則結(jié)束*/ buffi=ch; i+; ch=fgetc(fp); buffi=0; /*查找保留字*/ fseek(fp,-1,1); j=0; while(j=keyword) output(2,buff); else output(1,buff); else if(isdigit(ch) buff0=ch; ch=fgetc(fp); i=1; while(isdigit(ch)

8、/*如果是數(shù)字則整合數(shù)字*/ buffi=ch; i+; ch=fgetc(fp); buffi=0; /*整數(shù)整合結(jié)束*/ fseek(fp,-1,1); output(3,buff); else if(strchr(fen,ch)0) /*判斷分隔符*/ buff0=ch; ch=fgetc(fp); buff1=0; fseek(fp,-1,1); output(5,buff);else if(strchr(yun,ch)0) /*判斷運(yùn)算符*/ buff0=ch; if(ch=) /*雙運(yùn)算符*/ ch=fgetc(fp); if(ch=) output(4,=); else fsee

9、k(fp,-1,1); output(4,=); else if(ch=) ch=fgetc(fp); if(ch=) output(4,=); else fseek(fp,-1,1); output(4,); else if(ch=) ch=fgetc(fp); if(ch=) output(4,=); else fseek(fp,-1,1); output(4,); else if(ch=!) ch=fgetc(fp); if(ch=) output(4,!=); else fseek(fp,-1,1); output(0,error!); else ch=fgetc(fp); buff1

10、=0; fseek(fp,-1,1); output(4,buff);else /*無(wú)法識(shí)別的字符*/ buff0=ch; buff1=0; ch=fgetc(fp); fseek(fp,-1,1); printf(t非法字符%sn,buff);void save()FILE *out; out=fopen(out.txt,w+); while (gets(buff) fprintf(out,%sn,ch); fclose(out);void output(int n,char *m) /*輸出格式*/ printf(n,n,m);void main()FILE *fp; char filename20;printf(數(shù)據(jù)類(lèi)型定義規(guī)則:n); printf(保留字-1 標(biāo)識(shí)符-2 常數(shù)-3 運(yùn)算符-4 分隔符-5n); printf(please input the file name which you want to open: ); scanf(%s,&filename); fp=fopen(filename,r); /*以只讀方式打開(kāi)指定文件*/ if(fp=fopen(filename,r)=NULL) /*文件不存在輸出錯(cuò)誤*/ printf(File does not exist!check it

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論