編譯原理詞法分析器代碼_第1頁
編譯原理詞法分析器代碼_第2頁
編譯原理詞法分析器代碼_第3頁
編譯原理詞法分析器代碼_第4頁
編譯原理詞法分析器代碼_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、#include #include #include #include #include #define KEYWORD_LEN 32 /保留字個(gè)數(shù) #define STR_MAX_LEN 300 /標(biāo)識(shí)符最大長(zhǎng)度 #define PRO_MAX_LEN 20480 /源程序最大長(zhǎng)度 #define STB_MAX_LEN 1000 /符號(hào)表最大容量 #define CTB_MAX_LEN 1000 /常數(shù)表最大容量 #define ERROR 0 /錯(cuò)誤 #define ID (KEYWORD_LEN+1) /標(biāo)識(shí)符 #define CONST (KEYWORD_LEN+2) /常量 #de

2、fine OPERAT (KEYWORD_LEN+3) /運(yùn)算符 #define DIVIDE (KEYWORD_LEN+4) /界符 int errorLine=0; char proBufferPRO_MAX_LEN = ; /存儲(chǔ)程序代碼的全局緩沖區(qū) char ch; /讀出來的當(dāng)前字符 char wordgetSTR_MAX_LEN; /標(biāo)識(shí)符 或 常量 int point = 0; /源程序當(dāng)前位置指針 char signTabSTB_MAX_LENSTR_MAX_LEN; /符號(hào)表 int pointSTB = 0; /符號(hào)表指針 char constTabCTB_MAX_LENS

3、TR_MAX_LEN; /常量表 int pointCTB = 0; /常數(shù)表指針 char kwTabKEYWORD_LEN10= /保留字表 C語言一共有32個(gè)保留字關(guān)鍵字 auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void

4、, volatile, while; char errorTab50= /錯(cuò)誤代碼表 /*0*/未知錯(cuò)誤, /*1*/非法的字符, /*2*/不正確的字符常量表達(dá), /*3*/不正確的字符串表達(dá), /*4*/不正確的數(shù)字表達(dá), /*5*/注釋丟失*/;typedef struct signDuality int kind; int value; *pDualistic, Dualistic; void pretreatment(); /預(yù)處理 void ProcError(int id); /錯(cuò)誤 bool GetChar(); /獲得一個(gè)字符不包括結(jié)束標(biāo)記 bool GetBC(); /獲得

5、一個(gè)非空白字符 void Concat(char *str); /將ch連接到str后 int Reserve(char *str); /對(duì)str字符串查找保留字表 若是一個(gè)保留字-返回其編碼 否則返回0 void Retract(); /將搜索指示器回調(diào)一個(gè)字符位置 int InsertId(char *str);/將str串以標(biāo)識(shí)符插入符號(hào)表,并返回符號(hào)表指針 int InsertConst(char *str); /將str串以常數(shù)插入符號(hào)表,并返回常數(shù)表指針 bool wordAnalyse(pDualistic pDu); /詞法分析 true正常/預(yù)處理 將緩沖區(qū)內(nèi)的源代碼去掉注釋

6、和無效空格 void pretreatment() int lines=0; char tmpPRO_MAX_LEN; /先將處理結(jié)果保存到臨時(shí)空間 int tmpp = 0; /這個(gè)臨時(shí)空間的末尾指針 bool flg; char tmpc; /去掉注釋先 /注釋有兩種 一種是/ 另一種是/*/ point = 0; do flg = GetChar(); if(ch = /) flg = GetChar(); switch(ch) case /: do flg = GetChar(); while(!(ch = n | flg = false);/注釋一直到行尾或文件結(jié)束 if(ch =

7、n) Retract(); /歸還換行 break; case *: do flg = GetChar(); tmpc = ch; /為了保證出錯(cuò)處理程序能正確定位出錯(cuò)位置 保留注釋中的換行 if(tmpc = n) tmptmpp+ = tmpc; flg = GetChar(); Retract(); /歸還一個(gè)字符 while(flg & !(flg & tmpc = * & ch = /); flg = GetChar(); if (!flg) ProcError(5); break; default: /不是任何一種注釋 Retract(); Retract(); GetChar()

8、; tmptmpp+ = ch; flg = GetChar(); tmptmpp+ = ch; else tmptmpp+ = ch; while(flg); tmptmpp = 0; strcpy(proBuffer,tmp); /錯(cuò)誤 void ProcError(int id) printf(nError:第%d行,%sn,errorLine, errorTabid); /獲得一個(gè)字符 bool GetChar() if(point PRO_MAX_LEN & proBufferpoint != 0) /如果當(dāng)前下標(biāo)合法且當(dāng)前字符為結(jié)束標(biāo)記則取字符增游標(biāo) ch = proBufferp

9、oint+; if (ch = n) errorLine +; return true; ch = 0; return false; /獲得一個(gè)非空白字符 bool GetBC() do if(!GetChar() /獲取字符失敗 ch = 0; return false; while(isspace(ch); /直到獲得一個(gè)非空白字符 return true; /將ch連接到str后 void Concat(char *str) int i; for(i=0; stri; +i); stri = ch; stri+1 = 0; /對(duì)str字符串查找保留字表 若是一個(gè)保留字-返回其編碼 否則返

10、回0 int Reserve(char *str) int i; for(i=0; i 0) errorLine -; point -; /將str串以標(biāo)識(shí)符插入符號(hào)表,并返回符號(hào)表指針 int InsertId(char *str) int i; for(i=0; i pointSTB; +i) if(0 = strcmp(signTabi, str) return i; strcpy(signTabpointSTB+, str); return (pointSTB-1); /將str串以常數(shù)插入常量表,并返回常數(shù)表指針 int InsertConst(char *str) int i; f

11、or(i=0; i kind = ID; pDu-value = value; else pDu-kind = code; pDu-value = -1; return true; case D: while(isdigit(ch) wordgeti+ = ch; GetChar(); wordgeti = 0; Retract(); value = InsertConst(wordget); pDu-kind = CONST; pDu-value= value; return true; /( ) . , ! != sizeof = = = & & &= | | |= ?: + + += /

12、 - - - -= * *= / /= % %= = kind = ERROR; pDu-value = 0; else value = InsertConst(wordget); pDu-kind = CONST; pDu-value = value; return true; /字符常量 case : wordgeti+ = ch; / GetChar(); wordgeti+ = ch; if(ch = ) / n /如果是轉(zhuǎn)義字符則要多接收一個(gè)字符 GetChar(); / ch = wordgeti+ = ch; GetChar(); wordgeti+ = ch; wordgeti

13、 = 0; if(ch != ) /b printf(%s,wordget); ProcError(2); pDu-kind = ERROR; pDu-value = 0; else value = InsertConst(wordget); pDu-kind = CONST; pDu-value = value; return true; case (: case ): case : case : case .: case ,: case : case ?: case : case ;: case : case : case #: wordgeti+ = ch; wordgeti = 0;

14、pDu-kind = DIVIDE; /界符 pDu-value = -1; return true; case !: /!= wordgeti+ = ch; GetChar(); if (ch=) wordgeti+ = ch; else Retract(); wordgeti=0; break; case : / = wordgeti+ = ch; GetChar(); if (ch = : / = wordgeti+ = ch; GetChar(); if (ch = | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break;

15、 case =: / = wordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case &: / & &= wordgeti+ = ch; GetChar(); if (ch = & | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case |: / | |= wordgeti+ = ch; GetChar(); if (ch = | | ch = =) wordgeti+ = ch; else

16、 Retract(); wordgeti=0; break; case +: / + += wordgeti+ = ch; GetChar(); if (ch = + | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case -: / - -= - wordgeti+ = ch; GetChar(); if (ch = - | ch = = | ch = ) wordgeti+ = ch; else Retract(); wordgeti=0; break; case *:/ * *= wordgeti+ = ch; G

17、etChar(); if (ch = * | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case /: / /= wordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case %: / %= wordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case : / = w

18、ordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case 0: return false; default: ProcError(1); return false; pDu-kind = OPERAT; return true; /主函數(shù)int main() Dualistic tmp; pDualistic ptmp = &tmp; FILE *fin, *fout; int i; char c; char filename20; printf(源代碼讀入n);

19、/scanf(%s,filename); /將源程序讀入緩沖區(qū) if (fin=fopen(Test.txt,r) = NULL) printf(Cannot open infilen); return 0; i = 0; /c = fgetc(fin); while(c = fgetc(fin) != EOF) if(i = PRO_MAX_LEN-1) printf(n程序代碼太長(zhǎng),無法處理a); return 0; proBufferi+ = c; fclose(fin); /關(guān)閉文件 proBufferi+ = 0; printf(n*n源代碼讀入成功,源代碼如下:n%s,proBuf

20、fer); printf(n按任意鍵繼續(xù)n); getch(); /預(yù)處理 printf(n預(yù)處理n); pretreatment(); printf(n*n預(yù)處理成功,去掉注釋后的源代碼為:n%s*,proBuffer); printf(n按任意鍵繼續(xù)n); getch(); printf(n詞法分析n); point = 0; /詞法分析if (fout=fopen(Result.txt,wb) = NULL) printf(建立文件Result.txt失敗。n); return 0; i = 0; errorLine = 0; /錯(cuò)誤行歸零 do if(i+ PRO_MAX_LEN)/防止遇到BUG 導(dǎo)致程序死循環(huán)無限寫文件 break; if(!wordAnalyse(ptmp) break; if (ptmp-value = -1) fprintf(fout, t,ptmp-kind); else fprintf(fout, t,ptmp-kind, ptmp-value); switch(ptmp-kind) case ERROR: fprintf(fout, (出 錯(cuò):%s),wor

溫馨提示

  • 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. 人人文庫網(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)論