編譯原理設(shè)計(jì)c語言的詞法分析器_第1頁
編譯原理設(shè)計(jì)c語言的詞法分析器_第2頁
編譯原理設(shè)計(jì)c語言的詞法分析器_第3頁
編譯原理設(shè)計(jì)c語言的詞法分析器_第4頁
編譯原理設(shè)計(jì)c語言的詞法分析器_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、-. z.編譯原理課程設(shè)計(jì)報(bào)告題目:學(xué)院:教師:*:班級(jí):評(píng)分:簽字:-. z.編譯原理課程設(shè)計(jì)一:設(shè)計(jì)c語言的詞法分析器一、實(shí)驗(yàn)?zāi)康牧私飧呒?jí)語言單詞的分類,了解狀態(tài)圖以及如何表示并識(shí)別單詞規(guī)則,掌握狀態(tài)圖到識(shí)別程序的編程,加深對詞法原理的理解。二、實(shí)驗(yàn)要求了解高級(jí)語言單詞的分類,了解狀態(tài)圖以及如何表示并識(shí)別單詞規(guī)則,掌握狀態(tài)圖到識(shí)別程序的編程。三、實(shí)驗(yàn)設(shè)計(jì)3.1單詞分類及表示3.1.1 C語言的子集分類標(biāo)識(shí)符:以字母開頭的字母數(shù)字串整數(shù)或浮點(diǎn)型。保存字:for,while,do,else,if,static,int,sizeof,break,continue運(yùn)算符:+,-,*,/,%,=,!

2、=,=,=,!,&,&,|;界符:(,),:,;,單詞二元組單詞、單詞自身值單詞標(biāo)識(shí)符1整數(shù)或浮點(diǎn)型2保存字3運(yùn)算符4界符53.2 詞法分析器的設(shè)計(jì)算法設(shè)計(jì)概要設(shè)計(jì)從文件中逐個(gè)讀取字符,只要這五大類的狀態(tài)序列則繼續(xù)讀取,否則回退字符,在對應(yīng)類別進(jìn)展查找,輸出單元二次組至另一文件夾。狀態(tài)圖設(shè)計(jì)輸入輸出設(shè)計(jì)輸入:通過文件指針從文件中一個(gè)一個(gè)讀取字符輸出:輸出單詞二元組至文件。格式為種別碼,值主要函數(shù)void Getchar(FILE *fp ) /讀入一個(gè)字符void GetBC(FILE *fp)/讀入一個(gè)非空字符void contacat()/連接字符int letter()/判斷是否為字母i

3、nt digit()/判斷是否為字母void retract(FILE *fp,char *c)/回退int reserve (char *k)/處理保存字int sysmbol(identifier *id)/處理標(biāo)識(shí)符,查找符號(hào)表并存放位置假設(shè)沒有則添加int constant(constnumber *con)/存入常數(shù)表,并返回它在常數(shù)表中的位置void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)/寫到文件void WordAnalyze(char *k,char *c, char *CODE

4、, identifier *id, constnumber *con, FILE *fp, FILE *fw)/詞法分析函數(shù)四、結(jié)果測試文件輸入int main() int a=1,b=3; if(a1) b=b-2;輸出結(jié)果:結(jié)論:程序輸出結(jié)果與期望輸出結(jié)果相符。收獲與感想通過我本次課程設(shè)計(jì)掌握了詞法分析器設(shè)計(jì)的根本方法與相關(guān)知識(shí)。詞法分析的關(guān)鍵是明確各類字符的狀態(tài)轉(zhuǎn)換過程。同時(shí)輔助標(biāo)識(shí)符、常量構(gòu)造體與保存字表用于查找返回值。同時(shí)我也對分析問題解決問題有了更深入全面的認(rèn)識(shí)與理解。面對一個(gè)大的問題,需要理清解決的步驟再將其分解成小的模塊逐個(gè)解決最后再串聯(lián)在一起,問題就會(huì)變得更容易,思路也會(huì)更加

5、清晰。五、實(shí)驗(yàn)代碼#includeusing namespace std;#define LENGTH 10char ch;char *CODE = identifier,constant,keyword/*保存字*/,+,-,*,/,=,!=,=,=,(,),:,;, ;char *k = for,while,do,else,if,static,int,sizeof,break,continue ;/保存字char token16;/存放處理后的字符串/標(biāo)識(shí)符構(gòu)造體typedef structchar *I256;int len;identifier;typedef structint co

6、nt300;int len;constnumber;/讀入一個(gè)字符void Getchar(FILE *fp ) if (ch = getc(fp) = EOF)e*it(1);/讀入一個(gè)非空字符void GetBC(FILE *fp)while (ch = | ch = n | ch = 9)Getchar(fp);/連接字符void contacat()char * cht = &(ch);strcat_s(token, cht);/判斷是否為字母int letter()returnisalpha(ch);int digit()return isdigit(ch);/回退void retr

7、act(FILE *fp,char *c)int a=ftell(fp);fseek(fp,0,SEEK_SET);fprintf_s(fp, %c, ch);ch = ;fseek(fp, a, SEEK_SET);/處理保存字int reserve (char *k)int i;for (i = 0;i LENGTH;i+)if (strcmp(token, ki) = 0)return (i + 1);return 0;/處理標(biāo)識(shí)符,查找符號(hào)表并存放位置假設(shè)沒有則添加int sysmbol(identifier *id)int i;for (i = 0;i len;i+)if (strc

8、mp(token, id-Ii) = 0)return i + 1;if (id-len 256)cout Iid-len = token;id-len+;return id-len;/數(shù)字字符串轉(zhuǎn)化為整數(shù)int str_to_num()int i=0;int k = tokeni-0;for (i = 1;tokeni != 0;i+)k = k * 10 + tokeni - 0;return k;/存入常數(shù)表,并返回它在常數(shù)表中的位置int constant(constnumber *con)con-contcon-len = str_to_num();con-len+;return c

9、on-len;/寫到文件void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)int num_ = num;fprintf_s(fw, (%d,num);if (num = 4)fprintf_s(fw,%s, CODEnum-1);if (num Ival - 1);break;case 2:fprintf_s(fw, %d, con-contval - 1);break;case 3:fprintf_s(fw, %s, kval - 1);break;fprintf_s(fw, )n);void e

10、rror(FILE *fw)cout (Error, ch ) = A&ch = a&ch = z) /分析標(biāo)識(shí)符和保存字/假設(shè)字符為AZ或09,則繼續(xù)讀取while (letter() | digit()contacat();Getchar(fp);retract(fp, c);num = reserve(k);if (num != 0)Tofile(3, num, id, con,fw);elseval = sysmbol(id);Tofile(1, val, id, con,fw);else if (digit()/處理常數(shù)while (digit()contacat();Getchar

11、(fp);retract(fp,c);val = constant(con);Tofile(2, val, id, con,fw);else /分析符號(hào)switch (ch) case:Getchar(fp);if (ch = =)Tofile(11, 0, id, con,fw);elseretract(fp,c);Tofile(10, 0, id, con,fw);break;case=:Getchar(fp);if (ch = =)Tofile(13, 0, id, con,fw);elseretract(fp,c);Tofile(14, 0, id, con,fw);break;cas

12、e!:Getchar(fp);if (ch = =)Tofile(12, 0, id, con,fw);elseerror(fw);break;case+:Tofile(4, 0, id, con,fw);break;case-:Tofile(5, 0, id, con,fw);break;case*:Tofile(6, 0, id, con,fw);break;case/:Tofile(7, 0, id, con, fw);break;case(:Tofile(15, 0, id, con, fw);break;case):Tofile(16, 0, id, con, fw);break;c

13、ase,:Tofile(17, 0, id, con, fw);break;case:Tofile(18, 0, id, con, fw);break;case;:Tofile(19, 0, id, con, fw);break;case:Tofile(20, 0, id, con, fw);break;case:Tofile(21, 0, id, con, fw);break;default:error(fw);int main()char c100 = F:/1.t*t;FILE *fp,*fw;errno_t err;err = fopen_s(&fp, c, r);if (err != 0)printf(Thefile was not openedn);e*it(0);errno_t err1;err1 = fopen_s(&fw, F:/2.t*t, w);if (err1 != 0)printf(Thefile was not openedn);e*it(0);identifier *id=(identifier *)malloc(sizeof(identifier);id-len

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論