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

正文內(nèi)容

編譯原理課件07_語(yǔ)義分析和中間代碼產(chǎn)生-資料下載頁(yè)

2025-05-02 18:50本頁(yè)面

【導(dǎo)讀】名字的作用域分析。中間語(yǔ)言(復(fù)雜性界于源語(yǔ)言和目標(biāo)語(yǔ)言。便于進(jìn)行與機(jī)器無(wú)關(guān)的代碼優(yōu)化工作。使編譯程序的結(jié)構(gòu)在邏輯上更為簡(jiǎn)單明確。后綴式,逆波蘭表示。示表達(dá)式的方法,又稱(chēng)逆波蘭表示法。分別為E1和E2的后綴式。逆波蘭表示法不用括號(hào)。端進(jìn)行掃描,都能對(duì)它進(jìn)行唯一分解。一般的計(jì)算過(guò)程是:自左至右掃描后綴式,每碰到運(yùn)算量就把它推進(jìn)棧。結(jié)果代替這k個(gè)項(xiàng)。把表達(dá)式翻譯成后綴式的語(yǔ)義規(guī)則描述。op表示任意二元操作符。“||”表示后綴形式的連接。數(shù)組POST存放后綴式:k為下標(biāo),初值為1. 上述語(yǔ)義動(dòng)作可實(shí)現(xiàn)為:。在一個(gè)DAG中代表公共子表達(dá)式的結(jié)點(diǎn)具有多個(gè)。三地址代碼可以看成是抽象語(yǔ)法樹(shù)或DAG的一種。對(duì)表達(dá)式E求值并置于變量T中值。函數(shù)newtemp的功能是,每次調(diào)用它時(shí),將返。體實(shí)現(xiàn)可用記錄表示.通常有三種表示方法:四元式、三元式、間接三元式。一個(gè)帶有四個(gè)域的記錄結(jié)構(gòu),這四個(gè)域分別稱(chēng)為op,arg1,arg2及result

  

【正文】 z else x:=yz 考慮如下語(yǔ)句 : while ab do if cd then x:=y+z else x:=yz ? 生成下列代碼: L1: if ab goto L2 goto Lnext L2: if cd goto L3 goto L4 L3: T1:=y+z x:=T1 goto L1 L4: T2:=yz x:=T2 goto L1 Lnext: 一遍掃描翻譯控制流語(yǔ)句 ? 考慮下列產(chǎn)生式所定義的語(yǔ)句 : (1) S→if E then S (2) | if E then S else S (3) | while E do S (4) | begin L end (5) | A (6) L→L。S (7) | S ? S表示語(yǔ)句, L表示語(yǔ)句表, A為賦值語(yǔ)句, E為一個(gè)布爾表達(dá)式 ? if 語(yǔ)句的翻譯 相關(guān)產(chǎn)生式 S → if E then S(1) | if E then S(1) else S(2) 改寫(xiě)后產(chǎn)生式 S → if E then M S1 S → if E then M1 S1 N else M2 S2 M→? N→? 翻譯模式 : 1. S→if E then M S1 { backpatch(, )。 :=merge(, ) } 2. S→if E then M1 S1 N else M2 S2 { backpatch(, )。 backpatch(, )。 :=merge(, , ) } 3. M→ ? { :=nextquad } 4. N→ ? { :=makelist(nextquad)。 emit(‘j,- ,- ,- ’) } ? while 語(yǔ)句的翻譯 相關(guān)產(chǎn)生式 S→ while E do S(1) ? 翻譯為: E的代碼 S (1)的代碼 “真”出口 “假”出口 為了便于 回填 , 改寫(xiě)產(chǎn)生式為 : S→while M 1 E do M2 S1 M→ ? ? 翻譯模式 : 1. S→while M1 E do M2 S1 { backpatch(, )。 backpatch(, )。 := emit(‘j,- ,- ,’ ) } 2. M→ ? { :=nextquad } ? 產(chǎn)生式 L→L。S 改寫(xiě)為: L→L1。 M S M→? ? 翻譯模式 : 1. L→L 1。 M S { backpatch(, )。 := } 2. M→ ? { :=nextquad } ? 其它幾個(gè)語(yǔ)句的翻譯 1. S→begin L end { := } 2. S→A { :=makelist( ) } 3. L→S { := } 翻譯語(yǔ)句 while (ab) do if (cd) then x:=y+z。 100 (j, a, b, 102) 101 (j, , , 107) 102 (j, c, d, 104) 103 (j, , , 100) 104 (+, y, z, T) 105 (:=, T, , x) 106 (j, , , 100) 107 標(biāo)號(hào)與 goto語(yǔ)句 ? 標(biāo)號(hào)定義形式 L: S; ? 標(biāo)號(hào)引用 goto L; ? 示例: ?向后轉(zhuǎn)移: L1: …… …… goto L1。 ?向前轉(zhuǎn)移: goto L1。 …… L1: …… 產(chǎn)生式 S?→goto L的語(yǔ)義動(dòng)作 : { 查找符號(hào)表; IF L在符號(hào)表中且 定義否 欄為 已 THEN GEN(J, , , P) ELSE IF L不在符號(hào)表中 THEN BEGIN 把 L填入表中; 置 定義否 為 未 , 地址 欄為 NXQ; GEN(J, , , 0) END ELSE BEGIN Q:=L的地址欄中的編號(hào); 置地址欄編號(hào)為 NXQ; GEN(J, , , Q) END } ? 帶標(biāo)號(hào)語(yǔ)句的產(chǎn)生式 : S→label S label → i: ? label → i: 對(duì)應(yīng)的語(yǔ)義動(dòng)作 : 1. 若 i所指的標(biāo)識(shí)符 (假定為 L)不在符號(hào)表中 , 則把它填入 , 置 類(lèi)型 為 標(biāo)號(hào) , 定義否為 已 , 地址 為 nextquad ; 2. 若 L已在符號(hào)表中但 類(lèi)型 不為標(biāo)號(hào)或 定義否 為 已 , 則報(bào)告出錯(cuò); 3. 若 L已在符號(hào)表中,則把標(biāo)號(hào) 未 改為 已 ,然后,把地址欄中的鏈頭 (記為 q)取出,同時(shí)把nextquad填在其中,最后,執(zhí)行 BACKPATCH(q,nextquad )。 CASE語(yǔ)句的翻譯 ? 語(yǔ)句結(jié)構(gòu) case E of C1: S1。 C2: S2。 … Cn1: Sn1。 otherwise: Sn end ? 翻譯法 (一 ): T:=E L1: if T?C1 goto L2 S1的代碼 goto next L2: if T?C2 goto L3 S2的代碼 goto next L3: … Ln1: if T?Cn1 goto Ln Sn1的代碼 goto next Ln: Sn的代碼 next: ?改進(jìn) : C 1 S1 的地址C 2 S2 的地址? ?E Sn 的地址? 翻譯法 (二 ): 計(jì)算 E并放入 T中 goto test L1: 關(guān)于 S1的中間碼 goto next … Ln1: 關(guān)于 Sn1的中間碼 goto next Ln: 關(guān)于 Sn的中間碼 goto next test: if T=C1 goto L1 if T=C2 goto L2 … if T=Cn1 goto Ln1 goto Ln next: (case, C1, P1) (case, C2, P2) … (case, Cn1, Pn1) (case, T, Pn) (label, NEXT, , ) C 1 P 1C 2 P 2? ?C n 1 P n 1L 1 S1 的四元式首地址 L 2 S2 的四元式首地址 ? ? L n 1 Sn 1 的四元式首地址 L n Sn 的四元式首地址 Pi是 LI在 符號(hào)表中 的位置 過(guò)程調(diào)用的處理 ? 過(guò)程調(diào)用主要對(duì)應(yīng)兩種事 : ?傳遞參數(shù) ?轉(zhuǎn)子程序 ?傳地址 :把實(shí)在參數(shù)的地址傳遞給相應(yīng)的形式參數(shù) ?調(diào)用段預(yù)先把實(shí)在參數(shù)的地址傳遞到被調(diào)用段可以拿到的地方 ; ?程序控制轉(zhuǎn)入被調(diào)用段之后 , 被調(diào)用段首先把實(shí)在參數(shù)的地址抄進(jìn)自己相應(yīng)的形式單元中 ; ?過(guò)程體對(duì)形式參數(shù)的引用域賦值被處理 成 對(duì)形式單元的間接訪(fǎng)問(wèn) 。 ? 翻譯方法:把實(shí)參的地址逐一放在轉(zhuǎn)子指令的前面 . 例如 , CALL S(A, X+Y) 翻譯為 : 計(jì)算 X+Y置于 T中的代碼 par A /*第一個(gè)參數(shù)的地址 */ par T /*第二個(gè)參數(shù)的地址 */ call S /*轉(zhuǎn)子 */ 過(guò)程調(diào)用的翻譯 ? 過(guò)程調(diào)用文法 : (1) S → call id (Elist) (2) Elist → Elist, E (3) Elist → E ? 翻譯模式 1. S→call id (Elist) { for 隊(duì)列 queue中的每一項(xiàng) p do emit(‘param’ p)。 emit(‘call’ ) } 2. Elist→Elist, E { 將 queue的隊(duì)尾 } 3. Elist→E { 初始化 queue僅包含 } 作業(yè) ? P133—3, 4, 6, 7
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1