東北大學(xué)編譯原理實驗_第1頁
東北大學(xué)編譯原理實驗_第2頁
東北大學(xué)編譯原理實驗_第3頁
東北大學(xué)編譯原理實驗_第4頁
東北大學(xué)編譯原理實驗_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上編譯原理程序設(shè)計實驗報告實驗題目班級:計算機1507班 姓名:羅藝博學(xué)號:一、實驗?zāi)繕耍涸~法分析掃描器的設(shè)計實現(xiàn)。在程序源文件中輸入類C語言程序源文件,設(shè)計詞法分析掃描器,并以TOKEN類別碼序列的形式輸出掃描結(jié)果。二、實驗內(nèi)容:1.概要設(shè)計:將程序大致分為:主函數(shù)、識別器(有限自動機state_change)、詞法分析器(state_to_code)三大部分。其中,主函數(shù)所完成的功能為:打開、讀取、關(guān)閉文件(即C語言源程序),重置token串等。識別器的功能為:識別字符,完成token串的生成,判斷詞法錯誤等。詞法分析器的功能為:生成token類別碼,判斷token

2、是否出錯等。主函數(shù)、識別器、詞法分析器關(guān)系圖2.流程圖詞法分析掃描器流程圖3.關(guān)鍵函數(shù)a. 識別器(有限自動機state_change)int state_change(state,ch) /識別器,有限自動機if(ch = ) | (ch = t) | (ch = n)/略去空格、TAB、換行 return 0; else if(IsAlpha(ch) = 1) | (ch = _)/判斷是否為字母或_,從而判斷是關(guān)鍵字、標識符、CT字符還是ST字符串 if(state = 1) return 2; else if(state = 2) return 2; else if(state = 7

3、) return 8; else if(state = 8) return 8; else if(state = 10) return 11; else if(state = 11) return 11; else if(state = 6)/考慮與PT相連的情況 state_to_code(state_before,token); i = 0; memset(token,0,10); return 2; else return -1; else if(IsNum(ch) = 1)/判斷是否為數(shù)字,從而進一步判斷是為IT,CT,KT if(state = 1) return 3; else i

4、f(state = 2) return 2; else if(state = 3) return 3; else if(state = 4) return 4; else if(state = 5) return 5; else if(state = 6)/考慮與PT相連的情況 state_to_code(state_before,token); i = 0; memset(token,0,10); return 3; else return -1; else if(ch = .)/判斷是否為CT中的小數(shù)點 if(state = 3) return 4; else return -1; els

5、e if(ch = )/判斷是否為CT字符 if(state = 1) return 7; else if(state = 6)/考慮與PT相連的情況 state_to_code(state_before,token); i = 0; memset(token,0,10); return 7; else if(state = 8) return 9; else return -1; else if(ch = )/判斷是否為ST if(state = 1) return 10; else if(state = 6)/考慮與PT相連的情況 state_to_code(state_before,to

6、ken); i = 0; memset(token,0,10); return 10; else if(state = 11) return 12; else return -1; else/判斷是否為PT if(state = 1) return 6; else if(state = 2)/考慮與IT,KT相連的情況 state_to_code(state_before,token); i = 0; memset(token,0,10); return 6; else if(state = 3)/考慮與CT相連的情況 state_to_code(state_before,token); i

7、= 0; memset(token,0,10); return 6; else if(state = 9)/考慮與CT字符相連的情況 state_to_code(state_before,token); i = 0; memset(token,0,10); return 6; else if(state = 12)/考慮與ST相連的情況 state_to_code(state_before,token); i = 0; memset(token,0,10); return 6; else if(state = 6) if(i = 1)&(ch = =)&(token0 = )|(token0

8、= )|(token0 = =) return 6; else return 0; else return -1; b. 詞法分析器(state_to_code)int state_to_code(state_before,token)/詞法分析器 int n; /循環(huán) code1 = 0; code2 = 0;switch(state_before)case 2:/KT for(n=0; n6; n+) if(strcmp(token, KTn) = 0) code1 = 1; code2 = n; printf(n,code1,code2); /why改變不了全局的code1,code2

9、break; if(code1 = 0)/IT printf(n); break;case 3:/CT printf(n); break; case 5:/CT(小數(shù)) printf(n); break; case 6:/PT for(n=0; n18; n+) if(strcmp(token, PTn) = 0) code1 = 6; code2 = n; printf(n,code1,code2); /why改變不了全局的code1,code2 break; break; case 9:/CT字符 printf(n); break; case 12:/ST printf(n); break

10、; default :/不被任何詞識別 printf(Sorry its going wrong!);return 0;c.判斷函數(shù)int IsAlpha(char c)/判斷是否為字母 if(c=a)&(c=A)&(c=0&c=9) return 1; else return 0;int IsKey(char *word)/判斷是否為關(guān)鍵字 int m,n; for(n=0; n6; n+) if(m = strcmp(word, KTn) = 0) if(n = 0) return 2; return 1; return 0;int IsDelimiter(char *token)/判斷是

11、否為界符 int m,n; for(n=0; n18; n+) if(m = strcmp(token, PTn) = 0) if(n = 0) return 2; return 1; return 0;源程序代碼:(加入注釋)#include #include #include FILE *fp;char input200; /存放輸入字符串char token10;/存放構(gòu)成單詞符號的符號串char word10; /存放識別出的單詞流char ch;/存放當前讀入字符int p;/input下標int i=0; /token下標int state;/存放狀態(tài)標記int code1; /t

12、oken類別碼,1-KT,2-IT,3-CT,4-CTT,5-ST,6-PTint code2;int state_before;/存放之前狀態(tài)int num;/存放整形值char *KT6 = int, main, void, if, else, char; /1char *PT18 = =, , )|(token0 = )|(token0 = =) return 6; else return 0; else return -1; int state_to_code(state_before,token)/詞法分析器 int n; /循環(huán) code1 = 0; code2 = 0;switc

13、h(state_before)case 2:/KT for(n=0; n6; n+) if(strcmp(token, KTn) = 0) code1 = 1; code2 = n; printf(n,code1,code2); /why改變不了全局的code1,code2 break; if(code1 = 0)/IT printf(n); break;case 3:/CT printf(n); break; case 5:/CT(小數(shù)) printf(n); break; case 6:/PT for(n=0; n18; n+) if(strcmp(token, PTn) = 0) cod

14、e1 = 6; code2 = n; printf(n,code1,code2); /why改變不了全局的code1,code2 break; break; case 9:/CT字符 printf(n); break; case 12:/ST printf(n); break; default :/不被任何詞識別 printf(Sorry its going wrong!);return 0;int IsAlpha(char c)/判斷是否為字母 if(c=a)&(c=A)&(c=0&c=9) return 1; else return 0;int IsKey(char *word)/判斷是否為關(guān)鍵字 int m,n; for(n=0; n6; n+) if(m =

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論