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

正文內(nèi)容

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

2025-05-02 18:50本頁面

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

  

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