【文章內(nèi)容簡介】
2022/2/16 第 4章 語法制導(dǎo)的翻譯 65 ? 將 LR分析器 增加 一個(gè)域來保存綜合屬性值 Z Z. z Y Y. y X X. x . . . . . . 棧 state val top 2022/2/16 第 4章 語法制導(dǎo)的翻譯 66 ? 將 LR分析器 增加 一個(gè)域來保存綜合屬性值 Z Z. z Y Y. y X X. x . . . . . . 棧 state val top 若產(chǎn)生式 A → XYZ的 語義規(guī)則 是 := f (, , ) 右部符號(hào)從左至右壓入棧內(nèi) 2022/2/16 第 4章 語法制導(dǎo)的翻譯 67 ? 將 LR分析器 增加 一個(gè)域來保存綜合屬性值 Z Z. z Y Y. y X . . . . . . 若產(chǎn)生式 A → XYZ的 語義規(guī)則 是 := f (, , ), 那么歸約后: . . . . . . A . . . . . . 棧 state val top top top=top2 Top’ 2022/2/16 第 4章 語法制導(dǎo)的翻譯 68 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 Z Z. z Y Y. y X . . . . . . 棧 state val top 產(chǎn) 生 式 語 義 規(guī) 則 L ? E n print () E ? E1 + T :=E1 .val + E ? T := T ? T1 * F := * T ? F := F? (E) := F ? digit := Top’ 2022/2/16 第 4章 語法制導(dǎo)的翻譯 69 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 Z Z. z Y Y. y X . . . . . . 棧 state val top 產(chǎn) 生 式 代 碼 段 L ? E n print () E ? E1 + T :=E1 .val + E ? T := T ? T1 * F := * T ? F := F? (E) := F ? digit := Top’ 2022/2/16 第 4章 語法制導(dǎo)的翻譯 70 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 n E . . . . . . . . . . . . 產(chǎn) 生 式 代 碼 段 L ? E n print (val [ top?1] ) E ? E1 + T :=E1 .val + E ? T := T ? T1 * F := * T ? F := F? (E) := F ? digit := 棧 state val top :=左邊為歸約后左部文法符號(hào)的屬性值,下標(biāo)為值的存儲(chǔ)位置 Top’ 2022/2/16 第 4章 語法制導(dǎo)的翻譯 71 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 T + E . . . . . . 產(chǎn) 生 式 代 碼 段 L ? E n print (val [ top?1] ) E ? E1 + T val [top ?2 ] := val [top ?2]+val [top] E ? T := T ? T1 * F := * T ? F := F? (E) := F ? digit := 棧 state val top :=左邊為歸約后左部文法符號(hào)的屬性值,下標(biāo)為值的存儲(chǔ)位置 Top’ 2022/2/16 第 4章 語法制導(dǎo)的翻譯 72 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 T . . . . . . . . . . . . . . . . . . 產(chǎn) 生 式 代 碼 段 L ? E n print (val [ top?1] ) E ? E1 + T val [top ?2 ] := val [top ?2]+val [top] E ? T val [top]不變 T ? T1 * F := * T ? F := F? (E) := F ? digit := 棧 state val top :=左邊為歸約后左部文法符號(hào)的屬性值,下標(biāo)為值的存儲(chǔ)位置 2022/2/16 第 4章 語法制導(dǎo)的翻譯 73 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 F * T . . . . . . 產(chǎn) 生 式 代 碼 段 L ? E n print (val [ top?1] ) E ? E1 + T val [top ?2 ] := val [top ?2]+val [top] E ? T val [top]不變 T ? T1 * F val [top ?2 ] := val [top ?2]?val [top] T ? F := F? (E) := F ? digit := 棧 state val top :=左邊為歸約后左部文法符號(hào)的屬性值,下標(biāo)為值的存儲(chǔ)位置 Top’ 2022/2/16 第 4章 語法制導(dǎo)的翻譯 74 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 F . . . . . . . . . . . . . . . . . . 產(chǎn) 生 式 代 碼 段 L ? E n print (val [ top?1] ) E ? E1 + T val [top ?2 ] := val [top ?2]+val [top] E ? T val [top]不變 T ? T1 * F val [top ?2 ] := val [top ?2]?val [top] T ? F val [top]不變 F? (E) := F ? digit := 棧 state val top :=左邊為歸約后左部文法符號(hào)的屬性值,下標(biāo)為值的存儲(chǔ)位置 2022/2/16 第 4章 語法制導(dǎo)的翻譯 75 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 ) E ( . . . . . . 產(chǎn) 生 式 代 碼 段 L ? E n print (val [ top?1] ) E ? E1 + T val [top ?2 ] := val [top ?2]+val [top] E ? T val [top]不變 T ? T1 * F val [top ?2 ] := val [top ?2]?val [top] T ? F val [top]不變 F? (E) val [top ?2 ] := val [top ?1] F ? digit := 棧 state val top :=左邊為歸約后左部文法符號(hào)的屬性值,下標(biāo)為值的存儲(chǔ)位置 Top’ 2022/2/16 第 4章 語法制導(dǎo)的翻譯 76 ? 例:臺(tái)式計(jì)算器的語法制導(dǎo)定義改成棧操作代碼 digit exval . . . . . . . . . . . . . . . . . . 產(chǎn) 生 式 代 碼 段 L ? E n print (val [ top?1] ) E ? E1 + T val [top ?2 ] := val [top ?2]+val [top] E ? T val [top]不變 T ? T1 * F val [top ?2 ] := val [top ?2]?val [top] T ? F val [top]不變 F? (E) val [top ?2 ] := val [top ?1] F ? digit val [top]不變 棧 state val top :=左邊為歸約后左部文法符號(hào)的屬性值,下標(biāo)為值的存儲(chǔ)位置 2022/2/16 第 4章 語法制導(dǎo)的翻譯 77 L 屬性定義的自上而下計(jì)算 邊分析邊翻譯的方式能否用于繼承屬性 ? ? 屬性的計(jì)算次序受分析方法所限定的分析樹結(jié)點(diǎn)建立次序的限制 2022/2/16 第 4章 語法制導(dǎo)的翻譯 78 L屬性定義的自上而下計(jì)算 邊語法分析邊翻譯的方式能否用于繼承屬性 ? ? 屬性的計(jì)算次序受分析方法所限定的分析樹結(jié)點(diǎn)建立次序的限制 ? 語法分析方法的共同特點(diǎn):分析樹的結(jié)點(diǎn)是自左向右生成 ? 如果屬性信息自左向右流動(dòng),那么就有可能在分析的同時(shí)完成 L 屬性計(jì)算 ? L代表屬性 從左向右 傳遞的方向 2022/2/16 第 4章 語法制導(dǎo)的翻譯 79 ? ( 1) 如果每個(gè)產(chǎn)生式 A ?X1 X2 … Xj … Xn 的每條語義規(guī)則計(jì)算的屬性是 A的綜合屬性;或者 ( 2) 如果是 Xj 的繼承屬性 , 1 ? j ? n,但它僅依賴于: ? 該產(chǎn)生式中 Xj左邊 ( 兄弟結(jié)點(diǎn) ) 符號(hào) X1, X2, … , Xj1的屬性 ? A的繼承屬性 那么語法制導(dǎo)定義是 L屬性定義 L屬性定義 2022/2/16 第 4章 語法制導(dǎo)的翻譯 80 ? ( 1) 如果每個(gè)產(chǎn)生式 A ?X1 X2 … Xj … Xn 的每條語義規(guī)則計(jì)算的屬性是 A的綜合屬性;或者 ( 2) 如果是 Xj 的繼承屬性 , 1 ? j ? n,但它僅依賴于: ? 該產(chǎn)生式中 Xj左邊 ( 兄弟結(jié)點(diǎn) ) 符號(hào) X1, X2, … , Xj1的屬性 ? A的繼承屬性 那么語法制導(dǎo)定義是 L屬性定義 ? S屬性定義是 L屬性定義的一個(gè)特例 2022/2/16 第 4章 語法制導(dǎo)的翻譯 81 ? 例:變量類型聲明的語法制導(dǎo)定義是一個(gè) L屬性定義 產(chǎn) 生 式 語 義 規(guī) 則 D ? TL := T? int T. type := integer T? real T. type := real L? L1, id := 。 addtype (, ) L? id addtype (, ) 2022/2/16 第 4章 語法制導(dǎo)的翻譯 82 ? 計(jì)算屬性需要考慮執(zhí)行語義規(guī)則的時(shí)機(jī) ? 翻譯方案將語義動(dòng)作放在 { }內(nèi),并將它當(dāng)作 文法符號(hào) 插入產(chǎn)生式右部任何位置 ? 語義動(dòng)作插入的位置就是產(chǎn)生式的 項(xiàng)目 中的點(diǎn)的位置 ? 執(zhí)行時(shí)機(jī):當(dāng)語法分析到該 文法符號(hào) (語義動(dòng)作)而進(jìn)行 推導(dǎo)或歸約 時(shí),執(zhí)行該語義動(dòng)作 翻譯方案 什么是項(xiàng)目? 2022/2/16 第 4章 語法制導(dǎo)的翻譯 83 ? 只有綜合屬性的翻譯方案的建立 首先為每條語義規(guī)則建立一個(gè)放在一對(duì) { }括號(hào)內(nèi)賦值動(dòng)作,然后把這些動(dòng)作分別放在對(duì)應(yīng)產(chǎn)生式 右部的末端 2022/2/16 第 4章 語法制導(dǎo)的翻譯 84 ? 例 :把有加和減的中綴表達(dá)式翻譯成后綴表達(dá)式 如果輸入是 8+5 ?2,則輸出是 8 5 + 2 ? E ? T R R ? addop T {print ()} R1 | ? T ? num {print ()} 2022/2/16 第 4章 語法制導(dǎo)的翻譯 85 ? 例 :把有加和減的中綴表達(dá)式翻譯成后綴表達(dá)式 如果輸入是 8+5 ?2,則輸出是 8 5 + 2 ? E ? T R R ? addop T {print ()} R1 | ? T ? num {print ()} E ? T R ? num {print (8)} R ? num{print (8)}addop T{print (+)}R ? num{print(8)}addop num{print(5)}{print (+)}R … {print(8)}{print(5)}{print(+)}addop T{print(?)} R