无论如何以增量/在线方式使用llvm-clang解析器?
假设我正在编写一个编辑器,并且我希望能够解析我面前的 C++ 代码。
我不想编写自己的破解解析器。
我想使用功能齐全的东西,比如 llvm-clang。
有没有一种简单的方法来劫持 llvm-clang 解析器?(并且它是否足够快以在后台连续运行它)?
谢谢!
我不认为 clang 可以增量解析 C++ 文件,但这是该项目的目标之一:http ://clang.llvm.org/features.html
我为我最后一年的项目写了类似的东西。它不是 C++ 编辑器,而是一个 Visual Studio 插件,主要任务是改进 C++ 智能感知(如 Visual Assist X)。
当我写这个项目的时候,我也一直在考虑 C++ 增量解析器,但是我还没有找到任何合适的解决方案。为了解决 C++ 智能感知问题,我使用了来自 GCC 的普通 C++ 解析器。但是它很慢,在每个代码完成请求(ctrl+空格)之后解析文件,只需尝试包含 boost::spirit。为了使这个项目正常工作,我在后台解析了文件,在每个代码完成请求之后,我将当前文件与其以前的版本(通过差异)进行比较,以检测上次解析所做的更改。有了这些更改,我更新了语法树,主要是通过添加或删除变量。
除了增量解析,像这样的项目还有另一个问题。大多数情况下,您将解析正在编辑的 C++ 代码,因此它是无效代码。鉴于复杂的 C++ 语法,有时解析器无法从语法错误中恢复,因此它无法正确检测代码中的某些符号。
另一个问题是 C++ 解析器/编译器的差异。假设我在 Visual Studio 中工作,并且在我的代码中使用了一些 VC++ 编译器特定的构造。Clang 解析器将无法正确解析它。
For writing something similair to IntelliSense, I would advise you to write your own parser using the LALR parsing algorithm. Since you can save its state in each line so you don't have to reparse the whole file when a file has been editted, which is very fast!
Note that C++ can't be fully expressed in BNF, but I think you could get pretty far with some adjustments. It's ofcourse a lot more work than using Clang's frontend, but you could still use Clang for analysing header files in coöperation with you own written parser.