0

我目前正在嘗試使用boost spirit x3編寫一個編譯器。 我完成了解析器(現在沒有語義操作和錯誤處理,只是解析爲ast)。 由於我想實現支持範圍和函數調用的語言,我問自己什麼時候檢查被調用的函數是否存在? 我應該在構建ast時檢查當前範圍中是否存在函數(在使用語義操作進行解析時),還是應該在編譯ast時檢查該函數? 與範圍堆棧相同。我應該在解析,使用語義操作時,還是編譯出ast時構建範圍堆棧?語義檢查與提升精神x3

回答

1

這個問題是非常不明顯的。

其中大部分很大程度上取決於您正在實施的語言的性質(它是如何進行範圍界定的?您是否擁有詞彙範圍?關閉?您是否擁有動態堆棧?協程?變量是動態的還是完全的靜態?打字?)。

我應該在構建ast時(在使用語義操作進行解析時)檢查當前範圍中是否存在函數,還是應該在編譯ast時檢查該函數?

就像我說的,都可以工作。我通常會推薦分離問題。只需簡單地解析並在AST上進行操作(多次),思考起來就會簡單得多,並且結果更簡潔,更容易在大多數情況下擴展代碼。根據情況(例如,當想要變量在分析過程中可能隱藏某些關鍵字或某些其他情境感知謂詞時),您可能需要在範圍內維護具有已知標識符的符號表。這將 - IME - 構成設計氣味,您應該考慮是否需要複雜性。

與範圍堆棧相同。我應該在解析,使用語義操作時,還是編譯出ast時構建範圍堆棧?

再次,編譯過程中的處理通常要簡單得多。