Cursors 和 Nodes 遍历 AST 有什么区别

What is the difference between AST traversal by Cursors and Nodes

我正在使用 libclang 来解析小型 C++ 文件。我看过有关如何解析 AST 树的示例。

据我所知,AST 由 A​​STNodes 组成,其类型为 DeclStmt.要遍历树,我可以使用访问 A​​STNodesCxCursors.

的 ASTConsumer

这两种遍历方式有什么区别?

两者都是 AST 遍历相同方法的一部分,因为游标是 AST 节点上的指针。如果您正在寻找一种不同的 AST 遍历方法,您应该查看 AST 匹配器。使用该方法,您可以定义要与源文件的 AST 匹配的 AST 模型。它可以是一个强大的方法。

这里介绍一下如何用Clang匹配:https://clang.llvm.org/docs/LibASTMatchers.html

在阅读了一些页面后,我找到了一些关于这个主题的信息。根据 clang Tooling 文档,有两个工具(以及其他 clang 工具): - libclang - 库工具

CxCursors 属于 Libclang 库。 Libclang 库提供了遍历 AST 的游标,尽管对 AST 的控制是有限的。

类Decl 和 Stmt 是 Libtooling 的一部分。通过定义一个 RecursiveASTVisitor 及其相应的访问函数,可以遍历这些节点。使用这种方法可以完全控制 AST。