单行多变量声明的访问者

时间:2016-12-27 04:57:47

标签: c++ parsing abstract-syntax-tree llvm-clang libtooling

我是Clang libTooling开发的新手。

考虑以下变量声明

int i, j, k = 10;
^              ^  

对于我的项目要求,我想捕获整个声明表达式,包括" i"," j"和" k"。

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

我所遇到的是,我没有让访问者获得完整的表达,而是让访问者获得个别变量声明。

这是clang libTooling中的预期行为还是我错过了什么?

请建议我捕获单行多声明或任何解决方法的正确方法? 任何形式的帮助都将非常感激。

谢谢, 与Hemant

1 个答案:

答案 0 :(得分:2)

要解决上述问题,您可以编写一个访问DeclStmt个节点(不仅是VarDecl)的递归AST访问者。查看此网站,了解如何撰写此类访问者:http://clang.llvm.org/docs/RAVFrontendAction.html

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

    |-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&#34;捕获&#34;所有VarDecl个节点(以及初始化,如果给定)。 访问者访问DeclStmt后,如果您的声明引用了单个声明,则可以使用isSingleDecl()成员函数进行检查。如果不是(在您的情况下),您可以使用VarDecldecl_begin()等检索到不同decl_end()节点的迭代器。