第6章語(yǔ)法制導(dǎo)翻譯技術(shù)分析_第1頁(yè)
第6章語(yǔ)法制導(dǎo)翻譯技術(shù)分析_第2頁(yè)
第6章語(yǔ)法制導(dǎo)翻譯技術(shù)分析_第3頁(yè)
第6章語(yǔ)法制導(dǎo)翻譯技術(shù)分析_第4頁(yè)
第6章語(yǔ)法制導(dǎo)翻譯技術(shù)分析_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6章語(yǔ)法制導(dǎo)翻譯技術(shù)2024/10/231內(nèi)容提要引言翻譯文法語(yǔ)法制導(dǎo)翻譯自頂向下語(yǔ)法制導(dǎo)翻譯自底向上語(yǔ)法制導(dǎo)翻譯屬性翻譯文法屬性文法的自頂向下翻譯屬性文法的自底向上翻譯2024/10/232引言編譯程序的邏輯工作過(guò)程詞法分析和語(yǔ)法分析僅僅對(duì)源程序做形式變換和檢查。語(yǔ)義分析檢查程序語(yǔ)義是否正確。中間代碼生成將語(yǔ)義分析后的結(jié)果翻譯成代碼。上述工作過(guò)程采用串行處理方式實(shí)際應(yīng)用中語(yǔ)法分析、語(yǔ)義分析、中間代碼生成采用并行處理方式詞法分析語(yǔ)法分析語(yǔ)義分析代碼優(yōu)化目標(biāo)代碼生成目標(biāo)代碼源程序中間代碼生成2024/10/233并行處理方式:

對(duì)文法中的每個(gè)產(chǎn)生式都附加一些動(dòng)作(語(yǔ)義分析、操作符號(hào)表、代碼生成等),在語(yǔ)法分析過(guò)程中,每當(dāng)需要使用一個(gè)產(chǎn)生式進(jìn)行推導(dǎo)或歸約,語(yǔ)法分析程序除執(zhí)行相應(yīng)的語(yǔ)法分析動(dòng)作外,還要執(zhí)行相應(yīng)的其它動(dòng)作,完成語(yǔ)義分析和代碼生成等工作。(邊分析邊翻譯)并行處理方式涉及幾個(gè)概念翻譯文法語(yǔ)法制導(dǎo)翻譯屬性翻譯文法

2024/10/234翻譯文法:在描述語(yǔ)言規(guī)則的文法產(chǎn)生式右部的適當(dāng)位置加入動(dòng)作而得到的文法。翻譯文法@為動(dòng)作符號(hào)標(biāo)記,由符號(hào)@開(kāi)始的符號(hào)串稱為一個(gè)動(dòng)作符號(hào)。2024/10/235例:構(gòu)造中綴表達(dá)式文法的翻譯文法,得到其后綴表達(dá)式。①E→E+T⑤F→(E)②E→T ⑥F→a③T→T*F⑦F→b④T→F⑧F→c①E→E+T@+ ⑤F→(E)②E→T⑥F→a@a③T→T*F@* ⑦F→b@b④T→F ⑧F→c@c①E→E+T⑤F→(E)②E→T ⑥F→a③T→T*F⑦F→b④T→F⑧F→c①E→E+T@+ ⑤F→(E)②E→T⑥F→a@a③T→T*F@* ⑦F→b@b④T→F ⑧F→c@c把中綴表達(dá)式文法叫做輸入文法;在輸入文法上添加動(dòng)作后形成的文法叫做翻譯文法使用中綴表達(dá)式文法推導(dǎo)得到終結(jié)符號(hào)串叫做輸入序列;使用翻譯文法推導(dǎo)得到的符號(hào)串稱為活動(dòng)序列。從活動(dòng)序列中去掉所有動(dòng)作符號(hào)得到輸入序列,而所有動(dòng)作符號(hào)組成的符號(hào)串稱為動(dòng)作序列。從動(dòng)作序列中去掉動(dòng)作符號(hào)標(biāo)記得到輸出序列(翻譯結(jié)果)2024/10/236例:對(duì)于符號(hào)串(a+b)*c用輸入文法推導(dǎo)輸入序列(a+b)*c:E=>T=>T*F=>F*F=>(E)*F=>(E+T)*F=>(T+T)*F=>(F+T)*F=>(a+T)*F=>(a+F)*F=>(a+b)*F=>(a+b)*c用翻譯文法推導(dǎo)活動(dòng)序列(a@a+b@b@+)*c@c@*:E=>T=>T*F@*=>F*F@*=>(E)*F@*=>(E+T@+)*F@*=>(T+T@+)*F@*=>(F+T@+)*F@*=>(a@a+T@+)*F@*=>(a@a+F@+)*F@*=>(a@a+b@b@+)*F@*=>(a@a+b@b@+)*c@c@*將活動(dòng)序列(a@a+b@b@+)*c@c@*中的動(dòng)作符號(hào)去掉得到輸入序列:(a+b)*c所有動(dòng)作符號(hào)組成的符號(hào)串即動(dòng)作序列為:@a@b@+@c@*

去掉動(dòng)作符號(hào)標(biāo)記得到:ab+c*①E→E+T⑤F→(E)②E→T ⑥F→a③T→T*F⑦F→b④T→F⑧F→c①E→E+T@+ ⑤F→(E)②E→T⑥F→a@a③T→T*F@* ⑦F→b@b④T→F ⑧F→c@c2024/10/237由于翻譯文法是在輸入文法的產(chǎn)生式右部的適當(dāng)位置插入動(dòng)作符號(hào)形成的,因此,翻譯文法產(chǎn)生的動(dòng)作序列受輸入語(yǔ)言的文法控制(語(yǔ)法制導(dǎo))。語(yǔ)法制導(dǎo)翻譯:根據(jù)輸入文法,分析各條產(chǎn)生式的語(yǔ)義(要求計(jì)算機(jī)所完成的操作),分別編出完成這些操作的子程序或程序段(稱為語(yǔ)義子程序或語(yǔ)義動(dòng)作),并把這些子程序或程序段的名字作為動(dòng)作符號(hào)插入到輸入文法各產(chǎn)生式右部的適當(dāng)位置上,從而實(shí)現(xiàn)翻譯文法。

①E→E+T@+ ⑤F→(E)②E→T⑥F→a@a③T→T*F@* ⑦F→b@b④T→F ⑧F→c@c①E→E+T⑤F→(E)②E→T ⑥F→a③T→T*F⑦F→b④T→F⑧F→c2024/10/238語(yǔ)法制導(dǎo)翻譯9語(yǔ)法制導(dǎo)翻譯的基本思想通俗地講,以語(yǔ)法分析為基礎(chǔ),伴隨語(yǔ)法分析的各個(gè)步驟,執(zhí)行相應(yīng)的語(yǔ)義動(dòng)作。具體方法:

1.將文法符號(hào)所代表的語(yǔ)言成分的意思,用隸屬于該文法符號(hào)的屬性表示;

2.用語(yǔ)義規(guī)則(語(yǔ)義規(guī)則的執(zhí)行就是語(yǔ)義動(dòng)作)規(guī)定產(chǎn)生式所代表的語(yǔ)言成分之間的關(guān)系(即屬性之間的關(guān)系),即用語(yǔ)義規(guī)則實(shí)現(xiàn)屬性計(jì)算。3.語(yǔ)義動(dòng)作(語(yǔ)義規(guī)則的執(zhí)行):在語(yǔ)法分析的適當(dāng)時(shí)刻(如推導(dǎo)或歸約)執(zhí)行附在對(duì)應(yīng)產(chǎn)生式上的語(yǔ)義規(guī)則,以實(shí)現(xiàn)對(duì)語(yǔ)言結(jié)構(gòu)語(yǔ)義的處理,如計(jì)算、查填符號(hào)表、生成中間代碼、發(fā)布出錯(cuò)信息等。2024/10/23自頂向下的語(yǔ)法制導(dǎo)翻譯:遞歸下降翻譯、LL(1)翻譯。遞歸下降翻譯(在適當(dāng)位置插入實(shí)現(xiàn)動(dòng)作符號(hào)的子程序):例:算術(shù)表達(dá)式翻譯文法如下:(@為輸出其后的符號(hào)串)①E→E+T@+②E→T③T→T*F@*

④T→F ⑤F→(E)⑥F→a@a⑦F→b@b⑧F→c@c消除左遞歸得到:

E→TE’E’→+T@+E’|εT→FT’T’→*F@*T’|εF→(E)|a@a|b@b|c@c自頂向下語(yǔ)法制導(dǎo)翻譯

10FIRST(TE’)={(,a,b,c}FIRST(+T@+E’)={+}FOLLOW(E’)={#,)}FIRST(FT’)={(,a,b,c}FIRST(*F@*T’)={*}FOLLOW(T’)={#,+,)}FIRST((E))={(}FIRST(a@a)={a}FIRST(b@b)=FIRST(c@c)={c}求FIRST集和FOLLOW集不考慮動(dòng)作符號(hào)11-對(duì)改寫(xiě)后文法的每個(gè)非終結(jié)符號(hào)編寫(xiě)一個(gè)函數(shù)。對(duì)于產(chǎn)生式E→TE’FIRST(TE’)={(,a,b,c}-用E1表示E’

E(){if(ch∈FIRST(TE’)) {T();E1();}elseerror();}2024/10/23E→TE’E’→+T@+E’|εT→FT’T’→*F@*T’|εF→(E)|a@a|b@b|c@c12對(duì)于產(chǎn)生式

E’→+T@+E’|ε-用E1表示E’FIRST(+T@+E’)={+}FOLLOW(E’)={#,)}E1(){ if(ch==‘+’) {ch=getnextsymbol();T();OUT(“+”);E1();

} elseif(ch∈FOLLOW(E’))return;elseerror();}2024/10/23E→TE’E’→+T@+E’|εT→FT’T’→*F@*T’|εF→(E)|a@a|b@b|c@c對(duì)于產(chǎn)生式

T→FT’-用T1表示T’T(){if(ch∈FIRST(FT’)){F();T1();}else error();}2024/10/23E→TE’E’→+T@+E’|εT→FT’T’→*F@*T’|εF→(E)|a@a|b@b|c@c對(duì)于產(chǎn)生式T’→*F@*T’|εFIRST(*F@*T’)={*}FOLLOW(T’)={#,+,)}-用T1表示T’T1(){if(ch==‘*’){ch=getnextsymbol();F();OUT(“*”);T1();}elseif(ch∈FOLLOW(E’))return;elseerror();}2024/10/2314E→TE’E’→+T@+E’|εT→FT’T’→*F@*T’|εF→(E)|a@a|b@b|c@c對(duì)于產(chǎn)生式F→(E)|a@a|b@b|c@c

F(){if(ch==‘a(chǎn)’){ch=getnextsymbol();OUT(“a”);}elseif(ch==‘b’){ch=getnextsymbol();OUT(“b”);}elseif(ch==‘c’){ch=getnextsymbol();OUT(“c”);}elseif(ch==‘(’)

{ch=getnextsymbol();E();if(ch==‘)’)ch=getnextsymbol();} elseerror();}2024/10/23152024/10/2316FIRST(TE’)={(,a,b,c}FIRST(+T@+E’)={+}FOLLOW(E’)={#,)}FIRST(FT’)={(,a,b,c}FIRST(*F@*T’)={*}FOLLOW(T’)={#,+,)}FIRST((E))={(}FIRST(a@a)={a}FIRST(b@b)=FIRST(c@c)={c}思考:句子a+b*c的翻譯輸出是什么?E→TE’E’→+T@+E’|εT→FT’T’→*F@*T’|εF→(E)|a@a|b@b|c@c輸出:abc*+LL(1)翻譯器

例:輸入文法:①A→aBcD②A→b③B→c④B→aA⑤D→cD⑥D(zhuǎn)→b

輸入文法的LL(1)分析表

符號(hào)輸入符號(hào)

abc#ABDA→aBcDB→aA

A→b

D→b

B→cD→cD

翻譯文法:①A→@va@wB@xc@yD@z②A→b③B→c@r④B→a@mA⑤D→cD@n⑥D(zhuǎn)→@sb符號(hào)

輸入符號(hào)

abc#ABDA→@va@wB@xc@yD@zB→a@mAA→b

D→@sb

B→c@rD→cD@n

翻譯文法的LL(1)分析表

翻譯文法的動(dòng)作符號(hào)同樣入棧,當(dāng)其處于棧頂時(shí),無(wú)條件出棧并執(zhí)行其規(guī)定的操作,不移動(dòng)讀符號(hào)指針。

構(gòu)造翻譯文法分析表不考慮動(dòng)作符號(hào)2024/10/2317a……A..#@v

a

@w

B@x.#B..#@v出棧并執(zhí)行,a出棧,@w出棧并執(zhí)行

符號(hào)

輸入符號(hào)

abc#ABDA→@va@wB@xc@yD@zB→a@mA

A→b

D→@sb

B→c@rD→cD@n

2024/10/2318波蘭翻譯文法:對(duì)于一個(gè)文法,當(dāng)且僅當(dāng)文法中每個(gè)產(chǎn)生式右部的所有動(dòng)作符號(hào)都只出現(xiàn)在所有輸入符號(hào)和非終結(jié)符號(hào)的右邊,則稱此類(lèi)翻譯文法為波蘭翻譯文法。例:0)S→E1)E→E+T@ADD2)E→T3)T→T*F@MULT4)T→F5)F→(E)6)F→i

0)S→E1)E→E+T2)E→T3)T→T*F4)T→F5)F→(E)6)F→i

自底向上的語(yǔ)法制導(dǎo)翻譯2024/10/2319狀態(tài)

ACTION

GOTO

i+*()#ETF0S5

S4

1231

S6

A

2R2S7R2R2

3R4R4R4R4

4S5

S4

8235R6R6R6R6

6S5

S4

937S5

S4

108

S6

S11

9R1S7R1R1

10R3R3R3R3

11R5R5R5R5

算術(shù)表達(dá)式的LR分析表使用帶動(dòng)作符號(hào)的產(chǎn)生式歸約要執(zhí)行動(dòng)作符號(hào)規(guī)定的動(dòng)作。波蘭翻譯0)S→E1)E→E+T@ADD2)E→T3)T→T*F@MULT4)T→F5)F→(E)6)F→i

2024/10/2320步驟狀態(tài)棧符號(hào)棧輸入串ACTIONGOTO10#i+i#S5205#i+i#R63303#F+i#R42402#T+i#R21501#E+i#S66016#E+i#S570165#E+i#R6380163#E+F#R4990169#E+T#R111001#E#ACC輸入符號(hào)串i+i#的翻譯過(guò)程歸約之后執(zhí)行@ADD,輸出ADD0)S→E1)E→E+T@ADD2)E→T3)T→T*F@MULT4)T→F5)F→(E)6)F→i

2024/10/2321思考:若用棧計(jì)算后綴表達(dá)式,產(chǎn)生式6可添加什么動(dòng)作?屬性:指與文法符號(hào)的類(lèi)型和值等有關(guān)的一些語(yǔ)義信息,在編譯中用屬性描述被處理對(duì)象的語(yǔ)義特征。屬性代表與文法符號(hào)相關(guān)的語(yǔ)義信息。屬性的設(shè)置和語(yǔ)法結(jié)構(gòu)的語(yǔ)義以及翻譯程序的需要有關(guān)。例如:文法符號(hào)X的類(lèi)型屬性:X.type文法符號(hào)X的值屬性:X.val文法符號(hào)X的代碼序列:X.code文法符號(hào)X的內(nèi)存:X.place文法符號(hào)X的符號(hào)表入口指針:X.entry等。屬性翻譯文法注:教材中用箭頭↑和↓代替.2024/10/232223屬性、語(yǔ)義規(guī)則屬性和變量一樣,可以在語(yǔ)法分析過(guò)程中進(jìn)行計(jì)算和傳遞。語(yǔ)義規(guī)則:屬性的計(jì)算規(guī)則,屬性的加工和計(jì)算過(guò)程。由語(yǔ)義處理過(guò)程、語(yǔ)義動(dòng)作、語(yǔ)義子程序來(lái)實(shí)現(xiàn)。屬性分為兩類(lèi):綜合屬性和繼承屬性。終結(jié)符只有綜合屬性,由詞法分析器提供例:i.lexval表示單詞符號(hào)“數(shù)”的詞法值id.entry表示單詞符號(hào)“標(biāo)識(shí)符”的符號(hào)表入口非終結(jié)符既可以有綜合屬性也可以有繼承屬性注:教材中屬性前用↑表示綜合屬性,↓表示繼承屬性2024/10/2324兩種屬性:綜合屬性綜合屬性用于“自下而上”傳遞信息。綜合屬性:在語(yǔ)法樹(shù)中,一個(gè)結(jié)點(diǎn)的綜合屬性值由其子結(jié)點(diǎn)的屬性值確定。通常結(jié)合自下而上的語(yǔ)法分析在每一個(gè)結(jié)點(diǎn)處使用語(yǔ)義規(guī)則計(jì)算綜合屬性的值---由下層子結(jié)點(diǎn)的屬性值計(jì)算上層父結(jié)點(diǎn)的綜合屬性值,隨著自下而上語(yǔ)法分析的進(jìn)行,最終可計(jì)算出開(kāi)始符號(hào)的綜合屬性值。AX1X2…XnA.bX1.c1X2.c2…Xn.

ckAX1X2…Xn綜合屬性A.b=f(c1,c2,…,ck)帶屬性的語(yǔ)法樹(shù)2024/10/23例:設(shè)計(jì)一個(gè)語(yǔ)法分析程序接受算術(shù)表達(dá)式,并通過(guò)添加動(dòng)作符號(hào)輸出表達(dá)式的值。已知符號(hào)串翻譯文法如下:①S→E@ANSWER②E→E+T③E→T④T→T*F⑤T→F⑥F→(E)⑦F→NUM@ANSWER的動(dòng)作是輸出表達(dá)式的計(jì)算結(jié)果。表達(dá)式3+2*3的詞法分析結(jié)果如下:

NUM↑3+NUM↑2*NUM↑3其中NUM代表無(wú)符號(hào)整數(shù),↑數(shù)字串表示該符號(hào)的屬性2024/10/2325改寫(xiě)每一個(gè)產(chǎn)生式,添加符號(hào)屬性變量名,并定義符號(hào)屬性之間的關(guān)系即屬性求值規(guī)則(語(yǔ)義規(guī)則),得到:

屬性文法求值規(guī)則

①S→E↑q@ANSWER↓rr=q②E↑p→E↑q+T↑r p=q+r③E↑p→T↑q p=q④T↑p→T↑q*F↑r p=q*r⑤T↑p→F↑q p=q⑥F↑p→(E↑q) p=q⑦F↑p→NUM↑qp=q通過(guò)自底向上進(jìn)行求值的屬性,稱為綜合屬性,用↑來(lái)表示。終結(jié)符號(hào)的綜合屬性具有初始值,由詞法分析給出。2024/10/2326SET+E@ANSWERF*TTFNUM↑3

FNUM↑2

NUM↑3

NUM↑3+NUM↑2*NUM↑3的語(yǔ)法樹(shù)

NUM↑3

SE↑9

T↑6

+E↑3

@ANSWER↓9

F↑3

*T↑2

T↑3

F↑3

F↑2

NUM↑2

NUM↑3

NUM↑3+NUM↑2*NUM↑3帶屬性計(jì)算的語(yǔ)法樹(shù)

屬性文法求值規(guī)則①S→E↑q@ANSWER↓rr=q②E↑p→E↑q+T↑r p=q+r③E↑p→T↑q p=q④T↑p→T↑q*F↑r p=q*r⑤T↑p→F↑q p=q⑥F↑p→(E↑q) p=q⑦F↑p→NUM↑q

p=q在歸約過(guò)程中完成屬性值的計(jì)算⑦⑤③⑦⑤⑦④②2024/10/232728兩種屬性:繼承屬性繼承屬性用于“自上而下”傳遞信息。繼承屬性:在語(yǔ)法樹(shù)中,一個(gè)結(jié)點(diǎn)的繼承屬性由此結(jié)點(diǎn)的父結(jié)點(diǎn)和(或)兄弟結(jié)點(diǎn)的某些屬性確定。可以用繼承屬性來(lái)表示程序語(yǔ)言結(jié)構(gòu)中的上下文依賴關(guān)系。繼承屬性的計(jì)算可以結(jié)合自上而下的語(yǔ)法分析進(jìn)行A

X1…X

…XnA.

ck

X1.c1…X.b…Xn.ciAX1X2…X…Xn

繼承屬性X.b=f(c1,c2,…,ck)2024/10/23例:聲明語(yǔ)句文法 ①<聲明語(yǔ)句>→TYPEID<變量表>; ②<變量表>→,ID<變量表> ③<變量表>→ε

其中TYPE可為int,real,bool假設(shè)詞法分析程序輸出單詞符號(hào)時(shí),對(duì)變量名輸出單詞記號(hào)ID和變量名;對(duì)TYPE輸出單詞記號(hào)TYPE和類(lèi)型名。構(gòu)造語(yǔ)法分析程序,能輸出變量名及其類(lèi)型

2024/10/23291、添加語(yǔ)義動(dòng)作@SET_TYPE輸出變量名及類(lèi)型,因此@SET_TYPE帶有兩個(gè)屬性,即變量名和類(lèi)型:

@SET_TYPE↓n1,t1語(yǔ)法分析程序讀到一個(gè)變量后,調(diào)用SET_TYPE。因此文法改寫(xiě)為:

(1)<聲明語(yǔ)句>→TYPEID@SET_TYPE<變量表>;(2)<變量表>→,ID@SET_TYPE<變量表>(3)<變量表>→ε2、確定需要的屬性TYPE需要一個(gè)屬性(類(lèi)型名),即TYPE↑tID需要一個(gè)屬性(變量名),即ID↑n<變量表>需要一個(gè)屬性,即<變量表↓t2>2024/10/23303、確定語(yǔ)義規(guī)則(屬性求值規(guī)則)產(chǎn)生式(1)的TYPE↑t和ID↑n由詞法分析輸出得到。產(chǎn)生式(2)從詞法分析只能得到ID↑n,令產(chǎn)生式(2)左邊<變量表↓t2>=產(chǎn)生式(1)右邊<變量表↓t2>,得到翻譯文法:<聲明語(yǔ)句>→TYPE↑tID↑n@SET_TYPE↓n1,t1<變量表↓t2>

t2=t,t1=t,n1=n(屬性求值規(guī)則)2)<變量表↓t>→,ID↑n@SET_TYPE↓n1,t1<變量表↓t2>

t2=t,t1=t,n1=n(屬性求值規(guī)則)3)<變量表>→ε

(1)<聲明語(yǔ)句>→TYPEID@SET_TYPE<變量表>;(2)<變量表>→,ID@SET_TYPE<變量表>(3)<變量表>→ε2024/10/2331假設(shè)輸入符號(hào)串為inta,b;,詞法分析輸出為T(mén)YPE↑intID↑a,D↑b;,則帶有屬性的語(yǔ)法樹(shù)如圖所示按自頂向下或自左向右方式求得的屬性稱為繼承屬性,其前面冠以↓表示。

聲明語(yǔ)句

;@SET_TYPE↓a,int

ID↑a

TYPE↑int

變量表↓int

@SET_TYPE↓b,int

ID↑b

變量表↓int

,ε

TYPE↑intID↑a,D↑b;的語(yǔ)法樹(shù)<聲明語(yǔ)句>→TYPE↑tID↑n@SET_TYPE↓n1,t1<變量表↓t2>

(1)t2=t,(2)t1=t,(3)n1=n(屬性求值規(guī)則)2)<變量表↓t>→,ID↑n@SET_TYPE↓n1,t1<變量表↓t2>

(4)t2=t,(5)t1=t,(6)n1=n(屬性求值規(guī)則)3)<變量表

>→ε

2024/10/233233屬性文法:編譯技術(shù)中采用的一種語(yǔ)義描述工具,是一種適用于定義語(yǔ)言語(yǔ)義的特殊文法,即:在語(yǔ)言的文法中增加了屬性的文法。屬性翻譯文法:是以一個(gè)上下文無(wú)關(guān)文法為基礎(chǔ),為每個(gè)文法符號(hào)引進(jìn)一組屬性(語(yǔ)義值),對(duì)文法的每個(gè)產(chǎn)生式都配備一組與之相關(guān)聯(lián)的屬性的計(jì)算規(guī)則(語(yǔ)義規(guī)則)而得到的文法?;蛘哒f(shuō):符號(hào)具有屬性并帶有屬性求值規(guī)則的翻譯文法稱為屬性翻譯文法其具體定義如下:2024/10/231)文法的每個(gè)終結(jié)符、非終結(jié)符和動(dòng)作符號(hào)都可以有一個(gè)有窮的屬性集。2)每個(gè)非終結(jié)符和動(dòng)作符號(hào)屬性可分為綜合屬性和繼承屬性。3)繼承屬性的求值規(guī)則:①開(kāi)始符號(hào)的繼承屬性具有初始值。②對(duì)產(chǎn)生式左部的非終結(jié)符,其繼承屬性則繼承前面產(chǎn)生式中該符號(hào)已有的繼承屬性值。③右部的符號(hào),其繼承屬性由產(chǎn)生式中其它符號(hào)屬性值進(jìn)行計(jì)算。(語(yǔ)法樹(shù)上的父親和兄弟)2024/10/23344)綜合屬性的求值規(guī)則:①

終結(jié)符號(hào)的綜合屬性具有指定的初始值。在具體實(shí)現(xiàn)中,初始值由由詞法分析程序提供。②

產(chǎn)生式右部的非終結(jié)符號(hào)的綜合屬性值,則取后面以該非終結(jié)符號(hào)為產(chǎn)生式左部時(shí)求得的綜合屬性值。③

產(chǎn)生式的左部的非終結(jié)符號(hào)的綜合屬性值,由產(chǎn)生式中左部或右部的某些符號(hào)的屬性值進(jìn)行計(jì)算。④給定一動(dòng)作符號(hào),其綜合屬性值用該動(dòng)作符號(hào)的其它屬性值進(jìn)行計(jì)算。2024/10/2335翻譯要求:翻譯輸出是四元式代碼

輸出符號(hào)串中的每個(gè)雙目運(yùn)算都用一個(gè)四元式表示。四元式的順序與執(zhí)行時(shí)的運(yùn)算順序相同。四元式有三個(gè)參數(shù),從左到右為∶左操作數(shù),右操作數(shù),運(yùn)算結(jié)果。

例:翻譯器將表達(dá)式a+b翻譯成如下四元式∶

ADDa,b,t1其中t1是臨時(shí)變量,保存表達(dá)式的結(jié)果。對(duì)于表達(dá)式:a+a*b,詞法分析得到ID↑a+ID↑a*ID↑b,屬性翻譯文法翻譯得到:

MULTab,t1ADDat1,t2例:算術(shù)表達(dá)式的翻譯文法:E→E+TE→TT→T*FT→FF→(E)F→ID

2024/10/23361、設(shè)計(jì)翻譯文法:E→E+T@ADDE→TT→T*F@MULTT→FF→(E)F→ID

2024/10/23372、確定屬性和求值規(guī)則,構(gòu)造屬性翻譯文法1)令每個(gè)非終結(jié)符有一個(gè)綜合屬性:臨時(shí)變量,保存由它產(chǎn)生的表達(dá)式結(jié)果。2)輸入符號(hào)ID有一個(gè)綜合屬性:符號(hào)的變量名。3)動(dòng)作符號(hào)有三個(gè)繼承屬性:左操作數(shù)、右操作數(shù)、運(yùn)算結(jié)果。屬性翻譯文法如下:E↑x→E↑q+T↑r@ADD↓y,z,t,y=q,z=r,t=NEWT,x=tE↑x→T↑px=pT↑x→T↑q*F↑r@MULT↓y,z,t,y=q,z=r,t=NEWT,x=tT↑x→F↑p

,x=pF↑x→(E↑p),x=pF↑x→ID↑p

,x=p函數(shù)NEWT返回一個(gè)新的臨時(shí)變量名,按產(chǎn)生順序分別為t1、t2、…。動(dòng)作符號(hào)@ADD↓y,z,t

輸出ADDy,z,t動(dòng)作符號(hào)@MULT↓y,z,t

輸出MULTy,z,t2024/10/2338ID↑a

E↑x

T↑r

+E↑q

F↑p

*T↑q

T↑p

F↑x

F↑x

ID↑a

ID↑b

@MULT↓y,z,t

@ADD↓y,z,t

表達(dá)式a+a*b的屬性語(yǔ)法樹(shù)E↑t2

T↑t1

E↑a

F↑b

T↑a

T↑a

F↑a

F↑a

@MULT↓a,z,t

@ADD↓a,z,t

產(chǎn)生新變量t2產(chǎn)生新變量t1E↑x→E↑q+T↑r@ADD↓y,z,t,y=q,z=r,t=NEWT,x=tE↑x→T↑px=pT↑x→T↑q*F↑r@MULT↓y,z,t,y=q,z=r,t=NEWT,x=tT↑x→F↑p

,x=pF↑x→(E↑p),x=pF↑x→ID↑p

,x=p2024/10/2339@MULT↓a,b,t

@MULT↓a,b,t1

@ADD↓a,t1,t

@ADD↓a,t1,t2

屬性翻譯文法的語(yǔ)法樹(shù)需要保證完整性,即保證所有屬性能通過(guò)計(jì)算賦值。不同分析方法對(duì)文法有不同要求。L-屬性翻譯文法:自頂向下分析時(shí)保證語(yǔ)法樹(shù)的完整性屬性文法的自頂向下翻譯2024/10/23402024/10/2341

屬性翻譯文法是L-屬性翻譯文法,當(dāng)且僅當(dāng)對(duì)其中的每個(gè)產(chǎn)生式A→X1X2…Xn,下面三個(gè)條件成立:1.右部符號(hào)Xi(1≦i≦n)的繼承屬性之值,僅依賴于X1,X2,…,Xi-1的任意屬性或A的繼承屬性(P133繼承屬性規(guī)則③的限制);

(L的含義:符號(hào)的繼承屬性只依賴于該符號(hào)左邊的屬性值)2.左部符號(hào)A的綜合屬性值僅依賴于A的繼承屬性或右部符號(hào)Xi(1≦i≦n)的任意屬性(P133綜合屬性規(guī)則③的限制);3.對(duì)一動(dòng)作符號(hào)而言,其綜合屬性值依賴于該動(dòng)作符號(hào)的繼承屬性(P133繼承屬性規(guī)則④的限制)。條件2、3避免求值的循環(huán)依賴;給定文法后可通過(guò)構(gòu)造依賴圖進(jìn)行拓?fù)渑判蜃C明)例:文法中有產(chǎn)生式為:A↓I1↑S2,S3→B↓I4C↑S5D↑S6↓I7,I8E↓I9根據(jù)L-屬性的限制條件,I4=F(I1)、S2=G(I7,S6)合法,而I4=H(S2)不合法。

條件1條件2L-屬性文法翻譯的實(shí)現(xiàn)——遞歸下降翻譯

處理思路和處理不帶屬性的翻譯文法相同,由于屬性的存在需要改造對(duì)非終結(jié)符的處理方法:1)若非終結(jié)符具有屬性,則該非終結(jié)符的分析函數(shù)具有形參,形參數(shù)目等于其屬性個(gè)數(shù)。

2)對(duì)于繼承屬性,采用值傳遞方式,將繼承屬性值傳入被調(diào)函數(shù),即在函數(shù)調(diào)用中所對(duì)應(yīng)的實(shí)參是繼承屬性的值。

3)對(duì)于綜合屬性,采用引用(地址)傳遞方式,以便將值回傳給主調(diào)函數(shù),即實(shí)參是一個(gè)變量引用(地址),在函數(shù)返回之前,把綜合屬性的值賦給該變量。

2024/10/2342為了進(jìn)行屬性翻譯的程序設(shè)計(jì),作下述約定:

1)將屬性名用作變量名和參數(shù)名。

2)所有出現(xiàn)在左部的同名非終結(jié)符,應(yīng)具有相同的屬性名表。例:產(chǎn)生式L↑a↓b→E↓iR↓j,i,j=b,a=i+2L↑x↓y→H↑z↓w,w=y,z=2,x=z+y改成:L↑a↓b→E↓iR↓j,i,j=b,a=i+2L↑a↓b→H↑z↓w,w=b,z=2,a=z+b2024/10/23433)若兩個(gè)屬性值相同,則給它們相同的名字,但左部符號(hào)的屬性值相等時(shí),不能改變成相同的名字。規(guī)則S→A↑aB↓bC↓c,當(dāng)b=a,c=a時(shí),可寫(xiě)成S→A↑aB↓aC↓a規(guī)則L↑a→A↓b@f↓c

,當(dāng)a=b,c=b時(shí),可寫(xiě)成L↑a→A↓a@f↓a規(guī)則L↓a↑b→xB↓cC↓d,當(dāng)c=a,d=a時(shí),

可寫(xiě)成L↓a↑b→xB↓aC↓a但當(dāng)b=a時(shí),不能寫(xiě)成L↓a↑a→aB↓aC↓a理由:左部非終結(jié)符號(hào)的屬性將作為該非終結(jié)符號(hào)分析函數(shù)的形參,而一個(gè)函數(shù)的形參不能重名。如函數(shù)L(inta,intb)不可寫(xiě)成L(inta,inta)。2024/10/2344采用C語(yǔ)言編寫(xiě)屬性翻譯程序時(shí)采用的方法:1)形式參數(shù):產(chǎn)生式左部非終結(jié)符的屬性名表設(shè)計(jì)成相應(yīng)的形參表;將繼承屬性的形參名說(shuō)明為值形參(即簡(jiǎn)單變量),綜合屬性形參名說(shuō)明為指針變量。2)局部變量:產(chǎn)生式中與在左部出現(xiàn)的屬性名不同的屬性名變成相應(yīng)函數(shù)的局部變量。3)非終結(jié)符的代碼:對(duì)于右部出現(xiàn)的每個(gè)非終結(jié)符的函數(shù)調(diào)用,該非終結(jié)符的屬性作為實(shí)參。2024/10/23454)終結(jié)符的代碼:對(duì)文法中出現(xiàn)的每個(gè)終結(jié)符,將賦值語(yǔ)句插入到函數(shù)中它所對(duì)應(yīng)的NEXTSYM之前,把保存在讀符號(hào)程序NEXTSYM中的終結(jié)符號(hào)屬性(某個(gè)全局變量中)賦給終結(jié)符屬性中的每個(gè)屬性變量(讀下一個(gè)符號(hào)前賦值)。5)動(dòng)作符號(hào)的代碼:對(duì)出現(xiàn)在文法中的每個(gè)動(dòng)作符號(hào),插入代碼對(duì)動(dòng)作符號(hào)的綜合屬性進(jìn)行計(jì)算,并且把結(jié)果賦給對(duì)應(yīng)于該綜合屬性的變量,然后執(zhí)行相應(yīng)動(dòng)作。2024/10/23466)屬性規(guī)則的代碼:與每個(gè)產(chǎn)生式有關(guān)的屬性求值規(guī)則,插入其代碼以便對(duì)屬性求值規(guī)則的右部求值,并把結(jié)果賦給該規(guī)則左部的每個(gè)變量??梢园堰@些代碼放在屬性計(jì)算規(guī)則的所有自變量已知之后,且函數(shù)值被使用之前的任何地方。7)主程序:MAIN函數(shù)中,對(duì)文法開(kāi)始符號(hào)的每一個(gè)綜合屬性的名字變成主程序的局部變量,然后調(diào)用開(kāi)始符號(hào)對(duì)應(yīng)的函數(shù)。2024/10/2347例:為算術(shù)表達(dá)式的L-屬性翻譯文法編寫(xiě)遞歸下降翻譯器。E↑t→T↑pE'↓p↑tE'↓p↑t→+T↑r@ADD↓p,r,t0E'↓t0↑tt0=NEWT

E'↓p↑t→εt=pT↑t→F↑pT'↓p↑tT'↓p↑t→*F↑r@MULT↓p,r,t0T'↓t0↑tt0=NEWT

T'↓p↑t→εt=pF↑p→(E↑p)|ID↑p

2024/10/2348如何得到該文法?1、消除左遞歸2、命名改造2024/10/2349E↑x→E↑q+T↑r@ADD↓y,z,t,y=q,z=r,t=NEWT,x=tE↑x→T↑px=pT↑x→T↑q*F↑r@MULT↓y,z,t,y=q,z=r,t=NEWT,x=tT↑x→F↑p

,x=pF↑x→(E↑p),x=pF↑x→ID↑p

,x=pE↑x→T↑pE'↓q↑y

x=yq=pE'↓q↑y→+T↑r@ADD↓p,s,t0E'↓t1↑tt0=NEWTp=qs=rt1=t0t=t0y=tE'↓q↑y→εy=qT↑x→F↑pT'↓q↑yx=yq=pT'↓q↑y→*F↑r@MULT↓p,s,t0T'↓t0↑tt0=NEWTp=qs=rt1=t0t=t0y=tT'

↓q↑y→εy=qF↑q→(E↑p)|ID↑pq=p消除左遞歸ETF+TE’εIDE’T’εFIDT’ε2024/10/2350命名處理E↑t→T↑pE'↓p↑tE'↓p↑t→+T↑r@ADD↓p,r,t0E'↓t0↑tt0=NEWT

E'↓p↑t→εt=pT↑t→F↑pT'↓p↑tT'↓p↑t→*F↑r@MULT↓p,r,t0T'↓t0↑tt0=NEWT

T'↓p↑t→εt=pF↑p→(E↑p)|ID↑p

E↑x→T↑pE'↓q↑y

x=yq=pE'↓q↑y→+T↑r@ADD↓p,s,t0E'↓t1↑tt0=NEWTp=qs=rt1=t0t=t0y=tE'↓q↑y→εy=qT↑x→F↑pT'↓q↑yx=yq=pT'↓q↑y→*F↑r@MULT↓p,s,t0T'↓t0↑tt0=NEWTp=qs=rt1=t0t=t0y=tT'

↓q↑y→εy=qF↑q→(E↑p)|ID↑pq=p對(duì)產(chǎn)生式E↑t→T↑pE'↓p↑t,t為綜合屬性,形參用指針變量intE(int*t){intes=0;intp;es=T(&p);

es=E1(p,t);

return(es);}E↑t→T↑pE'↓p↑tE'↓p↑t→+T↑r@ADD↓p,r,t0E'↓t0↑tt0=NEWT

E'↓p↑t→εt=pT↑t→F↑pT'↓p↑tT'↓p↑t→*F↑r@MULT↓p,r,t0T'↓t0↑tt0=NEWT

T'↓p↑t→εt=pF↑p→(E↑p)|ID↑p

方法1方法2方法32024/10/2351對(duì)產(chǎn)生式E'↓p↑t→+T↑r@ADD↓p,r,t0E'↓t0↑t和

E'↓p↑t→εp為繼承屬性,形參用整型變量,t為綜合屬性,形參用指針變量intE1(intp,int*t){intr,es,t0;if(ch=='+'){ch=getword();es=T(&r);t0=NEWT();printf(“ADD%c,%c,%c\n",p,r,t0);es=E1(t0,t);return(es);}elseif(ch=='('||ch=='#') {*t=p; return(0);}elseerror();}......E'↓p↑t→+T↑r@ADD↓p,r,t0E'↓t0↑t

t0=NEWT

E'↓p↑t→εt=p......方法4,但+無(wú)屬性方法5,動(dòng)作符號(hào)無(wú)綜合屬性方法62024/10/2352intNEWT(){staticinti=64;

i=i+1;

return(i);}對(duì)產(chǎn)生式T↑t→F↑pT'↓p↑tt為綜合屬性,形參用指針變量intT(int*t){intes=0,p;es=F(&p);

es=T1(p,t);

return(es);}E↑t→T↑pE'↓p↑tE'↓p↑t→+T↑r@ADD↓p,r,t0E'↓t0↑tt0=NEWT

E'↓p↑t→εt=pT↑t→F↑pT'↓p↑tT'↓p↑t→*F↑r@MULT↓p,r,t0T'↓t0↑tt0=NEWT

T'↓p↑t→εt=pF↑p→(E↑p)|ID↑p

2024/10/2353intT1(intp,int*t){intr,es,t0;if(ch=='*'){ch=getword();es=F(&r);t0=NEWT();

printf(“MULT%c,%c,%c\n",p,r,t0);es=T1(t0,t);return(es);}elseif(ch=='+'||ch=='#'||ch==')'){*t=p;return(0);}elseerror();}......T'↓p↑t→*F↑r@MULT↓p,r,t0T'↓t0↑tt0=NEWT

T'↓p↑t→εt=p......2024/10/2354對(duì)產(chǎn)生式T’↓p↑t→*F↑r@MULT↓p,r,t0T’↓t0↑t和T’

↓p↑t→ε,p為繼承屬性,形參用整型變量;t為綜合屬性,形參用指針變量intF(int*p){intes=0;if(ch=='('){ch=getword();es=E(p);

if(ch!=')')return(3);else{ch=getword();return(es);}}else{ if(isalpha(ch))

{*p=ch; ch=getword(); return(es); }elsereturn(4);}}對(duì)產(chǎn)生式F↑p→(E↑p)|ID↑pp為綜合屬性,形參用指針變量方法42024/10/2355主程序:1、MAIN函數(shù)中對(duì)開(kāi)始符號(hào)的每一個(gè)綜合屬性作為其局部變量;2、調(diào)用開(kāi)始符號(hào)對(duì)應(yīng)的函數(shù),如果實(shí)參對(duì)應(yīng)開(kāi)始符號(hào)的繼承屬性,則以值參方式傳入該屬性的初始值;如果對(duì)應(yīng)開(kāi)始符號(hào)的綜合屬性,則傳入該屬性局部變量的地址。E↑t→T↑pE'↓p↑tmain(){intes=0,t;printf("請(qǐng)輸入算術(shù)表達(dá)式(操作數(shù)只能是單個(gè)字母):");ch=getword();printf("輸出四元式為:\n");es=E(&t);

if(es==0)printf("\n翻譯成功!\n");elseprintf("\n表達(dá)式有語(yǔ)法錯(cuò)誤!\n");}方法7(1)方法7(2)2024/10/2356運(yùn)行程序輸入:a*(b+c)+b*d輸出四元式序列為:其中A、B、C、D都是臨時(shí)變量。ADDb,c,AMULTa,A,BMULTb,d,CADDB,C,D2024/10/235758輸入:NUM↑2*NUM↑4+NUM↑6#E'↓t0↑tNUM↑2*E↑tT↑pF↑pT'↓p↑t+F↑rE'↓p↑t

T↑rNUM↑6F↑p

2024/10/23T'↓p↑t

NUM↑4F↑2T'↓2↑tF↑4MULT↓p,r,t0MULT↓2,r,t0MULT↓2,4,t0MULT↓2,4,8T'↓t0↑tT'↓8↑tADD↓p,r,t0F↑6T'↓6↑tT'↓8↑8T'↓2↑8T↑8E'↓8↑tT↑6T'↓6↑6E'↓8↑14ADD↓8,6,t0ADD↓8,6,14E'↓14↑tE'↓14↑14E↑14調(diào)用進(jìn)入返回遞歸下降翻譯程序的運(yùn)行(將文法中ID改為NUMt0=p+rt0=p*r)L-屬性文法翻譯的實(shí)現(xiàn)—LL(1)法擴(kuò)充翻譯文法的LL(1)翻譯器:對(duì)所有符號(hào),符號(hào)本身和屬性同時(shí)進(jìn)棧。將棧符號(hào)設(shè)計(jì)為兩部分(符號(hào)名、屬性域)例:對(duì)符號(hào)串ABC,假定A有屬性A1和A2,B有屬性B1,C無(wú)屬性。入棧后如圖所示。

A屬性

A1屬性

A2B屬性B1C…#2024/10/2359例:文法S→E↑p@ANSWER↓r

r=pE↑p→+E↑qE↑r@ADD↓A1,A2↑R

A1=q,A2=r,R=A1+A2,p=RE↑p→*E↑qE↑r@MULT↓A1,A2↑R

A1=q,A2=r,R=A1*A2,p=RE↑p→NUM↑q

p=q

構(gòu)造其翻譯器

步驟:1、棧符號(hào)設(shè)計(jì)2、構(gòu)造LL(1)分析表3、設(shè)計(jì)語(yǔ)義動(dòng)作2024/10/23601、棧符號(hào)設(shè)計(jì)根據(jù)屬性類(lèi)型確定屬性域的存放內(nèi)容,可存放屬性值和指向?qū)傩灾档闹羔?。?duì)于綜合屬性,其屬性域存放一個(gè)指針,指向存貯該屬性值的單元。對(duì)于繼承屬性,其屬性域直接保存其屬性值。繼承屬性的屬性域剛?cè)霔r(shí)為空,但在該棧符號(hào)變成棧頂符號(hào)之前的某一時(shí)刻,必須通過(guò)計(jì)算賦值,即在成為棧頂時(shí),繼承屬性的屬性域必須有值。2024/10/2361@MULT

繼承屬性1

繼承屬性2

綜合屬性指針

@ADD繼承屬性1

繼承屬性2

綜合屬性指針

@ANSWER

繼承屬性NUM

綜合屬性指針E綜合屬性指針SS的棧符號(hào)

E的棧符號(hào)

NUM的棧符號(hào)

@ANSWER的棧符號(hào)

@ADD的棧符號(hào)

@MULT的棧符號(hào)

S→E↑p@ANSWER↓r

r=pE↑p→+E↑qE↑r@ADD↓A1,A2↑R

A1=q,A2=r,R=A1+A2,p=RE↑p→*E↑qE↑r@MULT↓A1,A2↑R

A1=q,A2=r,R=A1*A2,p=RE↑p→NUM↑q

p=q

2024/10/23622、構(gòu)造屬性翻譯文法LL(1)分析表。符號(hào)輸入符號(hào)

+*NUM#SE121314

LL(1)析表(1)S→E↑p@ANSWER↓r

r=p(2)E↑p→+E↑qE↑r@ADD↓A1,A2↑R

A1=q,A2=r,R=1+A2,p=R(3)E↑p→*E↑qE↑r@MULT↓A1,A2↑R

A1=q,A2=r,R=A1*A2,p=R(4)E↑p→NUM↑q

p=q

2024/10/23633、語(yǔ)義動(dòng)作設(shè)計(jì)假定要求翻譯器計(jì)算輸出由文法定義的表達(dá)式值,三個(gè)動(dòng)作符號(hào)的翻譯動(dòng)作為:1)@ADD:把頭兩個(gè)域的內(nèi)容相加并將結(jié)果存貯在第三個(gè)域所指的單元中,然后出棧。2)@MULT:把頭兩個(gè)域的內(nèi)容相乘并將結(jié)果存貯在第三個(gè)域所指的單元中,然后出棧。3)@ANSWER:輸出屬性域的內(nèi)容結(jié)果,然后出棧。

2024/10/23641)#入棧,文法開(kāi)始符號(hào)S入棧,輸入指針指向符號(hào)++NUM↑2NUM↑3#

S#符號(hào)棧:輸入串+NUM↑2NUM↑3#

E↑p@ANSWER↓r#符號(hào)棧:2)查分析表S行+列,入棧,因?yàn)閞=p,所以E↑p為指向@ANSWER↓r的指針。

符號(hào)輸入符號(hào)

+*NUM#SE121314

輸入符號(hào)串+NUM↑2NUM↑3#的分析過(guò)程:2024/10/2365(1)S→E↑p@ANSWER↓r

r=p(2)E↑p→+E↑qE↑r@ADD↓A1,A2↑R

A1=q,A2=r,R=A1+A2,p=R(3)E↑p→*E↑qE↑r@MULT↓A1,A2↑R

A1=q,A2=r,R=A1*A2,p=R(4)E↑p→NUM↑q

p=q

NUM↑2NUM↑3#

E↑qE↑r@ADD↓A1↓A2↑R@ANSWER↓r#符號(hào)棧:

3)查分析表E行+列,E出棧前,E↑p指向@ANSWER↓r,因?yàn)镋↑p=@ADD↑R,所以@ADD↑R指向@ANSWER↓r;新入棧的E↑qE↑r,分別指向@ADD↑A1↑A2;因棧頂為+,+出棧,讀下一個(gè)符號(hào)。

符號(hào)輸入符號(hào)

+*NUM#SE121314

2024/10/2366E↑p@ANSWER↓r#(1)S→E↑p@ANSWER↓r

r=p(2)E↑p→+E↑qE↑r@ADD↓A1,A2↑R

A1=q,A2=r,R=A1+A2,p=R......+NUM↑2NUM↑3#

NUM↑3#

E↑r@ADD2↓A2↑R@ANSWER↓r#符號(hào)棧:

4)查分析表E行NUM列,E出棧前,E↑q指向@ADD↑A1,而E↑q=NUM↑q,所以NUM↑q入棧,把NUM

↑2放入E出棧前E↑q指向的單元@ADD↑A1。然后,NUM出棧,讀下一個(gè)符號(hào)。

2024/10/2367......(4)E↑p→NUM↑qp=q

符號(hào)輸入符號(hào)

+*NUM#SE1213

14

符號(hào)棧:E↑qE↑r@ADD↓A1↓A2↑R@ANSWER↓r#NUM↑2NUM↑3#

符號(hào)輸入符號(hào)

+*NUM#SE1213

14

5)查分析表E行NUM列,E出棧前,E↑r指向@ADD↑A2,而E↑r=NUM↑q,所以NUM↑q入棧,把NUM↑3放入E↑r指向的單元@ADD↑A2。然后NUM出棧,讀下一個(gè)符號(hào)。

#

@ADD23↑R@ANSWER↓r#符號(hào)棧:2024/10/2368.......(4)E↑p→NUM↑q

p=q

NUM↑3#

E↑r@ADD2↓A2↑R@ANSWER↓r#符號(hào)棧:

6)棧頂為動(dòng)作符號(hào)@ADD:把頭兩個(gè)域內(nèi)容2和3相加,并把計(jì)算結(jié)果5存貯在第三個(gè)域@ADD↑R所指的@ANSWER↓r中,出棧。#

@ANSWER5#符號(hào)棧:2024/10/2369符號(hào)輸入符號(hào)

+*NUM#SE1213

14

......(2)E↑p→+E↑qE↑r@ADD↓A1,A2↑R

A1=q,A2=r,R=A1+A2,p=R#

@ADD23↑R@ANSWER↓r#符號(hào)棧:7)棧頂為動(dòng)作符號(hào)@ANSWER,輸出屬性域的內(nèi)容5,出棧。棧內(nèi)為#,輸入指針指向#,成

溫馨提示

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