版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《編譯原理》課程設(shè)計(jì)</p><p> 題 目: 詞法分析器 </p><p> 班 級(jí): 計(jì)算機(jī)科學(xué)系0901班 </p><p> 2012 年 6 月 08 日</p><p><b> 目錄</b></p><p&
2、gt;<b> 1.需求分析1</b></p><p><b> 1.1問題描述1</b></p><p><b> 1.2基本要求1</b></p><p><b> 2.概要設(shè)計(jì)1</b></p><p> 2.1待分析的簡單語言詞法
3、1</p><p><b> 2.2主要函數(shù)2</b></p><p><b> 2.2流程圖:3</b></p><p><b> 3.詳細(xì)設(shè)計(jì)4</b></p><p><b> 4.調(diào)試與分析8</b></p><
4、;p> 4.1解析源文件8</p><p> 4.2調(diào)試與分析9</p><p> 4.3運(yùn)行結(jié)果10</p><p><b> 5.用戶手冊(cè)11</b></p><p> 5.1運(yùn)行環(huán)境11</p><p> 5.2執(zhí)行文件11</p><p&g
5、t;<b> 6.參考文獻(xiàn)12</b></p><p><b> 7.心得體會(huì)12</b></p><p> 8.小組成員任務(wù)分配及工作進(jìn)度安排12</p><p><b> 1.需求分析</b></p><p><b> 1.1問題描述</b&
6、gt;</p><p> 本次課程設(shè)計(jì)旨在是設(shè)計(jì)并實(shí)現(xiàn)一個(gè)具體的詞法分析程序,加深對(duì)詞法分析的原理的理解。該詞法分析程序能輸入源程序并輸出單詞符號(hào)。在掃描源程序字符串時(shí),一旦識(shí)別出關(guān)鍵字、分隔符、標(biāo)識(shí)符、無符號(hào)常數(shù)中之一,即以單詞形式(各類單詞均采用相同的結(jié)構(gòu),即二元式編碼形式)輸出。每次調(diào)用詞法分析程序,它均能自動(dòng)繼續(xù)掃描下去,形成下一個(gè)單詞,直至整個(gè)源程序全部掃描完畢,并形成相應(yīng)的單詞串形式的源程序。<
7、;/p><p><b> 1.2基本要求</b></p><p> 1.對(duì)給定的程序通過詞法分析器能夠識(shí)別一個(gè)個(gè)單詞符號(hào),并以二元式(單詞類型,單詞符號(hào))顯示;</p><p> 2.可以將要分析的程序保存到文件中進(jìn)行讀?。?lt;/p><p> 3.刪除無用的空白字符、回車符、及其它非實(shí)質(zhì)性符號(hào)。</p>
8、<p><b> 2.概要設(shè)計(jì)</b></p><p> 2.1待分析的簡單語言詞法</p><p> (1)關(guān)鍵字"main","void","int","char","printf","scanf","else&quo
9、t;,"if","return"</p><p> (2)運(yùn)算符:"+","-","*","/","="</p><p> (3)界符:"{","}","[","]",
10、";",",",".","(",")",":"</p><p> (4)其他標(biāo)記 如字符串,表示以字母開頭的標(biāo)識(shí)符。(5)空格、回車、換行符跳過。</p><p><b> 2.2主要函數(shù)</b></p><p> i
11、nt IsAlpha(char c)//判斷是否為字母</p><p> int IsNum(char c)//判斷是否為數(shù)字</p><p> int IsKey(char *Word)//識(shí)別關(guān)鍵字函數(shù)</p><p> void scanner(FILE *fp)//掃描函數(shù)</p><p><b> 2.2流程圖:&
12、lt;/b></p><p><b> 3.詳細(xì)設(shè)計(jì)</b></p><p> #include<string.h></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p>
13、#include<ctype.h></p><p> char //定義關(guān)鍵字</p><p> *Key[10]={"main","void","int","char","printf","scanf","else",&qu
14、ot;if","return"};</p><p> char Word[20],ch; // 存儲(chǔ)識(shí)別出的單詞流</p><p> int IsAlpha(char c) //判斷是否為字母</p><p> { </p><p> if
15、(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;</p><p> else return 0;</p><p><b> }</b></p><p> int
16、 IsNum(char c) //判斷是否為數(shù)字</p><p> { </p><p> if(c>='0'&&c<='9') return 1;</p><p> else return 0;</p><p><b> }</b
17、></p><p> int IsKey(char *Word) //識(shí)別關(guān)鍵字函數(shù)</p><p> { </p><p><b> int m,i;</b></p><p> for(i=0;i<9;i++)</p><p><b> {<
18、/b></p><p> if((m=strcmp(Word,Key[i]))==0)</p><p><b> {</b></p><p><b> if(i==0)</b></p><p><b> return 2;</b></p><p
19、><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p
20、><p> void scanner(FILE *fp) //掃描函數(shù)</p><p><b> { </b></p><p> char Word[20]={'\0'};</p><p><b> char ch;</b></p><p>&
21、lt;b> int i,c;</b></p><p> ch=fgetc(fp); //獲取字符,指針fp并自動(dòng)指向下一個(gè)字符</p><p> if(IsAlpha(ch)) //判斷該字符是否是字母</p><p> { </p><p> Word[0]=ch;</p&
22、gt;<p> ch=fgetc(fp);</p><p><b> i=1;</b></p><p> while(IsNum(ch)||IsAlpha(ch)) //判斷該字符是否是字母或數(shù)字</p><p><b> { </b></p><p> Word[i]=
23、ch;</p><p><b> i++;</b></p><p> ch=fgetc(fp);</p><p><b> }</b></p><p> Word[i]='\0'; //'\0' 代表字符結(jié)束(空格)</p><
24、p> fseek(fp,-1,1); //回退一個(gè)字符</p><p> c=IsKey(Word); //判斷是否是關(guān)鍵字</p><p> if(c==0) printf("%s\t$普通標(biāo)識(shí)符\n\n",Word);//不是關(guān)鍵字<
25、/p><p> else if(c==2) printf("%s\t$主函數(shù)\n\n",Word);</p><p> else printf("%s\t$關(guān)鍵字\n\n",Word); //輸出關(guān)鍵字</p><p><b> }</b></p><p>
26、else //開始判斷的字符不是字母</p><p> if(IsNum(ch))</p><p> { //判斷是否是數(shù)字</p><p> Word[0]=ch;</p><p> ch=fgetc(fp);</p><p>&
27、lt;b> i=1;</b></p><p> while(IsNum(ch)){</p><p> Word[i]=ch;</p><p><b> i++;</b></p><p> ch=fgetc(fp);</p><p><b> }</b&
28、gt;</p><p> Word[i]='\0';</p><p> fseek(fp,-1,1); //回退</p><p> printf("%s\t$無符號(hào)實(shí)數(shù)\n\n",Word);</p><p><b> }</b></
29、p><p> else //開始判斷的字符不是字母也不是數(shù)字</p><p><b> {</b></p><p> Word[0]=ch;</p><p> switch(ch){</p><p><b> case'[':</b>&l
30、t;/p><p><b> case']':</b></p><p><b> case'(':</b></p><p><b> case')':</b></p><p><b> case'{':
31、</b></p><p><b> case'}':</b></p><p><b> case',':</b></p><p><b> case'"':</b></p><p> case'
32、;;':printf("%s\t$界符\n\n",Word); break;</p><p> case'+':ch=fgetc(fp);</p><p> Word[1]=ch;</p><p> if(ch=='='){</p><p> printf("%s\
33、t$運(yùn)算符\n\n",Word);//運(yùn)算符“+=”</p><p><b> }</b></p><p> else if(ch=='+'){</p><p> printf("%s\t$運(yùn)算符\n\n",Word); //判斷結(jié)果為“++”</p><p><
34、b> }</b></p><p><b> else {</b></p><p> fseek(fp,-1,1);</p><p> printf("%s\t$運(yùn)算符\n\n",Word); //判斷結(jié)果為“+”</p><p><b> }</b>&
35、lt;/p><p><b> break;</b></p><p> case'-':ch=fgetc(fp);</p><p> Word[1]=ch;</p><p> if(ch=='='){</p><p> printf("%s\t$運(yùn)算符
36、\n\n",Word); }</p><p> else if(ch=='-'){</p><p> printf("%s\t$運(yùn)算符\n\n",Word); //判斷結(jié)果為“--”</p><p><b> }</b></p><p><b>
37、 else {</b></p><p> fseek(fp,-1,1);</p><p> printf("%s\t$運(yùn)算符\n\n",Word); //判斷結(jié)果為“-”</p><p><b> }</b></p><p><b> break;</b>&
38、lt;/p><p><b> case'*':</b></p><p><b> case'/':</b></p><p><b> case'!':</b></p><p> case'=':ch=fgetc
39、(fp);</p><p> if(ch=='='){</p><p> printf("%s\t$運(yùn)算符\n\n",Word);</p><p><b> }</b></p><p><b> else {</b></p><p>
40、; fseek(fp,-1,1);</p><p> printf("%s\t$運(yùn)算符\n\n",Word);</p><p><b> }</b></p><p><b> break;</b></p><p> case'<':ch=fgetc
41、(fp);</p><p> Word[1]=ch;</p><p> if(ch=='='){</p><p> printf("%s\t$運(yùn)算符\n\n",Word); //判斷結(jié)果為運(yùn)算符“<=”</p><p><b> }</b></p><
42、p> else if(ch=='<'){</p><p> printf("%s\t$運(yùn)算符\n\n",Word); //判斷結(jié)果為“<<”</p><p><b> } </b></p><p><b> else {</b></p>&l
43、t;p> fseek(fp,-1,1);</p><p> printf("%s\t$運(yùn)算符\n\n",Word); //判斷結(jié)果為“<”</p><p><b> }</b></p><p><b> break;</b></p><p> case
44、9;>':ch=fgetc(fp); </p><p> Word[1]=ch;</p><p> if(ch=='=') printf("%s\t$運(yùn)算符\n\n",Word);</p><p><b> else {</b></p><p> fseek(fp
45、,-1,1);</p><p> printf("%s\t$運(yùn)算符\n\n",Word);</p><p><b> }</b></p><p><b> break;</b></p><p> case'%':ch=fgetc(fp); </p&g
46、t;<p> Word[1]=ch;</p><p> if(ch=='='){printf("%s\t$運(yùn)算符\n\n",Word);}</p><p> if(IsAlpha(ch)) printf("%s\t$類型標(biāo)識(shí)符\n\n",Word);</p><p><b> e
47、lse {</b></p><p> fseek(fp,-1,1);</p><p> printf("%s\t$取余運(yùn)算符\n\n",Word);</p><p><b> }</b></p><p><b> break;</b></p>&
48、lt;p> default:printf("無法識(shí)別字符!\n\n"); break;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> ma
49、in()</b></p><p><b> { </b></p><p> printf("////////////////////////////////////////////////////////////////////////////////\n\n");</p><p> printf(&qu
50、ot;/**********************************詞法分析器**********************************/\n\n");</p><p> printf("/* 編譯原理課程設(shè)計(jì) */\n\n");</p>
51、<p> printf("/* 0901班 侯陽琳 李彩鳳 蘆光霞 張進(jìn) */\n\n");</p><p> char in_fn[30]; //文件路徑</p><p><b> FILE *fp;</b
52、></p><p> printf("\n請(qǐng)輸入源文件名(包括路徑和后綴名):");</p><p> while(true){</p><p> gets(in_fn);</p><p> //scanf("%s",in_fn);</p><p> if((fp
53、=fopen(in_fn,"r"))!=NULL) break; </p><p> //讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個(gè)字符</p><p> else printf("文件路徑錯(cuò)誤!請(qǐng)重新輸入:");</p><p><b> }</b></p><p
54、> printf("\n******************* 詞法分析結(jié)果如下 *******************\n");</p><p><b> do{</b></p><p> ch=fgetc(fp);</p><p> if(ch=='#') break;
55、//文件以#結(jié)尾,作為掃描結(jié)束條件</p><p> else if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格,空白,和換行</p><p><b> else</b></p><p><b> {</b></p><
56、;p> fseek(fp,-1,1); //回退一個(gè)字節(jié)開始識(shí)別單詞流</p><p> scanner(fp);</p><p><b> }</b></p><p> }while(ch!='#');</p><p> return(0);</p>&
57、lt;p><b> }</b></p><p><b> 4.調(diào)試與分析</b></p><p><b> 4.1解析源文件</b></p><p> void main()</p><p><b> {</b></p>&l
58、t;p><b> int a=3;</b></p><p><b> a+=b;</b></p><p> printf("%d",a); </p><p><b> return;</b></p><p><b> }</b
59、></p><p><b> 4.2調(diào)試與分析</b></p><p> 1.未輸入任何數(shù)據(jù)時(shí),運(yùn)行結(jié)果如下:</p><p> 2.文件輸入錯(cuò)誤時(shí),運(yùn)行結(jié)果如下:</p><p><b> 4.3運(yùn)行結(jié)果</b></p><p><b> 5.用戶
60、手冊(cè)</b></p><p><b> 5.1運(yùn)行環(huán)境</b></p><p> *硬件環(huán)境:多媒體計(jì)算機(jī)。</p><p> *軟件環(huán)境:Windows 2003;Microsoft Visual C++6.0。</p><p><b> 5.2執(zhí)行文件</b></p&g
61、t;<p><b> *詞法.exe</b></p><p><b> 6.參考文獻(xiàn)</b></p><p> 陳火旺.程序設(shè)計(jì)語言編譯原理.北京:國防工業(yè)出版社,2012</p><p> 王磊.編譯原理上機(jī)指導(dǎo).北京:科學(xué)電出版社,2009</p><p> Alfred
62、 V.Aho.編譯原理.北京:機(jī)械工業(yè)出版社,2009</p><p><b> 7.心得體會(huì)</b></p><p> 通過此次實(shí)驗(yàn),讓我們對(duì)實(shí)驗(yàn)原理有更深的理解. 通過該課程設(shè)計(jì),掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務(wù),熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程、構(gòu)造工具及其相關(guān)的技術(shù)對(duì)課本上的知識(shí)有了更深的理解。通過把該算法
63、的內(nèi)容,算法的執(zhí)行順序在計(jì)算機(jī)上實(shí)現(xiàn),把原來以為很深?yuàn)W的書本知識(shí)變的更為簡單,對(duì)實(shí)驗(yàn)原理有更深的理解。了解到如何設(shè)計(jì)、編制并調(diào)試詞法分析程序,加深對(duì)詞法分析原理的理解,熟悉了構(gòu)造詞法分析程序的手工方式的相關(guān)原理,使用C語言直接編寫此法分析程序。另外,也讓我們熟悉了C語言的相關(guān)內(nèi)容,加深了對(duì)C語言的用途的理解。全面系統(tǒng)的理解了編譯原理程序構(gòu)造的一般原理和基本實(shí)現(xiàn)方法。把死板的課本知識(shí)變得生動(dòng)有趣,激發(fā)了學(xué)習(xí)的積極性。把學(xué)過的計(jì)算機(jī)編譯原理
64、的知識(shí)強(qiáng)化,能夠把課堂上學(xué)的知識(shí)通過自己設(shè)計(jì)的程序表示出來,加深了對(duì)理論知識(shí)的理解。</p><p> 8.小組成員任務(wù)分配及工作進(jìn)度安排</p><p> 小組成員:侯陽琳、李彩鳳、蘆光霞、張進(jìn)</p><p> 任務(wù)分配:李彩鳳、張進(jìn)主要負(fù)責(zé)程序編程和調(diào)試</p><p> 侯陽琳、蘆光霞主要負(fù)責(zé)文本輸入、排版工作及心得體會(huì)<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì)----編譯原理詞法分析器
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理課程設(shè)計(jì)詞法分析器文檔
- 編譯原理課程設(shè)計(jì)報(bào)告之詞法分析器
- 編譯原理詞法分析器語法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)-詞法語法分析器
- 詞法分析器設(shè)計(jì)思路
- 詞法分析器設(shè)計(jì)思路
- 詞法分析器設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)--pascal語言詞法、語法分析器設(shè)計(jì)
- 詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)
- 詞法分析器的實(shí)現(xiàn)-c
- 詞法分析器測試報(bào)告
- 詞法分析器lex實(shí)驗(yàn)報(bào)告
- 編譯原理課程設(shè)計(jì)--語法分析器
- 編譯原理語法分析器課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--- 語法分析器
- 編譯原理課程設(shè)計(jì)---語法分析器
- c_minus語言詞法分析器的設(shè)計(jì)
- 基于ANTLR的Gaussian詞法分析器和語法分析器的分析與設(shè)計(jì).pdf
評(píng)論
0/150
提交評(píng)論