跳轉到內容

編譯器構造/語義分析

來自華夏公益教科書

語義分析

[編輯 | 編輯原始碼]

這大致相當於檢查用自然語言(例如英語)寫的一些普通文字是否真的有意義(無論它是否具有預期意義)。

語義分析的目的是檢查我們是否有有意義的標記序列。注意,一個序列可以在沒有正確的情況下有意義;在大多數程式語言中,短語“x + 1”將被認為是有意義的算術表示式。但是,如果程式設計師真的想寫“x - 1”,那麼它就不正確了。

名稱表

[編輯 | 編輯原始碼]
Clipboard

待辦事項
完成


是時候認真閱讀Aho & Ullman/龍書了。

語義分析是編譯器確定各種值的型別、這些型別如何在表示式中互動以及這些互動在語義上是否合理的活動。例如,你不能合理地將字串乘以類名,儘管沒有任何編輯器會阻止你寫

"abc" * MyClass

為此,編譯器必須首先識別宣告和作用域,並且通常將此步驟的結果記錄在一組符號表中。這告訴它特定識別符號在特定上下文中的含義。它還必須確定各種文字常量的型別;“abc”與 12.2e-5 的型別不同。

然後,它必須訪問所有使用識別符號和文字的位置,並驗證識別符號/文字的使用以及計算的結果是否與語言定義相容(如上面的示例所示)。

至於如何做到這一點:通常對原始碼進行解析,構建程式的某種表示(語法樹非常流行),然後逐元素遍歷(“訪問”)該表示以收集/驗證語義資訊。符號表通常只是一組與表示作用域的語法樹關聯的雜湊表,從識別符號雜湊到包含型別宣告的結構。

型別檢查

[編輯 | 編輯原始碼]

在靜態型別語言中,緊隨解析階段之後是型別檢查階段。這嘗試根據型別理論來捕捉程式設計錯誤。實際上,這是檢查諸如宣告為字串的變數是否未在需要整型的表示式中使用之類的事情。

在動態型別語言中,不執行型別檢查(實際上它被推遲到執行時)。

華夏公益教科書