【正文】
return x 過程返回 x := y[i] 數(shù)組運算 x[i] := y x := amp。 P4:=mknode(?*?,p2,p3)。 P2:=mkleaf( i2 , )。*39。+39。: =39。(去括弧 ); ( 2)否則, ?( i)出 ?棧,入 ?棧 若 Tj=??且 ?( i) =??, OK 8 ? 將規(guī)則式中操作符作為分支(父)結(jié)點,將操作數(shù)作為葉結(jié)點。 ( 2)若 ?( i) ?Tj則 ?( i)出 ?棧,入 ?棧; 若 Tj=?(’,則 Tj入 ? 棧, j:=j+1。if ch=?)?then getchar else error] Else error] 7 ?自底向上方法:算符優(yōu)先方法 數(shù)據(jù)結(jié)構(gòu):運算符棧 ?; 后綴式棧 ? ;輸入流 Tj 算法: 若 Tj=運算對象,則 Tj入 ?棧, j:=j+1。write(i)] Else if ch=?(?then [getchar。 Write(?+?)] ] Procedure F。T。1 第七章 語義分析 ? 語法制導(dǎo)翻譯技術(shù)應(yīng)用于語義分析 ? 語義處理的工作 數(shù)據(jù)結(jié)構(gòu):確定標識符類型,并檢查類型的正確性 控制結(jié)構(gòu):確定語法結(jié)構(gòu)的含義 2 中間代碼 ? 源程序經(jīng)過語義分析被譯成中間代碼序列 ? 用中間語言過渡的好處: – 與目標機無關(guān) – 便于編譯系統(tǒng)的實現(xiàn)、移植、代碼優(yōu)化 3 常用的中間代碼 (語言 ) ? 三地址代碼(三元式、四元式) ? 語法 (結(jié)構(gòu) )樹 ? 后綴式 —— 逆波蘭表示 特點 ? 形式簡單、語義明確、便于翻譯 ? 獨立于目標語言 4 (逆波蘭表示) ? 操作數(shù) 1 操作數(shù) 2 運算符 ? 操作數(shù) 運算符 ? 定義: ? E(常、變量)的后綴式為 E自身 ? E1 op E2 的后綴式為 E1′E2′op ? (E)的后綴式為 E的后綴式 ? 例 : – a := b *( c) + b *( 34)的后綴式 a b c * b 34 * + := 5 生成后綴式的屬性文法 產(chǎn)生式 語義規(guī)則 S → id:=E E → E1+E2 E → E1*E2 E → E1 E → (E1) E → id E → num Print (id. na m e | | de | | “ :=” ) de : = E1.code || E2.code || ”+ ” de : = E1.code || E2.code || ”* ” de : = E1.code || “ “ de : = E1.code de : = e de : = num .va l ; 屬性 c o d e 表示生成的代碼 6 生成后綴式的算法 ? 自頂向下方法:遞歸下降識別程序 .當輸入符是常、變量或運算符時,輸出到后綴式區(qū) E → TE 1 E 1→+ TE 1 | ? T→ FT 1 T1→*FT 1 | ? F→ ( E) | i Procedure E1。 [if ch=?+?then [getchar。E。 [if ch=?i?then [getchar。E。 若 Tj=運算符,則比較 ? ( i)和 Tj的優(yōu)先關(guān)系: ( 1)若 ? ( i) Tj則 Tj入 ?棧, j:=j+1。 若 Tj=?)’,則 ( 1)若 ?( i) =?(’則 ?( i)出 ?棧, j:=j+1。 ? 例 :表達式 (A 12) * B + 6 的語法結(jié)構(gòu)樹 A 12 B * 6 + 9 建立抽象語法樹 產(chǎn)生式 S → id:=E E → E1+ T E → T T → T1* F T → F F → (E) F → id F → num ? 屬性設(shè)置: – , , – 是名字的表項入口 – 是數(shù)值 ? 基本函數(shù) —— 結(jié)點構(gòu)造 – mknode 建中間結(jié)點 – mkleaf 建葉結(jié)點 op p1 p2 數(shù)據(jù)結(jié)構(gòu):運算符 (父 )結(jié)點 id entry 標識符 (葉 )結(jié)點 num lexval 數(shù) (葉 )結(jié)點 10 語法制導(dǎo)定義 (屬性文法 ) 產(chǎn)生式 語義規(guī)則 S → id:=E E → E1+ T E → T T → T1* F T → F F → (E) F → id F → num : = m k no de(39。, m k lea f( id, ry ), ) := m k no de(39。, E1.p, T .p) := T .p: = m k no de(39。, T1.p, F .p) T. p:= F .p: = F .p: = m k lea f( id, ry ) F .p: =m k lea f( num ,num .va l) 11 例 X := i1+i2*i3 的語法結(jié)構(gòu)樹 root := * i3 entry x entry + i1 entry i2 entry 生成抽象語法樹的中間代碼: P1:=mkleaf( i1 , )。 P3:=mkleaf( i3 , )。 P5:=mknode(?+?,p1,p4)。y 指針運算 x := *y *x = y 14 表達式的四元式表示 算符 操作數(shù) 操作數(shù)臨時變量 id b id c c T1 * b T1 T2 id b num 34 34 T3 * b T3 T4 + T2 T4 T5 id a := T5 a a := b * ( c) + b * ( 34) 15 地址 算符 操作數(shù) 操作數(shù) (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) id b id c (1) * ( 0 ) ( 2 ) id b num 34 (5) * ( 4 ) ( 6 ) + ( 3 ) ( 7 ) id a := ( 9 ) ( 8 ) 表達式的三元式表示 a := b * ( c) + b * ( 34) 16 生成三地址代碼的屬性文法 產(chǎn)生式 語義規(guī)則 S → id :=E E → E1+E2 E → E1*E2 E → E1 E → (E1) E → id E → n u m S .c o d e := E .c o d e | | g e n (i d