Parsing llvm clang:增量解析器还是在线解析器?

Parsing llvm clang:增量解析器还是在线解析器?,parsing,llvm,clang,Parsing,Llvm,Clang,是否有以增量/在线方式使用llvm clang解析器的方法 我说我正在写一个编辑器,我想能够解析我前面的C++代码。 我不想写我自己的黑客解析器 我想使用一些全功能的东西,比如llvm叮当声 有没有一种简单的方法可以劫持llvm铿锵解析器?(它是否足够快,可以在后台连续运行) 谢谢 >我不认为CLAN可以逐步解析C++文件,但它是这个项目目标之一: 我已经为我最后一年的项目写了类似的东西。它不是C++编辑器,而是VisualStudio插件,主要任务是改进C++智能感知(如Visual Asvi

是否有以增量/在线方式使用llvm clang解析器的方法

我说我正在写一个编辑器,我想能够解析我前面的C++代码。 我不想写我自己的黑客解析器

我想使用一些全功能的东西,比如llvm叮当声

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


谢谢

>我不认为CLAN可以逐步解析C++文件,但它是这个项目目标之一:

我已经为我最后一年的项目写了类似的东西。它不是C++编辑器,而是VisualStudio插件,主要任务是改进C++智能感知(如Visual Asvices X)。 当我写这个项目时,我也在思考C++增量解析器,但是我没有找到任何合适的解决方案。为了解决C++智能感知问题,我使用了GCC中的普通C++解析器。然而,要在每次代码完成请求(ctrl+space)后解析文件,只需尝试包含boost::spirit,速度就会变慢。为了使这个项目正常工作,我在后台解析了文件,在每次代码完成请求之后,我将当前文件与其以前的版本(通过diff)进行比较,以检测上次解析所做的更改。有了这些更改,我更新了语法树,主要是通过添加或删除变量

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

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

对于编写类似于IntelliSense的内容,我建议您使用LALR解析算法编写自己的解析器。因为你可以在每一行保存它的状态,所以当一个文件被编辑后,你不必重新分析整个文件,这是非常快的

请注意,C++不能在BNF中充分表达,但我认为在某些调整下,您可以得到相当远的结果。当然,这比使用Clang的前端要多得多,但您仍然可以使用Clang与您自己编写的解析器合作分析头文件。

有人想制作一个Visual Studio克隆(在编译之前检测错误):)有趣的项目。我一直在等待有人编写一个基于叮当声的IDE。如果您最终建立了一个完整的IDE,请考虑使用CGEAS作为其构建系统/项目文件。也许LBCLANG可以满足您的需求?问题是,很难得到C++解析器的权限。无论您编写什么,都可能没有实际编译器的确切行为。理想情况下,这是clang项目的目标之一,IDE可以重用用于构建编译器的相同库以获得一致的结果。