第7章-高級(jí)設(shè)計(jì)討論-minic編譯器_第1頁
第7章-高級(jí)設(shè)計(jì)討論-minic編譯器_第2頁
第7章-高級(jí)設(shè)計(jì)討論-minic編譯器_第3頁
第7章-高級(jí)設(shè)計(jì)討論-minic編譯器_第4頁
第7章-高級(jí)設(shè)計(jì)討論-minic編譯器_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余34頁可下載查看

下載本文檔

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

文檔簡(jiǎn)介

第7章本章將討論一些高級(jí)設(shè)計(jì)的話題,這包括設(shè)計(jì)流水型CPU,一些更復(fù)雜實(shí)用的接口部件,以MiniCMiniSysMiniSys5章所講的匯編器。對(duì)于C語言,有標(biāo)準(zhǔn)C語言和方言C語言。對(duì)于標(biāo)準(zhǔn)C語言,主要是學(xué)語言是根據(jù)特定應(yīng)用領(lǐng)域需求對(duì)ANSICC語言。C語言編寫的程序轉(zhuǎn)化為機(jī)器可以理解運(yùn)行的機(jī)器指令程序,則需要通CC語言程序直接編譯成機(jī)器指令程序,也可先編譯生成匯編指令程序,后通過匯編器(5章)將所生成的匯編指令程序編譯CC語言編譯器編譯生成匯編指令CMiniCMiniC編譯器,以有效支撐MiniCMiniSYS進(jìn)行系統(tǒng)編程和應(yīng)用編程。MiniCMiniSYSANSICMini循環(huán)語句允許有while,可以用continue、gotoiteruptrer0interuptServer1MiniC decl_list/*程序由變量描述或函數(shù)描述組成(decl)*/ decl_listdecl|decl var_decl| type_specIDENT|type_specIDENTint_literal*變量包括簡(jiǎn)單變量和一維數(shù)組變量*/type_specVOID|INT/*函數(shù)返回值類型或變量類型包括整型或VOID*/ type_specIDENT(params)compound_stmt param_list|VOID/*函數(shù)參數(shù)個(gè)數(shù)可為0或多個(gè)*/param_listparam_list,param|param type_specIDENT|type_specIDENT[int_literal] stmt_liststmt|ε expr_stmt|compound_stmt|if_stmt|while_stmt|return_stmt|expr_stmtIDENTexpr|IDENTexprexpr|/*賦值語句*/while_stmtWHILE(expr)stmt/*WHILE語句*/compound_stmtlocal_declsstmt_list/*函數(shù)內(nèi)部描述,包括局部變量和語句描述*/local_declslocal_declslocal_decl|ε/*函數(shù)內(nèi)部變量描述*/ type_specIDENT;|type_specIDENT[int_literal]; IF(expr)stmt|IF(expr)stmtELSEstmtreturn_stmtRETURN;|RETURNexpr; exprORexpr/*邏輯或表達(dá)式,運(yùn)算符為exprEQexpr|exprNEexpr/*關(guān)系表達(dá)式exprLEexpr|exprexpr|exprGEexpr|exprexpr/*關(guān)系表達(dá)式exprANDexpr*邏輯與表達(dá)式,運(yùn)算符為exprexpr|exprexpr*算術(shù)表達(dá)式expr*expr|exprexpr|exprexpr/*算術(shù)表達(dá)式expr|expr|expr|$expr/*$expr為取端口地址為expr值的端口值(exprIDENT|IDENTexpr|IDENTargs)/*IDENTargs為函數(shù)調(diào)用int_literal/*數(shù)值常量 um/*數(shù)值常量是十進(jìn)制整數(shù)*/ arg_list,expr|expr arg_list|ε(1)IF語句中,ELSEIF規(guī)表達(dá)式表示。如,標(biāo)識(shí)符的正規(guī)表達(dá)式是:(letter)(letter|digit)*,用于表示以字母開頭的

=

**

*

**

letterordigit

*Return(gettoken(),install

13*#defineIF#defineELSE#defineWHILE#defineINT#defineVOID#defineRETURN#defineRELOP#defineID#defineNUM#defineLE#defineEQ#defineGE#defineGT#defineENDintstate=0;*當(dāng)前狀態(tài),初始設(shè)置為零*/charword[];/*當(dāng)前單詞*/struct{intcatalog;*單詞所屬類別structentry{/*保留字符號(hào)表表項(xiàng)結(jié)構(gòu)定義*/charlexeme[]; int /*token碼}structentry *保留字符號(hào)表*/structsymbol_table*符號(hào)表項(xiàng)定義*/charname[];/*項(xiàng)名*/[];/charcatalog[];/*項(xiàng)類別,如,是變量名或函數(shù)名*/charval[]; int structsymbol_table structsymbol_tableliteral_table[];/*常量(字面量)符號(hào)表*/intlast_id_table_entry=-1; {charc*當(dāng)前單詞中的當(dāng)前字符intc_pos=0;*當(dāng)前單詞中的當(dāng)前字符位置*/Tokentoken;/*token信息*/while(1){switch(state){case0:c=nextchar*c是下一個(gè)字符ifc==blank||c==tab||c==newline*c是空白符號(hào)*/state=0;/*0*/}elseifcstate=1;*}elseifcstate=4;*}elseif {case1:

elseif(isletter(c)){}elseif(isdigit(c)){}if(c==’=’)state=2;elsestate=3;case2:);/caseretract(1*將當(dāng)前字符c返回到輸入緩沖區(qū)以作為下一個(gè)單詞的開始符號(hào));/case4:if(c==’=’)state=5;elsestate=6;case);/caseretract(1*將當(dāng)前字符c返回到輸入緩沖區(qū)以作為下一個(gè)單詞的開始符號(hào));/case7:if(c==’=’)state=8;elsestate=9;case);/caseretract(1*將當(dāng)前字符c返回到輸入緩沖區(qū)以作為下一個(gè)單詞的開始符號(hào)return(token*當(dāng)前單詞是關(guān)系運(yùn)算符’>’*/case10:c=netxchar();ifisletter(c||isdigit(cstate=10;*當(dāng)前字符c是字母或數(shù)字elsestate=11;caseretract(1*將當(dāng)前字符c返回到輸入緩沖區(qū)以作為下一個(gè)單詞的開始符號(hào)(();/elsetoken.innercode=0;*當(dāng)前單詞是保留字*/case12:if(isdigit(c))state=12;elsestate=13;caseretract(1*將當(dāng)前字符c返回到輸入緩沖區(qū)以作為下一個(gè)單詞的開始符號(hào)default:}}}int while [p].lexeme!=’\0’&&if(strcmp( [p].lexeme,word)==0)*當(dāng)前單詞出現(xiàn)在保留字符號(hào)表中*/elseif(endtag==1)return( [p].tokencode是保留字elsereturn(ID);}intinstall_id*判斷當(dāng)前單詞wordintif(last_id_table_entry==-1){}elsewhile(p<=last_id_table_entry&&endtag==0)if(strcmp(id_table[p].name,word)==0)endtag=1;elsep=p+1;if(endtag==1)return(p);else{}}}intif(last_literal_table_entry==-1){}elsewhile(p<=last_literal_table_entry&&endtag==0)if(strcmp(literal_table[p].name,word)==0)endtag=1;elsep=p+1;if(endtag==1)return(p);else{}}}Lex規(guī)范描述自己的詞法(單詞正規(guī)式描述及相應(yīng)語義動(dòng)作)及輔助成分,形成Lex描的詞法分析程序描述語言,如,CJava語言;用戶可對(duì)所生成的詞法分析程序進(jìn)行Lex所給出的規(guī)范比較復(fù)雜。我們可以模仿LexLex自動(dòng)機(jī)(NFA)構(gòu)造程序(可包括將所有正規(guī)表達(dá)式對(duì)應(yīng)的NFA合并為一個(gè)NFA化為確定有限自動(dòng)機(jī)(DFA)和DFA最小化算法可參見任何一本編譯原理。structedge*自動(dòng)機(jī)中邊的定義*/intastate;/*邊的起點(diǎn)狀態(tài)charsymbol;/*邊上的符號(hào)*/intbstate/*邊的終點(diǎn)狀態(tài)*/int charsigma[];/*狀態(tài)機(jī)中每條邊上可以出現(xiàn)的字符集合,其中包括*/intstart; intendstate*終止?fàn)顟B(tài)集,可有一個(gè)或多個(gè)終止?fàn)顟B(tài)*/structedgeedges[];/*邊集*/}Thompson算法(RENFA)所對(duì)應(yīng)非確定有限自動(dòng)機(jī)結(jié)點(diǎn)structnodeintlabel*狀態(tài)結(jié)點(diǎn)標(biāo)記名intacceptstatetag;*接受狀態(tài)標(biāo)記,0為非接受狀態(tài),1為接受狀態(tài)*/struct{charsymbol*邊上標(biāo)記structnode*nextnode*后續(xù)狀態(tài)結(jié)點(diǎn)}firstnode,}注:①NFANFA可轉(zhuǎn)化為五元組形NFANFA。解析正規(guī)表達(dá)式(RE)NFA的方法有二:LR(1)語法制導(dǎo)生成法和基于正規(guī)表達(dá)式NFA,也就是語法制導(dǎo)生成。其過程如下:R s1=newstate*s1labels1*/s2=newstate();/*s2labels2*/s1.acceptstatetag=0;/*s1為非接受態(tài)*/(s1.firstnode).symbola’;(s1.firstnode).nextnode=s2*s1通過as2*/(s1.lastnode).nextnode=’\0’;/*s1無其他發(fā)出邊*/s2.acceptstatetag=1;/*s2為接受態(tài)*/(s2.lastnode).nextnode=’\0’*s2無發(fā)出邊*/R.start=s1;/*s1R的自動(dòng)機(jī)的初態(tài)*/R.end=s2*s2R的自動(dòng)機(jī)的接受態(tài)}aRR(1)R(2) /*R(1).startR的開始狀態(tài)*/((R(1).end).firstnode).symbol’;/*R(1).end通過R(2).start*/(R(1).end).acceptstatetag=0;*R(1).end為非接受狀態(tài)*/R.end=R(2).end;/*R(2).endR的接受狀態(tài)*/}R2s1=newstate*s1labels1*/s2=newstate();/*s2labels2*/s1.acceptstatetag=0;/*s1為非接受態(tài)*/(s1.firstnode).symbol’;(s1.firstnode).nextnode=R(1).start*s1通過R(1).start*/(s1.lasttnode).symbol’;;/R.start=s1*s1R的開始狀態(tài)*/s2.acceptstatetag=1;/*s2為接受態(tài)*/((R(1).end).firstnode).symbol’;(R(1).end).acceptstatetag=0;*R(1).end為非接受狀態(tài)*/((R(2).end).firstnode).symbol’;(R(2).end).acceptstatetag=0;*R(2).end為非接受狀態(tài)*/R.end=s2;/*s2R的接受狀態(tài)*/}R1R2 RR(1)*s1=newstate*s1labels1*/s2=newstate();/*s2labels2*/s1.acceptstatetag=0;/*s1為非接受態(tài)*/(s1.firstnode).symbol’;(s1.firstnode).nextnode=R(1).start*s1通過R(1).start*/(s1.lasttnode).symbol’;(s1.lastnode).nextnode=s2*s1通過s2R.start=s1*s1R的開始狀態(tài)*/s2.acceptstatetag=1;/*s2為接受態(tài)*/((R(1).end).firstnode).symbol’;((R(1).end).lastnode).symbol’;/*R(1).end通過s2R(1).start*/(R(1).end).acceptstatetag=0;*R(1).end為非接受狀態(tài)*/R.end=s2;/*s2R的接受狀態(tài)*/}R1R1R(R(1))R.end=R(1)}構(gòu)造相應(yīng)LR(1)R如下:運(yùn)算符號(hào)’’的優(yōu)先級(jí)高于選擇運(yùn)算符號(hào)’|’;閉包運(yùn)算符號(hào)’*、連接運(yùn)算符號(hào)’’和選擇運(yùn)算符號(hào)|’均遵循左結(jié)合規(guī)則。RLR(1)下推自動(dòng)機(jī)(這里略LR(1)分 a|*()#R011273456789)’#’,LR(1)NFA的局部。當(dāng)出現(xiàn)接收動(dòng)作時(shí),則整個(gè)NFA就已生成。voidChange(char*r1,char* {Stack inti,j; char if(ch==' else }

else{

else charw=Peek(R);Precedence(w)Precedence('*')=3,//Precedence('|')=1,//Pop(R);w=Peek(R);}}else}}while{}Pop(R);//彈出'#'r2[j++]='\0'r2}可規(guī)定閉包運(yùn)算符號(hào)’*’的優(yōu)先級(jí)高于連接運(yùn)算符號(hào)’’,而連接運(yùn)算符號(hào)’’的優(yōu)先級(jí)高于選擇運(yùn)算符號(hào)’|’;閉包運(yùn)算符號(hào)’*、連接運(yùn)算符號(hào)’’和選擇運(yùn)算符號(hào)’|’均遵循左結(jié)根據(jù)正規(guī)表達(dá)式后綴形式r2生成相應(yīng)r2r2中當(dāng)前符號(hào)若r2中當(dāng)前符號(hào)是’或’|’,則彈出當(dāng)前操作數(shù)棧棧頂兩項(xiàng),并生成r2中當(dāng)前符號(hào)是*’NFAR,NFARr2結(jié)束。Stack int char if(isletter(ch)) s1=newstate*s1labels1*/s2=newstate();/*s2labels2*/s1.acceptstatetag=0;/*s1為非接受態(tài)*/(s1.firstnode).nextnode=s2*s1通過as2*/(s1.lastnode).nextnode=’\0’;/*s1無其他發(fā)出邊*/s2.acceptstatetag=1;/*s2為接受態(tài)*/(s2.lastnode).nextnode=’\0’*s2無發(fā)出邊*/aR.start=s1;/*s1R的自動(dòng)機(jī)的初態(tài)*/R.end=s2*s2RaPush(S,RRS }else R2=Pop(SSR2,R2NFAR1=Pop(SSR1R1NFA//R1R2NFA,NFAR1R2NFA((R1.end).firstnode).symbol=’’;(R1.end).acceptstatetag=0*R1.end為非接受狀態(tài)*/R.start=R1.start;/*R1.startR的開始狀態(tài)*/R.end=R2.end;/*R2.endR的接受狀態(tài)*/R1R1R1R1R2}elseNFAR,

{ R2=Pop(S);SR2R2NFAR1=Pop(SSR1R1NFA//R1R2NFANFAR1R2NFARs1=newstate();/*s1labels1*/s2=newstate();/*s2labels2*/s1.acceptstatetag=0;/*s1為非接受態(tài)*/(s1.firstnode).nextnode=R1.start*s1通過R1.start*/(s1.lasttnode).symbol’;(s1.lastnode).nextnode=R2.start*s1通過R2.start*/s2.acceptstatetag=1;/*s2為接受態(tài)*/((R1.end).firstnode).symbol’;(R1.end).acceptstatetag=0;*置R1.end為非接受狀態(tài)*/((R2.end).firstnode).symbol’;/*R2.end通過(R2.end).acceptstatetag=0;*R2.end為非接受狀態(tài)*/R.start=s1;/*s1R的開始狀態(tài)*/R.end=s2*s2R的接受狀態(tài)R1R2 }

elses1=newstate*s1labels1*/s2=newstate();/*s2labels2*/s1.acceptstatetag=0;/*s1為非接受態(tài)*/(s1.firstnode).symbol’;(s1.firstnode).nextnode=R1.start*s1通過R1.start*/(s1.lasttnode).symbol’;(s1.lastnode).nextnode=s2*s1通過s2s2.acceptstatetag=1;/*s2為接受態(tài)*/((R1.end).firstnode).symbol’;((R1.end).lastnode).symbol’;/*R1.end通過s2R1.start/R.start=s1*s1R的開始狀態(tài)*/R.end=s2;/*s2R的接受狀態(tài)*/R1}else}}RENFA。LL(1)預(yù)測(cè)LR(1)語法分析法。中,有一個(gè)產(chǎn)生式,產(chǎn)生式用于定義語言的成分,如程序,其它產(chǎn)生式用于定MiniC語法對(duì)語句(stmt)的定義,描述如何構(gòu)造基于遞歸下降分析法的語stmtexpr_stmt|compound_stmt|if_stmt|while_stmtexpr_stmtIDENTexpr|IDENTexprexpr|/*賦值語句*/while_stmtWHILE(expr)stmt/*WHILE語句*/compound_stmtlocal_declsstmt_list}/*函數(shù)內(nèi)部描述,包括局部變量和語句描述*/local_declslocal_declslocal_decl|ε/*函數(shù)內(nèi)部變量描述*/local_decltype_specIDENT;|type_specIDENT[];if_stmtIF(expr)stmt|IF(expr)stmtELSEstmtreturn_stmtRETURN;|RETURNexpr;if_stmtIF(expr)stmtif_stmtIF(expr)stmt1elsestmt2{Tokenvoidstmt*{if(lookahead.catalog==ID)//當(dāng)前單詞是標(biāo)識(shí)符();//elseiflookahead.catalog==IF當(dāng)前單詞是保留字IFif_stmt();//IF語句處理子程序elseiflookahead.catalog==WHILE當(dāng)前單詞是保留字IFwhile_stmt();//IF語句處理子程序 }void{match(ID);//ID,并讀入下一個(gè)單詞()//elseifmatch(ASSIGN確認(rèn)當(dāng)前單詞類型是賦值符號(hào),并讀入下一個(gè)單詞expr();//調(diào)用表達(dá)式處理子程序分析賦值符號(hào)右部的表達(dá)式}else}void{intmatch(IF);//確認(rèn)當(dāng)前單詞是’if’,并讀入下一個(gè)單詞match(LEFTP確認(rèn)當(dāng)前單詞是’(’,并讀入下一個(gè)單詞expr();//條件表達(dá)式處理match(RIGHTP);//確認(rèn)當(dāng)前單詞是’)’,并讀入下一個(gè)單詞out1=newlabel();//產(chǎn)生一個(gè)標(biāo)號(hào),用于指示條件表達(dá)式為出口stmt();//處理?xiàng)l件為真時(shí)應(yīng)該執(zhí)行的語句if(lookahead.innercode==ELSE)//ELSE{out2=newlabel();//產(chǎn)生一個(gè)標(biāo)號(hào),if語句的出口emit(GO,out2goto語句,gotoif語句的出口//else//}else//if語句無else}voidmatch(int{if(lookahead.catalog==t)//tlookahead=nexttoken讀入并分析下一個(gè)單詞else}voidemit(intt,int{switch(t)caseLVALUE:caseGOFALSE:printf(“jmp%d\n”,tval);caseprintf(“jmp%d\n”,tval);printf(“token%d,tokenval}此表以一定的方式進(jìn)行,以便于LR(1)語法分析總控程序使用。②手工構(gòu)造

LR(1)LALR(1)分析表的構(gòu)造,但一般可以不壓縮。structlr_rowintstate;//狀態(tài)stringaction動(dòng)作intgoto[];//gotostructlr_rowlr[];action和gototokens和nontermtokens是一個(gè)常量數(shù)組,作用是用于存放可識(shí)別單詞(也就是可以出現(xiàn)nontermstringnonterm[]={“E”,“T”,tokensm個(gè)元素,nonterm數(shù)組有nLR(1)分析表的每一1+m+n個(gè)元素:狀態(tài),action[0],…,action[n-1],goto[0],…,goto[n-1]。LR(1)語法分析總控程序使用。LR(1)分析表文件中每行信息可按如下結(jié)構(gòu)存放,每個(gè)元間用’,’隔開,若一將LR(1)分析表文件讀入內(nèi)存的基本過程如下:FILE*fp;structlr_rowintfp=fopen(“l(fā)r1.txtr假設(shè)LR(1)lr1.txtif(fp!=‘\0’) while(!feof(fp)){i=i+1;//準(zhǔn)備讀下一行}}else在LR(1)語法分析總控程序中可如下根據(jù)當(dāng)前狀態(tài)和LR(1)分析表查找決定下inti,tempcatalog,endtag;intactionindex,currentstate;stringaction;//iftempcatalogRELOP||tempcatalog==ARIOP當(dāng)前單詞是運(yùn)算符tempcatalog=lookahead.innercode;//運(yùn)算符類別碼用其內(nèi)碼表示whilei<n&&endtag==0tempcatalog尋找對(duì)應(yīng)動(dòng)作的actionif(tempcatalog==tokens[i])endtag=1;elsei=i+1;ifi<nactionindex=i獲得對(duì)應(yīng)動(dòng)作的action數(shù)組下標(biāo),以查找actionelseactionindex=-if(actionindex>=0)elseerror();由上可以得出,基于LR(1)分析法的語法分析程序編寫的和是由語言文LR(1)分析表。該構(gòu)造過程非常繁瑣,且當(dāng)語言文法稍微調(diào)整時(shí),LR(1)LR(1)分析表,進(jìn)一步自動(dòng)生成基于LR(1)分析的語法分析程序。這就需要語法分析程序MiniC語法,就需要通過一個(gè)語法分析程序生成MiniC語法分析程序,而不必只要語法修改則)YACC描述文件--.yYACC程序生成與.y文Java語言YACCYACC思路寫自己的語法分析要求用戶寫出語言語法成分定義的產(chǎn)生式規(guī)則、語法成分正確識(shí)別后應(yīng)采((LALR(1)(LR(1)LR(1)下推自動(dòng)機(jī)構(gòu)造相應(yīng)LR(1)LR(1)LALR(1)語法分析表的程序LALR(1)語法分析表。LALR(1)語法分析表進(jìn)行語法分LALR(1)語法分析總控程序的程序。我們編寫自己的語法分析程序生成工具的關(guān)鍵是如何編寫由語言語法(文法)產(chǎn)生式構(gòu)造L()L()(1)下推自動(dòng)機(jī)構(gòu)造L(1)語法分析表、由L(1分析表通過合并相容狀態(tài)生成LAL1)法分析的算可參任何本編譯。structLr1Item{//LR(1)項(xiàng)目定義;//stringright[];//項(xiàng)目右部,對(duì)應(yīng)某一非終結(jié)符產(chǎn)生式的右部,由多個(gè)符號(hào)組成 }structLr1PDAStateLR(1)下推自動(dòng)機(jī)的狀態(tài)定義intname;//狀態(tài)標(biāo)識(shí)名,用整數(shù)表示Lr1Itemitems[];//狀態(tài)所擁有的項(xiàng)目(可有多個(gè))intitemsnum;//狀態(tài)擁有項(xiàng)目數(shù)}structLr1PDAedgeLR(1)下推自動(dòng)機(jī)的邊定義intstartname;//邊的起點(diǎn)狀態(tài)標(biāo)識(shí)}structLr1PDALR(1)下推自動(dòng)機(jī)定義Lr1PDAStatestates[];//狀態(tài)集定義intNumOfStates;int}structLr1PDAstructLr1PDAStateinitState,s1;structLr1Items2;Enqueue(StateQueue,InitState);//將初始狀態(tài)入隊(duì)intnumStates=0;intwhile(StateQueue不為空){s1=Delqueue(StateQueue);//StateQueues1if(s1StateSet中){//s1放入集合ExtendedStateSet){//(//s1LR(1)項(xiàng)目右部點(diǎn)之后是非終結(jié)符,需要展開}while(ItemQueue不為空s2=Delqueue(ItemQueueItemQueues2if(s2ExtendedItemSet中){//擴(kuò)展新項(xiàng)目//s2放入集合ExtendedItemSet,ifs是非終結(jié)符structLr1Itemtempitem;//定義用于擴(kuò)展項(xiàng)目的tempitemstringtemps;//s2形如:(AB,a)temps為astrcpy(temps,s2.right[s2.dotpos+1]);intwhilej<=nnsCopy(tempitem.right,sj個(gè)產(chǎn)生式右部);//將當(dāng)前形成的與當(dāng)前產(chǎn)生式相關(guān)的LR(1)項(xiàng)目tempitem作為s1iftempitem.right[dotpos]是非終結(jié)符)}}}}structLr1Itemtempitem1;inttempnum=1;//tempnum用于s1狀態(tài)中項(xiàng)目右部點(diǎn)之后不同符號(hào)structstringsym;intitemno[];int}//genitem[i]用于記錄s1狀態(tài)中項(xiàng)目右部點(diǎn)之后為符號(hào)genitem[i].sym的所有項(xiàng)目編int//s1genitem[0]while(endtag==0&&mm<s1.itemsnum)//s1.items[mm]是可移進(jìn)項(xiàng)目,也就是可以有后續(xù)狀態(tài)}elseifendtag==1s1inttempcount=1;//tempcounts1strings=if(s1.items[tempcount].dotpos<s1.items[tempcount].rightnum){intk=0,endtag1=0;while(endtag1==0&&k<tempnum){if(strcmp(s,genitem[k].sym)==0){//若s是已出現(xiàn)的符號(hào),則記錄s的當(dāng)前項(xiàng)目編號(hào)入相應(yīng)genitem[k]}else}if(endtag1==0)//sgenitem[tempnum]}}}//以上代碼用于根據(jù)s1中所有項(xiàng)目點(diǎn)之后的符號(hào)進(jìn)行歸類,tempnum是分類intm=0;stringwhile(m<tempnum){structLr1PDAStatetempstate;if(genitem[m].numitem>0){intkk=0;while(kk<genitem[m].numitem){structLr1Itemtempitem2;//s作為項(xiàng)目右部點(diǎn)后符號(hào)的當(dāng)前項(xiàng)目令為if(tempitem2.dotpos<tempitem.rightnum){}}//tempstate放入狀態(tài)隊(duì)列,以對(duì)tempstate//s1tempstate之間形成一條邊}//}}}}}造LR(1)分析表的是如何定義LR(1)分析表的數(shù)據(jù)結(jié)構(gòu),具體可參見本節(jié)“基LR(1)語法分析法”的語法分析程序編寫部分。件中指明的算符優(yōu)先級(jí)及結(jié)合規(guī)則或else懸掛等消除規(guī)則進(jìn)行消除。設(shè)當(dāng)前狀態(tài)為m,后繼狀態(tài)為n,mn連接的邊上標(biāo)記為終結(jié)符c,即在m中存m中又有可歸約項(xiàng)目(Bc.,c)(為空或一個(gè)非終結(jié)符,也就是項(xiàng)目的核前讀頭下終結(jié)符c,根據(jù)移進(jìn)項(xiàng)目(A.c,a)要求移進(jìn);根據(jù)可歸約項(xiàng)目(Bc.,c為空或一個(gè)非終結(jié)符)要求先歸約)c的結(jié)合規(guī)則進(jìn)行序列編號(hào));否則保留移進(jìn)動(dòng)作,也就是置action(m,c)Sn(nmc連接的項(xiàng)目的部分的最后一個(gè)終結(jié)符為d),則同樣出現(xiàn)了對(duì)同一個(gè)符號(hào)c的移進(jìn)—項(xiàng)目(Cd.,c為空或一個(gè)非終結(jié)符)要求先歸約)d與c的優(yōu)先級(jí)進(jìn)行消除(若d的優(yōu)先級(jí)高于c的優(yōu)先級(jí),則保留歸約動(dòng)作,也就是置action(m,c)Sn(nm通過邊c連接的后續(xù)狀態(tài))言文則進(jìn)行語法分析的同時(shí),利用相應(yīng)語言文則的語義規(guī)則進(jìn)行目標(biāo)代碼生成,也為了便于目標(biāo)代碼生成,我們可先通過語言文則的語義規(guī)則生成以三地址碼形式表該標(biāo)識(shí)符所處的環(huán)境也一無所知,詞法分析時(shí)所構(gòu)造的符號(hào)表很不成熟,推語法分析及并分配相應(yīng)空間(以相對(duì)地址表示。對(duì)于全局變量說明,經(jīng)過翻譯后放在全局變量符 type_specIDENT;量} type_specIDENT[int_literal];量}type_specint } type_specIDENT(params)compound_stmt} }

param_list1param_list2,param}param_listparam } type_specIDENT量} type_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論