使用Clang ASTMatcher发出与非嵌套for语句匹配的问题

时间:2016-09-23 15:32:36

标签: c++ clang

我正在尝试使用Clang ASTMatcher在C ++代码中匹配单个for循环,即在源文件中如下所示

for(int x=0;x<10;x++){ } 
for(int y=0;y<10;y++){for(int z=0;z<5;z++){}}

我想仅匹配&#39; for(int x=0;x<10<x++){ }&#39;

为了做到这一点,我建立了一个匹配器:

StatementMatcher forStmtMatcher = forStmt(unless(anyOf(hasAncestor(forStmt()),hasDescendant(forStmt()))))
我认为应该有效,但事实并非如此。匹配包括我不想要的for(int y=0;y<10;y++),如果我在anyOf()匹配器中交换条件的位置,它匹配for(int z=0;z<5;z++)而不是我也不想要。

有人可以解释原因或告诉我如何解决它吗?

1 个答案:

答案 0 :(得分:0)

我同意你发布的内容看起来应该可行 - 但它无法通过clang-query 3.8和4.0产生预期的结果。如果您尝试绑定中间匹配的变量,它似乎可以工作。

Clang查询代码(为清晰起见,设置类型集,删除要运行的换行符)

set bind-root false
match forStmt(
    unless(hasAncestor(forStmt().bind('x'))),      
    unless(hasDescendant(forStmt().bind('y')))).bind('for')

对于一个等效的例子:

int main()
{ 
    for(int x=0;x<10;x++){ }
    for(int y=0;y<10;y++){for(int z=0;z<5;z++){}}
}

产地:

Match #1:

/vagrant/stackoverflow-ast-query/loops.cpp:3:5: note: "for" binds here
    for(int x=0;x<10;x++){ }
    ^~~~~~~~~~~~~~~~~~~~~~~~
1 match.

看起来这是AST匹配器构造函数转换中可能存在的错误。