第16-17講-語法制導(dǎo)的翻譯-III_第1頁
第16-17講-語法制導(dǎo)的翻譯-III_第2頁
第16-17講-語法制導(dǎo)的翻譯-III_第3頁
第16-17講-語法制導(dǎo)的翻譯-III_第4頁
第16-17講-語法制導(dǎo)的翻譯-III_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

4.3L屬性定義的自上而下計算S屬性定義的計算邊分析邊計算分析完畢,屬性也計算完畢問題:繼承屬性是否可以采用邊分析邊計算的方式進行?1邊分析邊計算,使得語法和語義的計算都在一遍處理完畢,而不需要為語義分析而單獨進行一遍編譯分析4.3L屬性定義的自上而下計算屬性計算與分析方法之間的關(guān)系屬性的計算次序受分析方法所限定的分析樹結(jié)點建立次序的限制。分析樹的結(jié)點是自左向右生成。所以,僅當(dāng)屬性信息是自左向右流動時,才有可能在分析的同時完成屬性計算。24.3L屬性定義的自上而下計算L屬性定義翻譯方案預(yù)測翻譯器的設(shè)計用綜合屬性代替繼承屬性34.3L屬性定義的自上而下計算4.3.1L屬性定義如果每個產(chǎn)生式AX1

X2…Xn

的每條語義規(guī)則計算的屬性是A的綜合屬性;或者是Xj

的繼承屬性,1

j

n,但它僅依賴:該產(chǎn)生式中Xj左邊符號X1,X2,…,Xj-1的屬性;A的繼承屬性。S屬性定義屬于L屬性定義。4例

非L屬性文法符號Q的繼承屬性依賴于它右邊文法符號R的屬性。5另一例非L屬性的語法制導(dǎo)定義文法符號B的繼承屬性依賴于它右邊文法符號C的屬性。64.3L屬性定義的自上而下計算L屬性定義的例子:變量類型聲明的語法制導(dǎo)定義7產(chǎn)生式

規(guī)

D

TL

L.in:=T.type

Tint

T.type:=integer

Treal

T.type:=real

L

L1,id

L1.in:=L.in;

addtype(id.entry,L.in)

Lid

addtype(id.entry,L.in)語義規(guī)則的執(zhí)行時刻很重要4.3L屬性定義的自上而下計算對于L屬性定義,與S屬性的一個最本質(zhì)區(qū)別在于S屬性定義中,只要將產(chǎn)生式作為一個整體看待即可,語義規(guī)則可以視為是附著在整個產(chǎn)生式上L屬性定義則不一樣,它跟屬性所屬的符號在產(chǎn)生式中的位置有關(guān)系為了對L屬性定義進行翻譯,必須提一下一個概念翻譯方案84.3L屬性定義的自上而下計算L屬性定義翻譯方案預(yù)測翻譯器的設(shè)計用綜合屬性代替繼承屬性94.3.2翻譯方案翻譯方案:給出了使用語義規(guī)則進行計算的次序,這樣就可把某些實現(xiàn)細節(jié)表示出來。在翻譯方案中,和文法符號相關(guān)語義動作,用花括號{}括起來,插入到產(chǎn)生式右部的合適位置上。這是一種動作和分析交錯的方法,以表示動作的執(zhí)行時機。104.3.2翻譯方案語義動作(語義規(guī)則)插入到產(chǎn)生式右部的任何地方,以表達動作的執(zhí)行時刻。

AB{..}C114.3.2翻譯方案例把有加和減的中綴表達式翻譯成后綴表達式 如果輸入是8+52,則輸出是85+2。

E

TRRaddopT{print(addop.lexeme)}R1|Tnum{print(num.val)}E

TRnum{print(8)}R

num{print(8)}addopT{print(+)}R

num{print(8)}addopnum{print(5)}{print(+)}R

{print(8)}{print(5)}{print(+)}addopT{print()}R…

{print(8)}{print(5)}{print(+)}{print(2)}{print()}12翻譯模式示例:把帶加號和減號的中綴表達式翻譯成相應(yīng)的后綴表達式

E→TRR→addopT{print(addop.lexeme)}R1|

T→num{print(num.val)}例:8+5-213+ETR8{print(‘8’)}TR5{print(‘5’)}{print(‘+’)}-T2{print(‘2’)}R{print(‘-’)}建立翻譯模式當(dāng)只需要綜合屬性時:為每一個語義規(guī)則建立一個包含賦值的動作,并把這個動作放在相應(yīng)的產(chǎn)生式右邊的末尾。產(chǎn)生式 語義規(guī)則

T→T1*F T.val:=T1.val×F.val 建立產(chǎn)生式和語義動作:

T→T1*F {T.val:=T1.val×F.val}14建立翻譯模式如果既有綜合屬性又有繼承屬性,在建立翻譯模式時就必須保證:1.產(chǎn)生式右邊的符號的繼承屬性必須在先于這個符號的動作中計算出來。2.一個動作不能引用這個動作右邊的符號的綜合屬性。3.產(chǎn)生式左邊非終結(jié)符的綜合屬性只有在它所引用的所有屬性都計算出來以后才能計算。計算這種屬性的動作通??煞旁诋a(chǎn)生式右端的末尾。15例:翻譯模式

S

A1A2{A1.in:=1;A2.in:=2}

Aa{print(A.in)}

不符合條件(1)。若改寫成

S

{A1.in:=1;A2.in:=2}

A1A2

Aa{print(A.in)}

則就符合條件(1)。

164.3L屬性定義的自上而下計算例數(shù)學(xué)排版語言EQN

Esub1.valSBBB1B2

BB1

subB2Btext17E1.val4.3L屬性定義的自上而下計算例數(shù)學(xué)排版語言EQN

Esub1.val18產(chǎn)

規(guī)

SB

B.ps:=10;S.ht:=B.ht

BB1B2

B1.ps:=B.ps;B2.ps:=B.ps;B.ht:=max(B1.ht,B2.ht)BB1

subB2

B1.ps:=B.ps;B2.ps:=shrink(B.ps);B.ht:=disp(B1.ht,B2.ht)BtextB.ht:=text.h

B.ps

E1.val綜合屬性:ht=height繼承屬性:ps=pointsize正文的實際高度=正文的正常高度乘以點的大小194.3L屬性定義的自上而下計算例數(shù)學(xué)排版語言EQNS {B.ps:=10} B {S.ht:=B.ht}

B {B1.ps:=B.ps}

B1 {B2.ps:=B.ps}

B2 {B.ht:=max(B1.ht,B2.ht)}

B {B1.ps:=B.ps}

B1 sub {B2.ps:=shrink(B.ps)} B2 {B.ht:=disp(B1.ht,B2.ht)}

Btext {B.ht:=text.h

B.ps}1.產(chǎn)生式右邊的符號的繼承屬性必須在先于這個符號的動作中計算出來。2.一個動作不能引用這個動作右邊的符號的綜合屬性。3.產(chǎn)生式左邊非終結(jié)符的綜合屬性只有在它所引用的所有屬性都計算出來以后才能計算。計算這種屬性的動作通常放在產(chǎn)生式右端的末尾。4.3L屬性定義的自上而下計算L屬性定義翻譯方案消除左遞歸預(yù)測翻譯器的設(shè)計用綜合屬性代替繼承屬性204.3L屬性定義的自上而下計算例左遞歸的消除引起繼承屬性21產(chǎn)生式語

規(guī)

E

E1+T

E.nptr:=mknode(‘+’,E1.nptr,T.nptr)

ET

E.nptr:=T.nptr

T

T1*F

T.nptr:=mknode(‘*’,T1.nptr,F.nptr)

T

F

T.nptr:=F.nptr

F(E)

F.nptr:=E.nptr

Fid

F.nptr:=mkleaf(id,id.entry)

Fnum

F.nptr:=mkleaf

(num,num.val)

4.3L屬性定義的自上而下計算關(guān)于算術(shù)表達式的左遞歸文法相應(yīng)的翻譯模式

E→E1+T {E.val:=E1.val+T.val} E→E1-T {E.val:=E1.val-T.val} E→T {E.val:=T.val} T→(E) {T.val:=E.val} T→num {T.val:=num.val}22E→TRR→+TR1R→-TR1R→T→(E)T→num消除左遞歸,構(gòu)造新的翻譯模式

E→T {R.i:=T.val} R {E.val:=R.s}

R→+ T {R1.i:=R.i+T.val}R1 {R.s:=R1.s}

R→- T {R1.i:=R.i-T.val} R1 {R.s:=R1.s} R→ {R.s:=R.i}

T→(E) {T.val:=E.val} T→num {T.val:=num.val}23E→TRR→+TR1R→-TR1R→T→(E)T→numR.i:R前面子表達式的值R.s:分析完R時子表達式的值計算表達式9-5+2E→T {R.i:=T.val} R {E.val:=R.s}R→+ T {R1.i:=R.i+T.val} R1{R.s:=R1.s}R→- T {R1.i:=R.i-T.val} R1 {R.s:=R1.s}R→ {R.s:=R.i}T→(E){T.val:=E.val}T→num{T.val:=num.val}24ETRnumnum.val=9T.val=9R.i=9-TRnumnum.val=5T.val=5R.i=4+TRnumnum.val=2T.val=2R.i=6R.s=6R.s=6R.s=6E.val=6構(gòu)造抽象語法樹的屬性文法定義轉(zhuǎn)化成翻譯模式E→E1+T {E.nptr:=mknode(‘+’,E1.nptr,T.nptr)}E→E1-T {E.nptr:=mknode(‘-’,E1.nptr,T.nptr)}E→T {E.nptr:=T.nptr}25構(gòu)造抽象語法樹的屬性文法定義轉(zhuǎn)化成翻譯模式

E→ T {R.i:=T.nptr} R {E.nptr:=R.s} R→ + T {R1.i:=mknode(‘+’,R.i,T.nptr)} R1 {R.s:=R1.s} R→ - T {R1.i:=mknode(‘-’,R.i,T.nptr)} R1 {R.s:=R.s} R→ {R.s:=R.i} T→ (E) {T.nptr:=E.nptr} T→ id {T.nptr:=mkleaf(id,id.entry)} T→ num {T.nptr:=mkleaf(num,num.val)}26使用繼承屬性構(gòu)造

a-4+c的抽象語法樹27ETRidToentryforaidT.nptr-Tnumnum4T.nptrR.

i-R+TRidToentryforcidT.nptrR.i+R.

iR.

sR.

sR.

sE.nptrE→T{R.i:=T.nptr}R{E.nptr:=R.s}R→+T{R1.i:=mknode(‘+’,R.i,T.nptr)}R1{R.s:=R1.s}R→-T{R1.i:=mknode(‘-’,R.i,T.nptr)}R1{R.s:=R.s}R→{R.s:=R.i}T→(E) {T.nptr:=E.nptr}T→id{T.nptr:=mkleaf(id,id.entry)}T→num{T.nptr:=mkleaf(num,num.val)}例:一個一般化的例子

A

A1Y{A.a:=g(A1.a,Y.y)}

AX{A.a:=f(X.x)}消除左遞歸后:A

X{R.i:=f(X.x)}

R{A.a:=R.s}RY{R1.i:=g(R.i,Y.y)}

R1{R.s:=R1.s}R{R.s:=R.i}28

A

A1Y{A.a:=g(A1.a,Y.y)}

AX{A.a:=f(X.x)}Y1XY2AAA.a=g

(g(f(X.x),Y1.y),Y2.y).a=g(f(X.x),Y1.y).a=f(X.x).y.y.x29A

X{R.i:=f(X.x)}

R{A.a:=R.s}RY{R1.i:=g(R.i,Y.y)}

R1{R.s:=R1.s}R{R.s:=R.i}AXRY1RY2R.i=g(g(f(X.x),Y1.y),Y2.y).i=g(f(X.x),Y1.y)

.y.i=f(X.x).y.xa

sss30本講綱要L屬性定義翻譯方案預(yù)測翻譯器的設(shè)計用綜合屬性代替繼承屬性31設(shè)計遞歸下降翻譯器的方法1.對每個非終結(jié)符A構(gòu)造一個函數(shù)過程,對A的每個繼承屬性設(shè)置一個形式參數(shù)函數(shù)的返回值為A的綜合屬性(作為記錄,或指向記錄的一個指針,記錄中有若干域,每個屬性對應(yīng)一個域)。為了簡單,假設(shè)每個非終結(jié)只有一個綜合屬性A對應(yīng)的函數(shù)過程中,為出現(xiàn)在A的產(chǎn)生式中的每一個文法符號的每一個屬性都設(shè)置一個局部變量。32設(shè)計遞歸下降翻譯器的方法2.非終結(jié)符A對應(yīng)的函數(shù)過程中,根據(jù)當(dāng)前的輸入符號決定使用哪個產(chǎn)生式候選。3334設(shè)計遞歸下降翻譯器的方法3.每個產(chǎn)生式對應(yīng)的程序代碼中,按照從左到右的次序,對于單詞符號(終結(jié)符)、非終結(jié)符和語義動作分別作以下工作:i)對于帶有綜合屬性x的終結(jié)符X,把x的值存入為X.x設(shè)置的變量中。然后產(chǎn)生一個匹配X的調(diào)用,并繼續(xù)讀入一個輸入符號。ii)對于每個非終結(jié)符B,產(chǎn)生賦值語句c=B(b1,b2,…,bk),其中,b1,b2,…,bk是為B的繼承屬性設(shè)置的變量,c是為B的綜合屬性設(shè)置的變量。iii)對于語義動作,把動作的代碼抄進分析器中,用代表屬性的變量來代替對屬性的每一次引用。4.3L屬性定義的自上而下計算4.3.3預(yù)測翻譯器的設(shè)計目標:為文法計算其中的L屬性值方法:把預(yù)測分析器的構(gòu)造方法推廣到翻譯方案的實現(xiàn)產(chǎn)生式R+TR|

的分析過程procedureR; begin iflookahead=‘+’thenbegin match(‘+’);T;R end elsebegin/*

什么也不做*/ end end354.3L屬性定義的自上而下計算functionR(i:syntax_tree_node):syntax_tree_node; var nptr,i1,s1,s:syntax_tree_node;

addoplexeme:char; begin iflookahead=‘+’thenbegin /*

產(chǎn)生式R+TR

*/ addoplexeme:=lexval; match(‘+’); nptr:=T;

i1:=mknode(addoplexme,i,nptr);

s1:=R(i1);

s:=s1 end elses:=i;/*

產(chǎn)生式

R

*/ returns end;36R+T {R1.i:=mknode(‘+’,R.i,T.nptr)}R1 {R.s:=R1.s}產(chǎn)生式R+TR|

的翻譯方案過程本講綱要L屬性定義翻譯方案預(yù)測翻譯器的設(shè)計用綜合屬性代替繼承屬性374.3L屬性定義的自上而下計算4.3.4(通過改寫文法)用綜合屬性代替繼承屬性Pascal的聲明,如m,n:integer D

L:T

Tinteger|char

L

L,id|id38D:L,idLidintegerT4.3L屬性定義的自上而下計算4.3.4用綜合屬性代替繼承屬性Pascal的聲明,如m,n:integer D

L:T

Tinteger|char

L

L,id|id改成從右向左歸約 DidL

L,idL|:T

Tinteger|char39D:L,idLidintegerT4.3L屬性定義的自上而下計算D

idL {addtype(id.entry,L.type)}L

,idL1{L.type:=L1.Type;

addtype(id.entry,L1.type)}L:T {L.type:=T.type}T

integer{T.type:=integer}T

real {T.type:=real}40D:L,idLidintegerT作業(yè)4.7,4.12,4.13414.4L屬性的自下而上計算刪除翻譯方案中嵌入的動作分析棧上的繼承屬性模擬繼承屬性的計算424.4L屬性的自下而上計算L屬性的自上而下計算與自上而下的語法分析的過程是一致的但是,自上而下分析能夠處理的文法局限于LL(1)為了為更為一般的文法計算L屬性,需要研究自下而上的L屬性計算方法434.4L屬性的自下而上計算在自下而上語法分析的框架中實現(xiàn)L屬性定義的方法,可以做到:實現(xiàn)任何基于LL(1)文法的L屬性定義。實現(xiàn)許多(但不是所有的)基于LR(1)的L屬性定義。444.4L屬性的自下而上計算L屬性自下而上計算需要解決的問題:45......YY.yXX.x......棧statevaltopAXY{Z.i=X.x}Z一個狀態(tài)(文法符號)對應(yīng)一個綜合屬性,該屬性的值一般在處理完該文法符號之后得到。那么在Z還沒有開始處理前,繼承屬性Z.i就沒有對應(yīng)的val條目供其使用!解決辦法:在棧上消除繼承屬性4.4.1

刪除翻譯方案中嵌入的動作問題自下而上的分析中,語義動作的執(zhí)行是在使用產(chǎn)生式對句柄進行歸約的時候但是,L屬性定義的繼承屬性的計算需要嵌在產(chǎn)生式右部不同的地方問題的解決方案:通過改寫文法,使得所有嵌入在產(chǎn)生式中間的動作變換成只在產(chǎn)生式的最右端出現(xiàn)464.4.1

刪除翻譯方案中嵌入的動作特殊情況一:刪除翻譯方案中嵌入的動作E

TRR+T{print(‘+’)}R1|

T{print(‘’)}R1|

Tnum{print(num.val)}在文法中加入產(chǎn)生的標記非終結(jié)符,讓每個嵌入動作由不同標記非終結(jié)符M代表,并把該動作放在產(chǎn)生式M

的右端。E

TRR+TMR1|

TNR1|Tnum{print(num.val)}M

{print(‘+’)}N

{print(‘’)}

474.4.2分析棧上的繼承屬性特殊情況二:分析棧上的繼承屬性例intp,q,rD

T{L.in:=T.type} LTint{T.type:=integer}Treal{T.type:=real}L{L1.in:=L.in}

L1,id{addtype(id.entry,L.in)}Lid{addtype(id.entry,L.in)}48所依賴的屬性在分析棧上的位置能靜態(tài)確定復(fù)寫規(guī)則494.4.2分析棧上的繼承屬性特殊情況二:分析棧上的繼承屬性屬性位置能預(yù)測狀態(tài)輸入所用產(chǎn)生式-intp,q,rintp,q,rTp,q,rTintTp,q,rTL,q,rLidTL,q,rTL,q,rTL,rLL,idTL,rTL,rTLLL,idDDTLDTLL,rL,qpinttypeininin每個L結(jié)點上L.in=T.typeLid{addtype(id.entry,L.in)}L{L1.in:=L.in}

L1,id{addtype(id.entry,L.in)}L{L1.in:=L.in}

L1,id{addtype(id.entry,L.in)}4.4.2分析棧上的繼承屬性50DTLL,rL,qpinttypeininin產(chǎn)生式

代碼段

D

TL

Tintval[top]:=integer

Trealval[top]:=real

L

L1,idaddtype(val[top],val[top3])Lidaddtype(val[top],val[top1])屬性T.type在棧中的位置相對于棧頂是事先知道的。因此,可以用棧中的屬性值T.type代替L.in。一個不能預(yù)知屬性值在棧中所放位置的例子考慮下面翻譯模式:產(chǎn)生式語義規(guī)則

S

aAC

C.i:=A.s

SbABC

C.i:=A.s

Cc

C.s:=g(C.i)屬性C.i通過一個復(fù)寫規(guī)則來繼承屬性A.s

的值。

SaA

Csi

SbABCsi514.4.2分析棧上的繼承屬性通過標記非終結(jié)符M復(fù)寫屬性的值產(chǎn)生式語義規(guī)則

S

aAC

C.i:=A.s

SbABMC

M.i:=A.s;C.i:=M.s

Cc

C.s:=g(C.i)

MM.s:=M.i

SbABCsi(a)原產(chǎn)生式

SbAB

M

Csisi

(b)依賴關(guān)系524.4.2分析棧上的繼承屬性cAa_A.s...topcMBAb_M.sB.sA.s...top通過標記非終結(jié)符M復(fù)寫屬性的值,預(yù)知屬性值在棧中所放位置SaACSbABMCCcval[top]=g(val[top-1])Mval[top+1]=val[top-1]534.4.2分析棧上的繼承屬性所依賴的屬性在分析棧上的位置不能靜態(tài)確定S

aAC C.i:=A.sS

bABC

C.i:=A.sC

c

C.s:=g(C.i)增加標記非終結(jié)符S

aAC C.i:=A.sS

bABMC

M.i:=A.s;C.i:=M.sC

c

C.s:=g(C.i)M

M.s:=M.iSaACSbABMCCcval[top]=g(val[top-1])Mval[top+1]=val[top-1]544.4.2分析棧上的繼承屬性4.4.3模擬繼承屬性的計算模擬繼承屬性的計算(一般情況)繼承屬性是某個綜合屬性的一個函數(shù) S

aAC C.i:=f(A.s)

C

c

C.s:=g(C.i)55cAaC.sA.s...top

SaA

Csi4.4.3模擬繼承屬性的計算模擬繼承屬性的計算(一般情況)增加標記非終結(jié)符,把f(A.s)的計算移到對標記非終結(jié)符歸約時進行。 S

aANC N.i:=A.s;C.i:=N.s N

N.s:=f(N.i)

C

c

C.s:=g(C.i)56這樣,每次需要使用繼承屬性的時候,剛好都在本文法符號的正下方cSiCiNsAsacNAaC.sN.sA.s...topcSiCiNsAsacAaC.sA.s...topcNAaC.sN.sA.s...top

SaA

Csi574.4.3模擬繼承屬性的計算4.4.3模擬繼承屬性的計算例數(shù)學(xué)排版語言EQN

S {B.ps:=10} B {S.ht:=B.ht}

B {B1.ps:=B.ps}

B1 {B2.ps:=B.ps}

B2 {B.ht:=max(B1.ht,B2.ht)}

B {B1.ps:=B.ps}

B1 sub {B2.ps:=shrink(B.ps)} B2 {B.ht:=disp(B1.ht,B2.ht)}

Btext {B.ht:=text.h

B.ps}584.4.3模擬繼承屬性的計算在計算文本的字體和高度的時候,無法確定所依賴的繼承屬性值的位置例如:棧頂元素可能是

text=>B

Btext=>BBBsubtext=>BsubB594.4.3模擬繼承屬性的計算60產(chǎn)

語義規(guī)則

S

LB

B.ps:=L.s;S.ht:=B.ht

L

L.s:=10BB1

MB2

B1.ps:=B.ps;M.i:=B.ps;B2.ps:=M.s;B.ht:=max(B1.ht,B2.ht)M

M.s:=M.i

BB1

sub

NB2

B1.ps:=B.ps;N.i:=B.ps;B2.ps:=N.s;B.ht:=disp(B1.ht,B2.ht)N

N.s:=shrink(N.i)BtextB.ht:=text.h

B.ps

4.4.3模擬繼承屬性的計算S L {B.ps:=L.s}B {S.ht:=B.ht}L {L.s:=10}

B {B1.ps:=B.ps}

B1 {M.i:=B.ps}

M{B2.ps:=M.s}

B2 {B.ht:=max(B1.ht,B2.ht)}

M

{M.s:=M.i}

B {B1.ps:=B.ps}

B1 sub {N.i=B.ps}

N {B2.ps:=shrink(N.s)} B2 {B.ht:=disp(B1.ht,B2.ht)}

N

{N.s:=N.i}

Btext {B.ht:=text.h

B.ps}614.4.3模擬繼承屬性的計算舉例說明62SM

BLBBtextEBsubNBtextEtext1s=10pspsspshth=E.hh=E.hspsiipsh=1.hhththththt4.4.3模擬繼承屬性的計算63產(chǎn)

語義規(guī)則

S

LB

B.ps:=L.s;S.ht:=B.ht

L

L.s:=10BB1

MB2

B1.ps:=B.ps;M.i:=B.ps;B2.ps:=M.s;B.ht:=max(B1.ht,B2.ht)M

M.s:=M.i

BB1

sub

NB2

B1.ps:=B.ps;N.i:=B.ps;B2.ps:=N.s;B.ht:=disp(B1.ht,B2.ht)N

N.s:=shrink(N.i)BtextB.ht:=text.h

B.ps

4.4.3模擬繼承屬性的計算64產(chǎn)

代碼段SLB

val[top1]:=val[top]L

L.s:=10BB1MB2

B1.ps:=B.ps;M.i:=B.ps;B2.ps:=M.s;B.ht:=max(B1.ht,B2.ht)M

M.s:=M.i

BB1

subNB2

B1.ps:=B.ps;N.i:=B.ps;B2.ps:=N.s;B.ht:=disp(B1.ht,B2.ht)N

N.s:=shrink(N.i)BtextB.ht:=text.h

B.ps

4.4.3模擬繼承屬性的計算65產(chǎn)

代碼段SLB

val[top1]:=val[top]L

val[top+1]

:=10BB1MB2

B1.ps:=B.ps;M.i:=B.ps;B2.ps:=M.s;B.ht:=max(B1.ht,B2.ht)M

M.s:=M.i

BB1

subNB2

B1.ps:=B.ps;N.i:=B.ps;B2.ps:=N.s;B.ht:=disp(B1.ht,B2.ht)N

N.s:=shrink(N.i)BtextB.ht:=text.h

B.ps

4.4.3模擬繼承屬性的計算66產(chǎn)

代碼段SLB

val[top1]:=val[top]L

val[top+1]

:=10BB1MB2

val[top2]:=max(val[top2],val[top])M

M.s:=M.i

BB1

subNB2

B1.ps:=B.ps;N.i:=B.ps;B2.ps:=N.s;B.ht:=disp(B1.ht,B2.ht)N

N.s:=shrink(N.i)BtextB.ht:=text.h

B.ps

4.4.3模擬繼承屬性的計算67產(chǎn)

代碼段SLB

val[top1]:=val[top]L

val[top+1]

:=10BB1MB2

val[top2]:=max(val[top2],val[top])M

溫馨提示

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

評論

0/150

提交評論