C++ 用于单行多变量声明的clang ast visitor

C++ 用于单行多变量声明的clang ast visitor,c++,parsing,abstract-syntax-tree,llvm-clang,libtooling,C++,Parsing,Abstract Syntax Tree,Llvm Clang,Libtooling,我不熟悉Clang libTooling开发 考虑以下变量声明 int i, j, k = 10; ^ ^ 对于我的项目需求,我想捕获整个声明表达式,包括“I”、“j”和“k” 如何使用clanglibtooling捕获包含所有变量的完整声明表达式 我所经历的是,我没有得到完整表达式的访问者,而是得到单个变量声明的访问者 这是clang libTooling中的预期行为还是我遗漏了什么 请告诉我捕获单行多声明或任何解决方法的正确方法? 任何形式的帮助都将不胜感激

我不熟悉Clang libTooling开发

考虑以下变量声明

int i, j, k = 10;
^              ^  
对于我的项目需求,我想捕获整个声明表达式,包括“I”、“j”和“k”

如何使用clanglibtooling捕获包含所有变量的完整声明表达式

我所经历的是,我没有得到完整表达式的访问者,而是得到单个变量声明的访问者

这是clang libTooling中的预期行为还是我遗漏了什么

请告诉我捕获单行多声明或任何解决方法的正确方法? 任何形式的帮助都将不胜感激

谢谢,
Hemant

为了解决所描述的问题,您可以编写一个递归AST访问者,访问
DeclStmt
节点(不仅仅是
VarDecl
)。查看此网站,了解如何编写此类访问者:

您应该访问
DeclStmt
节点而不仅仅是
VarDecl
节点的原因可以通过查看声明语句的AST表示来解释:

    |-DeclStmt 0x35dbfc8 <line:3:1, col:17>
    | |-VarDecl 0x35dbe48 <col:1, col:5> col:5 i 'int'
    | |-VarDecl 0x35dbeb8 <col:1, col:8> col:8 j 'int'
    | `-VarDecl 0x35dbf28 <col:1, col:15> col:11 k 'int' cinit
    |   `-IntegerLiteral 0x35dbf88 <col:15> 'int' 10
|-DeclStmt 0x35dbfc8
||-VarDecl 0x35dbe48列:5 i'int'
||-VarDecl 0x35dbeb8列:8 j‘int’
|`-VarDecl 0x35dbf28列:11 k'int'cinit
|`-IntegerLiteral 0x35dbf88'int'10
如您所见,
DeclStmt
“捕获”所有
VarDecl
节点(以及初始化,如果给定)。
访问者访问
DeclStmt
后,您可以使用
isSingleDecl()
成员函数检查您的声明是否引用了单个声明。如果没有(如您的情况),您可以使用
decl_begin()
decl_end()
,等检索不同
VarDecl
节点的迭代器。

我不确定是否有一种内置方法可以捕获libclangapi中一行的全部声明,但也许您可以通过比较这些变量的源代码位置来解决这个问题,以便识别何时在同一行中声明了一些变量。我当然可以这样做,但它背后的目的是遵循Java和C#中遵循的解析顺序。由于没有内置的方法,我必须手动遍历我想要避免的VarDecl。这只适用于局部变量。对于全局变量和类成员,AST不显示任何公共DeclStmt。是否有更新?可能使用clang_getCursorExtent()?我认为I、j和k的“开始”位置将是相同的。。。仍然需要在用户端进行解析,但只需要最少的解析。