版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、編譯原理課程設(shè)計實驗報告-( 川大張兵 )編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉編譯原理課程設(shè)計報告課題名稱:C- 詞法掃描器及語法分析器實現(xiàn)提交文檔學(xué)生姓名: 劉佳玉 提交文檔學(xué)生學(xué)號: 2012141461134 同組 成 員 名 單: 無 指導(dǎo) 教 師 姓 名: 張兵指導(dǎo)教師評閱成績:指導(dǎo)教師評閱意見:提交報告時間: 2015 年 6 月 10 日2 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉目錄編譯原理課程設(shè)計報告課程設(shè)計目標(biāo)分析與設(shè)計2.1程序結(jié)構(gòu)2. 2程序流程2.3詞法分析2.3.1代碼結(jié)構(gòu)分析. 232token定義和類型 2.3.3DNF 分析2.4語法分析2.4
2、.1代碼結(jié)構(gòu)分析. 2.4.2節(jié)點定義和類型. 2.4.3遞歸下降語法分析 測試結(jié)果3.1流程3. 2出錯情況總結(jié)4.1收獲4. 2特色4. 3不足程序代碼實現(xiàn)5.1遞歸下降源代碼5. 2C文法1、2、3、4、5、.2 ,4 4 ,4 ,5 5 5 .6 .7 ,8 81112212125252526262727783/79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉1、課程設(shè)計目標(biāo)學(xué)生在學(xué)習(xí)編譯原理課程過程中,結(jié)合各章節(jié) 的構(gòu)造編譯程序的基本理論,要求用 C 或 C+語言描 述及上機調(diào)試,實現(xiàn)一個 C-Minus 小編譯程序(包 括詞法分析,語法分析等重要子程序),使學(xué)生將理論 與實際應(yīng)用結(jié)合
3、起來,受到軟件設(shè)計等開發(fā)過程的全 面訓(xùn)練,從而提高學(xué)生軟件開發(fā)的能力。 要求:實現(xiàn) scanner和 parser 功能2、分析與設(shè)計2.1 程序結(jié)構(gòu) 語法分析采用遞歸下降方法的程序結(jié)構(gòu):本程序采用面向?qū)ο蟮乃枷刖帉懀褂?C 語言實 現(xiàn),程序分為兩部分:詞法分析( scan)和語法分析 (parse),分別將兩個處理階段寫在兩個函數(shù)中,分 別是 scan(和) parse(),兩個函數(shù)分別完成詞法分析和 語法分析的任務(wù)。 scan()函數(shù)主要的工作是檢查注釋 是否合法、詞法分析獲取 token。parse()函數(shù)的主要 工作是根據(jù) scan(詞) 法分析之后的 token 進行語法分 析,生
4、成語法樹,最后并輸出語法樹。4 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉2.2 程序流程遞歸下降方法的程序流程圖2.3 詞法分析2.3.1代碼結(jié)構(gòu)分析詞法分析階段的代碼寫在一個函數(shù)中 scan(。) main 函數(shù)讀取程序數(shù)據(jù),將其存儲在一5 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉個二維數(shù)組中,調(diào)用函數(shù) zhushierror(,) 確定程序是 否存在注釋錯誤,注釋的錯誤主要是注釋的符號不匹 配。如果不存在注釋錯誤,則調(diào)用 scan(函) 數(shù)進行詞 法分析,否則報錯。詞法分析是對輸入的數(shù)據(jù)一個字 符一個字符的分析,將所分析出來的 token存儲在一 個 vector數(shù)組中
5、,方便后面語法分析時調(diào)用。詞法分 析沒有什么錯誤限制,基本不會報錯。所以在分析的 同時,就會將所分析出的 token輸出2.3.2token定義和類型token結(jié)構(gòu)體定義如下: struct token/token結(jié)構(gòu)體Tokentype tokentype;/toke類n 型 char tokenstring1100;/toke串n int lineno;/token行號;token類型:/定義的 Token的類型(29 種),分別對應(yīng)于 else、if、 int、return、void、while、/+、-、*、/、=、=、=、 /!=、=、;、,、(、)、num、id、錯誤、 結(jié)束6 /
6、 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉typedef enumelsee=1,iff,intt,returnn,voidd,whilee,xiaoyudengyu,day udengyu,dengyudengyu,budengyu,/10jia,jian,cheng,chu,dayu,xiaoyu,dengyu,fenhao,douhao, zuokuohao,youkuohao,zuozhongkuohao,/22youzhongkuohao,zuohuakuohao,youhuakuohao,num, id,error,end/29Tokentype;2.3.3DNF 分析詞法分
7、析的 DFA 描述:詞法分析的 DFA 如下所示,一共分為 5 個狀態(tài): START、INNUM、INID 、INDBSYM、DONE。狀態(tài) START 表示開始狀態(tài),狀態(tài) INNUM 表示數(shù)字類型( NUM) Token 的狀態(tài),狀態(tài) INID 表示字符串類型 Token 的狀態(tài)(如關(guān)鍵字和一般的標(biāo)示符),狀態(tài) INDBSYM 表示雙目運算符型 Token 的狀態(tài)(如 =、!= 、 =),狀態(tài) DONE表示接收狀態(tài)。7 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉digitother2.4 語法分析2.4.1代碼結(jié)構(gòu)分析語法分析階段的代碼中,每一條文法都有相對應(yīng) 的函數(shù),通過函數(shù)之間的
8、遞歸調(diào)用來達到語法分析的 目的。語法分析的過程主要是:在語法分析之前進行 詞法分析,然后通過遞歸向下分析法根據(jù) C- 語言的文 法進行語法分析,并生成語法樹,最后打印語法樹。下面是語法分析所用到的全局變量和函數(shù)的聲 明:token currenttoken;/當(dāng)前 tokentoken lasttoken;/上一個 tokenint tokenxb=0;/token下標(biāo)int blank=0;/ 先行空格8 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉void gettoken();/ 得到 tokenvoid parseerror();/ 輸出錯誤void match(Tokentyp
9、e tt);/ 匹配 treenode * compound_stmt();/函數(shù)聲明void printspace(int n);/打印空格void printtree(treenode * t);/ 打印 語法分析樹treenode * newnode(Nodekind kind);/ 創(chuàng)建新節(jié)點treenode * args();treenode * call(treenode * k);/函數(shù)調(diào)用treenode * factor(treenode * k);treenode * term(treenode * k);treenode*additive_expression(treen
10、ode * k);/加成的表達式treenode*simple_expression(treenode * k);/ 簡單表 達式treenode * varr();treenode * expression();treenode * expression_stmt();/表達式聲明9 / 79treenode * return_stmt();/返回式聲明treenode * iteration_stmt();/while聲明treenode * selection_stmt();/if聲明treenode * statement();/復(fù)合語句后者種類treenode * statement
11、_list();/復(fù)合語句體后者treenode * local_declaration();/復(fù)合語句體前者treenode * param(treenode * k);/函參treenode * param_list(treenode *k);/ 函參列表treenode * compound_stmt();/函數(shù)內(nèi)容,復(fù)合語句treenode * params();/函數(shù)參數(shù)treenode * declaration();/函數(shù)聲明treenode * declaration_list();/多個函數(shù)列表編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉treenode * parse();/
12、 語法分析10 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉2.4.2節(jié)點定義和類型節(jié)點定義:struct treenode樹/ 節(jié)點結(jié)構(gòu)體treenode * child;子/ 節(jié)點 treenode * brother;兄/ 弟節(jié)點 int lineno;/所/ 在行Nodekind nodekind;節(jié)/ 點類型char nodestring1100;節(jié)/ 點類型所代表的字符 串,用于語法樹打印;節(jié)點類型:/19 種節(jié)點類型,分別表示 int、id、void、數(shù)值、變 量聲明、數(shù)組聲明、函數(shù)聲明、/函數(shù)聲明參數(shù)列表、函數(shù)聲明參數(shù)、復(fù)合語句體、if、 while、return、賦值、
13、運算、/數(shù)組元素、函數(shù)調(diào)用、函數(shù)調(diào)用參數(shù)列表、未知節(jié) 點typedef enumints,ids,voids,nums,var,shuzu,hanshu,hancanlist,hanc11 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉an,fuheyuju,ifs,whiles,returns,fuzhi,yunsuan,shuzuyuansu,hanshudiaoyong,hanshudiaoyongcanlist,unknownNodekind;/節(jié)點種類2.4.3遞歸下降語法分析2.4.3.1C-語法program declaration -list declaration_lis
14、t declaration declaration declaration var -declaration|fun-declaration var_declaration type-specifier ID; | type-specifier ID NUM;type - specifier int | voidfun- declatation type -specifier ID (params) | compound-stmt params param_list | void param_list param, param param type-specifier ID compound-
15、 stmt local-declaration statement-list local-declarations empty var- declaration| return-stmtstatement- list statement statement expression -stmt | compound-stmt | selection-stmt | iteration-stmt expression- stmt expression;selection- stmt if (expression) statement else statement iteration- stmt whi
16、le (expression)statement return- stmt return expression;expression var = expression | simple-expression relop = | | = | = = | ! = var ID | ID expression simple-expressionadditive-expression relop additive-expression additive- expression term addop term addop + | - term factor mulop factor mulop * |
17、/ factor (expression) | var | call | NUM call ID( args ) args arg-list | empty arg- list expression, expression12 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉2.4.3.2 遞歸下降語法分析過程以下表格列出了根據(jù)上文中的 C- 文法使用遞歸向下分析方法分析程序的過程,在代碼部分只列出了 函數(shù)名,具體函數(shù)見源代碼。待分 析文 法program declaration -list分析 函數(shù)treeNode * parse()分析說明 C-語言編寫的程序由一組聲名序列組成。pars
18、e(void) 函數(shù)使用遞歸向下分析方法直接調(diào) 用 declaration list()函數(shù),并返回樹節(jié)點代碼treenode * parse()待分 析文 法declaration_list declaration declaration 分析treenode * declaration_list()函數(shù)分析說明 C- 語言編寫的程序由一組聲名序列組成。 declaration_list(void) 分析方法直接調(diào)用 declaration()函數(shù),并返回樹節(jié)點函數(shù)使用遞歸向下代碼treenode * declaration_list()待分析 文法declaration var-decla
19、ration|fun-declarationvar_declaration fun-declatation type - specifier type-specifier ID; | type-specifier ID NUM; type-specifier ID (params) | compound-stmt int | void分析函treenode * declaration()13 / 79數(shù)分析說明 C- 語言的聲明分為變量聲明和函數(shù)聲明。 declaration(void)函數(shù)并不是直接調(diào)用var-declaration 或 fun-declaration 文法所對應(yīng)的函數(shù),令其
20、返回節(jié)點,實際上程 序 并沒 有為 var-declaration 和 fun-declaration 文 法 定義 函數(shù) ,而是 在 declaration(void) 函數(shù)中,通過求 First 集合的方式先確定是變量定義還是函數(shù)定義, 然后分別根據(jù)探測的結(jié)果生成變量聲明節(jié)點(Var_DeclK )或函數(shù)聲明節(jié)點(FunK)。所以 var-declaration 和 fun-declaration 文 法 在 declaration var-declaration|fun-declaration 文法中就都已經(jīng)分析了代碼treenode * declaration()待分析 文法param
21、s param list | void分析函 數(shù)treenode * params()分析說明函數(shù)參數(shù)列表要么是 void ,要么是多個參數(shù)組成。 params(void) 函數(shù)先判斷第一個是 void 還是 int ,如果是 int 說明是由 param_list 組成,則調(diào)用 param_list(TreeNode * k) 函數(shù)遞歸向下分析;如果是 void 說明可能是 void 型的參數(shù),也可能參數(shù)就是 void , 所以再求其 Follow 集合,如果集合求出來是右括號,則說明參數(shù)就是 void ,于是新建一個 VoidK 節(jié)點就行;如果集合求出來不是右括號則說明是 void 型的參
22、數(shù),然后再調(diào)用 param_list(TreeNode * k)函數(shù)遞歸向下分析,并將已經(jīng)取出VoidK 節(jié)點傳遞給param list(TreeNode * k)函數(shù)代碼treenode * params()待分 析文 法param_list param, param分析 函數(shù)treenode * param_list(treenode * k)分析說明參數(shù)列表由 param 序列組成,并由逗號隔開。 param_list(TreeNode * k)函數(shù)使用遞歸向下分析方法直接調(diào)用 param(TreeNode * k) 函數(shù),并返回樹節(jié)點代碼treenode * param_list(tr
23、eenode * k)編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉14 / 79待分析 文法param type-specifier ID 分析函 數(shù)treenode * param(treenode * k)分析說明參數(shù)由 int 或 void 、標(biāo)示符組成,最后可能有中括號表示數(shù)組。param(TreeNode * k) 函數(shù)根據(jù)探測先行 Token 是 int 還是 void 而新建 IntK 或 VoidK 節(jié)點作為其第一個子節(jié)點, 然后新建 IdK 節(jié)點作為其第二個子節(jié)點,最后探測 Follow 集合,是否是中括號,而確定是否 再新建第三個子節(jié)點表示數(shù)組類型代碼treenode * p
24、aram(treenode * k)待分析 文法compound-stmt local-declaration statement-list分析函 數(shù)treenode * compound_stmt()分析說明復(fù)合語句由用花括號圍起來的一組聲明和語句組成。 compound_stmt(void) 函數(shù)使用 遞歸向下分析方法直接調(diào)用 local_declaration() 函數(shù)和 statement_list() 函數(shù),并根 據(jù)返回的樹節(jié)點作為其第一個子節(jié)點和第二個子節(jié)點代碼treenode * compound_stmt()待分 析文 法local-declarations empty var
25、- declaration分析 函數(shù)treenode * local_declaration()分析說明局部變量聲明要么是空,要么由許多變量聲明序列組成。 local_declaration(void) 函 數(shù)通過判斷先行的 Token 是否是 int 或 void 便可知道局部變量聲明是否為空,如果不為空, 則新建一個變量定義節(jié)點( Var DeclK )代碼treenode * local_declaration()編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉15 / 79待分 析文 法statement-list statement分析 函數(shù)treenode * statement_lis
26、t( )分析說明由語句列表由 0 到多個 statement 組成。 statement_list(void)函數(shù)通過判斷先行Token 類型是否為 statement 的 First 集合確定后面是否是一個 statement ,如果是,則使 用遞歸向下分析方法直接調(diào)用 statement() 函數(shù)代碼treenode * statement_list()待分 析文 法statement expression-stmt | compound-stmt iteration-stmt | return-stmt| selection-stmt |分析 函數(shù)treenode * statement
27、()分析說明 statement 由表達式或復(fù)合語句或 if 語句或 while 語句或 return 語句構(gòu)成。 statement(void) 函數(shù)通過判斷先行 Token 類型確定到底是哪一種類型。如果是 IF 則是 if 語句類型,如果是WHILE,則是 while 語句類型,如果是RETURN,則是return 語句類型,如 果是左大括號,則是復(fù)合語句類型,如果是 ID 、SEMI、LPAREN、NUM,則是表達式語句類型代碼treenode * statement()待分expression-stmt expression;析文法分析treenode * expression_st
28、mt()編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉16 / 79函數(shù)分析說明表達式語句有一個可選的且后面跟著分號的表達式。 expression stmt(void) 斷先行 Token 類型是否為分號,如果不是則直接調(diào)用函數(shù) expression()函數(shù)通過判代碼treenode * expression_stmt()編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉待分 析文 法selection-stmt if (expression) statement else statement分析 函數(shù)treenode * selection_stmt()分析selection_stmt(void) 函
29、數(shù)直接調(diào)用 expression() 函數(shù)和 statement() 函數(shù)分別得到其 第一個和第二個子節(jié)點,然后通過判斷先行 Token 類型是否為 ELSE,如果是則直接調(diào)用 statement() 函數(shù)得到其第三個子節(jié)點代碼treenode * selection_stmt()待分 析文 法iteration-stmtwhile (expression)statement分析 函數(shù)treenode * iteration_stmt()分析iteration_stmt(void)函數(shù)直接調(diào)用 expression() 函數(shù)和 statement() 函數(shù)分別得到其第一個和第二個子節(jié)點代碼tr
30、eenode * iteration_stmt()待分 析文 法return-stmtreturn expression;17 / 79分析 函數(shù)treenode * return stmt()分析return_stmt(void) 函數(shù)通過判斷先行 Token 類型是否為分號,如果不是則直接調(diào)用函數(shù) expression() 得到其子節(jié)點代碼treenode * return_stmt()待分 析文 法expression var = expression | simple-expression分析 函數(shù)treenode * expression()分析expression(void) 函數(shù)
31、通過判斷先行 Token 類型是否為 ID ,如果不是說明只能是 simple_expression情況,則調(diào)用 simple_expression(TreeNode * k)函數(shù)遞歸向下分析;如果是 ID 說明可能是賦值語句,或 simple_expression中的 var 和 call 類型的情況,所以再求其 Follow 集合,如果集合求出來是賦值類型的 Token ,則說明是賦值語句,于是新建 一 個 AssignK 節(jié) 點 就 行 ; 如 果 集 合 求 出 來 不 是 賦 值 類 型 的 Token 則 說 明 是 simple_expression 中 的 var 和 call
32、 類 型 的 情 況 , 然 后 再 調(diào) 用 simple_expression(TreeNode * k)函數(shù)遞歸向下分析,并將已經(jīng)取出 IdK 節(jié)點傳遞給simple expression(TreeNode * k)函數(shù)代碼treenode * expression()待分var ID | ID expression析文法分析treenode * varr()函數(shù)分析varr(void) 函數(shù)先新建一個 IdK 節(jié)點,再通過判斷先行 Token 類型是否為左中括號,如果是則 新建一個數(shù)組節(jié)點 Arry_ElemK ,將 IdK 作為 Arry_ElemK 節(jié)點的第一個子節(jié)點,再直接調(diào)用函
33、數(shù) expression() 得到 Arry_ElemK 的第二個子節(jié)點,最后返回的節(jié)點時 Arry_ElemK ;如果 先行Token 類型不是左中括號,則將之前的 IdK 返回編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉18 / 79代碼treenode * varr()編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉待分 析文 法simple-expression additive-expression relop additive-expression relop = | | = | = = | ! =分析 函數(shù)treenode * simple_expression(treenode * k
34、)分析simple_expression(TreeNode* k) 函數(shù)先調(diào)用 additive_expression(TreeNode* k)函數(shù)返回一個節(jié)點,然后再一直判斷后面的 Token 是否為=、=、=、!= ,如果是則新 建 OpK 節(jié) 點 , 然 后 令 之 前 的 節(jié) 點 為 其 第 一 個 子 節(jié) 點 , 然 后 繼 續(xù) 調(diào) 用 additive_expression(TreeNode * k)函數(shù)返回一個節(jié)點,作為 OpK 節(jié)點的第二個節(jié)點代碼treenode * simple_expression(treenode * k)待分 析文 法additive-expressi
35、ontermaddop term addop + | -分析 函數(shù)treenode * additive_expression(treenode * k)分析additive_expression(TreeNode * k) 函數(shù)先調(diào)用 term(TreeNode * k) 函數(shù)返回一個節(jié) 點,然后再一直判斷后面的 Token 是否為 +或- ,如果是則新建 OpK 節(jié)點,然后令之前的節(jié)點為其 第一個子節(jié)點,然后繼續(xù)調(diào)用 term(TreeNode * k) 函數(shù)返回一個節(jié)點,作為 OpK 節(jié)點的第二個 節(jié)點代碼treenode * additive_expression(treenode *
36、 k)待分 析文 法term factormulop factor mulop * | /19 / 79分析 函數(shù)treenode * term(treenode * k)分析term(TreeNode * k)函數(shù)先調(diào)用 factor(TreeNode * k)函數(shù)返回一個節(jié)點,然后再一直判斷后面的 Token 是否為* 或/ ,如果是則新建 OpK節(jié)點,然后令之前的節(jié)點為其第一個子節(jié)點,然 后繼續(xù)調(diào)用 actor(TreeNode * k)函數(shù)返回一個節(jié)點,作為 OpK 節(jié)點的第二個節(jié)點代碼treenode * term(treenode * k)待分 析文 法factor (expres
37、sion) | var | call | NUM分析 函數(shù)treenode * factor(treenode * k)分析factor(TreeNode* k) 函數(shù)首先判斷 k 是否為空,如果不為空,則 k 為上面?zhèn)飨聛淼囊呀?jīng)解析出來的以 ID 開頭的 var ,此時可能為 call 或 var 的情況,然后判斷后面的 Token 是否為左括號, 如果是則說明是 call 的情形,如果不是則為 var 的情形。如果 k 為空,再根據(jù)先行的 Token 類 型判斷是 4 中推導(dǎo)中的哪一種,然后直接調(diào)用相關(guān)的函數(shù)返回一個節(jié)點代碼treenode * factor(treenode * k)待分
38、 析文 法call ID( args )分析 函數(shù)treenode * call(treenode * k)分析call(TreeNode * k) 函數(shù)新建一個 call 語句的節(jié)點 CallK ,如果 k 不為空,則將 k 設(shè)為 CallK 的第一個子節(jié)點,然后通過調(diào)用 args(void) 函數(shù)獲得其第二個節(jié)點,最后返回 CallK 節(jié)點代碼treenode * call(treenode * k)編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉20 / 79待分 析文 法args arg-list | empty arg-list expression, expression分析 函數(shù)tre
39、enode * args()分析factor(TreeNode * k) 函數(shù)首先判斷后面的 Token 是否為右括號,如果是則說明是 empty 的 情形,如果不是則為至少有一個 expression 的情形,然后調(diào)用 expression() 函數(shù)返回節(jié)點, 然后一直判斷后面的 Token 是否為逗號,如果是則說明后面還有一個 expression ,則再調(diào)用 expression() 函數(shù),使各 expression 返回的節(jié)點為兄弟節(jié)點,然后再將第一個 expression 返回的節(jié)點作為函數(shù)調(diào)用語句參數(shù)節(jié)點 ArgsK 的子節(jié)點代碼treenode * args()編譯原理課程設(shè)計指
40、導(dǎo)老師:張兵學(xué)生:劉佳玉3、測試結(jié)果3.1 流程測試數(shù)據(jù):測試結(jié)果:21 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉詞法分析:22 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉語法分析:23 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉24 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉3.2 出錯情況若注釋沒有結(jié)束符號:則提示刪除注釋出錯若含有未知 Token:比如 char則語法分析出錯4、總結(jié)4.1 收獲在本次課程設(shè)計中增加了自己的動手能力,鍛煉 了構(gòu)造一個項目的框架方法,能夠很好的給出系統(tǒng)的 框架,并且能夠按照程序流程進行程序的編寫。能夠 靈活運用遞歸下降的方法
41、進行分析問題,在詞法分析 中掌握了狀態(tài)機的轉(zhuǎn)變,同時能夠熟練運用狀態(tài)機進25 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉行字符的匹配。在語法分析中,學(xué)習(xí)到了怎么樣通過 文法構(gòu)建代碼,以及根據(jù)文法編寫代碼帶來的相關(guān)問 題,如左遞歸,節(jié)點的定義等。特別是在寫語法分析器的時候,已經(jīng)對編譯器的語法 分析的內(nèi)容有了一定的了解,所以直接進行了理論的 學(xué)習(xí)。首先自己對遞歸向下分析法進行了學(xué)習(xí),將書 上的幾個遞歸向下分析的偽代碼看過之后,自己對遞 歸向下的分析方法的原理有了初步的認(rèn)識,大概知道 了根據(jù)文法怎么分析。但是由于 C- 語言給出的文法有 左遞歸存在,于是自己將存在左遞歸的文法改寫成 EBNF
42、 的形式,并據(jù)此進行代碼編寫。整個過程可以 說是痛并快樂著,一方面自己在編寫代碼的時候遇到 了很多問題,這也是自己動手能力不足的一個表現(xiàn)。4.2 特色在詞法分析方面,使用全局變量 zs 來判斷當(dāng)前字 符是否是注釋,并且通過 zs 的值判斷注釋是否合法。整體來說,代碼簡介明了,沒有復(fù)雜的類的關(guān)系, 樹節(jié)點只有孩子和兄弟兩個子節(jié)點,沒有復(fù)雜的節(jié)點 之間的關(guān)系。4.3 不足由于各函數(shù)之間邏輯關(guān)系比較復(fù)雜,代碼還存在一些26 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉錯誤,需要通過測試來修復(fù) bug5、程序代碼實現(xiàn)5.1 遞歸下降源代碼#include #include #include #i
43、nclude #include #include #include using namespace std;char s10051005;/ 文本 char p10051005;char t1005;/ 當(dāng)前 token 串 char linshi1100;/ 臨時數(shù)組 int k;/ 文本行數(shù) int zs;/ 注釋標(biāo)記,1 表示是注釋,0 表示不是注釋void zhushierror()/ 注釋錯誤 int i,j,len;zs=0;27 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉for(i=0;ik-1;i+)len=strlen(si);for(j=0;jlen-1;j+)if
44、(sij=/&sij+1=*)if(zs=0)zs=1;elsereturn;if(sij=*&sij+1=/)if(zs=1)zs=0;else28 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉zs=1;return;/ 定義的 Token的類型(29 種) ,分別對應(yīng)于else 、if 、int 、return 、void 、while 、 /+ 、- 、* 、/ 、=、=、=、/!= 、=、; 、, 、( 、) 、 、 、 、 、num、id 、錯誤、結(jié)束 typedef enumelsee=1,iff,intt,returnn,voidd,whilee,xiaoyudengyu,
45、dayudengyu,dengyudengyu,bud engyu,/10 jia,jian,cheng,chu,dayu,xiaoyu,dengyu,fenhao,douhao,zuokuohao,youkuohao,zuozho ngkuohao,/22youzhongkuohao,zuohuakuohao,youhuakuohao,num,id,error,end/29 Tokentype;struct token/token 結(jié)構(gòu)體29 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉類型串Tokentype tokentype;/token char tokenstring1100
46、;/token int lineno;/token 行號 ;Tokentype gettokentype(char c) Tokentype to;if(!strcmp(c,else)to=elsee;else if(!strcmp(c,if)to=iff;else if(!strcmp(c,return)to=returnn;else if(!strcmp(c,int)to=intt;30 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉else if(!strcmp(c,void)to=voidd;else if(!strcmp(c,while)to=whilee;else if(!st
47、rcmp(c,+)to=jia;else if(!strcmp(c,-)to=jian;else if(!strcmp(c,*)to=cheng;else if(!strcmp(c,/)to=chu;31 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉else if(!strcmp(c,)to=xiaoyu;else if(!strcmp(c,)to=dayu;else if(!strcmp(c,=)to=dayudengyu;else if(!strcmp(c,=)to=dengyudengyu;else if(!strcmp(c,!=)to=budengyu;32 / 79編譯原理課程
48、設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉else if(!strcmp(c,=)to=dengyu;else if(!strcmp(c,;)to=fenhao;else if(!strcmp(c,)to=douhao;else if(!strcmp(c,()to=zuokuohao;else if(!strcmp(c,)to=youkuohao;else if(!strcmp(c,)to=zuozhongkuohao;33 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉else if(!strcmp(c,)to=youzhongkuohao;else if(!strcmp(c,)to=zuohuakuohao;else if(!strcmp(c,)to=youhuakuohao;else if(!strcmp(c,num)to=num;else if(!strcmp(c,id)to=id;else if(!strcmp(c,end)to=end;34 / 79編譯原理課程設(shè)計指導(dǎo)老師:張兵學(xué)生:劉佳玉return to;vector tokenlist;/token
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《食品安全法及實施條例》練習(xí)卷含答案
- 2024DRG專項考試專項測試卷
- 鹽城師范學(xué)院《世界遺產(chǎn)概論》2022-2023學(xué)年第一學(xué)期期末試卷
- 2024沙發(fā)翻新合同
- 店鋪轉(zhuǎn)租合同(2024年版)
- 紅細胞葉酸心腦血管零級預(yù)防培訓(xùn)考核試題
- 2024山地租賃合同書
- 合資合同擔(dān)保協(xié)議
- 2024個人房屋租賃合同介紹
- 溫泉度假酒店項目實施方案
- 2024年風(fēng)景園林專業(yè)中級職稱《法律法規(guī)及技術(shù)標(biāo)準(zhǔn)》考試題庫(含答案)
- DL-T2337-2021電力監(jiān)控系統(tǒng)設(shè)備及軟件網(wǎng)絡(luò)安全技術(shù)要求
- 2024勞動合同模板下載
- 聲屏障結(jié)構(gòu)技術(shù)標(biāo)準(zhǔn)(全面修訂征求意見稿)
- 大學(xué)生紅色旅游調(diào)查報告總結(jié)
- 【高中班主任育人方略】《以德樹人、以情聚人、以理律人》課件
- 中醫(yī)護理方案考核標(biāo)準(zhǔn)
- 一例肺癌術(shù)后并發(fā)肺栓塞患者的個案護理
- 2022版新課標(biāo)初中數(shù)學(xué)《數(shù)與代數(shù)、圖形與幾何》解讀
- 心房顫動診斷和治療中國指南(2023) 解讀
- 中式面點技藝智慧樹知到期末考試答案2024年
評論
0/150
提交評論