精品課程《編譯原理》第8章語法制導(dǎo)與中間代碼生成ppt課件_第1頁
精品課程《編譯原理》第8章語法制導(dǎo)與中間代碼生成ppt課件_第2頁
精品課程《編譯原理》第8章語法制導(dǎo)與中間代碼生成ppt課件_第3頁
精品課程《編譯原理》第8章語法制導(dǎo)與中間代碼生成ppt課件_第4頁
精品課程《編譯原理》第8章語法制導(dǎo)與中間代碼生成ppt課件_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、8.1 8.1 屬性文法屬性文法 語法分析后的源程序=語義處置 靜態(tài)語義是對(duì)程序約束的描畫,這些約束無法經(jīng)過籠統(tǒng)語法規(guī)那么來妥善地描畫,本質(zhì)上就是語法規(guī)那么的良方式條件,它可以分為類型規(guī)那么和作用域/可見性規(guī)那么兩大類 動(dòng)態(tài)語義 程序單位描畫的計(jì)算編譯程序的語義處置任務(wù) 1 靜態(tài)語義審查,即驗(yàn)證語法構(gòu)造合法的程序能否有意義 2 生成中間代碼靜態(tài)語義審查 1類型檢查。根據(jù)類型相容性要求,驗(yàn)證程序中執(zhí)行的每個(gè)操作能否遵守言語的類型系統(tǒng)的過程,編譯程序必需報(bào)告不符合類型系統(tǒng)的信息。 2控制流檢查??刂屏髡Z句必需使控制轉(zhuǎn)移到合法的地方。例如,在C言語中break語句使控制跳離包括該語句的最小while

2、、for或switch語句。假設(shè)不存在包括它的這樣的語句,那么就報(bào)錯(cuò)。 3一致性檢查。在很多場所要求對(duì)象只能被定義一次。例如Pascal言語規(guī)定同一標(biāo)識(shí)符在一個(gè)分程序中只能被闡明一次,同一case語句的標(biāo)號(hào)不能一樣,枚舉類型的元素不能反復(fù)出現(xiàn)等等。 4上下文相關(guān)性檢查。比如,變量名字必需先聲明后援用; 5名字的作用域分析。各變量的作用域能夠是不一樣的,要經(jīng)過分析明確各變量的作用域。解釋執(zhí)行動(dòng)態(tài)語義 計(jì)算生成代碼中間代碼或目的代碼例:有文法GE: E T1+T2 | T1 or T2 T num|true|false對(duì)輸入串 2+6 語法樹如圖:ET+T26ET1.t=T2.tT+26TT2.t

3、=intT1.t=int類型檢查的屬性文法:E T1+T2 T1.t=int AND T2.t=intE T1 or T2 T1.t=bool AND T2.t=boolT num T.t:=intT true T.t:=boolT false T.t:=bool屬性文法,語法制導(dǎo)翻譯屬性文法,語法制導(dǎo)翻譯屬性文法A(attribute grammar)是一個(gè)三元組:A=(G,V,F),其中 G:是一個(gè)上下文無關(guān)文法, V:有窮的屬性集,每個(gè)屬性與文法的一終結(jié)符或非終結(jié)符相連, F:關(guān)于屬性的屬性斷言或謂詞集.每個(gè)斷言與一個(gè)產(chǎn)生式相聯(lián).而此斷言只援用該產(chǎn)生式左端或右端的終結(jié)符或非終結(jié)符相聯(lián)的屬

4、性例如:定義表達(dá)式的文法如下: EE+E E(E)En 給出定義表達(dá)式值的屬性文法。 我們?yōu)槲姆ǚ?hào)E引進(jìn)屬性符號(hào)val,用E.val表示E的值,屬性計(jì)算規(guī)那么以賦值語句的方式給出,附在每個(gè)產(chǎn)生式后,并用大括號(hào)括起來。為了明確E的不同出現(xiàn)位置,用上角標(biāo)區(qū)別。終結(jié)符n的值是詞法分析程序提供的,這里用n.lex表示。下面給出屬性文法: EE1+E2 E.val := E1.val +E2.val E(E1) E.val := E1.val En E.val := n.lex屬性文法的主要思想有兩點(diǎn): 首先對(duì)于每個(gè)文法符號(hào)引進(jìn)相關(guān)的屬性符號(hào); 其次對(duì)于每個(gè)產(chǎn)生式寫出屬性值計(jì)算的規(guī)那么。 屬性文法屬性

5、文法:允許為每個(gè)終結(jié)符和非終結(jié)符配備一允許為每個(gè)終結(jié)符和非終結(jié)符配備一些屬性的文法些屬性的文法.它既能描畫程序設(shè)計(jì)言語的語法它既能描畫程序設(shè)計(jì)言語的語法,又為其語義描畫提供了手段又為其語義描畫提供了手段. 屬性文法由D.E.Knuth于1968年引進(jìn).后來才被用于編譯程序的設(shè)計(jì)。 屬性有不同的類型,可以象變量一樣地被賦值。賦值規(guī)那么附加于語法規(guī)那么之上。賦值與語法同時(shí)進(jìn)展,賦值過程就是語義處置過程。在推導(dǎo)語法樹的時(shí)候,諸屬性的值被計(jì)算并經(jīng)過賦值規(guī)那么層層傳送。有的從語法規(guī)那么左邊向右邊傳,有的從右邊向左邊傳。語法推導(dǎo)樹最后完成時(shí),就得到開場符號(hào)的屬性值。也就是整個(gè)程序的語義.屬性分為兩種:承繼

6、屬性和綜合屬性. inherited and synthesized(derived)attribute 承繼屬性的計(jì)算規(guī)那么由頂向下, 綜合屬性的計(jì)算規(guī)那么由底向上.例如定義表達(dá)式值的屬性文法, E.val是一個(gè)綜合屬性的例子: EE1+E2 E.val := E1.val +E2.val E(E1) E.val := E1.val En E.val := n.lex思索句子231的求值順序,將231的語法樹結(jié)點(diǎn)改為有附加屬性的結(jié)點(diǎn)這樣的樹稱為帶注釋的語法樹: E.val=6 E.val=2 + E.val=4 n.lex=2 ( E.val=4 ) E.val=3 + E.val=1 n.

7、lex=3 n.lex=1 例8.1 一個(gè)簡單臺(tái)式計(jì)算器的定義 綜合屬性val語 義 規(guī) 那么 L EE E1+TE TT T1 * FT FF (E)F digitPrint(E.val) E.val:=E1.val+T.val E.val:=T.val T.val:=T1.val F.val T.val:=F.valF.val:=E.valF.val:=digit.lexval產(chǎn) 生 式3*5+6的帶注釋的分析樹的帶注釋的分析樹只運(yùn)用綜合屬性.LE.val=21E.val=15T.val=6T.val=15F.val=6T.val=3F.val=3F.val=5digit.lexval=6

8、digit.lexval=5digit.lexval=3+*3*5+6的帶注釋的分析樹的帶注釋的分析樹承繼屬性承繼屬性一個(gè)結(jié)點(diǎn)的承繼屬性值是由此結(jié)點(diǎn)的父結(jié)點(diǎn)和/或兄弟結(jié)點(diǎn)的某些屬性來決議的。例8.2 添加標(biāo)識(shí)符類型的語義描畫: 承繼屬性type產(chǎn)生式語 義 規(guī) 那么D TL T int T real L L1,idL idL.type:=T.typeT.type=integerT.type:=real L1.type:=L.type addtype(id.entry,L.type) addtype(id.entry,L.type) DL.type= realL.type= realL.type

9、= realT.type=realrealid2id1id3.承繼屬性續(xù)承繼屬性續(xù)Real id1,id2,id3的帶注釋的語法樹的帶注釋的語法樹, 8.2 語法制導(dǎo)概論 屬性文法:描畫語義規(guī)那么。一個(gè)屬性文法包含一個(gè)上下文無關(guān)文法和一系列語義規(guī)那么,這些語義規(guī)那么附在文法的每一個(gè)產(chǎn)生式上。 語法制導(dǎo)翻譯:在語法分析的同時(shí),執(zhí)行語義子程序: 1 檢查靜態(tài)語義 2 翻譯(生成)中間(目的)代碼 基于屬性文法的處置過程即語法制導(dǎo)翻譯是這樣的: 對(duì)符號(hào)串進(jìn)展語法分析,構(gòu)造語法樹,然后根據(jù)需求構(gòu)造屬性依賴圖,遍歷語法樹并在語法樹的各結(jié)點(diǎn)按語義規(guī)那么進(jìn)展計(jì)算。 8.2.1 計(jì)算語義規(guī)那么 屬性依賴圖是一

10、個(gè)有向圖,用于描畫分析樹中的屬性和屬性間的相互依賴關(guān)系。 對(duì)于編譯程序來講,在單遍掃描中完成語義翻譯任務(wù)非常重要。 8.2.2 S-屬性文法和自下而上翻譯 普通的屬性文法的翻譯器很難建立,然而L-屬性文法的翻譯器很容易建立。 L-屬性文法的一個(gè)特例叫S-屬性文法。S-屬性文法是只含有綜合屬性的屬性文法。8.2.3 L-屬性文法在自下而上分析中實(shí)現(xiàn) L-屬性文法允許一次遍歷就計(jì)算出所以的屬性值。8.3 8.3 中間代碼的方式中間代碼的方式 編譯程序的總義務(wù)是把源言語的程序代碼(源代碼)翻譯成目的言語的程序代碼(目的代碼)。 有些編譯程序直接把源代碼翻譯目的代碼,而有些編譯程序首先把源代碼翻譯成一

11、種中間言語的程序代碼(中間代碼),再生成目的代碼。翻譯方法可分為語法制導(dǎo)非語法制導(dǎo)中間代碼的特點(diǎn): 中間代碼與機(jī)器無關(guān),編譯程序易于移植。 中間代碼級(jí)進(jìn)展優(yōu)化較為容易。常見的中間代碼方式有逆波蘭式,三元式,四元式,樹等。 在產(chǎn)生語法制導(dǎo)翻譯程序時(shí),完全根據(jù)文法的產(chǎn)生式來生成的,有時(shí)為了到達(dá)語法制導(dǎo)的目的,不得不對(duì)現(xiàn)有產(chǎn)生式做一些修正,這也是語法制導(dǎo)方法的特點(diǎn)。 語法制導(dǎo)方法是一種方式化方法。它嚴(yán)厲依賴于產(chǎn)生式構(gòu)造。中間代碼中間代碼概述概述何謂中間代碼何謂中間代碼( Intermediate code) (Intermediate representation) (Intermediate la

12、nguage)是源程序的一種內(nèi)部表示是源程序的一種內(nèi)部表示復(fù)雜性介于源言語和目的機(jī)言語之間復(fù)雜性介于源言語和目的機(jī)言語之間中間代碼的作用:中間代碼的作用:使編譯程序的邏輯構(gòu)造更加簡單明確使編譯程序的邏輯構(gòu)造更加簡單明確利于進(jìn)展與目的機(jī)無關(guān)的優(yōu)化利于進(jìn)展與目的機(jī)無關(guān)的優(yōu)化利于在不同目的機(jī)上實(shí)現(xiàn)同一種言語利于在不同目的機(jī)上實(shí)現(xiàn)同一種言語中間代碼的方式:中間代碼的方式: 逆波蘭式、四元式、三元式、間接三元式、樹逆波蘭式、四元式、三元式、間接三元式、樹中間代碼的層次中間代碼的層次中間代碼按照其與高級(jí)言語和機(jī)器言語的接近程度,可以分成以下三個(gè)層次:高級(jí):最接近高級(jí)言語,保管了大部分源言語的構(gòu)造。中級(jí):介

13、于二者之間,與源言語和機(jī)器言語都有一定差別。低級(jí):最接近機(jī)器言語,可以反映目的機(jī)的系統(tǒng)構(gòu)造,因此經(jīng)常依賴于目的機(jī)。不同層次的中間代碼舉例不同層次的中間代碼舉例源語言源語言(高級(jí)語言)(高級(jí)語言)中間代碼中間代碼(高級(jí))(高級(jí))中間代碼中間代碼(中級(jí))(中級(jí))中間代碼中間代碼(低級(jí))(低級(jí))float a1020;aij+2;t1 = ai, j+2t1 = j + 2t2 = i * 20t3 = t1 + t2t4 = 4 * t3t5 = addr at6 = t5 + t4t7 = *t6r1 = fp - 4r2 = r1 + 2r3 = fp - 8r4 = r3 * 20r5 =

14、r4 + r2r6 = 4 * r5 r7 = fp 216f1 = r7 + r68.3.1 8.3.1 逆波蘭式逆波蘭式 運(yùn)算符跟在一切運(yùn)算對(duì)象的后面的表示法寫出的式子稱為后綴法或逆波蘭法。例子: 中綴表示:a+b 后綴表示:ab+ 前綴表示:+ab 假設(shè)用POS(E)表示中綴式E的逆波蘭式那么當(dāng)E=E1T時(shí)有:POS(E)=POS(E1)|POS(T)|其中“|表示串的“捻接。POS(F)=POS(E) F=(E) POS(F)=i F=i POS(T)=POS(T(1)|POS(F)|/ T=T(1)/F POS(T)=POS(T(1)|POS(F)|* T=T(1)*F POS(T)

15、=POS(F) T=F POS(E) =POS(E(1)|POS(T)|- E=E(1)-T POS(E)=POS(E(1)|POS(T)|+ E=E(1)+T POS(E)=POS(T) E=T 逆波蘭式 中綴式 例:POS(A+B*C)= POS(A)|POS(B*C)|+ = ABC*+POS(A*B+c)= POS(A*B)|POS(C)|+ = AB*C+ 處置原那么: 運(yùn)算對(duì)象出現(xiàn)的順序與原來的一樣 運(yùn)算符按實(shí)踐運(yùn)算順序出現(xiàn)。 運(yùn)算符緊跟在運(yùn)算對(duì)象的后面出現(xiàn),并且沒有括號(hào)。逆波蘭式的優(yōu)點(diǎn):轉(zhuǎn)換為逆波蘭式的言語中間方式后,容易實(shí)現(xiàn)中間代碼的翻譯或目的指令。 逆波蘭式的生成: 運(yùn)算對(duì)象

16、向左挪動(dòng) 運(yùn)算符與棧頂比較優(yōu)先數(shù) 括號(hào)處置:左括號(hào)進(jìn)棧,起間隔作用;右括號(hào)與左括號(hào)匹配抵消。 .波蘭表達(dá)式表達(dá)式運(yùn)算符棧運(yùn)算對(duì)象運(yùn)算符.進(jìn)棧.退棧a*(b+c/d)#.#例子:a*(b+c/d)abcd/+*的推導(dǎo)*(b+c/d)#.#a(b+c/d)#.*#ab+c/d)#.(*#a+c/d)#.(*#abc/d)#.+(*#ab/d)#.+(*#abcd)#./+(*#abc)#./+(*#abcd)#.+(*#abcd/)#.(*#abcd/+#.*#abcd/+#.#abcd/+*.abcd/+*動(dòng)畫演示8.3.2 8.3.2 表達(dá)式的三元式和樹表達(dá)式的三元式和樹一、三元式 三元式的普

17、通方式:i:(,OPR1,OPR2) i是三元式編號(hào),不同三元式不能有一樣編號(hào)。 是運(yùn)算符部分。 OPR1和OPR2是運(yùn)算對(duì)象部分。例子: a:=b*c+b*d的相應(yīng)三元組 (*, b, c) b*c (*, b, d) b*d (+, (1),(2) b*c+b*d (:=,(3), a) a:=b*c+b*d例子:tri(A*B+C) =tri(A*B)|tri(c)|2:(+,C) =1:(*, A,B) A*B 2:(+,C) A*B+C tri(A*B+C/D)= 1:(*, A, B) A*B 2:(/, C, D) C/D 3:(+,) A*B+C/Dtri(ABXY+1(X0B

18、)D)=1:(+, Y, 1) Y+1 2:(,X,) XY+1 3:(,B,) BXY+1 4:(,A,) ABXY+15:(, X, 0) X06:(, B) X0B7:(, D) (X0B)D8:(,)二、樹 二目運(yùn)算對(duì)應(yīng)二叉樹,多目運(yùn)算對(duì)應(yīng)多叉樹。三元式可以用二叉樹表示。例: (a+b*(c-d)-e/f的樹。 (-,c, d ) c-d (*,b,(1) b*(c-d) (+,a,(2) a+b*(c-d) (/,e, f ) e/f (-,(3),(4) 該題的樹構(gòu)造如下:cd-+/*-abef1234 該樹的根后序?yàn)椋篴bcd-*+ef/-,為該式的逆波蘭式。58.3.3 8.3

19、.3 四元式四元式 四元式的普通方式是: (,OPR1,OPR2,RESULT) 其中是運(yùn)算符。 OPR1和OPR2是第一,二分量, RESULT是運(yùn)算結(jié)果變量名。例: 求a:=b*c+b*d 的四元式1)(*,b,c,T1) b*c2)(*,b, d,T2)b*d3)(+,T1,T2,T3)b*c+b*d 4)(:=,T3,-,a)下面是表達(dá)式四元式的方式定義。 FOUR(T) RES(E)=RES(T)1E=T四元式中綴式FOUR(E1) 2E=E1+T FOUR(T)(+,RES(E1),RES(T),TEMP)RES(E)=TEMP(暫時(shí)變量)空RES(F)=ID 7F=I 類似于2

20、6T=T1/F 類似于2 5.T=T1*F FOUR(F) RES(T)=RES(F) 4T=F 類似于2 3E=E1-T FOUR(E)RES(F)=RES(E) 8F=(E) 例:設(shè)有表達(dá)式A*(B+C*(A-B)那么有 (-,A,B,T1)A-B (*,C,T1,T2)C*(A-B) (+,B,T2,T3)B+C*(A-B) (*,A,T3,T4) 引進(jìn)一過程GENQT: GENQT():BEGIN RESULT:=NEWTEMP; QTJ:=(,SEMS-2,SEMS-1,RESULT); SEMS-2:=RESULT; J:=J+1; S:=S-1 END 語法制導(dǎo)翻譯算法如下: 空

21、 F-(E) SEMs:=EADDR(id);s:=s+1 F-I GENQT(/) T-T/F GENQT(*) T-T*F 空 T-F GENQT(-) E-E-T GENQT(+) E-E+T 空 E-T 語義子程序 產(chǎn)生式 例例 ; A + B * ( C - D ) + E / ( C - D ) N 逆逆波波蘭蘭 A B C D - * + E C D N / + 四四元元式式 (1) ( - C D T1 ) (2) ( * B T1 T2) (3) ( + A T2 T3) (4) ( - C D T4) (5) ( T4 N T5) (6) ( / E T5 T6) (7)

22、( + T3 T6 T7)8.4 8.4 類型檢查與類型轉(zhuǎn)換類型檢查與類型轉(zhuǎn)換例:a+b 3+5=8 3.2+5=3.2+5.0=8.2 3+T=?例:設(shè)有一表達(dá)式X*2+a*(i+1)/(j+1)其中i和j為整形變量,其它為實(shí)型變量,那么產(chǎn)生的四元式如下: 1(tran,2, T1)2(r*, x,T1, T2) x*23(i+, i, 1, T3) i+14(tran,T3,T4)5(r*, a, T4,T5) a*(i+1)6(i+, j, 1, T6) j+17(tran,T6, T7)8(r/, T5, T7, T8)a*(i+1)/(j+1)9(r+, T2, T8, T9) 8.

23、5 8.5 語句的中間代碼及其語法制導(dǎo)生成語句的中間代碼及其語法制導(dǎo)生成循環(huán)語句只思索While型循環(huán)語句。所要思索的語句文法如下:Gs:Si:=E | if E then S | if E then S else S | while E do S | begin B end | goto l | l:S BS | B; S 下面是語句四元式的方式定義:four(E) (then, res(E),) four(S1) (ifend,,) Sif E then S1 four(E)(=:,res(E), ,i) Si:=E 四元式 源代碼 (while,) Four(E) (do res(E),

24、) four(S1) Swhile E do S1 four(E) (then,res(E),,) four(S1) (else, ) four(S2) (ifend,,) Sif E then S1 else S2 four(S) BS (label,,l) four(S1)Sl:S1four(B1) Four(S) BB1;S (goto,l) Sgoto l four(B) Sbegin B end whend(,) 例:設(shè)有語句 if X=Y+1 then X:=X*Y else while X0 do begin X:=X-1;Y:=Y+2 end那么其四元式如下: 1.(+, Y,

25、 1, T1) Y+1 2.(=, X, T1, T2) X=Y+1 3.(then,T2, ,)4.(*, X, Y, T3) X*Y5.(=:, T3, , X ) X:=X*Y6.(else, , ) 7.(while, , ) 8.(, X , 0, T4) X0 9.(do, T4, , )10.(-, X, 1, T5) X-111.(=:, T5, , X) X:=X-112.(+, Y, 2, T6) Y+2 13.(=:, T6, , Y) Y:=Y+2 14.(whend, , , ) 15.(ifend, , , ) 語法制導(dǎo)用的新文法可設(shè)計(jì)如下:Gs:SAssig E

26、| Ifthen S | Ifelse S | Whido S | begin B end | goto l | Label S Assigi:= Ifthenif E then Ifelse Ifthen S elseWhido While E doWhile whileLabel l:BS| B; S8.6 8.6 復(fù)合變量的中間代碼復(fù)合變量的中間代碼及其語法制導(dǎo)生成及其語法制導(dǎo)生成在Pascal中,變量方式定義是: Vid | VE | V.id稱后兩種為復(fù)合變量。其中V又可以是恣意變量,因此復(fù)合變量的方式能夠是很復(fù)雜的。首先思索下標(biāo)變量VE情形。 ClASS POINT atp:Ltp

27、ulLOW UP CTP ClEN 其中tp是成分類型的TYPEL地址,L是成分類型的長度。假設(shè)用typ(V)和addr(V)表示變量V的類型(TYPEL地址)和V的始地址,那么有: addr(VE)=addr(V)+(E-l)*L 其中 l=AINFLTYPELtp.TPOINT.LOW L=AINFLTYPELtp.TPOINT.CLEN 下面思索域選擇變量V.id情形。 設(shè)tpy(V)=tp,且TYPELtp.TCLASS=d.這是tp指向一個(gè)記錄類型的內(nèi)部表示: ClASS POINT dtp:RINFL 假設(shè)用V.id中的id去查RINFL部分可得到id關(guān)于該記錄的區(qū)距off。假設(shè)用

28、off (tp,id)表示id 關(guān)于tp記錄的區(qū)距,那么有:addr(V.id)=addr(V)+off(typ(V),id)例:設(shè)有PASCAL闡明:TYPE at=ARRAY1.10OF1.5OF integer; rt=RECORD d:real; a:at; b:at END;VAR c,g:at;r,u:rt; 那么有:addr(ci)=c+(i-1)*5 addr(cij)=c+(i-1)*5+(j-1)*1 addr(u.a)=u+1 addr(u.ai)=u+1+(i-1)*5下面思索VE和V.id情形的四元式。變量目的的義務(wù)是計(jì)算變量的地址,于是其四元式可描畫如下:vfour

29、(V): addr(V)=T其中vfour表示變量的四元式。變量的目的代碼不一定要徹底計(jì)算出變量的地址并將它存于暫時(shí)變量中。假設(shè)沒有方便的目的代碼,那么計(jì)算X:=VE的過程大致是: 1) Addr(V)=T12) Value(E)T23) T1+ T2T3 4) T3X 但假設(shè)有方便的目的代碼,那么計(jì)算過程可以是: 1) Addr(V)T1 2) Value(E)T2 3) T2T1T3VE的四元式構(gòu)造可設(shè)計(jì)如下: vfour(VE):vfour(V) efour(E) (,eres(E),l,T1) (*,T1,L,T2) (,vres(V),T2,T)F eres(E)是表示E的結(jié)果變量。

30、F vres(V)是表示V變量的地址所在的變量F l和L分別為數(shù)組的下界和成分類型長度。 用efour(E)方式表示如今表達(dá)式的四元式,eres(E)也類似。其中的vres(v)和efour(E)分別為SEMs-2和SEMs-1,而l和L那么可按下法求出:tp:=SYMBLSEMS-2.TYPE l:=AINFLTYPELtp.LOW L:=AINFLTYPELtp.CLEN 域選擇變量V.id的四元式可設(shè)計(jì)如下: vfour(V.id) : vfour(V)(., vres(V),off,T) 例:假定有前例的闡明,那么有: vfour(ci) : 1.(, i, 1, T1) 2.(*,

31、T1,5, T2) 3.(, c, T2,T3)vfour(cij): 1. vfour(ci) 4.(, j, 1,T4) 5.(*, T4,1,T5) 6.(, T3,T5,T6)vfour(u.ai): 1.(., u,off,T1) 2.(,i, 1, T2) 3.(*, T2,5, T3) 4.(,T1, T3,T4)例:設(shè)有闡明部分VAR x,i,j:integer; B:boolean a:ARRAY1.10OF1.5OF integer; b:ARRAY1.5 OF integer那么以下語句 aij:=bbi ai:=b 的四元式部分如下:I.1.(, i, l, T1) 2

32、.(*, T1,5, T2) 3.(, a, T2,T3) ai 4.(, j, 1, T4) 5.(*, T4, 1, T5)可省 6.(, T3, T5, T6) aij 7.(, i, 1, T7) 8.(*, T7, 1, T8)可省 9.(, b, T8, T9) bi10.(, T9, 1, T10)11.(*, T10,1, T11)可省12.(, b, T11, T12) bbi13.(=:, T12, T6)aij:=bbi II. 1.(,i, 1, T1) 2.(*, T1,5, T2) 3.(,a, T2,T3) ai 4.(=:,b, ,T3) ai:=b8.7 8.

33、7 過程語句的中間代碼及其語法制導(dǎo)生成過程語句的中間代碼及其語法制導(dǎo)生成過程語句調(diào)用的四元式構(gòu)造:g(E1,E2,En) efour(E1) efour(E2) .efour(En) (act,eres(E1), 1,OFF(X1)(act,eres(E2), 2,OFF(X2)(act,eres(En), n,OFF(Xn)(call,EADDR(g),) 當(dāng)Xi為賦值形參時(shí),i部分為1,當(dāng)Xi為援用型形參時(shí), i部分為0 。 假設(shè)是函數(shù)調(diào)用,那么最后一條為: (call,EADDR(g),,NEWT) 在上述四元式中,Xi(i=1,2,.,n)為g的形參名。OFF(Xi)表示形參Xi的off值。例:設(shè)有如下闡明部分 TYPE arr=ARRAY1.10 OF integer; VAR x,y:real; i:integer; a:arr; FUNCTION f(VAR.Y1:real; Y2:integer;Y3:real):real;BEGINEND;FUNCTION g(VAR Z:integer):integer;BEGINEND 寫出語句f(x,g(ai)*3,y+2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論