什麼是語法制導翻譯方案?
語法制導翻譯方案主要分為以下兩種:
綜合翻譯
在這種翻譯中,產生式規則左邊變數的值取決於右邊變數的值。
例如:
E → E(1) + E(2) {E.VAL = E(1).VAL + E(2).VAL}
這裡,產生式規則左邊(LHS)的E可以透過右邊(RHS)的E(1)和E(2)的值之和來計算,即LHS變數依賴於RHS變數。
在綜合翻譯中,節點上綜合屬性的值是從語法樹中該節點子節點的屬性值計算出來的。
例如,在以下產生式中:
E → E(1) + E(2)
E → digit
其中 digit = 0 | 1 | 2 |… . . | 9
字串 "2 + 3" 的語法樹為...
完整的語法樹(包含翻譯結果)將是一棵樹,每個節點都標記有屬性VAL。
這裡,E.VAL表示非終結符E的值,它是根據語法樹中該節點子節點的值計算出來的。
繼承翻譯
在這種翻譯中,產生式規則右邊非終結符的翻譯取決於左邊非終結符的翻譯。
例如,考慮一個帶有語義動作的產生式:
A → BC {B.VAL = 5 * A.VAL}
在這個產生式中,可以看到B的值取決於A的值。因此,產生式右邊(RHS)非終結符的翻譯(B.VAL)取決於產生式左邊(LHS)非終結符的翻譯(A.VAL)。
繼承屬性的值是從該節點的兄弟節點和父節點的屬性值計算出來的。
例如,完整的語法樹將是...
A → BC {B.VAL = 5 * A.VAL}
如果 A.VAL = 2,那麼 B.VAL = 5 * 2 = 10
因此,B的值是由其父節點計算出來的。
繼承翻譯的例子——考慮產生式:
A → BC {C.VAL = 2 * B.VAL}
其完整的語法樹將是...
這裡,C節點的值依賴於其兄弟節點B。因此,在繼承翻譯中,節點上繼承屬性的值取決於其父節點或兄弟節點。
語法樹上的翻譯
考慮以下文法:
E → E + T
E → T
T → T * F
T → F
F → digit
以下是上述文法的語法制導定義。
產生式 | 語義動作 |
---|---|
E → E + T | E.VAL = E1.VAL + T1.VAL |
E → T | E.VAL = T.VAL |
T → T * F | T.VAL = T.VAL * F.VAL |
T → F | T.VAL = F.VAL |
F → digit | F.VAL = digit |
下圖顯示了字串 "5 + 6 + 7" 的語法樹和完整的語法樹。
**完整的語法樹(帶註釋的語法樹)**——顯示每個節點屬性值的語法樹。
LEXVAL表示葉節點上數字的值。