什麼是語法制導翻譯的實現?


語法制導翻譯方案是一個上下文無關文法,其中屬性與文法符號相關聯,語義動作包含在花括號 ({ }) 中。這些語義動作是解析器在適當時間用於翻譯的子例程。語義動作在產生式右側的位置表示解析器實現它的時間。

當它可以生成翻譯方案時,它應該提供在動作定義屬性值時該屬性值可用。這需要

  • 產生式右側符號的繼承屬性應該在直接位於該符號之前的動作(左側)中計算,因為它可以定義為評估其右側符號繼承屬性的動作。

  • 評估產生式左側非終結符綜合屬性的動作應該位於產生式右側的末尾,因為它可以定義任何右側文法符號的屬性。

考慮一個包含產生式及其語義動作的例子。產生式是

E → E1 + E2

其語義動作將是

{E.Val = E1.Val + E2.Val}

語法制導翻譯提供了一種描述輸入-輸出對映的方法,這種描述與實現無關。要實現語法制導翻譯,可以使用一個由 STATE **& VAL** 兩個陣列組成的棧。每個 **STATE** 條目顯示一個指向解析表的指標,每個 **VAL** 表示與對應的 **STATE** 符號關聯的值。

**STATE** 陣列包含上下文無關文法中出現的所有變數或識別符號,**VAL** 陣列包含每個變數的值。

**示例** - 對於產生式

A → BC

要計算變數 A 的翻譯,首先必須將 B 和 C 與它們對應的值 B.VAL 和 C.VAL 分別插入到棧中。

自底向上解析器將在 BC 歸約為 A 時執行翻譯。

**歸約前** - 頂部指標將指向 C 變數,VAL[TOP] 包含 C.VAL。VAL[TOP-1] 包含 B.VAL。

**歸約後** - 當 BC 歸約為 A 時,B 和 C 及其對應的值 B.VAL 和 C.VAL 將被彈出,並將帶有 A.VAL 的 A 壓入棧中。因此,歸約後,棧在其棧頂將包含變數 A,而 VAL[TOP] 現在將包含 A.VAL。

∴ 對於產生式 A → BC

更新於:2021年11月3日

2K+ 次瀏覽

啟動您的 職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.