gpt4 book ai didi

c++ - 使用 Clang ASTMatcher 发出匹配非嵌套 for 语句

转载 作者:太空宇宙 更新时间:2023-11-04 13:11:29 30 4
gpt4 key购买 nike

我正在尝试使用 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++){}}

我只想匹配' for(int x=0;x<10<x++){ } '

为此,我构建了一个匹配器:

StatementMatcher forStmtMatcher = forStmt(unless(anyOf(hasAncestor(forStmt()),hasDescendant(forStmt()))))

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

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

最佳答案

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

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 匹配器构造函数转换中的错误。

关于c++ - 使用 Clang ASTMatcher 发出匹配非嵌套 for 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39664565/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com