第6章 語法制導(dǎo)翻譯和語義分析_第1頁
第6章 語法制導(dǎo)翻譯和語義分析_第2頁
第6章 語法制導(dǎo)翻譯和語義分析_第3頁
第6章 語法制導(dǎo)翻譯和語義分析_第4頁
第6章 語法制導(dǎo)翻譯和語義分析_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 v 定義相關(guān)概念:屬性、屬性文法、定義相關(guān)概念:屬性、屬性文法、S屬性文法和屬性文法和L屬性文法屬性文法 v 解釋基于屬性文法的語法制導(dǎo)翻譯技術(shù)的基本思想解釋基于屬性文法的語法制導(dǎo)翻譯技術(shù)的基本思想 v 介紹常見的中間代碼的描述方法介紹常見的中間代碼的描述方法 v 介紹不同語法結(jié)構(gòu)的語法制導(dǎo)翻譯技術(shù)介紹不同語法結(jié)構(gòu)的語法制導(dǎo)翻譯技術(shù) 6.1 6.1 屬性文法與語法制導(dǎo)翻譯屬性文法與語法制導(dǎo)翻譯 6.2 6.2 語義分析和中間代碼的產(chǎn)生語義分析和中間代碼的產(chǎn)生 6.3 6.3 簡單算術(shù)表達(dá)式及賦值語句的翻譯簡單算術(shù)表達(dá)式及賦值語句的翻譯 6.4 6.4 布爾表達(dá)式的翻譯布爾表達(dá)式的翻譯 6.5

2、 6.5 控制結(jié)構(gòu)的翻譯控制結(jié)構(gòu)的翻譯 6.6 6.6 說明語句的翻譯說明語句的翻譯 6.7 6.7 數(shù)組的翻譯數(shù)組的翻譯 6.8 6.8 過程調(diào)用語句的翻譯過程調(diào)用語句的翻譯 6.9 6.9 本章小結(jié)本章小結(jié) 屬性及屬性文法屬性及屬性文法 1 綜合屬性與繼承屬性綜合屬性與繼承屬性 2 S屬性文法與屬性文法與L屬性文法屬性文法 3 基于屬性文法的語法制導(dǎo)翻譯基于屬性文法的語法制導(dǎo)翻譯 4 (1)文法的屬性 是指與文法符號的類型和值等有關(guān)的一些信息,在編譯中用屬 性描述處理對象的特征。 隨著編譯的進(jìn)展,對語法分析產(chǎn)生的語法樹進(jìn)行語義分析,且分析 的結(jié)果用中間代碼描述出來。對于一棵等待翻譯的語法樹

3、,它的各個結(jié) 點都是文法中的一個符號X,該X可以是終結(jié)符或非終結(jié)符。根據(jù)語義處 理的需要,在用產(chǎn)生式AX進(jìn)行歸約或推導(dǎo)時,應(yīng)能準(zhǔn)確而恰當(dāng)?shù)乇?達(dá)文法符號X在歸約或推導(dǎo)時的不同特征。 例如,判斷變量X的類型是否匹配,要用X的數(shù)據(jù)類型來描述;判斷 變量X是否存在,要用X的存儲位置來描述;而對X的運算,則要用X的 值來描述;因此,語義分析階段引入X的屬性,如X.type、X.place、X.val 等來分別描述變量X的類型、存儲位置以及值等不同的特征。 (2)屬性文法 屬性文法是一種適用于定義語義的特殊文法,即在語言的文法中增 加了屬性的文法,它將文法符號的語義以“屬性”的形式附加到各個文 法的符號

4、上(如上述與變量X相關(guān)聯(lián)的屬性X.type、X.place和X.val等),再 根據(jù)產(chǎn)生式所包含的含義,給出每個文法符號屬性的求值規(guī)則,從而形 成一種帶有語義屬性的上下文無關(guān)文法,即。屬性文法也是一 種翻譯文法,屬性有助于更詳細(xì)地指定文法中的代碼生成動作。 屬性文法=上下文無關(guān)文法+屬性+語義規(guī)則 (1)屬性分類 屬性文法中的屬性可分為與兩類。 u 繼承屬性 用于“自上而下”地傳遞信息。 u 綜合屬性 用于“自下而上”地傳遞信息。 (2)語義規(guī)則 屬性與變量一樣可以進(jìn)行計算和傳遞,屬性加工的過程即是語義處 理的過程。對于文法的每一個產(chǎn)生式都配備了一組屬性的計算規(guī)則,稱 為。 (3)語義規(guī)則的表

5、示 在一個屬性文法中,對應(yīng)于每個產(chǎn)生式A 都有一套與之相關(guān)聯(lián) 的語義規(guī)則,每條規(guī)則形式為 其中f是一個函數(shù),而且或者 b是A的一個綜合屬性,并且c1,c2,ck是中文法符號的屬性;或者 b是中某個文法符號的一個繼承屬性 并且c1,c2,.,ck是A或中任何文 法符號的屬性。 在上述兩種情況下,我們都說。 12k b : f(c ,c ,c ) (3)語義規(guī)則的表示 終結(jié)符號只有綜合屬性,由詞法分析器提供。 非終結(jié)符既可有綜合屬性也可有繼承屬性,文法開始符號的所有繼承 屬性作為屬性計算前的初始值。 對出現(xiàn)在產(chǎn)生式右邊的繼承屬性和產(chǎn)生式左邊的綜合屬性都必須提供 一個計算規(guī)則。 屬性計算規(guī)則中只能使

6、用相應(yīng)產(chǎn)生式的文法符號的屬性,這有利于在 產(chǎn)生式范圍內(nèi)“封裝”屬性的依賴性。然而,出現(xiàn)在產(chǎn)生式左邊的繼承 屬性和出現(xiàn)在產(chǎn)生式右邊的綜合屬性不由所給的產(chǎn)生式的屬性計算規(guī)則 進(jìn)行計算,它們由其它產(chǎn)生式的屬性規(guī)則計算,由屬性計算器的參數(shù)提供。 (1)S屬性文法 僅僅使用綜合屬性的屬性文法,稱為。 (2)L屬性文法 一個屬性文法稱為,如果對于每個產(chǎn)生式Ax1x2,xn, 其每個語義規(guī)則中的每個屬性或者是綜合屬性,或者是xj(1jn)的一個 繼承屬性且這個繼承屬性僅依賴于: 產(chǎn)生式中xj的左邊符號x1,x2,xj-1的屬性; A的繼承屬性 L屬性文法的最大特點是產(chǎn)生式右部符號的繼承屬性不依賴于該 符號右

7、邊符號的任何屬性。 S屬性文法一定是L-屬性文法 S屬性文法適合于一遍掃描的自下而上分析 L屬性文法可用于一遍掃描的自上而下分析 (1)語法制導(dǎo)翻譯 所謂就是指為文法中每個產(chǎn)生式配上一組語義規(guī)則, 并且在語法分析的同時執(zhí)行這些語義規(guī)則。 語法制導(dǎo)翻譯法的基本思想是對文法中的每個產(chǎn)生式都附加上一個 語義動作(或語義子程序),在執(zhí)行語法分析的過程中,每當(dāng)使用一條 產(chǎn)生式進(jìn)行推導(dǎo)或歸約時,就執(zhí)行相應(yīng)產(chǎn)生式對應(yīng)的語義動作(或語義 子程序)。這些語義動作不僅指明了該產(chǎn)生式所產(chǎn)生符號串的意義,而 且還根據(jù)這種意義規(guī)定了對應(yīng)的加工動作(如查填各類表格、更新變量 的值、提示出錯信息、生成中間代碼等),從而完成

8、預(yù)定的翻譯工作。 (2)舉例 【例6.1】描述簡單算術(shù)表達(dá)式求值的屬性文法。 val:綜合屬性,表:綜合屬性,表 示示E、T、F的值的值 lexval:綜合屬性,由:綜合屬性,由 詞法分析器提供詞法分析器提供 print:打?。捍蛴?由由E產(chǎn)生的表產(chǎn)生的表 達(dá)式值達(dá)式值 【例6.2】描述說明語句中變量類型信息的屬性文法。 type:綜合屬性,:綜合屬性, 其值由說明中的關(guān)其值由說明中的關(guān) 鍵字確定鍵字確定in:繼承屬性,:繼承屬性, addtype:把每個標(biāo)識的類型信息登記:把每個標(biāo)識的類型信息登記 到符號表中相關(guān)項(到符號表中相關(guān)項(id.entry)中)中 返回 語義分析的任務(wù)語義分析的任

9、務(wù) 1 常見的中間代碼形式常見的中間代碼形式 2 語義分析與處理的主要任務(wù): (1)審查每個語法結(jié)構(gòu)的靜態(tài)語義,即驗證語法結(jié)構(gòu)合法的源程 序是否真正有意義。有時把這個工作稱為或。 (2)若靜態(tài)語義正確,則要執(zhí)行,即用另一種語言形式 (比源語言更接近于目標(biāo)語言的一種中間代碼或直接用目標(biāo)代碼)來描 述這種語義。 (1)中間代碼 源程序的一種內(nèi)部表達(dá),不依賴于目標(biāo)機的結(jié)構(gòu),易于機械生成目 標(biāo)代碼的中間表示,稱為。 (2)為什么要此階段 使用中間代碼主要有以下幾點好處: 使邏輯結(jié)構(gòu)清楚 有利于不同目標(biāo)機上實現(xiàn)同一種語言 有利于進(jìn)行與機器無關(guān)的優(yōu)化 這些內(nèi)部形式也能用于解釋 (3)常見的中間代碼形式 后

10、綴式(逆波蘭表示式) 圖表示法 v抽象語法樹抽象語法樹 vDAG圖圖 三地址代碼 v四元式四元式 v三元式三元式 v間接三元式間接三元式 (4)后綴式(逆波蘭式) 定義 后綴式表示法(逆波蘭表示法),由波蘭邏輯學(xué)家盧卡西維奇 (Lukasiewicz)發(fā)明,它把運算量(操作數(shù))寫在前面,把運算符寫在 后面(后綴)的一種表達(dá)式表示方法。其歸納定義如下: 如果如果E是一個變量或常數(shù),則是一個變量或常數(shù),則E的后綴式是的后綴式是E自身。自身。 如果如果E是是E1 op E2 形式的表達(dá)式,形式的表達(dá)式,op是二元操作符,則是二元操作符,則E的后綴式為的后綴式為 E1 E2 op,其中,其中E1,E2

11、分別是分別是E1和和E2的后綴式。的后綴式。 a) 若若E是(是(E1)形式的表達(dá)式,則)形式的表達(dá)式,則E的后綴式就是的后綴式就是E1的后綴式。的后綴式。 (4)后綴式(逆波蘭式) 舉例 (4)后綴式(逆波蘭式) 后綴式的計算機處理 后綴式的最大優(yōu)點是易于計算機處理,其處理過程如下: 利用一個棧,從左至右掃描逆波蘭式,若當(dāng)前符號是運算對象則進(jìn) 棧,若當(dāng)前符號是運算符(假定該運算符號是k元運算符),則將棧頂k 個元素依次彈出,同時進(jìn)行k元運算,并將運算結(jié)果進(jìn)棧,表達(dá)式處理完 畢時,最后的結(jié)果留在棧頂。 (5)圖表示法 抽象語法樹 在抽象語法樹表示中,每一個葉結(jié)點都表示諸如常量或變量這樣的 運算

12、對象,而其它內(nèi)部結(jié)點則表示運算符。抽象語法樹不同于前述的語 法樹,它展示了一個操作過程并同時描述了源程序的層次結(jié)構(gòu)。 例如,表達(dá)式x=a-b*c的語法樹和抽象語法樹如下圖所示: SV=E Vx EE-E|E*E|a|b|c (5)圖表示法 DAG圖(Directed Acyclic Graph,有向無環(huán)圖) 對表達(dá)式的每個子表達(dá)式,DAG都有一個結(jié)點,一個內(nèi)部結(jié)點代表 一個操作符,它的孩子代表操作數(shù),在一個DAG中代表公共子表達(dá)式的 結(jié)點具有多個父結(jié)點。而在抽象語法樹中公共子表達(dá)式被表示為重復(fù)的 子樹。 例如,表達(dá)式a+a*(b-c)+(b-c)*d的DAG圖和抽象語法樹如下圖所示: (6)三

13、地址代碼 三地址代碼可以看成是抽象語法樹或的一種線性表示。 三地址代碼的形式 三地址代碼語句的一般形式為 x=y op z 其中,x、y和z為名字、常量或編譯時產(chǎn)生的臨時變量,op為運算符。三 地址代碼的每條語句通常包含三個地址,兩個用來存放運算對象,一個 用來存放運算結(jié)果。 實際中用戶定義的名字由指向符號表中該名字項的指針?biāo)〈?。?于三地址語句只含一個運算符,因此多個運算符組成的表達(dá)式需用三地 址語句序列來表示。 (6)三地址代碼 例如,表達(dá)式x+y*z的三地址代碼為: t1=y*z t2= x+t1 三地址語句的種類 三地址語句類似于匯編代碼,它可以有符號標(biāo)號和各種控制流語句。 常用的三

14、地址語句有以下幾種: x=y op z,其中,其中op為二目算術(shù)或邏輯運算符。為二目算術(shù)或邏輯運算符。 a) x=op y,其中,其中op為一目運算符,如一目減為一目運算符,如一目減uminus、邏輯否定、邏輯否定not、移、移 位運算符、將定點數(shù)轉(zhuǎn)換成浮點數(shù)的類型轉(zhuǎn)換符。位運算符、將定點數(shù)轉(zhuǎn)換成浮點數(shù)的類型轉(zhuǎn)換符。 (6)三地址代碼 賦值語句:賦值語句:x=y 無條件轉(zhuǎn)移語句:無條件轉(zhuǎn)移語句:goto L 條件轉(zhuǎn)移語句:條件轉(zhuǎn)移語句:if x relop y goto L ,if a goto L 過程調(diào)用語句過程調(diào)用語句param X和和call P,n及過程返回語句及過程返回語句retu

15、rn y 變址賦值語句:變址賦值語句:x=yi,xi=y 地址和指針賦值語句:地址和指針賦值語句:x= (:=, 0, _ , E.place); (j,_,_,nextstat+2) (:=, 1, _ ,E.place) (5)數(shù)值表示法的翻譯方案 運算符not, and, or 翻譯為四元式: 一個形如 a relop b的關(guān)系表達(dá)式可等價的寫成: if a relop b then 1 else 0 , 并將它翻譯成如下三地址語句及四元式序列:(我們假定語句序號從p開 始。) 三地址 四元式 (5)數(shù)值表示法的翻譯方案 例如, ab的關(guān)系表達(dá)式可等價地寫成: if ab then 1

16、else 0 ,并將它 翻譯成如下三地址語句及四元式序列: (我們假定語句序號從100開 始。) (6)語義子程序 相關(guān)函數(shù)和變量說明: uemit函數(shù)函數(shù):生成四元式,并將其插入到四元式列表中。:生成四元式,并將其插入到四元式列表中。 unextstat: 給出四元式序列中下一條四元式語句的地址索引,每調(diào)用一給出四元式序列中下一條四元式語句的地址索引,每調(diào)用一 次次emit函數(shù),便把函數(shù),便把nextstat加加1。 語義規(guī)則 (7)舉例: 將布爾表達(dá)式 ab or cd and ef 翻譯為四元式序列。 100:(j,a,b,103) 101:(:=,0,_,T1) 102:(j,_,_,

17、104) 103:(:=,1,_,T1) 104:(j,c,d,107) 105:(:=,0,_,T2) 106:(j,_,_,108) 107:(:=,1,_,T2) 108:(jc or bc goto L2 goto L1 L1: if bd goto L2 goto L3 L2: 關(guān)于關(guān)于S1 的三地址代碼序列的三地址代碼序列 goto Lnext L3: 關(guān)于關(guān)于S2的三地址代碼序列的三地址代碼序列 Lnext: n 布爾量的目標(biāo)結(jié)構(gòu)應(yīng)由兩條四元式組成: : 真出口,當(dāng)真出口,當(dāng)A為真時跳轉(zhuǎn)到四元式為真時跳轉(zhuǎn)到四元式P ,if A goto P : 假出口,無條件跳轉(zhuǎn)到四元式假出口,

18、無條件跳轉(zhuǎn)到四元式q goto q n 關(guān)系表達(dá)式的目標(biāo)結(jié)構(gòu)可以寫成兩條四元式: : 真出口,當(dāng)真出口,當(dāng)x rop y為真時轉(zhuǎn)四元式為真時轉(zhuǎn)四元式P if x rop y goto P : 假出口,無條件跳轉(zhuǎn)到四元式假出口,無條件跳轉(zhuǎn)到四元式q goto q (5)如何確定一個表達(dá)式的真假出口呢? 考慮表達(dá)式E(1) or E(2)。若E(1)為真,則E為真,因此,E(1)的真出口就 是E的真出口;若E(1)為假,則E(2)必須被計值,此時E(2)的第一個四元式 就是E(1)的假出口,同時,E(2)的真假出口就是E的真假出口。 考慮E(1) and E(2),與上類似。 對not E(1),

19、 只需調(diào)換E(1)的真假出口為E的假真出口。 E(1) or E(2)和E(1) and E(2)的翻譯如下圖: (5)如何確定一個表達(dá)式的真假出口呢? (5)如何確定一個表達(dá)式的真假出口呢? 在自下而上分析過程中,一個布爾式的真假出口往往不能在一個布爾式的真假出口往往不能在 產(chǎn)生四元式時填上產(chǎn)生四元式時填上,故把未完成四元式的地址(編號)作為E的語義值 暫存,等到整個表達(dá)式的四元式產(chǎn)生完畢后,再填寫這個未填入的轉(zhuǎn)移 目標(biāo)。 對于每個非終結(jié)符E,需為它賦兩個語義值E.truelist和和 E.falselist,分別用以記錄E所對應(yīng)的四元式需要回填“真”、“假”出 口的四元式地址所構(gòu)成的鏈。這

20、是因為在翻譯過程中常會出現(xiàn)若干四元 式轉(zhuǎn)向同一目標(biāo)但目標(biāo)位置又未確定的情況,此時將這些四元式鏈接起 來,待獲得目標(biāo)四元式地址時再返填返填。 (5)如何確定一個表達(dá)式的真假出口呢? 例如,假定E的四元式需要回填“真”出口的有p、q、r這三個四 元式,則它們可鏈接成如下圖所示的一條真值鏈(記作truelist)。 (6)舉例 對輸入串 ab or cf 翻譯成四元式, 100:(:(j , a , b , ) 101: (j, _ , _ , 102) 102:(:(j , e, f, 106) 105: (j, _ , _ , ) 106:(:= , 1 , _ , T ) 107:(j, _

21、, _ , 109 ) 108:(:= , 0 , _ , T ) 109:后續(xù)四元式:后續(xù)四元式 返回 if語句的翻譯語句的翻譯 1 while語句的翻譯語句的翻譯 2 for語句的翻譯語句的翻譯 3 (1)文法 Sif E then S1 if E then S1 else S2 (2)語義 條件分支轉(zhuǎn)移語句。條件成立執(zhí)行S1,不成立不執(zhí)行任何操作或執(zhí) 行S2, 然后繼續(xù)執(zhí)行if語句后面的語句。 (3)目標(biāo)結(jié)構(gòu)T E 的代碼 S1 的代碼 S2 的代碼 F (4)舉例 將if ab or cf then x=y+z else x=y-z 翻譯成四元式。 100:(j,a,b, ) 101:

22、(j, _,_,102) 102:(j,e,f,106) 105:(j, _,_, ) 106:(+,y,z,x) 107:(j, _,_,109) 108: (-,y,z,x) 109:(后續(xù)四元式序列后續(xù)四元式序列) (1)文法 Swhile E do S1 (2)語義 當(dāng)E為真 ,反復(fù)執(zhí)行S1 ; 否則執(zhí)行while語句后面的語句。 (3)目標(biāo)結(jié)構(gòu) T E 的代碼 S(1) 的代碼 F (4)舉例 將 while (AB) do if (C ,A ,B , 102 ) 101: ( j, _ , _ , ) 102: ( j ,I , N , ) 104 (+ , M ,I ,T ) 1

23、05 (:= ,T , _ , M) 106 (j ,_ ,_ ,102) 107 或 返回 簡單說明語句的翻譯簡單說明語句的翻譯 1 過程中的說明過程中的說明 2 (1)文法 簡單說明語句的文法GD為: D int namelist | float namelist namelist namelist, i | i (2)語義 說明源程序中的簡單變量的名字及其性質(zhì)。 (3)翻譯方法 我們可以把文法GD改為GD: GD: DD, i int i float i 這樣,就能把所說明的性質(zhì)及時地告訴每個名字i;或者說,每當(dāng)讀 進(jìn)一個標(biāo)識符時就可以把它的性質(zhì)登記到符號表中,而無須到最后再集 中登記了

24、。 語義變量和語義過程 u語義變量語義變量:用于傳遞名字的性質(zhì):用于傳遞名字的性質(zhì) u過程過程:把名字:把名字id和性質(zhì)和性質(zhì)A登記在符號表中登記在符號表中 翻譯方案 當(dāng)考察一個過程或分程序的一系列說明語句時,便可為局部于該過 程的名字分配存儲空間。對每個局部名字,我們將在符號表中建立相應(yīng) 的表項,并填入相應(yīng)的信息如類型、在存儲器中的相對地址等。 (1)相關(guān)術(shù)語 :為了管理過程在一次執(zhí)行中所需要的信息,使用一個連:為了管理過程在一次執(zhí)行中所需要的信息,使用一個連 續(xù)的存儲塊,這個連續(xù)的存儲塊稱為活動記錄。續(xù)的存儲塊,這個連續(xù)的存儲塊稱為活動記錄。 :指對靜態(tài)數(shù)據(jù)區(qū)基址或活動記錄中局部數(shù)據(jù)區(qū)基址

25、的一:指對靜態(tài)數(shù)據(jù)區(qū)基址或活動記錄中局部數(shù)據(jù)區(qū)基址的一 個偏移量。個偏移量。 (2)過程中的說明語句翻譯 在C、Pascal及FORTRAN等語言的語法中,允許在一個過程中的所 有說明語句作為一個組來處理,把它們安排在一所數(shù)據(jù)區(qū)中。從而我們 需要一個全程變量如offset來跟蹤下一個可用的相對地址的位置。 語義變量和語義過程 :把名字把名字name填入到符號表中,并給出此名字填入到符號表中,并給出此名字 的類型的類型type及在過程數(shù)據(jù)區(qū)中的相對地址及在過程數(shù)據(jù)區(qū)中的相對地址offset。 : 綜合屬性,名字的類型綜合屬性,名字的類型 : 綜合屬性,名字的域?qū)捑C合屬性,名字的域?qū)?翻譯方案 返

26、回 數(shù)組元素的地址計算數(shù)組元素的地址計算 1 賦值語句中數(shù)組元素的翻譯賦值語句中數(shù)組元素的翻譯 2 (1)數(shù)組的存儲方式 在表達(dá)式或賦值語句中若出現(xiàn)數(shù)組元素,則翻譯時將牽涉到數(shù)組元 素的地址計算。數(shù)組在存儲器中的存放方式?jīng)Q定了數(shù)組元素的地址計算 方法,從而決定了該產(chǎn)生什么樣的中間代碼。數(shù)組在存儲器中的存放通 常有和兩種方式。下面討論以行為主序存放方式的數(shù)組元素地 址計算法。 (2)數(shù)組元素的地址計算 一維數(shù)組 考慮一維數(shù)組Alow1.high1,假定數(shù)組元素的存儲長度為w,base 是數(shù)組A的首地址,則數(shù)組元素Ai1的起始地址為: base+(i1-low1)*w 即 i1*w + (base

27、-low1*w) base i1low1high1 w 二維數(shù)組 同理,二維數(shù)組元素Ai1,i2的起始地址為 base+(i1-low1)*d2+ i2-low2*w 即 (i1*d2+ i2 )*w+base-(low1*d2+ low2)*w base i1 low1 high1 low2high2 i2 d2 d1 一般數(shù)組 數(shù)組的一般定義為: 其中,A是數(shù)組名,lk是數(shù)組A第k維的下界,uk是第k維的上界。為簡單 起見,假定數(shù)組A中每個元素的存儲長度為1,a是數(shù)組A的首地址,則數(shù) 組元素Ai1, i2, in的地址D的計算公式如下: 其中,di=ui-li+1(i=1,2,n)。將上述

28、公式整理后得到: 1123n2234nn 1n 1nnn Da(il )d dd(il )d dd(il)d(il ) 123n234nn 1nn123n234nn 1nn Da(l d ddl d ddldl )(i d ddi d ddidi ) DC O N ST P A R TV A R P A R T 與ik(1kn) 無關(guān)的不變量 與ik(1kn) 有關(guān)的可 變量 (1)翻譯方法 CONSTPART中的各項(如li、di(i=1,2,n)在處理說明語句時就可以 得到,因此CONSTPART值可在編譯時計算出來后保存在數(shù)組A的相關(guān)符 號表項里。此后,在計算數(shù)組A的元素地址時僅需計算V

29、ARPART值而直 接引用CONSTPART值。 實現(xiàn)數(shù)組元素的地址計算時,將產(chǎn)生兩組四元式序列:一組計算 CONSTPART,其值存放在臨時變量T中;另一組計算VARPART,其值存 放在臨時變量T1中,即用T1T表示數(shù)組元素的地址。這樣,對數(shù)組元素 的引用和賦值就有如下兩種不同的四元式: :若有:若有,則可以用四元式,則可以用四元式表示。表示。 :若有:若有,則可用四元式,則可用四元式表示。表示。 (2)舉例 已知A是一個1020的數(shù)組(每維下界均為1)且按行存放,求: (1) 賦值語句X=AI,J的四元式序列; (2) 賦值語句AI+2,J+1=M+N的四元式序列。 解:由于A是1020

30、的數(shù)組,故d1=10,d2=20,C=d2+1=21。 X=AI,J的四元式序列為: (2)舉例 已知A是一個1020的數(shù)組(每維下界均為1)且按行存放,求: (1) 賦值語句X=AI,J的四元式序列; (2) 賦值語句AI+2,J+1=M+N的四元式序列。 解:由于A是1020的數(shù)組,故d1=10,d2=20,C=d2+1=21。 X=AI,J的四元式序列為: 返回 參數(shù)傳遞的方式參數(shù)傳遞的方式 1 過程調(diào)用的處理過程調(diào)用的處理 2 (1)參數(shù) u形式參數(shù)(形參,啞元)形式參數(shù)(形參,啞元) u實在參數(shù)(實參)實在參數(shù)(實參) (2)參數(shù)傳遞的途徑 u傳地址傳地址 u傳值傳值 u傳名傳名 u

31、得結(jié)果得結(jié)果 傳地址 把實參地址傳給相應(yīng)形參,在過程段中每個形參都有一個相應(yīng)單元, 稱為形式單元,用來存放實參地址,過程體對形參的任何引用或賦值都 被處理成對形式單元的間接訪問。 得結(jié)果 每個形參對應(yīng)有兩個單元,第一個單元存放實參地址,第二個單元 存放實參的值,在過程體中對形參的任何引用或賦值都看成是對它的第 二個單元的直接訪問,但在過程工作完成返回前必須把第二個單元的內(nèi) 容存放到第一個單元所指的那個實參單元中。 傳值 調(diào)用段把實參值計算出來并存放在一個被調(diào)用段可以拿得到的地方, 被調(diào)用段開始工作時,首先把這些值抄進(jìn)自己的形式單元之中,然后就 好象使用局部名一樣使用這些形式單元,若實參不為指針

32、,在這種情況 下被調(diào)用段無法改變實參的值。 傳名(替換規(guī)則) 過程調(diào)用的作用相當(dāng)于把被調(diào)用段的過程體抄到調(diào)用出現(xiàn)的位置, 把其中任一出現(xiàn)的形式參數(shù)都替換成相應(yīng)的實在參數(shù),為了表現(xiàn)實在參 數(shù)的整體性,必需時在替換前先把它用括號括起來。 (3)參數(shù)傳遞舉例 在下面的函數(shù)P中,參數(shù)x是通過地址傳遞的,參數(shù)y通過值傳遞 FUNCTION P(VAR x:integer ; y:integer) : integer; BEGIN K:=3; L:=5; P:=x+y END; 若P由下列程序調(diào)用 K:=1; L:=1; Z:=P(K,L) 則Z的值是什么? 解: 當(dāng)傳值時,在調(diào)用段對參數(shù)進(jìn)行的修改在主程序段中不對參數(shù)實際值 造成影響,而傳地址時,在調(diào)用段對參數(shù)的修改就實際改變了參數(shù)值。 x傳地址 y傳值 Z:=P(K,L) K地址傳到

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論