2012-07-16 30 views
2

我想了解叮噹的來龍去脈,而且我不太確定「Sema」庫。語法分析是編譯器編譯程序所用的路徑嗎?還是僅供程序員用來分析他/她的代碼?Clang中的語義分析步驟是編譯器的重要部分嗎?

從我收集的內容中,解析器創建一個AST,然後有「AST消費者」使用AST來做不同的事情。因此,代碼生成庫將AST轉換爲IR。語義分析庫使用AST來分析代碼。這種理解是否正確,或者語義分析器是否也用於編譯?

+1

Clang有點奇怪:Sema不僅檢查AST並插入隱式轉換/聲明/任何內容,但它也負責構建AST本身。這對編譯器來說不是一個非常典型的安排。 – 2012-07-18 07:58:13

+0

@ SK邏輯它負責構建AST?但是解析器是做什麼的?解析器如何將其發現與語義分析器交流? – Hassan 2012-07-18 12:23:51

+1

解析器直接調用Sema,爲每個完整的表達式或語句。涉及到一些中間結構(例如,用於表示已解析但尚未解析的類型),但最終的Clang AST由Sema生成。 – 2012-07-18 12:28:04

回答

3

語義分析是編譯分析過程的一部分,通常是在詞法和語法分析之後進行的。語義分析器檢查使用的數據類型的有效性,是否進行類型轉換等,並在出現錯誤時報告錯誤。換句話說,就語義分析而言,編譯器已經確定在程序(詞法)中使用了有效的單詞,並且根據給定的語言語法(語法),正確地構建了句子。只剩下檢查這些句子是否有意義 - 檢查數據類型,返回值,邊界大小,未初始化的變量等。

我對編譯過程的瞭解比Clang更普遍而不是具體,但我認爲語義分析在代碼分析中絕對存在。

+1

如果C++語法完全獨立於類型,那將是正確的。不幸的是,你甚至不能正確解析'a * b;'而不知道'a'是否是一個類型。 – fredoverflow 2016-06-04 14:55:12