版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、編譯原理語義分析和中間代碼生成第1頁,共169頁,2022年,5月20日,20點33分,星期二4.1 概 述 4.1.1 語義分析的概念 一個源程序經(jīng)過詞法分析、語法分析之后,表明該源程序在書寫上是正確的,并且符合程序語言所規(guī)定的語法。但是語法分析并未對程序內(nèi)部的邏輯含義加以分析,因此編譯程序接下來的工作是語義分析,即審查每個語法成分的靜態(tài)語義。如果靜態(tài)語義正確,則生成與該語言成分等效的中間代碼,或者直接生成目標(biāo)代碼。 第2頁,共169頁,2022年,5月20日,20點33分,星期二 直接生成機器語言或匯編語言形式的目標(biāo)代碼的優(yōu)點是編譯時間短且無需中間代碼到目標(biāo)代碼的翻譯,而中間代碼的優(yōu)點是使
2、編譯結(jié)構(gòu)在邏輯上更為簡單明確,特別是使目標(biāo)代碼的優(yōu)化比較容易實現(xiàn)。第3頁,共169頁,2022年,5月20日,20點33分,星期二 如同在進行詞法分析、語法分析的同時也進行著詞法檢查、語法檢查一樣,在語義分析時也必然要進行語義檢查。動態(tài)語義檢查需要生成相應(yīng)的目標(biāo)代碼,它是在運行時進行的;靜態(tài)語義檢查是在編譯時完成的,它涉及以下幾個方面: (1) 類型檢查,如參與運算的操作數(shù)其類型應(yīng)相容。 (2) 控制流檢查,用以保證控制語句有合法的轉(zhuǎn)向點。如C語言中不允許goto語句轉(zhuǎn)入case語句流;break語句需尋找包含它的最小switch、while或for語句方可找到轉(zhuǎn)向點,否則出錯。 第4頁,共1
3、69頁,2022年,5月20日,20點33分,星期二 (3) 一致性檢查,如在相同作用域中標(biāo)識符只能說明一次、case語句的標(biāo)號不能相同等。 語義分析階段只產(chǎn)生中間代碼而不生成目標(biāo)代碼的方法使編譯程序的開發(fā)變得較為容易,但語義分析不像詞法分析和語法分析那樣可以分別用正規(guī)文法和上下文無關(guān)文法描述。由于語義是上下文有關(guān)的,因此語義的形式化描述是非常困難的,目前較為常見的是用屬性文法作為描述程序語言語義的工具,并采用語法制導(dǎo)翻譯的方法完成對語法成分的翻譯工作。第5頁,共169頁,2022年,5月20日,20點33分,星期二 語法制導(dǎo)翻譯方法 語法制導(dǎo)翻譯的方法就是為每個產(chǎn)生式配上一個翻譯子程序(稱語
4、義動作或語義子程序),并在語法分析的同時執(zhí)行這些子程序。語義動作是為產(chǎn)生式賦予具體意義的手段,它一方面指出了一個產(chǎn)生式所產(chǎn)生的符號串的意義,另一方面又按照這種意義規(guī)定了生成某種中間代碼應(yīng)做哪些基本動作。在語法分析過程中,當(dāng)一個產(chǎn)生式獲得匹配(對于自上而下分析)或用于歸約(對于自下而上分析)時,此產(chǎn)生式相應(yīng)的語義子程序就進入工作,完成既定的翻譯任務(wù)。第6頁,共169頁,2022年,5月20日,20點33分,星期二 語法制導(dǎo)翻譯分為自下而上語法制導(dǎo)翻譯和自上而下語法制導(dǎo)翻譯,我們重點介紹自下而上語法制導(dǎo)翻譯。 假定有一個自下而上的LR分析器,我們可以把這個LR分析器的能力加以擴大,使它能在用某個產(chǎn)
5、生式進行歸約的同時調(diào)用相應(yīng)的語義子程序進行有關(guān)的翻譯工作;每個產(chǎn)生式的語義子程序執(zhí)行之后,某些結(jié)果(語義信息)必須作為此產(chǎn)生式的左部符號的語義值暫時保存下來,以便以后語義子程序引用這些信息。第7頁,共169頁,2022年,5月20日,20點33分,星期二 此外,原LR分析器的分析棧也加以擴充,以便能夠存放與文法符號相對應(yīng)的語義值。這樣,分析??梢源娣湃愋畔ⅲ悍治鰻顟B(tài)、文法符號及文法符號對應(yīng)的語義值。擴充后的分析棧如圖41所示。 作為一個例子,我們考慮下面的文法及語義動作所執(zhí)行的程序:第8頁,共169頁,2022年,5月20日,20點33分,星期二產(chǎn)生式 語義動作(0) SE print va
6、lTOP(1) EE(1)+E(2)valTOP=valTOP+valTOP+2(2) EE(1)*E(2)valTOP=valTOP*valTOP+2(3) E(E(1) valTOP= valTOP+1(4) Ei valTOP=lexval (注:lexval為i的整型內(nèi)部值)這個文法的LR分析表見表3.20。第9頁,共169頁,2022年,5月20日,20點33分,星期二 我們擴充分析棧工作的總控程序功能,使其在完成語法分析的同時也能完成語義分析工作(這時的語法分析棧已成為語義分析棧);即在用某一個規(guī)則進行歸約之后,調(diào)用相應(yīng)的語義子程序完成與所用產(chǎn)生式相應(yīng)的語義動作,并將每次工作后的語
7、義值保存在擴充后的“語義值”棧中。圖42表示算術(shù)表達式79*5#的語法樹及各結(jié)點值,而表4.1則給出了根據(jù)表3.20用LR語法制導(dǎo)翻譯方法得到的該表達式的語義分析和計值過程。第10頁,共169頁,2022年,5月20日,20點33分,星期二圖41 擴充后的LR分析棧 第11頁,共169頁,2022年,5月20日,20點33分,星期二圖42 語法制導(dǎo)翻譯計算表達式 79*5#的語法樹第12頁,共169頁,2022年,5月20日,20點33分,星期二表4.1 表達式79*5#的語義分析和計值過程步驟狀態(tài)棧符號棧語義棧輸入串主要動作10#_79*5#s3203# 7_ _9*5#r4301# E_7
8、9*5#s44014# E+_7_9*5#s350143# E+9_7_ _*5#r460147# E+E_7_9*5#s5701475# E+E*_7_9_5#s38014753# E+E*5_7_9_ _#r49014758# E+E*E_7_9_5#r2100147# E+E_7_45#r11101# E_52#acc第13頁,共169頁,2022年,5月20日,20點33分,星期二4.2 屬 性 文 法 4.2.1 文法的屬性 屬性是指與文法符號的類型和值等有關(guān)的一些信息,在編譯中用屬性描述處理對象的特征。隨著編譯的進展,對語法分析產(chǎn)生的語法樹進行語義分析,且分析的結(jié)果用中間代碼描述出
9、來。對于一棵等待翻譯的語法樹,它的各個結(jié)點都是文法中的一個符號X,該X可以是終結(jié)符或非終結(jié)符。根據(jù)語義處理的需要,在用產(chǎn)生式AX進行歸約或推導(dǎo)時,應(yīng)能準(zhǔn)確而恰當(dāng)?shù)乇磉_文法符號X在歸約或推導(dǎo)時的不同特征。 第14頁,共169頁,2022年,5月20日,20點33分,星期二 例如,判斷變量X的類型是否匹配,要用X的數(shù)據(jù)類型來描述;判斷變量X是否存在,要用X的存儲位置來描述;而對X的運算,則要用X的值來描述;因此,語義分析階段引入X的屬性,如X.type、X.place、X.val等來分別描述變量X的類型、存儲位置以及值等不同的特征。 文法符號的屬性可分為繼承屬性與綜合屬性兩類。繼承屬性用于“自上而
10、下”傳遞信息。繼承屬性由相應(yīng)語法樹中結(jié)點的父結(jié)點屬性計算得到,即沿語法樹向下傳遞,由根結(jié)點到分枝(子)結(jié)點,它反映了對上下文依賴的特性。繼承屬性可以很方便地用來表示程序語言上下文的結(jié)構(gòu)關(guān)系。第15頁,共169頁,2022年,5月20日,20點33分,星期二 綜合屬性用于“自下而上”傳遞信息。綜合屬性由相應(yīng)語法分析樹中結(jié)點的分枝結(jié)點(即子結(jié)點)屬性計算得到,其傳遞方向與繼承屬性相反,即沿語法分析樹向上傳遞,從分枝結(jié)點到根結(jié)點。第16頁,共169頁,2022年,5月20日,20點33分,星期二 4.2.2 屬性文法 屬性文法是一種適用于定義語義的特殊文法,即在語言的文法中增加了屬性的文法,它將文法
11、符號的語義以“屬性”的形式附加到各個文法的符號上(如上述與變量X相關(guān)聯(lián)的屬性X.type、X.place和X.val等),再根據(jù)產(chǎn)生式所包含的含義,給出每個文法符號屬性的求值規(guī)則,從而形成一種帶有語義屬性的上下文無關(guān)文法,即屬性文法。屬性文法也是一種翻譯文法,屬性有助于更詳細(xì)地指定文法中的代碼生成動作。第17頁,共169頁,2022年,5月20日,20點33分,星期二例如,簡單算術(shù)表達式求值的屬性文法如下: 產(chǎn)生式 語義規(guī)則(1) SE print (E.val)(2) EE(1)+TE.val=E(1).val+T.val(3) ET E.val=T.val(4) TT(1)*FT.val=
12、T(1).val*F.val(5) TT(1)T.val=T(1).val(6) F(E)F.val=E.val(7) Fi F.val=i.lexval第18頁,共169頁,2022年,5月20日,20點33分,星期二上面的一組產(chǎn)生式中,每一個非終結(jié)符都有一個屬性val來表示整型值,如E.val表示E的整型值,而i.lexval則表示i的整型內(nèi)部值。與產(chǎn)生式關(guān)聯(lián)的每一個語義規(guī)則的左部符號E、T、F等的屬性值的計算由其各自相應(yīng)的右部符號決定,這種屬性也稱為綜合屬性。與產(chǎn)生式SE關(guān)聯(lián)的語義規(guī)則是一個函數(shù)print(E.val),其功能是打印E產(chǎn)生式的值。S在語義規(guī)則中沒有出現(xiàn),可以理解為其屬性是
13、一個虛屬性。我們再舉一例說明屬性文法。一簡單變量類型說明的文法GD如下:GD:Dint Lfloat LLL, idid第19頁,共169頁,2022年,5月20日,20點33分,星期二其對應(yīng)的屬性文法為: 產(chǎn)生式語義規(guī)則(1) DTLL.in=T.type(2) TintT.type=int(3) TfloatT.type=float(4) LL(1),idL(1).in=L.in; addtype(id.entry,L.in)(5) Lidaddtype(id.entry,L.in)注意到與文法GD相應(yīng)的說明語句形式可為int id1,id2,,idn 或者 float id1,id2,,
14、idn第20頁,共169頁,2022年,5月20日,20點33分,星期二 非終結(jié)符T有一個綜合屬性type,其值為int或float。語義規(guī)則L.in=T.type表示L.in的屬性值由相應(yīng)說明語句指定的類型T.type決定;屬性L.in被確定后將隨語法樹的逐步生成而傳遞到下邊的有關(guān)結(jié)點使用,這種結(jié)點屬性稱為繼承屬性。由此可見,標(biāo)識符的類型可以通過繼承屬性的復(fù)寫規(guī)則來傳遞。例如,對輸入串int a,b,根據(jù)上述的語義規(guī)則,可在其生成的語法樹中看到用“”表示的屬性傳遞情況,如圖43所示。 第21頁,共169頁,2022年,5月20日,20點33分,星期二圖43 屬性信息傳遞情況示意第22頁,共1
15、69頁,2022年,5月20日,20點33分,星期二4.3 幾種常見的中間語言 4.3.1 抽象語法樹 抽象語法樹也稱圖表示,是一種較為流行的中間語言表示形式。在抽象語法樹表示中,每一個葉結(jié)點都表示諸如常量或變量這樣的運算對象,而其它內(nèi)部結(jié)點則表示運算符。抽象語法樹不同于前述的語法樹,它展示了一個操作過程并同時描述了源程序的層次結(jié)構(gòu)。第23頁,共169頁,2022年,5月20日,20點33分,星期二 注意,語法規(guī)則中包含的某些符號可能起標(biāo)點符號作用也可能起解釋作用。如賦值語句語法規(guī)則: SV=e 其中的賦值號“=”僅起標(biāo)點符號作用,其目的是把V與e分開;而條件語句語法規(guī)則:Sif(e)S1;
16、else S2第24頁,共169頁,2022年,5月20日,20點33分,星期二 其中的保留字符號if和else起注釋作用,說明當(dāng)布爾表達式e為真時執(zhí)行S1,否則執(zhí)行S2;而“;”僅起標(biāo)點符號作用。可以看出,上述語句的本質(zhì)部分是V、e和Si。當(dāng)把語法規(guī)則中本質(zhì)部分抽象出來而將非本質(zhì)部分去掉后,便得到抽象語法規(guī)則。這種去掉不必要信息的做法可以獲得高效的源程序中間表示。上述語句的抽象語法規(guī)則為:第25頁,共169頁,2022年,5月20日,20點33分,星期二 (1) 賦值語句:左部 表達式 (2) 條件語句:表達式 語句1 語句2 與抽象語法相對應(yīng)的語法樹稱為抽象語法樹或抽象樹,如賦值語句x=a
17、b*c的抽象語法樹如圖44(a)所示,而圖44(b)則是該賦值語句的普通語法樹。第26頁,共169頁,2022年,5月20日,20點33分,星期二圖44 x=ab*c的語法樹 第27頁,共169頁,2022年,5月20日,20點33分,星期二 抽象語法樹的一個顯著特點是結(jié)構(gòu)緊湊,容易構(gòu)造且結(jié)點數(shù)較少。圖44(b)所示的普通語法樹的結(jié)點為14個;而圖44(a)所示的抽象語法樹的結(jié)點僅有7個,且每個內(nèi)部結(jié)點最多只有兩個分支,因此可以將每個賦值語句或表達式表示為一棵二叉樹。對于含有多元運算的更為復(fù)雜的語法成分,相應(yīng)的抽象語法樹則為一棵多叉樹,但我們總可以將其轉(zhuǎn)變?yōu)橐豢枚鏄?。?8頁,共169頁,2
18、022年,5月20日,20點33分,星期二 逆波蘭表示法 逆波蘭表示法是波蘭邏輯學(xué)家盧卡西維奇(Lukasiewicz)發(fā)明的一種表示表達式的方法,這種表示法把運算量(操作數(shù))寫在前面,把運算符寫在后面,因而又稱后綴表示法。例如,把a+b寫成ab+,把a*(b+c)寫成abc+*。第29頁,共169頁,2022年,5月20日,20點33分,星期二 1表達式的逆波蘭表示 表達式E的后綴表示的遞歸定義如下: (1) 如果E是變量或常數(shù),則E的后綴表示即E自身。 (2) 如果E為E1 op E2形式,則它的后綴表示為E1E2op;其中op是二元運算符,而E1、E2分別又是E1和E2的后綴表示。若op
19、為一元運算符,則視E1和E1為空。 (3) 如果E為(E1)形式,則E1的后綴表示即為E的后綴表示。第30頁,共169頁,2022年,5月20日,20點33分,星期二上述遞歸定義的實質(zhì)是:后綴表示中,操作數(shù)出現(xiàn)的順序與原來一致,而運算符則按運算先后的順序放入相應(yīng)的操作數(shù)之后(即運算符先后的順序發(fā)生了變化)。這種表示已不再需要用括號來規(guī)定運算的順序了。后綴表示中的計值用棧實現(xiàn)非常方便。一般的計值過程是自左至右掃描后綴表達式,每碰到運算量就把它推進棧,每碰到K目運算符就把它作用于棧頂?shù)腒個運算量,并用運算的結(jié)果(即一個運算量)來取代棧頂?shù)腒個運算量。第31頁,共169頁,2022年,5月20日,2
20、0點33分,星期二 2程序語句的逆波蘭表示 為了用逆波蘭式表示一些控制語句,我們定義轉(zhuǎn)移操作如下: (1) BL:轉(zhuǎn)向某標(biāo)號; (2) BT:條件為真時轉(zhuǎn)移; (3) BF:條件為假時轉(zhuǎn)移; (4) BR:無條件轉(zhuǎn)移。第32頁,共169頁,2022年,5月20日,20點33分,星期二 部分程序語句的逆波蘭表示如下: (1) 賦值語句。賦值語句“=”的逆波蘭表示為 = 例如,賦值語句“x=a+b*c”可按逆波蘭式寫為“xabc*+=”。 (2) GOTO語句。轉(zhuǎn)向語句“GOTO”的逆波蘭表示為BL 其中,“BL”為單目后綴運算符,“”則為BL的一個運算分量。第33頁,共169頁,2022年,5月
21、20日,20點33分,星期二 (3) 條件語句。BR表示無條件轉(zhuǎn)移單目后綴運算符。例如,“BR”表示無條件轉(zhuǎn)移到“”處,這里的順序號是BR的一個特殊運算分量,用來表示逆波蘭式中單詞符號的順序號(即第幾個單詞),它不同于GOTO語句中的語句標(biāo)號。BT和BF表示按條件轉(zhuǎn)移的兩個雙目后綴運算符。例如:BTBF第34頁,共169頁,2022年,5月20日,20點33分,星期二 分別表示當(dāng)e為真或假時轉(zhuǎn)移到順序號處;其中,布爾表達式e的逆波蘭式和順序號是兩個特殊的運算分量。若使用BT和BF兩個運算符,則條件語句if(e)S1;else S2的逆波蘭式為: BF /*e為假則轉(zhuǎn)S2的第一個單詞的順序號*/
22、 /*e為真則執(zhí)行S1*/BR /*S1執(zhí)行結(jié)束后無條件轉(zhuǎn)出該條件語句*/ 第35頁,共169頁,2022年,5月20日,20點33分,星期二 (3) 條件語句。BR表示無條件轉(zhuǎn)移單目后綴運算符。例如,“BR”表示無條件轉(zhuǎn)移到“”處,這里的順序號是BR的一個特殊運算分量,用來表示逆波蘭式中單詞符號的順序號(即第幾個單詞),它不同于GOTO語句中的語句標(biāo)號。BT和BF表示按條件轉(zhuǎn)移的兩個雙目后綴運算符。例如:BTBF第36頁,共169頁,2022年,5月20日,20點33分,星期二例如,條件語句if(mn) k=i+1;else k=i1的逆波蘭式表示為(1)(18)為單詞編號):(1) mn(
23、4) 13BF(6) ki1+=(11) 18BR(13) ki1=(18) if語句的后繼語句此逆波蘭式也可寫在一行上,即mn13BFki1+=18BRki1 =第37頁,共169頁,2022年,5月20日,20點33分,星期二 (4) 循環(huán)語句。for循環(huán)語句為:for(i=m;i=n;i+)S;其中,i為循環(huán)控制變量,m為初值,n為終值,S為循環(huán)體。循環(huán)語句不能直接用逆波蘭表示,因而將其展開為等價的條件語句后再用逆波蘭表示,即i=m;10:if(i=n) S;i=i+1;goto l0第38頁,共169頁,2022年,5月20日,20點33分,星期二 4.3.3 三地址代碼 1三地址代碼
24、的形式 三地址代碼語句的一般形式為 x=y op z 其中,x、y和z為名字、常量或編譯時產(chǎn)生的臨時變量;op為運算符,如定點運算符、浮點算符和邏輯運算符等。三地址代碼的每條語句通常包含三個地址,兩個用來存放運算對象, 第39頁,共169頁,2022年,5月20日,20點33分,星期二 一個用來存放運算結(jié)果。在實際實現(xiàn)中,用戶定義的名字將由指向符號表中該名字項的指針?biāo)〈?。由于三地址語句只含有一個運算符,因此多個運算符組成的表達式必須用三地址語句序列來表示,如表達式x+y*z的三地址代碼為:t1=y*zt2= x+t1第40頁,共169頁,2022年,5月20日,20點33分,星期二 其中,t
25、1和t2是編譯時產(chǎn)生的臨時變量。三地址代碼是語法樹的一種線性表示,如圖44(a)所示的語法樹用三地址代碼表示為:t1=b*ct2= a t1x=t2第41頁,共169頁,2022年,5月20日,20點33分,星期二2三地址語句的種類 作為中間語言的三地址語句非常類似于匯編代碼,它可以有符號標(biāo)號和各種控制流語句。常用的三地址語句有以下幾種:(1) x=y op z形式的賦值語句,其中op為二目的算術(shù)運算符或邏輯運算符。(2) x=op y形式的賦值語句,其中op為一目運算符,如一目減uminus、邏輯否定not、移位運算符以及將定點數(shù)轉(zhuǎn)換成浮點數(shù)的類型轉(zhuǎn)換符。第42頁,共169頁,2022年,5
26、月20日,20點33分,星期二(3) x=y形式的賦值語句,將y的值賦給。(4) 無條件轉(zhuǎn)移語句goto L,即下一個將被執(zhí)行的語句是標(biāo)號為L的語句。(5) 條件轉(zhuǎn)移語句if x rop y goto L,其中rop為關(guān)系運算符,如、=等。若x和y滿足關(guān)系rop就轉(zhuǎn)去執(zhí)行標(biāo)號為L的語句,否則繼續(xù)按順序執(zhí)行本語句的下一條語句。第43頁,共169頁,2022年,5月20日,20點33分,星期二(6) 過程調(diào)用語句par X和call P,n。源程序中的過程調(diào)用語句P(X1、X2、,Xn)可用下列三地址代碼表示:par X1par X2par Xncall P,n 其中,整數(shù)n為實參個數(shù)。過程返回語
27、句為return y,其中y為過程返回值。第44頁,共169頁,2022年,5月20日,20點33分,星期二 (7) 變址賦值語句x=yi,其中x、y、i均代表數(shù)據(jù)對象,表示把從地址y開始的第i個地址單元中的值賦給x。xi=y則表示把y的值賦給從地址x開始的第i個地址單元。 (8) 地址和指針賦值語句 x=&y表示將y的地址賦給x,y可以是一個名字或一個臨時變量,而x是指針名或臨時變量; x=*y表示將y所指示的地址單元中的內(nèi)容(值)賦給x,y是一個指針或臨時變量; *x=y表示指將x所指對象的值置為y的值。第45頁,共169頁,2022年,5月20日,20點33分,星期二 3三地址代碼的具體
28、實現(xiàn) 三地址代碼是中間代碼的一種抽象形式。在編譯程序中,三地址代碼語言的具體實現(xiàn)通常有三種表示方法:四元式、三元式和間接三元式。 1) 四元式 四元式是具有四個域的記錄結(jié)構(gòu),這四個域為(op,arg1,arg2,result)第46頁,共169頁,2022年,5月20日,20點33分,星期二 其中,op為運算符;arg1、arg2及result為指針,它們可指向有關(guān)名字在符號表中的登記項或一臨時變量(也可空缺)。常用的三地址語句與相應(yīng)的四元式對應(yīng)如下:x=y op z 對應(yīng)(op, y, z, x)x=y 對應(yīng)(uminus, y, _, x)x=y 對應(yīng)(=, y, _, x)par x1
29、對應(yīng)(par, x1, _, _)call P 對應(yīng)(call, _, _, P)goto L 對應(yīng)(j, _, _, L)if x rop y goto L 對應(yīng)(jrop, x, y, L)第47頁,共169頁,2022年,5月20日,20點33分,星期二例如,賦值語句a=b*(c+d)相應(yīng)的四元式代碼為: (+,c,d,t1) (*,b,t1,t2) (=,t2,_,a) 我們約定:凡只需一個運算量的算符一律使用arg1。此外,注意這樣一個規(guī)則:如果op是一個算術(shù)或邏輯運算符,則result總是一個新引進的臨時變量,它用來存放運算結(jié)果。由上例也可看出,四元式出現(xiàn)的順序與表達式計值的順序是
30、一致的,四元式之間的聯(lián)系是通過臨時變量實現(xiàn)的。四元式由于其表示更接近程序設(shè)計的習(xí)慣而成為一種普遍采用的中間代碼形式。第48頁,共169頁,2022年,5月20日,20點33分,星期二 2) 三元式 三元式是具有三個域的記錄結(jié)構(gòu),這三個域為(op,arg1,arg2) 其中,op為運算符;arg1、arg2既可指向有關(guān)名字在符號表中的登記項或臨時變量,也可以指向三元式表中的某一個三元式。例如,相應(yīng)于賦值語句a=(b+c)*(b+c)的三元式代碼為:第49頁,共169頁,2022年,5月20日,20點33分,星期二 (+,b,c) (+,b,c) (*,) (=,a,) 上述三元式表示的結(jié)果與的結(jié)
31、果相乘。由上例可知,三元式出現(xiàn)的先后順序和表達式各部分的計值順序是一致的。第50頁,共169頁,2022年,5月20日,20點33分,星期二 3) 間接三元式 在三元式代碼表的基礎(chǔ)上另設(shè)一張表,該表按運算的次序列出相應(yīng)三元式在三元式表中的位置,這張表稱為間接碼表。三元式表只記錄不同的三元式語句,而間接碼表則表示由這些語句組成的運算次序。例如,賦值語句a=(b+c)*(b+c)對應(yīng)的三元式表與間接碼表為:三元式表: (+,b,c) (*,) (=,a,)間接碼表: 第51頁,共169頁,2022年,5月20日,20點33分,星期二 在三元式表示中,每個語句的位置同時有兩個作用:一是可作為該三元式
32、的結(jié)果被其它三元式引用;二是三元式位置順序即為運算順序。在代碼優(yōu)化階段,需要調(diào)整三元式的運算順序時會遇到困難,這是因為三元式中的arg1、arg2也可以是指向某些三元式位置的指針,當(dāng)這些三元式的位置順序發(fā)生變化時,含有指向這些三元式位置指針的相關(guān)三元式也需隨之改變指針值。因此,變動一張三元式表是很困難的。第52頁,共169頁,2022年,5月20日,20點33分,星期二 對四元式來說,引用另一語句的結(jié)果可以通過引用該語句的result(通常是一個臨時變量)來實現(xiàn),而間接三元式則通過間接碼表來描述語句的運算次序。這兩種方法都不存在語句位置同時具有兩種功能的現(xiàn)象,代碼調(diào)整時要做的改動只是局部的,因
33、此,當(dāng)需要對中間代碼表進行優(yōu)化處理時,四元式與間接三元式都比三元式方便得多。第53頁,共169頁,2022年,5月20日,20點33分,星期二4.4 表達式及賦值語句的翻譯 4.4.1 簡單算術(shù)表達式和賦值語句的翻譯 簡單算術(shù)表達式是一種僅含簡單變量的算術(shù)表達式;簡單變量是指普通變量和常數(shù),但不含數(shù)組元素及結(jié)構(gòu)引用等復(fù)合型數(shù)據(jù)結(jié)構(gòu)。簡單算術(shù)表達式的計值順序與四元式出現(xiàn)的順序相同,因此很容易將其翻譯成四元式形式,這些翻譯方法稍加修改也可用于產(chǎn)生三元式或間接三元式。第54頁,共169頁,2022年,5月20日,20點33分,星期二考慮以下文法GA:Ai=EEE+EE*EE(E)i 在此,非終結(jié)符A
34、代表“賦值句”。文法GA雖然是一個二義文法,但通過確定運算符的結(jié)合性及規(guī)定運算符的優(yōu)先級就可避免二義性的發(fā)生。 為了實現(xiàn)由表達式到四元式的翻譯,需要給文法加上語義子程序,以便在進行歸約的同時執(zhí)行對應(yīng)的語義子程序。語義子程序所涉及的語義變量、語義過程及函數(shù)說明如下:第55頁,共169頁,2022年,5月20日,20點33分,星期二(1) 對非終結(jié)符E定義語義變量E.place,即用E.place表示存放E值的變量名在符號表中的入口地址或臨時變量名的整數(shù)碼。(2) 定義語義函數(shù)newtemp(),即每次調(diào)用newtemp()時都將回送一個代表新臨時變量的整數(shù)碼;臨時變量名按產(chǎn)生的順序可設(shè)為T1、T
35、2、。(3) 定義語義過程emit(op,arg1,arg2,result), emit的功能是產(chǎn)生一個四元式并填入四元式表中。第56頁,共169頁,2022年,5月20日,20點33分,星期二 (4) 定義語義函數(shù)lookup(),其功能是審查是否出現(xiàn)在符號表中,是則返回在符號表的入口指針,否則返回NULL。使用上述語義變量、過程和函數(shù),可寫出文法GA中的每一個產(chǎn)生式的語義子程序。 (1) Ai=E p=lookup();if(p=NULL) error();else emit(=,E.place,_,P); (2) EE(1)+E(2) E.
36、place=newtemp();emit(+,E(1) .place, E(2).place,E.place);第57頁,共169頁,2022年,5月20日,20點33分,星期二(3) EE(1)*E(2) E.place=newtemp();emit(*,E(1) .place, E(2).place,E.place);(4) EE(1) E.place=newtemp();emit(uminus,E(1) .place,_,E.place);(5) E(E(1) E.place= E(1) .place ;(6) Ei p=lookup();if(p!=NULL) E.plac
37、e=p; /*另一種表示為E.place=entry(i)*/else error();第58頁,共169頁,2022年,5月20日,20點33分,星期二 例4.1 試分析賦值語句X= B*(C+D)的語法制導(dǎo)翻譯過程。 解答 賦值語句X=B*(C+D)的語法制導(dǎo)翻譯過程如表4.2所示(加工分析過程參考表4.1)。第59頁,共169頁,2022年,5月20日,20點33分,星期二表4.2 賦值語句X=B*(C+D)的翻譯過程輸入串歸約產(chǎn)生式符號棧語義棧(place)四元式X=B*(C+D)# # _=B*(C+D)# (6)#i_XB*(C+D)# #i=_X_B*(C+D)# #i=_X_
38、_*(C+D)# (6)#i=i_X_ _B*(C+D)# (4)#i=E_X_ _B(uminus,B, _,T1)*(C+D)# #i=E_X_T1第60頁,共169頁,2022年,5月20日,20點33分,星期二(C+D)# #i=E*_X_T1_C+D)# #i=E*(_X_T1_ _+D)# (6)#i=E*(i_X_T1_ _C+D)# #i=E*(E_X_T1_ _CD)# #i=E*(E+_X_T1_ _C_)# (6)#i=E*(E+i_X_T1_ _C_D)# (2)#i=E*(E+E_X_T1_ _C_D(+,C,D,T2)# #i=E*(E_X_T1_ _T2# (5)
39、#i=E*(E)_X_T1_ _T2_# (3)#i=E*E_X_T1_T2(*,T1,T2,T3)# (1)#i=E_X_T3(=,T3, _,X)# #A_X第61頁,共169頁,2022年,5月20日,20點33分,星期二 4.4.2 布爾表達式的翻譯 在程序語言中,布爾表達式一般由運算符與運算對象組成。布爾表達式的運算符為布爾運算符,即、,或為not、and和or(注:C語言中為!、&和|),其運算對象為布爾變量,也可為常量或關(guān)系表達式。關(guān)系表達式的運算對象為算術(shù)表達式,其運算符為關(guān)系運算符、=、等。關(guān)系運算符的優(yōu)先級相同但不得結(jié)合,其運算優(yōu)先級低于任何算術(shù)運算符。布爾運算符的運算順序
40、一般為、,且和服從左結(jié)合, 第62頁,共169頁,2022年,5月20日,20點33分,星期二 布爾算符的運算優(yōu)先級低于任何關(guān)系運算符(注意,此處的運算優(yōu)先級約定不同于C語言)。此外,對布爾運算、關(guān)系運算、算術(shù)運算的運算對象的類型可不區(qū)分布爾型或算術(shù)型,假定不同類型的變換工作將在需要時強制執(zhí)行。為簡單起見,我們遵循以上運算約定討論下述文法GE生成的布爾表達式: GE:EEEEEE(E)ii rop i 第63頁,共169頁,2022年,5月20日,20點33分,星期二 另一種方法是根據(jù)布爾運算的特點實施某種優(yōu)化,即不必一步一步地計算布爾表達式中所有運算對象的值,而是省略不影響運算結(jié)果的運算。例
41、如,在計算AB時,若計算出的A值為1,則B值就無需再計算了;因為不管B的結(jié)果是什么,AB的值都為1。同理,在計算AB時若發(fā)現(xiàn)A值為0,則B值也無需計算,AB的值一定為0。第64頁,共169頁,2022年,5月20日,20點33分,星期二 在后面的論述中,我們假定函數(shù)過程的工作不出現(xiàn)上述的副作用情況。 如何確定一個表達式的真假出口呢?考慮表達式E(1)E(2),若E(1)為真,則立即知道E也為真,因此,E(1)的真出口也就是整個E的真出口;若E(1)為假,則E(2)必須被計值,此時E(2)的第一個四元式就是E(1)的假出口。當(dāng)然,E(2)的真假出口也就是整個E的真假出口。類似的考慮適用于對E(1
42、)E(2)的翻譯。我們將E(1)E(2)和E(1)E(2)的翻譯用圖45表示,而對形如E(1)的表達式則只需調(diào)換E(1)的真假出口就可得到該表達式E的真假出口。第65頁,共169頁,2022年,5月20日,20點33分,星期二圖45 E(1)E(2)和E(1)E(2)的翻譯圖(a) E(1)E(2);(b) E(1)E(2)第66頁,共169頁,2022年,5月20日,20點33分,星期二 在自下而上的分析過程中,一個布爾式的真假出口往往不能在產(chǎn)生四元式的同時就填上,我們只好把這種未完成的四元式的地址(編號)作為E的語義值暫存起來,待到整個表達式的四元式產(chǎn)生完畢之后,再來填寫這個未填入的轉(zhuǎn)移目
43、標(biāo)。第67頁,共169頁,2022年,5月20日,20點33分,星期二 對于每個非終結(jié)符E,我們需要為它賦予兩個語義值E.tc和E.fc,以分別記錄E所對應(yīng)的四元式需要回填“真”、“假”出口的四元式地址所構(gòu)成的鏈。這是因為在翻譯過程中,常常會出現(xiàn)若干轉(zhuǎn)移四元式轉(zhuǎn)向同一個目標(biāo)但目標(biāo)位置又未確定的情況,此時可用“拉鏈”的方法將這些四元式鏈接起來,待獲得轉(zhuǎn)移目標(biāo)的四元式地址時再進行返填。例如,假定E的四元式需要回填“真”出口的有p、q、r這三個四元式,則它們可鏈接成如圖46所示的一條真值鏈(記作tc)。 第68頁,共169頁,2022年,5月20日,20點33分,星期二圖46 拉鏈法鏈接四元式示意第
44、69頁,共169頁,2022年,5月20日,20點33分,星期二 為了處理E.tc和E.fc這兩項語義值,我們需要引入如下的語義變量和函數(shù): (1) nxq:始終指向下一條將要產(chǎn)生的四元式的地址(序號),其初值為1。每當(dāng)執(zhí)行一次emit語句后,nxq自動增1。 (2) merge(p1,p2):把以p1和p2為鏈?zhǔn)椎膬蓷l鏈合并為一條以p2為鏈?zhǔn)椎逆?即返回鏈?zhǔn)字祊2)。 (3) Backpatch(p,t):把鏈?zhǔn)譸所鏈接的每個四元式的第四區(qū)段(即result)都改寫為地址t。第70頁,共169頁,2022年,5月20日,20點33分,星期二 merge()函數(shù)如下:merge(p1,p2)
45、if(p2=0) return(p1); else p=p2; while(四元式p的第四區(qū)段內(nèi)容不為0)第71頁,共169頁,2022年,5月20日,20點33分,星期二 p=四元式p的第四區(qū)段內(nèi)容; 把p1填進四元式p的第四區(qū)段; return(p2); Backpatch()函數(shù)如下:Backpatch(p,t) Q=p; while(Q!=0)第72頁,共169頁,2022年,5月20日,20點33分,星期二 q=四元式Q的第四區(qū)段內(nèi)容; 把t填進四元式Q的第四區(qū)段; Q=q; 第73頁,共169頁,2022年,5月20日,20點33分,星期二 為了便于實現(xiàn)布爾表達式的語法制導(dǎo)翻譯,并
46、在掃描到“”與“”時能及時回填一些已經(jīng)確定了的待填轉(zhuǎn)移目標(biāo),我們將前述文法GE改寫為下面的文法GE,以利于編制相應(yīng)的語義子程序: GE:EEAEEBEE(E)ii rop iEAEEBE第74頁,共169頁,2022年,5月20日,20點33分,星期二這時,文法GE的每個產(chǎn)生式和相應(yīng)的語義子程序如下:(1) Ei E.tc=nxq; E.fc=nxq+1;emit(jnz,entry(i),_,0);emit(j,_,_,0);(2) Ei(1) rop i(2) E.tc=nxq; E.fc=nxq+1; emit(jrop, entry(i(1), entry(i(2),0); emit(
47、j,_,_,0);(3) E(E(1) ) E.tc = E(1).tc;E.fc = E(1).fc;(4) EE(1) E.tc = E(1).fc;E.fc = E(1).tc;第75頁,共169頁,2022年,5月20日,20點33分,星期二(5) EAE(1) Backpatch(E(1).tc,nxq);EA.fc = E(1).fc;(6) EEAE(2) E.tc = E(2).tc;E.fc =merge( EA.fc,E(2).fc); (7) EBE(1) Backpatch(E(1).fc,nxq); EB.tc = E(1).tc; (8) EEBE(2) E.fc
48、= E(2).fc; E.tc = merge(EB.tc,E(2).tc);第76頁,共169頁,2022年,5月20日,20點33分,星期二 例4.2 試給出布爾表達式abcd作為控制條件的四元式中間代碼。 解答 設(shè)四元式序號從100開始,則布爾表達式abcd的分析過程如圖47所示。第77頁,共169頁,2022年,5月20日,20點33分,星期二 圖47 表達式abcd分析示意 第78頁,共169頁,2022年,5月20日,20點33分,星期二即: 100(jnz,a,_,102) 101(j,_,_,104) 102(jnz,b,_,106) 103(j,_,_,104) 104(j,
49、c,d,106) 105(j,_,_,q) T: 106 F: q第79頁,共169頁,2022年,5月20日,20點33分,星期二 當(dāng)然,我們也可以通過圖48的分析得到上述四元式序列。 由例4.2可知,每一個布爾變量a都對應(yīng)一真一假兩個四元式,并且格式是固定的,即 (jnz,a,_,0) /*a為布爾變量*/ ( j,_,_,0) 而每一個關(guān)系表達式同樣對應(yīng)一真一假兩個四元式,其格式也是固定的,即 (jrop,X,Y,0) /*X、Y為關(guān)系運算符兩側(cè)的變量或值*/ ( j,_,_,0)第80頁,共169頁,2022年,5月20日,20點33分,星期二圖48 abcd的翻譯圖第81頁,共169
50、頁,2022年,5月20日,20點33分,星期二4.5 控制語句的翻譯在源程序中,控制語句用于實現(xiàn)程序流程的控制。一般程序流程控制可分為下面三種基本結(jié)構(gòu):(1) 順序結(jié)構(gòu),一般用復(fù)合語句實現(xiàn);(2) 選擇結(jié)構(gòu),用if和case等語句實現(xiàn);(3) 循環(huán)結(jié)構(gòu),用for、while、do(即repeat)等語句實現(xiàn)。第82頁,共169頁,2022年,5月20日,20點33分,星期二 4.5.1 條件語句if的翻譯 1條件語句if的代碼結(jié)構(gòu) 我們按下面的條件語句if的模式進行討論: if(E)S1;else S2 條件語句if (E); else S2中布爾表達式E的作用僅在于控制對S1和S2的選擇,
51、因此可將作為轉(zhuǎn)移條件的布爾式E賦予兩種“出口”:一是“真”出口,出向S1;一是“假”出口,出向S2。于是,條件語句可以翻譯成如圖49所示的代碼結(jié)構(gòu)。第83頁,共169頁,2022年,5月20日,20點33分,星期二圖49 條件語句if(E)S1;else S2 的代碼結(jié)構(gòu)第84頁,共169頁,2022年,5月20日,20點33分,星期二 我們知道,非終結(jié)符E具有兩項語義值E.tc和E.fc,它們分別指出了尚待回填真假出口的四元式串。E的“真”出口只有在掃描完布爾表達式E后的“)”時才能知道,而它的“假”出口則需要處理過S1之后并且到else時才能明確。這就是說,必須把E.fc的值傳下去,以便到
52、達相應(yīng)的else時才進行回填。S1語句執(zhí)行完就意味著整個if-else語句也已執(zhí)行完畢,因此, 第85頁,共169頁,2022年,5月20日,20點33分,星期二在S1的編碼之后應(yīng)產(chǎn)生一條無條件轉(zhuǎn)移指令,這條轉(zhuǎn)移指令將導(dǎo)致程序控制離開整個if-else語句。但是,在完成S2的翻譯之前,這條無條件轉(zhuǎn)移指令的轉(zhuǎn)移目標(biāo)是不知道的,甚至在翻譯完S2之后仍無法確定,這種情形是由語句的嵌套性所引起的。例如下面的語句:if (E1) if (E2) S1; else S2;else S3 在S1代碼之后的那條無條件轉(zhuǎn)移指令不僅應(yīng)跨越S2,而且應(yīng)跨越S3。這也就是說,轉(zhuǎn)移目標(biāo)的確定和語句所處的環(huán)境密切相關(guān)。第
53、86頁,共169頁,2022年,5月20日,20點33分,星期二 2條件語句if的文法和語義子程序的設(shè)計 條件語句if的文法GS如下: GS:Sif(E) S(1)Sif(E) S(1);else S(2) 為了在掃描條件語句過程中不失時機地處理和回填有關(guān)信息,可將GS改寫為如下的GS: GS:(1) SCS(1)(2) Cif(E)(3) STpS(2)(4) TPCS(1);else第87頁,共169頁,2022年,5月20日,20點33分,星期二根據(jù)程序語言的處理順序,首先用產(chǎn)生式(2) Cif(E)進行歸約,這時E的真出口即為E所生成四元式序列后的下一個地址。因此,將“)”后的第一個四
54、元式地址回填至E的真出口,E的假出口地址則作為待填信息放在C的語義變量C.chain中,即: Cif(E) Backpatch(E.tc,nxq); C.chain=E.fc; 接下來用產(chǎn)生式(1) SCS(1)繼續(xù)向上歸約。這時已經(jīng)處理到Sif(E) S(1),由于歸約時E的真出口已經(jīng)處理,而E的假出口(即語句S的出口)同時是語句S(1)的出口, 第88頁,共169頁,2022年,5月20日,20點33分,星期二 但此時語句S的出口地址未定,故將C.chain和S(1).chain一起作為S的待填信息鏈用函數(shù)merge鏈在一起保留在S的語義值S.chain中,即有SCS(1) S.chain
55、=merge(C.chain,S(1).chain) 如果此時條件語句為不含else的條件句,則在產(chǎn)生式(1)、(2)歸約為S后即可以用下一個將要產(chǎn)生的四元式地址(即S的出口地址)來回填S的出口地址鏈(即S.chain);如果此時條件語句為if-else形式,則繼續(xù)用產(chǎn)生式(4) TPCS(1);else歸約。第89頁,共169頁,2022年,5月20日,20點33分,星期二 用TpCS(1);else 歸約時首先產(chǎn)生S(1)語句序列之后的一個無條件轉(zhuǎn)移四元式(以便跳過S(2),見圖49的結(jié)構(gòu)框圖),該四元式的地址(即標(biāo)號)保留在q中,以便待獲知要轉(zhuǎn)移的地址后再進行回填,也即: (i) (S(
56、1)的第一個四元式) /*E的真出口*/ (q1) (S(1)的最后一個四元式) (q) (j, _, _,0) /*無條件跳過S(2),其轉(zhuǎn)移地址有待回填*/ (q+1)(S(2)的第一個四元式) /*E的假出口*/第90頁,共169頁,2022年,5月20日,20點33分,星期二 此時q的出口也就是整個條件語句的出口,因此應(yīng)將其與S.chain鏈接后掛入鏈頭為Tp.chain的鏈中。此外,emit 產(chǎn)生四元式q后nxq自動加1(即為q+1),其地址即為else后(也即S(2)的第一個四元式地址,它也是E的假出口地址,因此應(yīng)將此地址回填到E.fc即C.chain中,即有: TpCS(1);
57、else q=nxq; emit(j,_,_,0); Backpatch(C.chain,nxq); Tp.chain=merge(S.chain,q);第91頁,共169頁,2022年,5月20日,20點33分,星期二 最后用產(chǎn)生式(3) STpS(2)歸約。當(dāng)S(2)語句序列處理完后繼續(xù)翻譯if語句之后的后繼語句,這時就有了后繼語句的四元式地址,該地址也是整個if語句的出口地址,它與S(2)語句序列的出口一致。由于S(2)的出口待填信息在S(2).chain中,故將Tp.chain與S(2).chain鏈接后掛入鏈頭為S.chain的鏈中,即 STpS(2) S.chain=merge(T
58、p.chain, S(2).chain);第92頁,共169頁,2022年,5月20日,20點33分,星期二 4.5.2 條件循環(huán)語句while的翻譯 1條件循環(huán)語句while的代碼結(jié)構(gòu) 條件循環(huán)語句while (E) S(1) 通常被翻譯成圖410所示的代碼結(jié)構(gòu)。布爾表達式E的“真”出口出向S(1)代碼段的第一個四元式,緊接S(1)代碼段之后應(yīng)產(chǎn)生一條轉(zhuǎn)向測試E的無條件轉(zhuǎn)移指令;而E的“假”出口將導(dǎo)致程序控制離開整個while語句而去執(zhí)行while語句之后的后繼語句。第93頁,共169頁,2022年,5月20日,20點33分,星期二圖410 條件循環(huán)while語句的代碼結(jié)構(gòu)第94頁,共169
59、頁,2022年,5月20日,20點33分,星期二 2條件循環(huán)語句while的文法和語義子程序設(shè)計 同樣,我們給出易于及時處理和回填的條件循環(huán)語句while的文法GS如下: GS:(1) SWdS(1) (2) WdW(E) (3) Wwhile 根據(jù)while語句的掃描加工順序,首先用產(chǎn)生式(3) Wwhile進行歸約,這時nxq即為E的第一個四元式地址,我們將其保留在W.quad中。 第95頁,共169頁,2022年,5月20日,20點33分,星期二 然后繼續(xù)掃描并用WdW(E)歸約,即掃描完“)”后可以用Backpatch(E.tc,nxq)回填E.tc值;而E.fc則要等到S(1)語句序
60、列全部產(chǎn)生后才能回填,因此E.fc作為待填信息用Wd.chain=E.fc傳下去。 當(dāng)用產(chǎn)生式(1)SWdS(1)歸約時,S(1)語句序列的全部四元式已經(jīng)產(chǎn)生。根據(jù)圖410 while語句代碼結(jié)構(gòu)的特點,此時應(yīng)無條件返回到E的第一個四元式繼續(xù)對條件E進行測試,即形成四元式(j,_,_,Wd.quad),同時用Backpatch(S(1).chain,Wd.quad)回填E的入口地址到S(1)語句序列中所有需要該信息的四元式中。第96頁,共169頁,2022年,5月20日,20點33分,星期二 在無條件轉(zhuǎn)移語句(j,_,_,Wd.quad)之后即為while語句的后繼語句,而這個后繼語句中的第一
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)五年級《分?jǐn)?shù)加減混合運算》教學(xué)設(shè)計
- 小學(xué)數(shù)學(xué)一年級上冊:10以內(nèi)口算過關(guān)練習(xí)題
- 《瞳孔大小的臨床見》課件
- 湖南省株洲市2025屆高三上學(xué)期教學(xué)質(zhì)量統(tǒng)一檢測物理答案
- 高考新課標(biāo)語文模擬試卷系列之66
- 《病房監(jiān)護系統(tǒng)》課件
- 《研究性學(xué)習(xí)的評價》課件
- 《汽車行業(yè)發(fā)展》課件
- 營養(yǎng)科護士年終總結(jié)
- 建材行業(yè)人事工作總結(jié)
- 七年級英語句型轉(zhuǎn)換專題訓(xùn)練100題含答案
- 長期異地安置、居住就醫(yī)備案承諾書【模板】
- 盤查戰(zhàn)術(shù)教案
- GB/T 2652-2022金屬材料焊縫破壞性試驗熔化焊接頭焊縫金屬縱向拉伸試驗
- GB/T 1243-1997短節(jié)距傳動用精密滾子鏈和鏈輪
- 打起手鼓唱起歌二聲部改編簡譜
- 陜西西安電子科技大學(xué)招考聘用(同步測試)模擬卷和答案
- 父母教養(yǎng)方式與青少年學(xué)業(yè)自我效能的關(guān)系:自尊和學(xué)業(yè)自我概念的中介作用優(yōu)秀獲獎科研論文
- 高血壓危象(講課)課件
- 獅子王-中英文-劇本臺詞(全)
- 2022年陜西金融控股集團有限公司招聘筆試題庫及答案解析
評論
0/150
提交評論