編譯原理實(shí)驗(yàn)報告1_第1頁
編譯原理實(shí)驗(yàn)報告1_第2頁
編譯原理實(shí)驗(yàn)報告1_第3頁
編譯原理實(shí)驗(yàn)報告1_第4頁
編譯原理實(shí)驗(yàn)報告1_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、編譯原理實(shí)驗(yàn)報告103091337 李璐03091339 宗婷婷一、上機(jī)題目:實(shí)現(xiàn)一個簡單語言(CPL)的編譯器(解釋器)二、功能要求:接 收以CPL編寫的程序,對其進(jìn)行詞法分析、語法分析、語法制導(dǎo)翻譯等,然后能夠正確的執(zhí)行程序。三、試驗(yàn)?zāi)康?加深編譯原理基礎(chǔ)知識的理解:詞法分析、語法分析、語法制導(dǎo)翻譯等.加深相關(guān)基礎(chǔ)知識的理解:數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)等3.提高編程能力.鍛煉獨(dú)立思考和解決問題的能力四、題目說明1.數(shù)據(jù)類型:整型變量(常量),布爾變量(常量)取值范圍?, 2, -1, 0, 1, 2, ?, true, false)2、運(yùn)算表達(dá)式:簡單的代數(shù)運(yùn)算,布爾運(yùn)算3、程序語句:賦值表達(dá)式,

2、順序語句,if-else語句,while語句五、環(huán)境配置1. 安裝 Parser Generator Visual C+;2.分別配置 Parser Generator Visual C+;3.使用 Parser Generator 創(chuàng)建一個工程編寫1文件my lexer. 1:編譯 mylexer. 1, 生成 mylexer. h 與 mylexer. c:4.使用 VC+創(chuàng)建 Win32 Console Application 工程并配置該項(xiàng)目:執(zhí)行標(biāo)識符數(shù)字識別器;加入mylexer. h與mylexer. c,編譯工程;注意:每次修改1文件后,需要重新編譯1文件,再重新編譯VC工程六

3、、設(shè)計思路及過程9 *設(shè)計流程:YACC預(yù)定義文法BNF遞歸文法擴(kuò)展實(shí)現(xiàn)函數(shù)?詞法分析LEX的此法分析部分主要利用有限狀態(tài)機(jī)進(jìn)行單詞的識別,在分析該部分之前,首先 應(yīng)該對YACC的預(yù)定義文法進(jìn)行解釋。在YACC中用舟union擴(kuò)充了 yystype的內(nèi)容,使其可 以處理char型,int型,node型,其中Node即為定義的樹形結(jié)點(diǎn),其定義如下: typedef enum TYPE_CONTENT, TYPE.INDEX, TYPE_OP NodeEnum;/* 操作符 */ typedef struct int name; /*操作符名稱*/ int num; /*操作元個數(shù)*/struct

4、 NodeTag * node Cl; /* 操作元地址可擴(kuò)展 */ OpNode;typedef struct NodeTag NodeEnum type; /*樹結(jié)點(diǎn)類型*/* Union必須是最后一個成員*/ union int content; /* 內(nèi)容*/ int index; /* 索引 */OpNode op; /*操作符對象*/); Node;extern int Var26;結(jié)點(diǎn)可以是三種類型(CONTENT, INDEX, OP)。結(jié)點(diǎn)如果是操作符對象(OpNode)的話,結(jié) 點(diǎn)可繼續(xù)遞歸結(jié)點(diǎn)。操作符結(jié)點(diǎn)包括了名稱,個數(shù)和子結(jié)點(diǎn)三個要素,其中子結(jié)點(diǎn)可以為 多個。在YACC

5、定義的文法中將與INTEGER,與VARIABLE綁定,表示對lex返回的值自動進(jìn) 行類型轉(zhuǎn)換。? YACC的語法分析和語義制導(dǎo)在YACC中首先定義了與函數(shù)相關(guān)的文法和與運(yùn)算相關(guān)的文法,其中函數(shù)定義的文法 中可以處理if-else, if, while, print, x二exp;類型,在與運(yùn)算相關(guān)的文法中可以處理+, 一, *, /,二,| |運(yùn)算。在語義制導(dǎo)翻譯部分主要目的是在內(nèi)存建立一顆語法樹來 實(shí)現(xiàn)剛才所說的函數(shù)。擴(kuò)展了 set_index,set_value兩個賦值語句,其操作實(shí)質(zhì)是在內(nèi)存 空間分配index和value的兩種樹結(jié)點(diǎn)。opr這個擴(kuò)展函數(shù)很重要,而且使用了動態(tài)參數(shù), 主

6、要考慮操作符的操作元個數(shù)是可變的,這個也與頭文件“struct NodeTag * nodel;” 的定義思想一致。opr主要在內(nèi)存空間中分配操作符相關(guān)的樹結(jié)點(diǎn)。Set_index, set_value, opr從概念上是完全一致的,目的就是在內(nèi)存中構(gòu)造一顆可以遞歸 的語法樹。程序代碼my lexer. 1文件如下:%(#include #include #include void yyerror(char *);%)%; return WHILE; return IF; return ELSE;return PRINT; yylval.iValue = 0; )return INTEGER;

7、 return INTEGER; La_z yylval. slndex = *yytext - a ; return VARIABLE; 0-9+yylval. iValue = atoi(yytext); yylval. iValue = 1;return INTEGER; -()=+*/%;). return *yytext;return GE; return LE; return EQ; return NE; return NE; return AND; return OR; return NOT;tn+ ; /*去除空格,回車*/ .%printf(int yywrap(void)

8、return 1; myparser. y文件如下:%(#include rtinclude #include include /*屬性操作類型*/Node *opr(int name, int num, );Node *set_index(int value); Node *set_content(int value);void freeNode(Node *p); int exeNode(Node *p); int yylexeNode(void); void yyerror(char *s);int Var26; /* 變量數(shù)組 */ %)%union int iValue; /* 變量值 */ char sIndex; /* 變量數(shù)組索引 */ Node*nPtr; /*結(jié)點(diǎn)地址*/ %token VARIABLE %token INTEGER %token WHILE IF PRINT %nonassoc IFX %nonassoc ELSE%left AND OR

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論