llvm-clang:增量或在线解析器?

时间:2010-02-17 21:12:27

标签: parsing llvm clang

无论如何以增量/在线方式使用llvm-clang解析器?

说我正在编写一个编辑器,我希望能够解析我面前的C ++代码。

我不想写自己的黑客攻击解析器。

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

有没有一种简单的方法可以劫持llvm-clang解析器? (它是否足够快以在后台连续运行?)

谢谢!

2 个答案:

答案 0 :(得分:3)

我不认为clang可以逐步解析C ++文件,但这是项目目标之一:http://clang.llvm.org/features.html

我为我的最后一年项目编写了类似的东西。它不是C ++编辑器,而是一个Visual Studio插件,主要任务是改进C ++ intellisense(如Visual Assist X)。

当我写这个项目时,我一直在考虑C ++增量解析器,但我还没有找到任何合适的解决方案。为了解决C ++ intellisense问题,我使用了GCC的普通C ++解析器。然而,在每次代码完成请求(ctrl + space)之后,要解析文件,请尝试包含boost :: spirit。为了使这个项目正常工作,我在后台解析文件,在每次代码完成请求之后,我将当前文件与它的先前版本(通过diff)进行比较,以检测上次解析所做的更改。进行这些更改后,我更新了语法树,主要是通过添加或删除变量。

除了增量解析之外,这样的项目还存在另一个问题。大多数情况下,您将解析正在编辑的C ++代码,因此它是无效的代码。鉴于复杂的C ++语法,有时解析器将无法从语法错误中恢复,因此它无法正确检测代码中的某些符号。

另一个问题是C ++解析器/编译器的差异。假设我正在使用Visual Studio,我在代码中使用了一些VC ++编译器特定的构造。 Clang解析器无法正确解析它。

答案 1 :(得分:0)

为了向IntelliSense写一些similair,我建议你使用LALR解析算法编写自己的解析器。由于您可以在每行中保存其状态,因此您无需在编辑文件时重新分析整个文件,这非常快! 请注意,C ++无法在BNF中完全表达,但我认为您可以通过一些调整得到很好的结果。它比使用Clang的前端要多得多,但是你仍然可以使用Clang来分析与你自己编写的解析器相关的头文件。