編譯原理課程設(shè)計報告-簡單編譯器的設(shè)計與實現(xiàn)_第1頁
編譯原理課程設(shè)計報告-簡單編譯器的設(shè)計與實現(xiàn)_第2頁
編譯原理課程設(shè)計報告-簡單編譯器的設(shè)計與實現(xiàn)_第3頁
編譯原理課程設(shè)計報告-簡單編譯器的設(shè)計與實現(xiàn)_第4頁
編譯原理課程設(shè)計報告-簡單編譯器的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

編譯原理課程設(shè)計——簡單編譯器的設(shè)計與實現(xiàn)設(shè)計時間:2016年12月姓名組長:語法分析部分,語義分析和中間代碼生成部分,符號表的管理,目標(biāo)代碼的生成,數(shù)據(jù)結(jié)構(gòu)的設(shè)計和總體框架的設(shè)計。組員:中間代碼優(yōu)化部分,負(fù)責(zé)從DAG圖中獲得優(yōu)化后的四元式代碼,以及將中間變量填寫入符號表內(nèi)。組員:中間代碼優(yōu)化部分,負(fù)責(zé)優(yōu)化DAG圖的建立。組員:詞法分析部分,詞法分析部分的符號表和錯誤表的記錄。摘要 41.概述 52.課程設(shè)計任務(wù)及要求 62.1設(shè)計任務(wù) 62.2設(shè)計要求 63.算法及數(shù)據(jù)結(jié)構(gòu) 73.1算法的總體思想(流程) 73.2詞法分析模塊 8 83.2.2數(shù)據(jù)結(jié)構(gòu) 8 3.3語法分析(含語義分析和中間代碼生成)模塊 3.3.2數(shù)據(jù)結(jié)構(gòu) 3.4中間代碼優(yōu)化模塊 3.4.1功能 3.4.2數(shù)據(jù)結(jié)構(gòu) 3.5.2數(shù)據(jù)結(jié)構(gòu) 4.程序設(shè)計與實現(xiàn) 4.1程序流程圖 4.2程序說明 4.3實驗結(jié)果 5.系統(tǒng)特色 6.結(jié)論 7.參考文獻(xiàn) 8.收獲、體會和建議 過有限自動機的狀態(tài)跳轉(zhuǎn)來實現(xiàn),根據(jù)自動機結(jié)束狀態(tài)來得到該單詞的了優(yōu)化,該編譯器的目標(biāo)代碼是8086匯編語言代碼,能夠?qū)崿F(xiàn)將優(yōu)化后的四元能夠支持前置++和后置++這種語法,擁有類似C語言的if條件語句和while循環(huán)語句以及cout簡單輸出功能。在表達(dá)式語代碼,我們所選定的目標(biāo)代碼是8086匯編語言代碼,所以該階段的任務(wù)是將優(yōu)2.1設(shè)計任務(wù)達(dá)式、算術(shù)表達(dá)式、邏輯表達(dá)式、關(guān)系表達(dá)式和位運算表達(dá)式;能夠支持if條1、在深入理解編譯原理基本原理的基礎(chǔ)上,對于選定的題目,以小組為單2、設(shè)計系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu),設(shè)計每個模塊的處理流程。要求設(shè)計并回答指導(dǎo)教師的提問;6、提交課程設(shè)計報告。3.算法及數(shù)據(jù)結(jié)構(gòu)3.1算法的總體思想(流程)我們將編譯器的設(shè)計按照功能劃分為以下四個部分,通過這四個部分來實現(xiàn)編譯器的全部功能。如下圖。符號表符號表記錄數(shù)據(jù)和標(biāo)識符填寫符號表中數(shù)據(jù)關(guān)系中間代碼優(yōu)優(yōu)化后四元式目標(biāo)代碼生錯誤表語法和語義分析以及中間代碼生成詞法分析器目標(biāo)語言變量檢查源語言四元式TOKEN圖3.1算法總體思想圖詞法分析器用來對輸入的字符流進(jìn)行詞法分析,識別每一個單詞并生成相應(yīng)的TOKEN碼,并記錄它們的數(shù)據(jù)信息。語法分析和語義分析以及中間代碼的生成被劃分為一個模塊是因為它們的不可分割性,當(dāng)某個語法分析通過后,就開始產(chǎn)生語義動作生成相應(yīng)的四元式,因此該部分用來對詞法分析產(chǎn)生的TOKEN序列進(jìn)行語法分析,從而在符號表中記錄相關(guān)數(shù)據(jù)信息,并且產(chǎn)生中間代碼。中間代碼優(yōu)化模塊是為了簡化中間代碼而設(shè)計的,該部分通過四元式構(gòu)建相應(yīng)的無向圖,通過算法產(chǎn)生優(yōu)化后的四元式序列。目標(biāo)代碼生成模塊用于產(chǎn)生匯編代碼,將優(yōu)化后的四元式進(jìn)行翻譯,生成對應(yīng)的匯編語言。該編譯器包含了前端和后端的基本功能,能夠進(jìn)行詞法錯誤檢測、語法錯誤檢測、標(biāo)識符定義錯誤檢測,并提示錯誤行數(shù),且編譯后生成可以直接運行的匯編程序,可以算是一個較為完整的簡單編譯器。3.2詞法分析模塊auto,short,int,long,real,double,char,struct,union,enum,typedef,const,unsigned,signed,extern,register,static,volatile,void,if,else,switch,case,for,do,while,goto,continue,break,default,sizeof,return,bool,cout.運算符:TOKEN值為70-99現(xiàn)有能夠識別的運算符有:charKT[34][15]={"auto","short","int","lon"double","char","struct","union","enum","typedef","const","unsigned","signed","extern","register","static""volatile","void","if","else","switch","case","for""do","while","goto","continue","break","default","sizeof","return","bool","cout"charOT[23][3]{"+","-","*","/","%","++","--","=",typedefstructERRORL{//錯誤記錄表charname[100];//錯誤內(nèi)容intline;//行數(shù)記錄,系統(tǒng)編碼標(biāo)記structINT*tpl;//整型指針structREAL*tpR;//實型指針structCHAR*tpc;//字符指針structSYNBL*tplT;//標(biāo)識符表指針char*tpKT;//關(guān)鍵字指針char*tpPT;//界符指針char*tpOT;//運算符指針}TOKEN;typedefstructIdentifier{//標(biāo)識符表structIdentifier*next;typedefstructINT{//整數(shù)型表}HINT;typedefstructREAL{//實數(shù)型表charname[100];//標(biāo)識符名字structTYPEL*type;//類型表指針charL;//活躍信息structPFINFL*pfinfl;//函數(shù)表指針structLENL*lenl;//長度表指針structVALL*vall;//活動記錄表指針初始化自動機運行自動機,進(jìn)行狀態(tài)轉(zhuǎn)換N標(biāo)識符?Y生成對應(yīng)token畢?Y打印輸出token結(jié)束數(shù)、浮點數(shù)?Y記錄錯誤信息關(guān)鍵字?界符?圖3.2詞法分析算法3.3語法分析(含語義分析和中間代碼生成)模塊該模塊接收詞法分析模塊得到TOKEN序列,通過對TOKEN序列的語法分析,判斷該語法是否合法,如果合法則執(zhí)行相應(yīng)的語義動作,生成中間代碼。在語法分析模塊,我們設(shè)計了比較接近于C語言的語法結(jié)構(gòu),雖然不如C語言語法那么靈活,但是依然能夠滿足用戶基本的需求,源程序的編寫與C語言類似,對C語言用戶來說沒有陌生感。文法結(jié)構(gòu)如下(這里的{}代表可以循環(huán)生成,符號'{外面有單引號):Type->'int'|'real'|'char'Parameter->e|'void'|Type結(jié)構(gòu)體聲明文法:Declaration->{e|'struct'i4'{'Base_declaration'Y';'|Base_declaration}Base_declaration->gStructure->g|E‘;'|If|WFun->i4'(‘')';|i4'('Assignment{‘if條件語句文法:‘if’‘('ExpressionWhile->'while''('Expression'Y''{'Content'}'賦值表達(dá)式文法:Assignment->i4!ld'='Logical_or|ld'='Logical_or|Logical_or邏輯表達(dá)式文法:Logicalor->Logicaland{'||'Logicaland}Logical_and->Inclusive_or{'&&'Inclusive_or}Inclusive_or->Exclusive_or{'I'Exclusive_or}And->Equality{'&'Equality}關(guān)系表達(dá)式文法:Equality->Relational{w0Rel算術(shù)表達(dá)式文法:Shift->Additive{w2Additive}Additive->Multiplicative{w3Multiplicative}Primary->i4|constant|'('Expression'Y'其中符號表示:w0->'=='|'!='w1->'<|'>'|'<='|'>=w3->'+'|'-'w4->'*′|'’|'%’w5->'!'|'~′|'++'|'--'|'sizeofw6->'++'|'--'|'['Expression]|!i4其中在生成四元式的過程中需要用到語義棧來存儲當(dāng)前的token,以便當(dāng)識別到typedefstructOperand{//操作數(shù)structTOKEN*tpToken;charOperatorL[37][5]{"+","-","*","/","%","++","--","=","gt","1b","if","el","ie","wh","do","we","inc","dec","arr","si",".","cstructOperand*operand[3];//3個操作數(shù)structQuaternary*next;chartval;//類碼,類型代碼,決定下列指針選擇,現(xiàn)有類碼為:i(整structAINFL*ainfl;//數(shù)組表指針structRINFL*rinfl;//結(jié)構(gòu)體表指針typedefstructAINFL{//數(shù)組表intlow;//數(shù)組下界structTYPEL*ctp;//成分類型指針,指向該維數(shù)組成分的類型的指針intclen;//成分類型的長度,成分類型數(shù)據(jù)所占值單元的個數(shù)typedefstructRINFL{//結(jié)構(gòu)表intOFF;//(區(qū)距)—是idk的值單元首址相對于所在記錄值區(qū)區(qū)頭位置ERRORERROR開始開始NYNYNPush(i4)”=※?Next(w)Y程序NERRORYNext(w)程序程序ld子程序”=※?開始NY結(jié)束圖3.4邏輯或算法開始開始NNYExpression子程序NYConstant?YYN圖3.5數(shù)據(jù)生成部分算法開始YY子程序NERRORNERRORN//else※?YY程序N→ERRORYY程序NERRORNERRORNYERRORNERRORY開始開始YNYNYGEM(we)NYYGEM(wh)程序子程序結(jié)束圖3.7while循環(huán)語句算法3.4中間代碼優(yōu)化模塊該部分的功能是對從前端得到的四元式進(jìn)行優(yōu)化,目的是為了精簡代碼數(shù)量,使得編譯后的程序能夠更高效的運行,這里我們采用了DAG算法對中間代碼進(jìn)行優(yōu)化。首先對前端輸出的四元式進(jìn)行基本塊劃分,然后對一個基本塊執(zhí)行DAG算法,構(gòu)造一個無向圖,從該圖中獲取到優(yōu)化后的四元式序列。之后清空該圖,對之后的基本塊執(zhí)行相同的算法,直到將所有基本塊的四元式序列都優(yōu)化為止,最后輸出優(yōu)化后的四元式序列。typedefstructBlock{structQuaternary*qua_block;//分塊后的四元式塊集合讀取四元式N語句?Y新建一個基本塊將四元式加入到當(dāng)前基本塊內(nèi)畢?Y結(jié)束開始開始讀取四元式(,B_A)賦值N四元式?值?YY將A添加到B的mark標(biāo)記上否存在?Y新建操作數(shù)結(jié)點新建該運算結(jié)點,并將B,C連接為該結(jié)點的孩子若被添加結(jié)點的主標(biāo)記是中間變量,則交換逆序檢查刪除存在的非用戶定義標(biāo)識符標(biāo)記N基本塊結(jié)束?Y結(jié)束(w,B,A)雙目或單目賦值Y在圖中查找該運算是否已經(jīng)(=,C1,_A)常值運算或者賦計算出常值NNNN圖3.9DAG優(yōu)化創(chuàng)建算法從DAG中獲取優(yōu)化后四元式的算法如下圖所示:開始開始Y下一個圖結(jié)點為空?N讀取圖結(jié)點N點?YN存在從標(biāo)記?YN從標(biāo)記為非臨時變量?Y將主標(biāo)記的值賦給從標(biāo)記N該結(jié)點為非葉結(jié)點?Y以該結(jié)點的運算符為標(biāo)準(zhǔn)生成相應(yīng)四元式N存在從標(biāo)記?Y從標(biāo)記為非臨時變量?Y將主標(biāo)記的值賦給從標(biāo)記結(jié)束N圖3.10優(yōu)化后四元式獲取算法3.5目標(biāo)代碼生成模塊該模塊的功能是通過優(yōu)化后的四元式序列生成目標(biāo)代碼——匯編語言。該部分首先會對得到的四元式序列進(jìn)行分析,對四元式序列中的操作數(shù)進(jìn)行判斷,如果該操作數(shù)是系統(tǒng)生成的中間變量(該中間變量不能在運算化簡中被舍棄),那一個目標(biāo)語句鏈表來保存目標(biāo)語句的相關(guān)信息,其中包含存儲的目標(biāo)代碼語句,當(dāng)前語句的類型目前有4種,一種是0,表示此語句為一般語句,另外3種分別為i、e、d,分別代表if、else、do的四元式產(chǎn)生的目標(biāo)語句,這些語句因為涉及到跳轉(zhuǎn),需要當(dāng)讀取到它們跳轉(zhuǎn)到的語句時才能獲得地址信息,所以它們所生成的目標(biāo)語句的跳轉(zhuǎn)地址需要回填,這個語句類型作為回填時查找該語句charcode[30];//存儲的目標(biāo)代碼structObject*fron;目標(biāo)代碼的生成算法如下圖所示:開始開始更新符號表生成目標(biāo)代碼頭部(生成數(shù)據(jù)段目標(biāo)代碼)Y基本塊為空?N取基本塊Y四元式序列為空?N讀四元式并生成相應(yīng)的目標(biāo)代碼結(jié)束文件生成目標(biāo)代碼尾部圖3.11目標(biāo)代碼生成算法4.程序設(shè)計與實現(xiàn)4.1程序流程圖開始開始詞法分析器存在詞法錯誤?N四元式生成語法有錯誤?標(biāo)識符定義有錯誤?N匯編代碼生成輸出錯誤信息程序運行結(jié)果輸出到屏幕結(jié)束圖4.1程序運行流程圖4.2程序說明程序的編寫使用的是C++語言,采用了類的封裝,將整個編譯器拆分為了四個模塊,分別是詞法分析器模塊、語法分析(含語義分析和中間代碼生成)模塊、中間代碼優(yōu)化模塊和目標(biāo)代碼生成模塊,各個模塊由上到下依次繼承,實現(xiàn)了良好的封裝性。下面按照每個模塊類的設(shè)計對各個模塊所含有的成員和方法進(jìn)行說明。詞法分析:classScanner{//詞法分析器模塊private;charch,ch_before;//當(dāng)前詞,前一voidCreatNewToken(TOKEN*&t);//創(chuàng)建新的Token結(jié)點voidreset(int&state,char*code,int&i,int&warn);//重置自動機狀態(tài)intstate_change(intst,charch,int&warn);//自動機狀態(tài)轉(zhuǎn)換voidstatetocode(TOKEN*t,intstatline,intwarn);//根據(jù)自動機狀態(tài)生成Token序列public:structERRORL*error_head;//錯誤表頭指針structERRORL*error_now;//錯誤表當(dāng)前位置voidScan();//詞法分析主函數(shù)voidConvertFtoS(floatvoidConvertStoC(stringvoidConvertStoI(stringvoidConvertStoF(stringvoidCoutErrorL();//輸出錯誤表}語法分析、語義分析和中間代碼生成:classGrammaticalAnalysis:publicprivate://語法部分structTOKEN*ch;//當(dāng)前詞intStart();//語法,開始Scanner{//語法分析和語義動作及//中間代碼生成模塊intFType();//語法,函數(shù)類型intType();//語法,變量類型intDeclaration();//語法,聲明intBasedeclaration();//語法,基本類型聲明intId();//語法,基本類型intId_Expression();//語法,數(shù)據(jù)類型intExpression();//語法,表達(dá)式intCout();//語法,輸出函數(shù)intAssignment();//語法,賦值intLogical_or();//語法,邏輯或intLogical_and();//語法,邏輯與intExclusiveor();//語法,異或intEquality();//語法,相等intAdditive();//語法,加法減法intMultiplicative();//語法,乘法除法intUnary();//語法,前置算符intPrimary();//語法,標(biāo)識符、常數(shù)生成structTOKEN*chsem;//入語義棧的詞structTOKEN*operandnow;//當(dāng)前操作數(shù)structQuaternary*quater_now;//當(dāng)前四元式指針voidCreateSEM();//生成一個語義棧voidDeStack();//出棧intcounter;//系統(tǒng)變量計數(shù)器voidCreateQuaternary();//生成一個四元式voidPushQuaternary();//入四元式隊列voidBi_oper_qua();//雙目算符的操作數(shù)生成voidUnary_oper_qua();//單目算符的操作數(shù)生成voidAssign_oper_qua();//賦值操作數(shù)生成voidGetMark(TOKEN*ch_ope);//獲取運算符voidGetMark_front(TOKEN*ch_ope);//獲取前置運算符intFindSynbl();//查重voidPushSynbl();//添加進(jìn)符號表intCoutSynbl();//輸出符號表voidCheckSynbl();//檢查標(biāo)識符是否被定義,未定義則記錄到錯誤表中voidGrammar();//語法部分GrammaticalAnalysis(){token=NULL;counror_now=NULL;}//語義部分structOperand*operand[3];//語義操作數(shù)structQuaternary*quater;//structIdentifier*id;//用戶定義標(biāo)識符structIdentifier*idnow;//當(dāng)前標(biāo)識符指針voidCoutQuaternary();//輸出四元式classOptimization:publicGrammaticalAnalysis{//中間代碼優(yōu)化模塊private:structQuaternary*optimize_now;//當(dāng)前優(yōu)化四元式structBlock*optimize_block_now;//優(yōu)化后的當(dāng)前塊structBlock*block_now;//當(dāng)前塊指針structOperand*find_now_numl;//當(dāng)前查找詞structOperand*find_now_num2;//當(dāng)前查找詞char*find_now_ope;//structOperand*add當(dāng)前查找運算符now;//當(dāng)前需要加入的結(jié)點char*op_now;//當(dāng)前運算符structDAG*find_begin;//查找開始處structDAG*pos;//找到的位置structMark*mark_pos;//找到的標(biāo)記位置structDAG*temp_dag;//待交換標(biāo)記所在的dag結(jié)點structMark*templ;//待交換標(biāo)記1structMark*temp2;//待交換標(biāo)記2voidCreateOptimize();//創(chuàng)建一個優(yōu)化后四元式頭部voidCreateOptimize_Block();//創(chuàng)建一個優(yōu)化后塊頭部voidDivideBlock();//塊劃分函數(shù)voidCoutBlock();//按基本塊輸出四元式voidCreateDAG();//創(chuàng)建一個DAGvoidAddDAG();//加入一個DAG點intFindDAG();//檢查重復(fù)DAG結(jié)點intFindDAGunary();//檢查單目運算符重復(fù)DAGintMainMark();//檢查該標(biāo)記是不是主標(biāo)記voidSwopMark();//交換兩個標(biāo)記voidDeleteMark();//刪除一個標(biāo)記voidCoutOptimize();//輸出優(yōu)化后的四元式public;structQuaternary*optimize;//優(yōu)化四元式structBlock*optimize_block;//優(yōu)化后的塊voidOptimize();classObjectCode:publicOptimization{//目標(biāo)代碼生成模塊private:structObject*obj_now;//當(dāng)前目標(biāo)代碼structBlock*blo;structQuaternary*qua;structOperand*num;//當(dāng)前操作數(shù)intfindnum;//需要查找的系統(tǒng)變量名稱intSystemExist();//查找符號表中是否有必須的中間變量voidUpdateSymbol();//更新符號表,將系統(tǒng)生成中間變量放入voidGetObjCode();//生成目標(biāo)代碼voidAddObject();//加入obj結(jié)點voidCoutObj();//輸出目標(biāo)代碼voidJudge(string&st);//獲取操作數(shù)類型,存到numTypeintFindobj();//從后向前尋找相應(yīng)類型的首個目標(biāo)代碼語句intFindobjhead();//從前向后尋找相//目標(biāo)代碼生成函數(shù)(代碼段具體語句)voidGetHead();//目標(biāo)代碼頭部生成(含數(shù)據(jù)段)voidGetTail();//目標(biāo)代碼尾部生成public:structObject*obj;//目標(biāo)代碼指針voidObjCode();//目標(biāo)代碼主函數(shù)]4.3實驗結(jié)果voidmain(){a=1;b=1;while(b<5){if(a%2==0){}輸出結(jié)果如下所示,顯示為結(jié)果為行數(shù)、token值、單詞。E:\SimpleCompiler\b4444444voidmain()abA[cdaE:SimpleCompiler\440401b二1353540b5)4(4a00%2二=0)B33564004444if(a%2=二0){a1b圖4.2詞法分析結(jié)果語法分析模塊:變量的定義會被保存在符號表中,用于之后的標(biāo)識符檢測和最后的目標(biāo)代碼生成階段,符號表存儲結(jié)果如下圖。圖4.3符號表顯示 b該模塊會執(zhí)行相應(yīng)的語義動作并生成中間代碼——四元式,產(chǎn)生的四元式結(jié)果如下圖所示。四元式!四元式!da,t1,,(%,a,2,t2)if,t3圖4.4四元式顯示結(jié)果中間代碼優(yōu)化:中間代碼優(yōu)化采用DAG算法按照基本塊進(jìn)行四元式優(yōu)化,得到的最后優(yōu)化四元式結(jié)果如下圖所示。(=,1,_;b)wh,)do,t1,,塊3:(%,a,2,t2(==,t2,0,t3)if,t3,,塊4:c0,a,,5中6inc,a,,t5)WE編譯成功!圖4.5優(yōu)化后四元式結(jié)果目標(biāo)代碼模塊會產(chǎn)生相應(yīng)的匯編代碼,并最終生成可編譯的.ASM匯編文件,生成的最終文件結(jié)果如下圖所示。code.ASM-記事本code.ASM-記事本code.ASM-記事本ASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLAB1:MOVBX,1AB3:MOVBX,1LAB5:MOVAX,bAB6:MOVBX,5AB7:MOVCX,1LAB8:CMPAX,BXLAB12:MOVBX,t1LAB13:CMPBX,OLAB15:MOVAX,aLAB16:MOVBX,2LAB17:MOVDX,0LAB18:IDIVBXLAB19:MOVt2,DXLAB20:MOVAX,t2LAB21:MOVBX,0LAB22:MOVCX,1LAB23:CMPAX,BXLAB24:JELAB26LAB25:MOVCX,0LAB26:MOVt3,CXLAB27:MOVBX,t3LAB28:CMPBX,0LAB29:JZLAB42LAB30:MOVAX,aLAB31:AAALAB32:0RAX,3030HLAB33:MOVBX,AXLAB34:MOVDL,BHLAB35:MOVAH,O2HLAB36:INT21HLAB37:MOVDL,BLLAB38:INT21HLAB39:MOVDL,10LAB40:INT21HLAB41:JMPLAB46LAB42:MOVBX,bLAB43:MOVt4,BXLAB29:JZLAB42LAB30:MOVAX,aLAB31:AAALAB32:0RAX,3030HLAB33:MOVBX,AXLAB34:MOVDL,BHLAB35:MOVAH,O2HLAB36:INT21HLAB37:MOVDL,BLLAB38:INT21HLAB39:MOVDL,10LAB40:INT21HLAB41:TMPLAB46LAB42:MOVBX,bLAB44:INCBXLAB45:MOVb,BXLAB46:MOVBX,aLAB47:INCBXLAB48:MOVa,BXLAB49:MOVt5,BXLAB50:JMPLAB5LAB51:MOVAH,4CHMOVAL,0圖4.6目標(biāo)代碼生成結(jié)果該模塊已經(jīng)配置好了相應(yīng)環(huán)境,會自動調(diào)用匯編的編譯文件生成可執(zhí)行文件,并自動執(zhí)行該可執(zhí)行文件,從而向屏幕打印輸出源程序的結(jié)果,實現(xiàn)完整的編譯程序。運行結(jié)果如下圖所示。Microsoft(R)OverlauLinkerVersion3.69Copyright(C)MicrosoftCorp1983-1988.A11LIMK:warningL4021:nostacksegmentE:N>code.exe2M圖4.7源程序結(jié)果顯示●main(4444—abC●main(4444—abCU404041b11一測試樣例2:voidmain(){while(a<=5){cout++b;778…9(0……y44…g8…9(0……y44…口寫U404041C二;while(a5———aC55圖4.8詞法分析結(jié)果四元式b,t4圖4.9四元式生成結(jié)果E:\SimpleCompiler\bi塊1:t2e塊4:決5決5塊6:(inc,b,,t4t4,圖4.10中間代碼優(yōu)化結(jié)果目標(biāo)代碼生成:code.ASM-記事本code.ASM-記事本文件(F)編輯(E)格式(O)查看文件(F)編輯(E)格式(O)查code.ASM-記事本DSEGSEGMENTCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLAB2:MOVa,BXLAB3:MOVBX,1LAB6:MOVc,BXLAB10:CMPAX,BXLAB11:JLELAB13LAB15:CMPBX,0LAB17:MOVLAB18:MOVLAB19:INCLAB20:MOVLAB21:MOVLAB22:AAAL

溫馨提示

  • 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

提交評論