語法分析源代碼分析報(bào)告.doc
《語法分析源代碼分析報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《語法分析源代碼分析報(bào)告.doc(10頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
語法分析源代碼分析報(bào)告 學(xué)生:吳藝萍、陳璐、崔旻、劉超群 學(xué)號(hào):095 、 094 、 101、103 時(shí)間:2014年06月 —————————————————————————————————— 目錄 一、概述.............................................................................................................................................1 二、詞法分析設(shè)計(jì)與實(shí)現(xiàn).................................................................................................................1 1、相關(guān)枚舉類型的定義...........................................................................................................1 2、函數(shù)......................................................................................................................................2 三、語法、語義分析設(shè)計(jì)與實(shí)現(xiàn).......................................................................................................3 1、相關(guān)數(shù)據(jù)結(jié)構(gòu)定義..............................................................................................................3 2、函數(shù).......................................................................................................................................3 四、中間代碼.....................................................................................................................................6 1、相關(guān)數(shù)據(jù)結(jié)構(gòu)定義...............................................................................................................6 2、相關(guān)枚舉類型的定義...........................................................................................................6 3、函數(shù).......................................................................................................................................7 一、概述 編譯原理是在介紹編譯程序構(gòu)造的一般原理和基本方法。內(nèi)容包括語言和文法、詞法分析、語法分析、語法制導(dǎo)翻譯、中間代碼生成、存儲(chǔ)管理、代碼優(yōu)化和目標(biāo)代碼生成?,F(xiàn)在計(jì)算機(jī)系統(tǒng)的性能不僅僅取決于它的原始速度,還取決于編譯器是否能生成充分利用其特征的代碼。在現(xiàn)代計(jì)算機(jī)體系結(jié)構(gòu)的研究中,在處理器的設(shè)計(jì)階段就開發(fā)編譯器,并將編譯生成的代碼在模擬器上運(yùn)行,以評(píng)價(jià)擬采用體系結(jié)構(gòu)的特征。編譯器技術(shù)影響計(jì)算機(jī)體系結(jié)構(gòu)設(shè)計(jì)的一個(gè)著名例子是精簡(jiǎn)指令集計(jì)算機(jī)(RISC)的發(fā)明。 二、詞法分析 1、相關(guān)枚舉類型定義 (1)SymType的定義 //記號(hào)類型 enum SymType { OR , //或 AND, //與 RELOP, //關(guān)系運(yùn)算符 ADDOP, //加減 MULOP, //乘除 NOT, //非 LP, //左括號(hào) 1 RP, //右括號(hào) ID, //標(biāo)志符 NUM, //數(shù) ASSIGN, //賦值 LB, //左大括號(hào) RB, //右大括號(hào) COMMA, //逗號(hào) SEMICOLON, //分號(hào) UNDEFINED, //未定義 INT, //int IF, //if ELSE, //else WHILE, //while RETURN, //return PRINTF, //printf SCANF, //scanf} // (2)AddOp、MulOp、RelType的定義 次枚舉類型確定了加減乘除運(yùn)算和關(guān)系運(yùn)算符的符號(hào) enum AddOp{ ADD, //加法 SUB //減法 }; // enum MulOp{ MUL, //乘法 DIV, //除法 MOD, //取余 }; //關(guān)系運(yùn)算符類型 enum RelType{ GT, //大于 > GE, //大于等于 >= EQ, //等于 == LT, //小于 < LE, //小于等于 <= NE, //不等于 != NR //沒有關(guān)系 用于優(yōu)先關(guān)系表 }; 2、函數(shù) 用char * types[]、static char * keywords[KeyWordsCount] (關(guān)鍵字) 、static int keyType[KeyWordsCount] (關(guān)鍵字對(duì)應(yīng)類別)來申明輸入的字符串中詞語的特定意義,即詞 2 法。根據(jù)一下函數(shù)來 函數(shù) 作用 static int isDigit(char ch); 判斷現(xiàn)在的token是否為數(shù)值 static int isLetter(char ch) 判斷現(xiàn)在的token是否為字母 static int getKeyWord(char * str); 獲取現(xiàn)有的token的關(guān)鍵字 void getToken(); 取得當(dāng)前的token進(jìn)行判斷 識(shí)別詞義。組成了詞法分析的功能。 三、語法、語義分析設(shè)計(jì)與實(shí)現(xiàn) 1、相關(guān)數(shù)據(jù)結(jié)構(gòu)的定義 (1)ExprNode的定義. 用來記錄數(shù)據(jù)存儲(chǔ)的位置 //表達(dá)式(采用C的風(fēng)格,非0為真,0為假) typedef struct { int truelist; //真出口鏈 int falselist; //假出口鏈 int address; //存放表達(dá)式值的地址或常量的值 //若為負(fù)數(shù),則存放全局變量的地址 //若為正數(shù),則為局部變量的相對(duì)地址 bool isTemp; //是否為臨時(shí)變量 }ExprNode; (2)SymbolEntry的定義 //符號(hào)表表項(xiàng) typedef struct { int type; //類型FUN 或VAR int address; //地址全局為非正 局部為正 char lexeme[MaxIdLen+1]; //詞素,變量名或函數(shù)名 int paramCount; //函數(shù)的參數(shù)個(gè)數(shù) }SymbolEntry; (3)SymbolTable的定義 該數(shù)據(jù)結(jié)構(gòu)的作用是用來記錄已存在的變量,關(guān)聯(lián)到相關(guān)的存儲(chǔ)位置,還有防止重名 struct SymbolTable{ SymbolEntry * entries; //各表項(xiàng) int index; //符號(hào)表當(dāng)前表尾的下標(biāo),表中第項(xiàng)不用 }; 2、函數(shù) 這里采用的是四元式形式的中間代碼。另外還需要實(shí)現(xiàn)一個(gè)虛擬機(jī)來解釋執(zhí)行編譯后 3 的中間代碼。語法定義并未采用文法的形式,而是采用語法圖的直觀形式,語法圖和文法相比具有更易于理解的優(yōu)點(diǎn)。這里是用采用自頂向下的遞歸下降分析方法[2],它也是基于語法圖進(jìn)行分析的。下圖由橢圓和圓形代表的其實(shí)是語法圖對(duì)應(yīng)文法的終結(jié)符,矩形方框代表的是相應(yīng)文法的非終結(jié)符。下圖規(guī)定了合法的程序的“程序體”應(yīng)具有什么樣的語法形式,此處“程序體”的概念顯然是語法圖對(duì)應(yīng)文法的開始符號(hào)。下圖很直觀地給出了語言是由函數(shù)的定義和全局變量的聲明所構(gòu)成。全局變量可以只聲明而不進(jìn)行初始化,也可在聲明的時(shí)侯進(jìn)行初始化,還可以同時(shí)聲明多個(gè)全局變量。全局變量與函數(shù)的聲明可以交替進(jìn)行。 通過以下函數(shù)實(shí)現(xiàn)statement的語法 函數(shù) 作用 static void inputValue(); 輸入 static void outputExprValue(); 輸出 static int ifStatement() if語句 static int assignStatement(); 賦值語句 static int whileStatement(); while語句 static int printfStatement() 打印語句 static int scanfStatement(); 輸出語句 static int returnStatement(); return語句 static int compoundStatement(); 復(fù)合語句 static void callStatement(char * func); 函數(shù)調(diào)用 void callExpr(char * func) bool isStatementStarting(int tok); tok是否為語句開始記號(hào) bool isExpressionStarting(int tok) ok是否為表達(dá)式開始記號(hào)下圖很直觀地給出語言的 statement: )> ( statement else statement expression if )> ( while statement expression ) ( ; print expression , ; }﹛﹜﹛﹜ statement {﹛﹜﹛﹜ expression = id ; 在paramDeclare.cpp中通過以下函數(shù)實(shí)現(xiàn)變量申明definition 4 函數(shù) 作用 static void processOneDeclare() 處理一個(gè)聲明 int paramDeclare() 申明 并在varDeclare.cpp中處理變量和對(duì)變量列表的內(nèi)容進(jìn)行處理: 函數(shù) 作用 void processOneVar() 處理一個(gè)變量 void varDeclare() 處理變量列表 definition: expression ; int id = 在expression.cpp中 通過ExprNode expression()函數(shù)來實(shí)現(xiàn)expression ExprNode expression(){ ExprNode left = andTerm(); while(token == OR){ changeArithToCondition(&left); getToken(); backpatch(left.falselist,csIndex); ExprNode right = andTerm(); changeArithToCondition(&right); left.truelist = mergeList(left.truelist,right.truelist); left.falselist = right.falselist; } return left; } expression: term term || 函數(shù) 作用 static ExprNode andTerm(); 與項(xiàng) static ExprNode relationTerm(); 關(guān)系項(xiàng) static ExprNode addTerm(); 和項(xiàng) static ExprNode mulTerm(); 乘項(xiàng) static ExprNode factor(); 因子 int mergeList(int list1, int list2); 合并鏈表 void backpatch(int list, int cx); 回填鏈表 ExprNode expression(); 表達(dá)式 用以上的函數(shù)實(shí)現(xiàn)expression中的加減乘除以及關(guān)系運(yùn)算 四、中間代碼生成器 1、數(shù)據(jù)結(jié)構(gòu)定義 (1)Instruction的定義 此處用四元式形式作為中間代碼,此數(shù)據(jù)結(jié)構(gòu)來記錄中間代碼 typedef struct { int optr; //運(yùn)算符 int arg1; //左操作數(shù)的地址 int arg2; //右操作數(shù)的地址 int result; //存放結(jié)果的地址 }Instruction; 2、枚舉類型定義 (1)InstrType的定義 此枚舉類型出現(xiàn)在四則運(yùn)算的運(yùn)算符,為了之后的數(shù)據(jù)運(yùn)算 //虛擬機(jī)指令集 enum InstrType{ InsJtrue, //為真則跳轉(zhuǎn) (InsJtrue, arg1, , dest) InsJfalse, //為假則跳轉(zhuǎn) (InsJfalse,arg1, , dest) InsJmp, //無條件跳轉(zhuǎn) (InsJmp, , , dest) InsMov, //數(shù)據(jù)復(fù)制 (InsMov, arg1, ,dest) InsInit, //初始化某單元 (InsInit,arg1,num, ) InsAdd, //加法 (InsAdd, arg1,arg2,dest) InsSub, //減法 (InsSub, arg1,arg2,dest) InsMul, //乘法 (InsMul, arg1,arg2,dest) InsDiv, //除法 (InsDiv, arg1,arg2,dest) InsMod, //取余 InsNop, //空操作 (InsNop, , , ) InsJlt, //判斷是否< (InsLt,arg1,arg2,result) InsJle, //判斷是否<= (InsLe,arg1,arg2,result) 2 InsJgt, //判斷是否> (InsGt,arg1,arg2,result) InsJge, //判斷是否>= InsJeq, //判斷是否== InsJne, //判斷是否!= InsOr, //邏輯或運(yùn)算 6 InsAnd, //邏輯與運(yùn)算 InsNot, //邏輯非運(yùn)算 InsIn, //讀入一個(gè)整數(shù)到單元dest (InsIn,dest , ,); InsOut, //輸出一個(gè)整數(shù) (InsOut,num, ,); InsUminus, //負(fù)數(shù) (InsUminus,oprn, ,dest) InsCall, //過程調(diào)用 (InsCall,des, , ,); InsRet, //過程返回 (InsRet,expr, , ); InsSetBx, //設(shè)置bx指針,指向活動(dòng)記錄首地址(InsSetBx,addr, , ) InsAddBx, //bx指針增加 (InsSetBx,addr); }; 3、函數(shù) 通過virtualMachine.cpp來實(shí)現(xiàn)中間代碼的生成和實(shí)現(xiàn),具體通過以下2個(gè)函數(shù) 函數(shù) 作用 static int getAddress(int offset); 由活動(dòng)記錄內(nèi)的偏移來求"變量的地址" void interpret() 具體情況的實(shí)現(xiàn) 7- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語法分析 源代碼 分析 報(bào)告
鏈接地址:http://appdesigncorp.com/p-9111935.html