我正在尝试使用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++)
而不是我也不想要。
有人可以解释原因或告诉我如何解决它吗?
答案 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匹配器构造函数转换中可能存在的错误。