有没有办法以增量/在线的方式使用llvm-clang解析器?
假设我正在编写一个编辑器,并且我希望能够解析我面前的C++代码。
我不想写自己的破解解析器。
我想用一些功能齐全的东西,比如llvm-clang。
有没有一种简单的方法可以劫持llvm-clang解析器?(它是否足够快,可以在后台连续运行)?
谢谢!
发布于 2010-02-26 19:32:29
我不认为clang可以增量地解析C++文件,但它是这个项目的目标之一:http://clang.llvm.org/features.html
我已经为我的最后一年的项目写了类似的东西。它不是C++编辑器,而是一个Visual Studio插件,它的主要任务是改进C++智能感知(如Visual Assist X)。
当我写这个项目时,我也一直在考虑C++增量解析器,但我还没有找到任何合适的解决方案。为了解决C++智能感知问题,我使用了来自GCC的普通C++解析器。然而,在每次代码完成请求(ctrl+space)之后解析文件会很慢,只要尝试包含boost::spirit即可。为了让这个项目正常工作,我在后台解析文件,在每次代码完成请求之后,我将当前文件与它的前一个版本(通过diff)进行比较,以检测上次解析后所做的更改。有了这些更改,我更新了语法树,主要是通过添加或删除变量。
除了增量解析之外,类似这样的项目还有另一个问题。大多数情况下,您将解析正在编辑的C++代码,因此它是无效代码。考虑到复杂的C++语法,解析器有时无法从语法错误中恢复,因此它无法正确检测代码中的某些符号。
另一个问题是C++解析器/编译器的差异。假设我在Visual Studio中使用working,并且在代码中使用了一些特定于VC++编译器的构造。Clang解析器将无法正确解析它。
发布于 2013-01-12 00:32:16
为了编写类似于IntelliSense的代码,我建议您使用LALR解析算法编写自己的解析器。因为你可以在每一行中保存它的状态,所以当文件被编辑时,你不必重新解析整个文件,这是非常快的!
请注意,C++不能在BNF中完全表达,但我认为您可以通过一些调整得到相当大的效果。这当然比使用Clang的前端多得多的工作,但你仍然可以使用Clang与你自己编写的解析器合作来分析头文件。
https://stackoverflow.com/questions/2284448
复制相似问题