編譯原理課設(shè)報(bào)告 C—編譯器_第1頁(yè)
編譯原理課設(shè)報(bào)告 C—編譯器_第2頁(yè)
編譯原理課設(shè)報(bào)告 C—編譯器_第3頁(yè)
編譯原理課設(shè)報(bào)告 C—編譯器_第4頁(yè)
編譯原理課設(shè)報(bào)告 C—編譯器_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

編譯原理課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告書課設(shè)名稱:C編譯器班 級(jí):學(xué) 號(hào):姓 名: 指導(dǎo)老師: 2009年月 日 一、 程序簡(jiǎn)介本程序?qū)Ψ螩文法的源程序進(jìn)行詞法分析、語(yǔ)法分析、語(yǔ)義分析,并根據(jù)分析結(jié)果依次輸出token鏈的內(nèi)容、移進(jìn)規(guī)約過(guò)程、符號(hào)表、參數(shù)表、函數(shù)列表和四元式鏈。詞法分析和語(yǔ)義分析報(bào)錯(cuò)時(shí)可以指出在第幾行。二、 主要算法及數(shù)據(jù)結(jié)構(gòu)和函數(shù)模塊1、 詞法分析(1)主要算法這部分對(duì)源文件進(jìn)行分析,允許/* */注釋。從源文件依次讀取字符,對(duì)字符進(jìn)行分析,組成字符串、數(shù)字、關(guān)系符等固定含義的token符,并把它們添加到token鏈中,如果遇到非法字符報(bào)錯(cuò)并退出程序。 (2)數(shù)據(jù)結(jié)構(gòu)#define INT 1/int#define VOID 2/void #define IF 3 / if#define ELSE 4 / else#define WHILE 5 / while#define RETURN 6 / return#define CONSTANT 7 /int型#define ID 8 /標(biāo)識(shí)符#define RELOP 9 /關(guān)系符 、=、=、!=#define ADDOP 10 / +和-#define MULOP 11 / *和/#define L_BRACKET 12 /代表 #define R_BRACKET 13 /代表 #define L_PARENTHESE 14 /代表 (#define R_PARENTHESE 15 /代表 )#define L_BPARENTHESE 16 /代表 #define R_BPARENTHESE 17 /代表 #define SEMICOLON 18 /代表 ;#define COMMA 19 /代表 ,#define EQUATER 20 /代表 = #define $ 21 /終結(jié)符 typedef struct token/*詞法分析中的 token結(jié)構(gòu)體*char *name;/字符串int type;/類型int LineNum;/所在行數(shù)struct token *next;token;token *TokenHead,*TokenTail;(3)函數(shù)模塊void LexicalAnalyzer();/詞法分析int IsLetter(char ch);/判斷是否是字母int IsDigit(char ch);/判斷是否是數(shù)字void Concat(char strToken,char ch,int &strNum);/把字符連接到字符串尾int Reserve(char strToken);/判斷字符串是否為關(guān)鍵字void ProcError(char ch,int num);/錯(cuò)誤處理void TokenInsert(char *str,int type,int num,int LineNum);/添加Token鏈節(jié)點(diǎn)2、 語(yǔ)法分析(1) 主要思想這部分對(duì)Token鏈進(jìn)行分析,利用自底向上的分析方法,構(gòu)建SLR(1)分析表的過(guò)程是手工完成的。語(yǔ)法分析的同時(shí)構(gòu)建語(yǔ)法樹,移進(jìn)時(shí)創(chuàng)建葉子,規(guī)約時(shí)創(chuàng)建節(jié)點(diǎn)。(2) 數(shù)據(jù)結(jié)構(gòu) typedef struct pank/*語(yǔ)法 action表結(jié)構(gòu)體*char sr;/移進(jìn)或歸約int state;/轉(zhuǎn)到的狀態(tài)編號(hào)pank;pank action9721;/action表int go_to9729;/語(yǔ)法 go_to表typedef struct stack/*語(yǔ)法分析棧結(jié)構(gòu)體*int state;/狀態(tài)int word;/符號(hào)編碼stack;typedef struct Tree_Node/*語(yǔ)法分析樹*int code;/記錄字符串對(duì)應(yīng)編號(hào)char *word;/記錄字符串int Rnum;/記錄規(guī)約式的編號(hào)int LineNum;/記錄字符所在行數(shù)char *place;/傳遞變量名稱int E_type;/傳遞變量的類型struct Tree_Node *child1;struct Tree_Node *child2;struct Tree_Node *para;Tree_Node;Tree_Node *Head,*Tail;typedef struct ivan/*語(yǔ)法產(chǎn)生式結(jié)構(gòu)體*int left;/產(chǎn)生式的左部int len;/產(chǎn)生式右部的長(zhǎng)度ivan;ivan css56; /css56存的是55條規(guī)約式的左邊非終結(jié)符的編號(hào)和右邊規(guī)約的個(gè)數(shù)*/char *Grammar56; /*Grammar56存的是55條規(guī)約式char *Str29; /*Str29存的是29個(gè)非終結(jié)符(3) 函數(shù)模塊void ParseAnalyzer();/語(yǔ)法分析void yufa_initialize(void);/ACTION 和GOTO表的初始化void CreatLeaf(int code,char *str,int LineNum);/創(chuàng)建語(yǔ)法樹的葉子void CreatNode(int code,int Rnum,int num,char *str);/創(chuàng)建語(yǔ)法樹的節(jié)點(diǎn)void OutPutTree(Tree_Node *p);/輸出語(yǔ)法樹3語(yǔ)義分析 (1)主要算法 這部分對(duì)語(yǔ)法樹從左到右進(jìn)行遍歷,節(jié)點(diǎn)記錄了規(guī)約式的編號(hào),遍歷到節(jié)點(diǎn)時(shí)就進(jìn)行相應(yīng)處理。語(yǔ)義分析主要檢查變量、函數(shù)是否被定義或重定義,同時(shí)產(chǎn)生四元式。(2)數(shù)據(jù)結(jié)構(gòu)typedef struct LF/*語(yǔ)義分析中四元式結(jié)構(gòu)體*/int k;/四元式的編號(hào)char *op;/操作符char *op1;/操作數(shù)char *op2;/操作數(shù)char *result;/結(jié)果struct LF *next;/語(yǔ)義四元式向后指針struct LF *Ltrue;/回填true鏈向前指針struct LF *Lfalse;/回填false鏈向前指針LF;LF *L_four_head,*L_four_tail,*L_true_head,*L_true_tail;LF *L_false_head,*L_false_tail;/四元式鏈,true鏈,false鏈typedef struct symb/語(yǔ)義分析時(shí)的符號(hào)表int flag;/是否為數(shù)組int num;/數(shù)組長(zhǎng)度char *word;/變量名稱int addr;/變量地址struct symb *next;symb;symb *symb_head10,*symb_tail10;/語(yǔ)義符號(hào)鏈表typedef struct queue/*語(yǔ)義分析時(shí)的參數(shù)表*/char *word;/參數(shù)名char *type;/參數(shù)類型struct queue *next;queue;queue *queue_head10,*queue_tail10;typedef struct prob/*語(yǔ)義分析時(shí)的函數(shù)表*/int code;/函數(shù)起始位置char *type;/返回值類型char *name;/函數(shù)名symb *Sym;/對(duì)應(yīng)符號(hào)表queue *Queue;/對(duì)應(yīng)參數(shù)表prob;prob prob_head10;(3)函數(shù)模塊void SemanticAnalyzer(Tree_Node *p);/語(yǔ)義分析void YuYIFenXi(Tree_Node *p);/語(yǔ)義分析void add_symb(symb *temp);/向語(yǔ)義符號(hào)表鏈中加一個(gè)結(jié)點(diǎn)void add_queue(queue *temp);/向參數(shù)鏈表中加入一個(gè)節(jié)點(diǎn)void add_prob(prob *temp);/向函數(shù)鏈表中加一個(gè)節(jié)點(diǎn)int CharToInt(char *w);/將字符串轉(zhuǎn)化為整型char* num_to_char(int num);/將數(shù)字轉(zhuǎn)化為char*類型;void add_L_four(LF *temp);/向四元式鏈中加一個(gè)結(jié)點(diǎn)void add_L_true(LF *temp);/向true鏈中加一個(gè)結(jié)點(diǎn)void add_L_false(LF *temp);/向false鏈中加一個(gè)結(jié)點(diǎn)void add_symb(symb *temp);/向語(yǔ)義符號(hào)表鏈中加一個(gè)結(jié)點(diǎn)void output_yuyi();/輸出中間代碼四元式和最后符號(hào)表char *newop(int m);/把數(shù)字變成字符串char *id_numtoname(int num);/把編號(hào)轉(zhuǎn)換成相應(yīng)的變量名int lookup(char *m);/變量聲明檢查int Look_up(char *m);/檢查函數(shù)是否已經(jīng)聲明void OutPutSymb();/輸出符號(hào)表void OutPutQueue();/輸出參數(shù)表void OutPutProb();/輸出函數(shù)表void OutPutFour();/輸出四元式三、 所做工作負(fù)責(zé)詞法分析。/#define MAX 1999;int Lexabc=0;int Lextokennum=0;int Lexerror1=0,Qiantao=0;int LexLines=1,LexColumns=0;int StrToken1=0;char ch= ,LexStrToken10;char ch1= ;int wrong=0;int Token,j=1;int Main=0; /判斷原程序是否有主函數(shù)int error1=0;fstream LexFile;char infilename100;fstream file,outfile;struct key/用來(lái)存儲(chǔ)關(guān)鍵字與專用符號(hào)char keystring7; /存儲(chǔ)關(guān)鍵字和專用符號(hào)int value; /用一個(gè)簡(jiǎn)單數(shù)字對(duì)應(yīng)一個(gè)關(guān)鍵字或?qū)S梅?hào)Key28=main,1,else,2,if,3,int,4,return,5,void,6,while,7,+,8,-,9,*,10,/,11,12,14,=,15,=,16,!=,17,=,18,;,19,20,(,21,),22,23,24,25,26,ID,27,NUM,28; /關(guān)鍵字表/注意:以上結(jié)構(gòu)體實(shí)現(xiàn)了一個(gè)數(shù)字對(duì)關(guān)鍵字字符串和專用符號(hào)的替代,這些/數(shù)字在整個(gè)編譯器的設(shè)計(jì)與實(shí)現(xiàn)當(dāng)中起到了很好的作用struct token /用來(lái)記錄詞法分析得到的單詞符號(hào)的相關(guān)信息char lexeme10;/單詞符號(hào)int list;/類型long int value;/單詞符號(hào)的屬性值int lines;/所在行int columns;/所在列LexToken1000,token1;/token1struct Lexerror/存儲(chǔ)詞法分析的錯(cuò)誤信息char errorwords10;/非法單詞符號(hào)int lines;/所在行int columns;/所在列int type;/錯(cuò)誤類型LexError1100;void LexError(int errortype)/錯(cuò)誤處理strcpy(LexError1Lexerror1.errorwords,LexStrToken);LexError1Lexerror1.lines=LexLines;LexError1Lexerror1.columns=LexColumns;LexError1Lexerror1.type=errortype;Lexerror1+=1;void openfile(char* filename)/打開源文件file.open(filename,ios:in|ios:binary);if(file.fail()=1)coutOpenfilenameFailed!endl;getch();exit(0);void openLexFile()/打開詞法分析結(jié)果文件outfile.open(Lex.txt,ios:out|ios:binary);if(outfile.fail()coutOpen File Lex.txt Failed!endl;getch();exit(0);void WriteFile(token temp)/寫入文件outfile.write(char*)&temp,sizeof(temp);char GetChar()/讀字符file.get(ch);LexColumns+=1;if(ch=n)LexLines+=1;LexColumns=0;return ch;void GetBC()/略過(guò)空白符while(ch= )&(file.eof()=0)|(ch=n)&(file.eof()=0)|(ch=t)&(file.eof()=0)GetChar();void Concat()/字符歸入字符串LexStrTokenStrToken1=ch;StrToken1+=1;bool IsLetter(char ch)if(ch=a)|(ch=A)return 1;return 0;bool IsDigit(char ch)if(ch=0)return 1;return 0;int Reserve()/獲取單詞符號(hào)的屬性值ch= ;for(int i=0;i28;i+)if(strcmp(LexStrToken,Keyi.keystring)=0)return i+1;if(IsDigit(LexStrToken0)return 28; return 27;void Retract()/讀文件指針回退一個(gè)字符file.seekg(-1l,ios:cur);LexColumns-=1; /?ch= ;void InsertID()/存單詞符號(hào)int list;list=Reserve();strcpy(LexTokenLextokennum.lexeme,LexStrToken);LexTokenLextokennum.list=list;LexTokenLextokennum.columns=LexColumns;LexTokenLextokennum.lines=LexLines;LexTokenLextokennum.value=-1999;if(list=28) LexTokenLextokennum.value=atoi(LexStrToken);Lextokennum+=1;void Break()/跳過(guò)非法字符while(GetChar()!= )&(file.eof()=0) ;void LexOut()/詞法輸出for(int j=0;(j100)&(LexTokenj.lexeme0!=0);j+)cout setw(6)LexTokenj.lexeme, ;if(LexTokenj.list!=28) coutsetw(3)-endl;else coutsetw(3)LexTokenj.value0)cout*詞法錯(cuò)誤*endl;for(j=0;(j100)&(LexError1j.lines!=0);j+)cout*j+1.LexError1j.lines行LexError1j.columns列;if(LexError1j.type=2)coutLexError1j.errorwords 為非法標(biāo)志符!endl;cout*endl;else cout程序無(wú)詞法錯(cuò)誤!endl;cout詞法分析完成!任意鍵返回主菜單endl;getch();void Lex_main()int code;while(!file.eof()GetBC();if(file.eof() break;if(IsLetter(ch)while(IsLetter(ch)|IsDigit(ch)Concat();GetChar();Retract();code=Reserve();InsertID();else if(IsDigit(ch)while(IsDigit(ch)Concat(); GetChar();if(IsLetter(ch)Concat();LexError(2);Break();else InsertID();Retract();else if(ch=)|(ch=)|(ch=!)Concat();GetChar();if(ch=)Concat();InsertID();elseInsertID();Retract();else if(ch=/)GetChar();if(ch=*)if(Qiantao=1)LexError(3);Break();elseQiantao=1;for(;)ch1=ch;GetChar()

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論