




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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; /讀出來(lái)的當(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語(yǔ)言一共有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、和無(wú)效空格 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),無(wú)法處理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)無(wú)限寫(xiě)文件 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 改進(jìn)護(hù)士資格證學(xué)習(xí)方式試題及答案
- 西醫(yī)臨床指南試題及答案全面解析
- 新西蘭航空面試題及答案
- 編制警犬考試題及答案
- 美術(shù)筆試題型分類(lèi)及答案
- 藥劑類(lèi)考試?yán)碚撆c實(shí)踐試題及答案
- 添可招聘筆試題及答案
- 系統(tǒng)架構(gòu)設(shè)計(jì)的社會(huì)影響考題試題及答案
- 藥劑學(xué)教育改革的探討試題及答案
- 藥劑學(xué)專(zhuān)業(yè)的未來(lái)發(fā)展試題及答案
- 尋甸城鄉(xiāng)投資開(kāi)發(fā)集團(tuán)有限公司筆試信息
- 本科成考試題及答案政治
- 中國(guó)桂花茶行業(yè)市場(chǎng)前景預(yù)測(cè)及投資價(jià)值評(píng)估分析報(bào)告
- 陜西省縣以下醫(yī)療衛(wèi)生機(jī)構(gòu)定向招聘真題2024
- 2024年中國(guó)郵政儲(chǔ)蓄銀行廣東省分行招聘筆試真題
- 2025年河南省新鄉(xiāng)市中考一模歷史試題(原卷版+解析版)
- 2025山東能源集團(tuán)中級(jí)人才庫(kù)選拔易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 夏季四防知識(shí)考題及答案
- 第五單元:數(shù)學(xué)廣角-鴿巢問(wèn)題(教學(xué)設(shè)計(jì))-【大單元教學(xué)】六年級(jí)數(shù)學(xué)下冊(cè)同步備課系列(人教版)
- 2025年人民保險(xiǎn)筆試題型及答案
- 2025-2030中國(guó)TPU膜行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭(zhēng)格局與投資發(fā)展研究報(bào)告
評(píng)論
0/150
提交評(píng)論