版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 編譯原理課程設(shè)計(jì)</b></p><p><b> 詞法分析程序</b></p><p> 姓名 : ******* </p><p> 班級(jí) :******************** </p>&l
2、t;p> 學(xué)號(hào) : ************ </p><p> 日期 : 2011-12-30 </p><p><b> 詞法分析程序設(shè)計(jì)</b></p><p><b> 課程設(shè)計(jì)目的:</b></p><p> 運(yùn)用所學(xué)習(xí)的知識(shí)和語言,設(shè)計(jì)編
3、制和調(diào)試一個(gè)具體的詞法分析程序,通過運(yùn)行程序從而加深對(duì)詞法分析的理解。</p><p><b> 課程設(shè)計(jì)要求:</b></p><p> 通過對(duì)PL/0詞法分析程序(GETSYS)的分析,編制一個(gè)具有以下功能的詞法分析程序:</p><p> a.輸入待進(jìn)行詞法分析的源程序,輸出為單詞串,即由(單詞,類別)所組成的二元組序列;</
4、p><p> b.有一定的錯(cuò)誤檢查能力,例如能發(fā)現(xiàn)2a這類不能作為單詞的字符串。</p><p><b> 課程設(shè)計(jì)思路:</b></p><p> 詞法分析所能分辨的符號(hào)有,常數(shù),字符,關(guān)鍵字,界符,運(yùn)算符等類型,設(shè)計(jì)的程序要求可以分辨各種不同的類型,可以運(yùn)用C語言文件操作的功能,導(dǎo)入一個(gè)已經(jīng)存在的文本文件,對(duì)文本文件的內(nèi)容進(jìn)行此法分析,并
5、且把分析結(jié)果導(dǎo)入到另外一個(gè)文件當(dāng)中。</p><p><b> 主要變量說明: </b></p><p> 運(yùn)用C語言的宏定義功能,1~11這十二個(gè)數(shù)字分別用來表示不同的關(guān)鍵字,12代表標(biāo)示符類型ID,13代表常數(shù)類型INT,14代表界符類型JF,15代表運(yùn)算符類型YSF。定義一個(gè)長度為30的數(shù)組,用來存放標(biāo)示符和常量。設(shè)置指向固定文件的指針write和read,
6、用來進(jìn)行對(duì)文件的操作。</p><p><b> 算法描述:</b></p><p> 設(shè)置一個(gè)字符串匹配函數(shù)looksame,對(duì)于以字母開頭的字符串,對(duì)其進(jìn)行與關(guān)鍵字的匹配,如果對(duì)于匹配關(guān)鍵字的字符串,則將字符串識(shí)別為關(guān)鍵字。</p><p> 設(shè)置一個(gè)字符類型和字符串輸出函數(shù)out,把從文件中讀出的字符串,以及它預(yù)定義的類型輸出,同時(shí)
7、將詞法分析的一段結(jié)果輸入到指定文件中,同時(shí)輸出到命令窗口。</p><p> 設(shè)置一個(gè)報(bào)錯(cuò)函數(shù)error,對(duì)于文件中未能夠識(shí)別的字符進(jìn)行報(bào)錯(cuò)處理,輸入報(bào)錯(cuò)信息“書寫格式錯(cuò)誤,未被識(shí)別”。</p><p> 設(shè)置功能函數(shù)function,進(jìn)行具體的詞法分析功能,不斷對(duì)文件中的字符進(jìn)行讀出,按照字符串類型進(jìn)判斷分類,調(diào)用字符串匹配函數(shù)用來識(shí)別關(guān)鍵字,調(diào)用out函數(shù),用來識(shí)別普通的常量以及標(biāo)
8、示符,同時(shí)對(duì)于界符和運(yùn)算符進(jìn)行識(shí)別,同時(shí)輸出到指定的文件中。在本函數(shù)中還設(shè)置了屏蔽注釋內(nèi)容的功能,因?yàn)樽⑨尣⒉粚?shí)際參與程序的運(yùn)行,設(shè)置屏蔽注釋內(nèi)容夫人功能,不把它反映在在此法分析的結(jié)果中。</p><p> 運(yùn)用主函數(shù),對(duì)上面設(shè)置的函數(shù)進(jìn)行調(diào)用,完成具體的詞法分析功能。</p><p><b> F具體的程序代碼:</b></p><p>
9、 /*該語言的關(guān)鍵字 :begin end if then else for do while and or not */</p><p> /*該語言的界符: ; , : , ( , ) , { , }等/</p><p> /*該語言的運(yùn)算符:+,?=,-,*,>,>=,<,<=等/</p><p> #
10、include <stdio.h></p><p> #include <ctype.h></p><p> #include <string.h></p><p> #include <stdlib.h></p><p> #define ID 12</p><p&
11、gt; #define INT 13</p><p> #define JF 14</p><p> #define YSF 15</p><p> #define N 30</p><p> char TOKEN[N];</p><p> FILE *write;</p><p>
12、 int looksame(char *a)</p><p><b> {</b></p><p><b> int i;</b></p><p> Char*key[22]={"begin","end","if","then",&qu
13、ot;else","for","do","while","and","or","not",</p><p> "BEGIN","END","IF","THEN","ELSE",&quo
14、t;FOR","DO","WHILE","AND","OR","NOT"};</p><p> for(i = 0;i < 22;i++)</p><p><b> {</b></p><p> if(strcmp(key[
15、i],a) == 0)/*該字符串是否與關(guān)鍵字相匹配*/</p><p> return (i%11+1);</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><
16、p> /*本函數(shù)的意思是,查詢一個(gè)字符串,看其是否與指定的字符相匹配,如果匹配返回1個(gè)非零的值,如果不匹配,則返回一個(gè)0值*/</p><p> void out(int a,char *b) </p><p><b> {</b></p><p> FILE *write; </p><p>
17、 write = fopen("E:\\b.txt","a+");</p><p> if(write == NULL)</p><p><b> {</b></p><p> printf("文件打開失敗");</p><p><b> e
18、xit(0);</b></p><p><b> }</b></p><p> fprintf(write,"%d\t", a); </p><p> fwrite(b,strlen(b),1,write);</p><p> fprintf(write,"\n"
19、;);</p><p> fclose(write); </p><p> printf("%d %20s\t\t",a,b);</p><p><b> }</b></p><p> //這個(gè)函數(shù)的意思就是吧a輸入到指定文件中,然后從該文件中讀出字符串,放到一個(gè)數(shù)組中輸出//&l
20、t;/p><p> int error()</p><p><b> {</b></p><p> printf("書寫格式錯(cuò)誤,未被識(shí)別\n");</p><p><b> return 0;</b></p><p><b> }<
21、/b></p><p> void function(FILE *fp)</p><p><b> {</b></p><p> char ch=' ';</p><p><b> int i,c;</b></p><p> while(ch!
22、= EOF)</p><p><b> {</b></p><p> ch = fgetc(fp);</p><p> while(ch == ' ' || ch == '\t' || ch == '\n') {</p><p> ch = fgetc
23、(fp);</p><p><b> }</b></p><p> if(isalpha(ch)) //isalpha()判斷是否為英文字母,是則返回非零值,否則返回零值//</p><p><b> {</b></p><p> TOKEN[0] = ch;</p><
24、;p> ch = fgetc(fp);</p><p><b> i = 1;</b></p><p> while(isalnum(ch)) //isalnum()判斷字符是否為英文字母或數(shù)字,如果是則返 回非零值,如果不是則返回零值//</p><p>&l
25、t;b> {</b></p><p> TOKEN[i] = ch;</p><p><b> i++;</b></p><p> ch = fgetc(fp); }</p><p> TOKEN[i] = '\0';</p><p> f
26、seek(fp,-1,1);</p><p> c = looksame(TOKEN);</p><p> if(c == 0)</p><p><b> {</b></p><p> out(ID,TOKEN);printf("標(biāo)示符\n");</p><p><
27、;b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> out(c,TOKEN);printf("關(guān)鍵字\n");</p><p><b> }</b></p&
28、gt;<p><b> }</b></p><p> else if(isdigit(ch)) //isdigit()判斷是否為a0-9的數(shù)字//</p><p><b> {</b></p><p> TOKEN[0] = ch;</p><p>
29、; ch = fgetc(fp);</p><p><b> i = 1;</b></p><p> while(isdigit(ch))</p><p><b> {</b></p><p> TOKEN[i] = ch;</p><p><b>
30、 i++;</b></p><p> ch = fgetc(fp);</p><p><b> }</b></p><p> TOKEN[i] = '\0';</p><p> fseek(fp,-1,1);</p><p> out(INT,TOKEN);&
31、lt;/p><p> printf("常數(shù)\n");</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> switch(ch)</p&g
32、t;<p><b> {</b></p><p> case'+':out(YSF,"+");printf("運(yùn)算符\n");</p><p><b> break;</b></p><p> case'-':out(YSF,&q
33、uot;-");printf("運(yùn)算符\n");</p><p><b> break;</b></p><p> case';':out(JF,";");printf("界符\n");</p><p><b> break;</b>
34、;</p><p> case',':out(JF,",");printf("界符\n");</p><p><b> break;</b></p><p> case'|':out(YSF,"|");printf("運(yùn)算符\n"
35、;);</p><p><b> break;</b></p><p> case'{':out(JF,"{");printf("界符\n");</p><p><b> break;</b></p><p> case'(
36、39;:out(JF,"(");printf("界符\n");</p><p><b> break;</b></p><p> case'!':out(JF,"!");printf("界符\n");</p><p><b> bre
37、ak;</b></p><p> case'^':out(JF,"^");printf("界符\n");</p><p><b> break;</b></p><p> case')':out(JF,")");printf("
38、;界符\n");</p><p><b> break;</b></p><p> case'}':out(JF,"}");printf("界符\n");</p><p><b> break;</b></p><p> ca
39、se'<':ch = fgetc(fp);</p><p> if(ch== '=')</p><p><b> {</b></p><p> out(YSF,"<=");</p><p> printf("運(yùn)算符\n");<
40、;/p><p><b> }</b></p><p> else if(ch== '>')</p><p><b> {</b></p><p> out(YSF,"<>");</p><p> printf(&qu
41、ot;運(yùn)算符\n");</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> fseek(fp,-1,1);</p><p> out(YSF,&qu
42、ot;<");</p><p> printf("運(yùn)算符\n");</p><p><b> }</b></p><p><b> break;</b></p><p> case'=':out(YSF,"=");pri
43、ntf("運(yùn)算符\n");</p><p><b> break;</b></p><p> case'>':ch = fgetc(fp);</p><p> if(ch == '=')</p><p><b> {</b></
44、p><p> out(YSF,">=");</p><p> printf("運(yùn)算符\n");</p><p><b> }</b></p><p><b> else</b></p><p><b> {<
45、/b></p><p> fseek(fp,-1,1);</p><p> out(YSF,">");</p><p> printf("運(yùn)算符\n");</p><p><b> }</b></p><p><b> bre
46、ak;</b></p><p> case':':ch = fgetc(fp);</p><p> if(ch == '=')</p><p><b> {</b></p><p> out(YSF,":=");</p><p&g
47、t; printf("運(yùn)算符\n");</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> fseek(fp,-1,1);</p><p>
48、; out(JF,":");</p><p> printf("界符\n");</p><p><b> }</b></p><p><b> break;</b></p><p> case'/':ch = fgetc(fp);&l
49、t;/p><p> if(ch == '*')</p><p><b> {</b></p><p> out(JF,"/*");</p><p> printf("界符\n");</p><p> while(1) /
50、/ 注釋的內(nèi)容不反應(yīng)在詞法分析中// {</p><p> while(ch != '/')</p><p> ch = fgetc(fp);</p><p> fseek(fp, -2, 1);</p><p> ch = fgetc(fp);</p><p> i
51、f(ch == '*')</p><p><b> {</b></p><p> fseek(fp, 1, 1);</p><p><b> break;</b></p><p><b> }</b></p><p><b&
52、gt; else</b></p><p><b> {</b></p><p> fseek(fp, 2, 1);</p><p> ch = fgetc(fp);</p><p><b> }</b></p><p><b> }</
53、b></p><p> fseek(fp, -2, 1);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> fseek(fp,-1,1);</
54、p><p> out(JF,"/");</p><p> printf("界符\n");</p><p><b> }</b></p><p><b> break;</b></p><p> case'*':ch
55、 = fgetc(fp);</p><p> if(ch == '/')</p><p><b> {</b></p><p> out(JF,"*/");</p><p> printf("界符\n");</p><p><b
56、> }</b></p><p><b> else</b></p><p><b> {</b></p><p> fseek(fp,-1,1);</p><p> out(YSF,"*");</p><p> printf(
57、"運(yùn)算符\n");</p><p><b> }</b></p><p><b> break;</b></p><p> case EOF:break;</p><p> default:error();</p><p><b> b
58、reak;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> int main()
59、</p><p><b> {</b></p><p> FILE *read;</p><p> read = fopen("E:\\a.txt","r");</p><p> write = fopen("E:\\b.txt","a+&qu
60、ot;);</p><p> if(read == NULL)</p><p><b> {</b></p><p> printf("FILE OPEN FAIL!");//</p><p><b> exit(0);</b></p><p>&
61、lt;b> } </b></p><p> printf("===========================================================\n");</p><p> printf("====================詞法分析程序===========================\n&q
62、uot;);</p><p> printf("===========該分析程序的文件存放在D:\\a.txt目錄下==========\n");</p><p> printf("===========該程序的分析結(jié)果存放在D:\\b.txt目錄下===========\n");</p><p> printf(&qu
63、ot;============================================================\n");</p><p> function(read);</p><p> fclose(read);</p><p> system("pause");</p><p><
64、;b> return 0;</b></p><p><b> }</b></p><p> G,文件說明,程序中運(yùn)用的兩個(gè)文件存放在E盤中,文件名為a和b。</p><p><b> 文件a的內(nèi)容為:</b></p><p><b> 程序運(yùn)行的結(jié)果為:<
65、/b></p><p> 文件b在執(zhí)行后的內(nèi)容變?yōu)椋?lt;/p><p><b> 實(shí)驗(yàn)心得體會(huì):</b></p><p> 這次課程設(shè)計(jì)頻繁的使用了C語言中的文件操作函數(shù),對(duì)這方面的知識(shí)有了更加深刻的了解,在設(shè)計(jì)過程中,對(duì)各種函數(shù)的使用也更加熟練,與此同時(shí)對(duì)編譯原理中詞法分析的功能有了更加深刻的了解和認(rèn)識(shí)。由于自己時(shí)間的原因,選擇了一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)詞法分析
- 編譯原理課程設(shè)計(jì)--詞法分析
- 課程設(shè)計(jì)----編譯原理詞法分析器
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理課程設(shè)計(jì)詞法分析器文檔
- 編譯原理課程設(shè)計(jì)報(bào)告之詞法分析器
- 編譯原理課程設(shè)計(jì)--詞法自動(dòng)機(jī)
- 編譯原理詞法分析器語法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)-詞法語法分析器
- c-minus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)
- 編譯原理-詞法分析
- 編譯原理課程設(shè)計(jì)報(bào)告-編譯程序構(gòu)造
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語法分析的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測分析程序的設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測分析程序的設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--pascal語言詞法、語法分析器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 編譯原理遞歸下降子程序課程設(shè)計(jì)報(bào)告
- 編譯原理實(shí)驗(yàn)報(bào)告-詞法分析程序的設(shè)計(jì)與實(shí)現(xiàn)等
評(píng)論
0/150
提交評(píng)論