2010-02-17 22 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