freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

[計(jì)算機(jī)]第四章語法制導(dǎo)翻譯生成中間代碼-資料下載頁

2024-12-08 02:13本頁面
  

【正文】 x, int *y) { int temp。 temp=*x。 *x=*y。 *y=temp。 } 值調(diào)用模擬引用調(diào)用 69 3 復(fù)寫 恢復(fù) // 引用調(diào)用的副作用的程序?qū)嵗? include int a=2。 void main () { coutbefore: a=aendl。 add_one(a)。 coutafter: a=aendl。 } 引用調(diào)用的副作用 本意: a=3 結(jié)果: a=4 原因: 實(shí)參與非本地量共用一個(gè)存儲(chǔ)空間,使得在過程內(nèi)改變參數(shù)值的同時(shí),也改變了非本地量的值。 void add_one(int amp。x){ a=x+1。 x=x+1。 } 70 3 復(fù)寫 恢復(fù)(續(xù) 1) 復(fù)寫 恢復(fù)的特點(diǎn): (值調(diào)用和引用調(diào)用的結(jié)合 ) 1. 過程內(nèi)部對參數(shù)的修改不直接影響實(shí)參,避免了副作用; 2. 返回時(shí)將形參內(nèi)容恢復(fù)給實(shí)參,實(shí)現(xiàn)了參數(shù)的返回。 實(shí)參的特點(diǎn): 必須是左值 。 參數(shù)傳遞和過程內(nèi)對參數(shù)的使用原則: 1. 過程定義時(shí)形參被當(dāng)作 局部名 看待 , 并在過程內(nèi)部為形參分配單元 (復(fù)寫 ); 2. 調(diào)用過程前 , 首先計(jì)算實(shí)參并將 值 (實(shí)參的右值 )放入形參的存儲(chǔ)單元; 3. 過程內(nèi)部對形參單元中的數(shù)據(jù) 直接訪問 ; 4. 過程返回前,將形參的 右值重新放回實(shí)參的存儲(chǔ)單元 (恢復(fù) )。 a定義時(shí):f(a) 過程內(nèi)2x調(diào)用時(shí):過程外 f(x)3a返回前:過程內(nèi) f(a)3x返回后:過程外 f(x)71 3 復(fù)寫 恢復(fù)(續(xù) 2) procedure test is Ada源程序 a : integer。 begin a:=2。 a:=add_one(a)。 put_line(39。a=39。, a)。 end test。 procedure add_one(x:in out integer)。 復(fù)寫 恢復(fù)調(diào)用 begin a:=x+1。 x:=x+1。 end add_one。 // 引用調(diào)用模擬復(fù)寫 恢復(fù) 參數(shù)傳遞的演示程序 include int a=2。 void add_one(int amp。x) { int local_x=x。 a=local_x+1。 local_x++。 x=local_x。} void main () { coutbefore: a=aendl。 add_one(a)。 coutafter: a=aendl。 } 復(fù)寫 恢復(fù)舉例: 72 上次課主要內(nèi)容 1. 散列表 ? 作用域鏈與散列鏈、散列函數(shù)的計(jì)算 2. 變量聲明的語法制導(dǎo)翻譯 ? 類型定義與變量聲明 ? 類型定義確定存儲(chǔ)空間,變量聲明分配存儲(chǔ)空間 ? 簡單類型的預(yù)定義 3. 過程的定義與聲明 ? 過程的三個(gè)形態(tài):定義、聲明與引用 ? 左值與右值 ? 參數(shù)傳遞(形參與實(shí)參的結(jié)合) ? 是傳遞左值、右值、還是正文 ? 各種傳遞形式與處理方式 73 4 換名調(diào)用 嚴(yán)格講,換名調(diào)用并不能算作真正的過程調(diào)用和參數(shù)傳遞。 換名調(diào)用由 Algol的復(fù)寫規(guī)則定義: 1. 過程被認(rèn)為宏 , 每次對過程的調(diào)用 , 實(shí)質(zhì)上是用過程體替換過程調(diào)用 , 替換中用實(shí)參的文字替換體中的形參 。這樣的替換方式被稱為宏替換或宏展開; 2. 應(yīng)區(qū)分被調(diào)用過程的局部名和調(diào)用過程名 。 可以認(rèn)為在宏展開前被調(diào)用過程的每個(gè)局部名被系統(tǒng)地重新命名成可區(qū)別的名字; 3. 當(dāng)需要保持實(shí)參的完整性時(shí) , 可以為實(shí)參加括弧 。 換名調(diào)用在 C++中的形式是宏定義( define),宏定義是采用預(yù)處理的方法,在預(yù)處理時(shí)進(jìn)行宏替換。宏替換將過程體直接展開在它被調(diào)用的地方,因此經(jīng)過宏替換之后的程序中,已經(jīng)不存在過程的調(diào)用與參數(shù)傳遞,它的特點(diǎn)是運(yùn)行速度快。 74 4 換名調(diào)用(續(xù) 1) // 換名調(diào)用副作用的演示程序 include int temp。 void main () { int a(1), b[]={0,0}。 coutbefore: a=a b=b[0] b[1]endl。 swap(a, b[a])。 coutafter: a=a b=b[0] b[1]endl。 } define swap(x, y) temp=x。 x=y。 y=temp。 // 宏定義 void swap(int amp。x, int amp。y) // 引用調(diào)用 { int temp。 temp=x。 x=y。 y=temp。 } 正文替換與函數(shù)調(diào)用的不一致性 75 4 換名調(diào)用(續(xù) 2) C++的內(nèi)聯(lián)函數(shù)( inline): 與宏替換一樣高效(避免了函數(shù)調(diào)用); 消除了宏替換的副作用(模擬函數(shù)調(diào)用的效果)。 // 宏定義 define macro_swap(x, y) temp=x。 x=y。 y=temp。 // 內(nèi)聯(lián)函數(shù) inline void inline_swap(int amp。x, int amp。y) {int temp。 temp=x。 x=y。 y=temp。} // 引用調(diào)用 void procedure_swap(int amp。x, int amp。y) {int temp。 temp=x。 x=y。 y=temp。} 一種折中的方法 76 作用域信息的保存 1 過程的作用域 與程序塊類似 , 在允許嵌套定義過程的程序設(shè)計(jì)語言中 ,相同的名字可以同時(shí)出現(xiàn)在不同的作用域中 , 因此有必要討論如何設(shè)計(jì)符號(hào)表來存放它們 。 此處討論的過程作用域 , 同樣遵守的是靜態(tài)作用域和最近嵌套原則 。 定義 設(shè)主程序 ( 最外層過程 ) 的嵌套深度 dmain=1, 則 1 若過程 A直接嵌套定義過程 B, 則 dB=dA+1; 2 變量聲明時(shí)所在過程的嵌套深度,被認(rèn)為是該變量的嵌套深度。 ■ 與程序塊相比,有兩點(diǎn)不同,使得過程聲明的處理復(fù)雜: 1. 過程頭 (即界面 )是一個(gè)名字,可象引用變量一樣被調(diào)用; 2. 程序塊的執(zhí)行(控制流)與靜態(tài)一致,而過程不一致。 77 1 過程的作用域(續(xù) 1) 例 快排序的 Pascal程序: program sort(input,output)。 var a:array[0..10]of integer。 x:integer。 procedure readarray。 procedure exchange(i,j:integer)。 procedure quicksort (m,n:integer )。 begin a[0]:=9999。 a[10]:=9999。 readarray。 quicksort(1,9) end {sort}. var i:integer。 begin for i:=1 to 9 do read(a[i])end{readarray}。 begin x:=a[i]。 a[i]:=a[j]。 a[j]:=x。 end{exchange}。 var i,v:integer。 function partition(y,z:integer):integer。 begin if (nm) then begin i:=partition(m,n)。 quicksort(m,i1)。 quicksort(i+1,n) end。 end{quicksort}。 var i,j:integer。 begin ...a...。 ...v...。 ...exchange(i,j)。... end{partition}。 78 1 過程的作用域(續(xù) 2) sort a, x, 1 readarray i 2 exchange 2 quicksort i, v 2 partition i, j 3 2 符號(hào)表中的作用域信息 嵌套過程中名字作用域信息的保存,可以用具有嵌套結(jié)構(gòu)的符號(hào)表來實(shí)現(xiàn),每個(gè)過程可以被認(rèn)為是一個(gè)子符號(hào)表,或者是符號(hào)表中的一個(gè)節(jié)點(diǎn)。 嵌套的節(jié)點(diǎn)之間可以用雙向的鏈表連接,正向的鏈指示過程的嵌套關(guān)系,而逆向的鏈可以用來實(shí)現(xiàn)按作用域?qū)γ值脑L問。 過程 過程中的變量 嵌套深度 79 2 符號(hào)表中的作用域信息 例 忽略參數(shù)的快排序程序的符號(hào)表: sortreadarray exchange quicksortpartitionaheaderxreadarrayexchangequicksortsortto readarrayiheaderreadarrayto exchangeexchangeheaderquicksortheaderivpartitionheaderijpartition雙向鏈表: 正向 -嵌套定義關(guān)系 逆向 -作用域與可見性關(guān)系 問題: 參數(shù)如何處理? 80 符號(hào)表中的作用域信息: sortreadarray exchange quicksortpartitionaheaderxreadarrayexchangequicksortsortto readarrayiheaderreadarrayto exchangeexchangeheaderquicksortheaderivpartitionheaderijpartition81 3 語法制導(dǎo)翻譯生成符號(hào)表 (a) 簡化的過程定義文法(忽略了參數(shù)): P → D (1) D → D 。 D (2) | id : T (3) | proc id 。 D。 S (4) 問題: 如何在處理產(chǎn)生式 (1)和(4)的語言結(jié)構(gòu)時(shí)正確地填寫符號(hào)表信息(雙向鏈表)? 修改文法 , 使得在定義 D之前生成符號(hào)表 ( LR分析 ) : P → M D (1) D → D 。 D (2) | id : T (3) | proc id 。 N D。 S (4) M →ε (5) N →ε (6) 82 (b) 全程量、屬性與語義函數(shù) 全程量: 有序?qū)?( tblptr, offset) tblptr offsettop其中, tblptr保存指向符號(hào)表節(jié)點(diǎn)的指針, offset保存當(dāng)前節(jié)點(diǎn)所需寬度。 棧上的操作: push(t, o)、 pop、 top(stack) 語義函數(shù)與過程: 1. 函數(shù) mktable(previous): 建立一個(gè)新的節(jié)點(diǎn) , 并返回指向新節(jié)點(diǎn)的指針 。 參數(shù) previous是逆向鏈 , 指向該節(jié)點(diǎn)的前驅(qū) , 或者說是外層 。 2. 過程 enter(table, name, type, offset): 在 table指向的節(jié)點(diǎn)中為名字 name建立新的條目 , 包括名字的類型和存儲(chǔ)位臵等 。 3. 過程 addwidth(table, width): 計(jì)算 table節(jié)點(diǎn)中所有條目的累加寬度 , 并記錄在 table的頭部信息中 。 4. 過程 enterproc(table, name, newtable): 為過程 name在 table指向的節(jié)點(diǎn)中建立一個(gè)新的條目 。 參數(shù) newtable是正向鏈 , 指向 name過程自身的符號(hào)表節(jié)點(diǎn) 。 83 (b) 全程量、屬性與語義函數(shù)(續(xù)) head...previousmktable1. 函數(shù) mktable(previous): tablename type offset enter(table, name, type, offset): ... widthtable3. 過程 addwidth(table, width): 4. 過程 enterproc(table, name, newtable): name newtabletable84 (c) 語義規(guī)則 (1) P → M D (2) M → ε (4) D → id : T (5) D → proc id 。 N D1。 S (6) N → ε {t:=mktable(null)。 push(t
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1