2010-02-17 40 views
11

無論如何要以增量/在線方式使用llvm-clang解析器嗎?llvm-clang:增量或在線解析器?

假設我正在編寫一個編輯器,我希望能夠解析我在我面前的C++代碼。

我不想寫我自己破解的解析器。

我想使用全功能的東西,如llvm-clang。

有沒有簡單的方法來劫持llvm-clang解析器? (而且速度足夠快,可以在後臺連續運行)?

謝謝!

+0

有人想製作一個Visual Studio克隆[在編譯前檢測錯誤] :) – Earlz

+0

有趣的項目。我一直在等待有人寫一個基於Clang的IDE。如果最終構建完整的IDE,請考慮使用CMake作爲其構建系統/項目文件。 – Tronic

+3

也許libclang的['clang_reparseTranslationUnit()'](http://clang.llvm.org/doxygen/group__CINDEX__TRANSLATION__UNIT.html#ga524e76bf2a809d037934d4be51ea448a)能滿足您的需求嗎? – bames53

回答

3

我不認爲鐺可以逐步解析C++的文件,但它是這個項目的目標之一:http://clang.llvm.org/features.html

我寫我的最後一年的項目類似的東西。它不是C++編輯器,而是Visual Studio插件,主要任務是改進C++智能感知(如Visual Assist X)。

當我寫這個項目時,我一直在考慮C++增量式解析器,但是我還沒有找到任何合適的解決方案。爲了解決C++ intellisense問題,我使用了GCC的普通C++解析器。然而,它會減慢,在每個代碼完成請求(ctrl +空格)之後解析文件,只需嘗試包括boost :: spirit。爲了使這個項目能夠正常工作,我在後臺解析了文件,並且在每次完成代碼完成請求之後,我將當前文件與之前版本(通過diff)進行比較,以檢測上次解析所做的更改。進行這些更改後,我更新了語法樹,主要是通過添加或刪除變量。

除增量解析外,這樣的項目也存在另一個問題。大多數情況下,您將解析正在編輯的C++代碼,因此它是無效的代碼。鑑於複雜的C++語法,有時分析器將無法從語法錯誤中恢復,因此它不會正確檢測代碼中的某些符號。

另一個問題是C++解析器/編譯器的差異。假設我在Visual Studio中工作,並在代碼中使用了一些VC++編譯器特定的構造。 Clang解析器將無法正確解析它。

0

爲了寫一些類似於IntelliSense的東西,我建議你使用LALR解析算法編寫你自己的解析器。既然你可以在每行中保存它的狀態,所以當文件被編輯時,你不必重新分析整個文件,這非常快!
請注意,C++不能在BNF中完全表達,但我認爲你可以做一些調整。這當然比使用Clang的前端更多的工作,但是你仍然可以使用Clang來分析你自己編寫的解析器的頭文件。

+0

問題是,真的很難獲得正確的C++解析器。無論你寫什麼都可能不具備實際編譯器的確切行爲。理想情況下,這是clang項目的目標之一,用於構建編譯器的相同庫可以被IDE重用以獲得一致的結果。 – bames53