什麼是語法制導翻譯?\n
在語法制導翻譯中,除了語法之外,它還可以識別一些非正式的表示法,這些表示法被稱為語義規則。
在實現語義分析後,源程式被修改為中間形式。
中間程式碼生成階段需要一些資訊來將語義檢查過的語法樹轉換為中間程式碼。但是,這些資訊或變數的屬性不能僅由上下文無關文法表示。
因此,必須將一些語義動作附加到上下文無關文法中,這有助於中間程式碼生成階段生成中間程式碼。
因此,將屬性附加到上下文無關文法的變數並定義每個語法產生式的語義動作(含義)稱為**語法制導翻譯**。
這是一種表示法,其中上下文無關文法的每個產生式都與一組語義規則或動作相關聯,並且每個語法符號都與一組屬性相關聯。因此,語法和語義動作組結合起來構成**語法制導定義**。翻譯可以是中間程式碼的生成、目的碼的生成或在符號表中新增關於構造型別的資訊。
**語義動作** - 它是當解析器識別由上下文無關文法生成的輸入字串時執行的操作。
例如, A → BC {語義動作}
語義動作用花括號括起來,附加到產生式上。
**在自頂向下解析器中**,當 A 展開推匯出 BC,BC 進一步推匯出字串 w 時,將執行語義動作。
**在自底向上解析器中**,當 BC 還原為 A 時,生成語義動作。
語義動作可以執行 -
- 計算變數的值
S → S(1) + S(2) {S. VAL = S(1). VAL + S(2). VAL}
這裡 S. VAL 將計算 S(1) 和 S(2) 值的總和。
- 列印錯誤訊息
**示例** - A → BC {error ( ); }
每當 A 展開為 BC 時,都會呼叫錯誤函式來列印錯誤訊息。
語法制導翻譯方案是有益的,因為它允許編譯器設計人員直接根據源語言的語法結構定義中間程式碼的生成。它被分為兩個子集,稱為語法的綜合屬性和繼承屬性。
屬性與語法符號相關,語法符號是語法樹節點的標籤。換句話說,屬性是透過將它們附加到表示該構造的語法符號來與語言構造關聯的資訊。屬性可以描述任何(合理的)東西,它可以選擇字串、數字、型別、記憶體位置、程式碼片段等。
例如,識別符號的屬性可以包括名稱、作用域、型別、實際引數(引數數量)和引數型別、返回型別等。語法樹節點中屬性的值由與應用於該節點的產生式相關的語義規則表示。