rec*_*ecu 6 clang abstract-syntax-tree
我想匹配任何具有调用表达式的语句作为AST的后代。这是一个简单的示例:
int foo() {
return 5;
}
int main() {
int a;
a = foo();
return 0:
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,我想匹配该a = foo();语句。为了做到这一点,我创建了以下匹配器,它可以正常工作:
StatementMatcher sm = stmt(hasParent(compoundStmt()),
hasDescendant(callExpr()));
Run Code Online (Sandbox Code Playgroud)
问题是,如果我将语句的RHS更改为更复杂的表达式(例如a = 5 + foo();而不是),则该匹配器将不起作用a = foo();。hasDescendantClang文档中对匹配器的描述是这样的:
匹配具有与提供的匹配器匹配的后代AST节点的AST节点。
据此,匹配器也应在第二种情况下工作,但事实并非如此。为什么不?还有其他方法可以匹配这种陈述吗?
我为您提供了两种情况的误报。
a = foo(); 倾倒:
`-CompoundStmt 0x4223c40 <line:6:12, line:10:1>
|-DeclStmt 0x4223b08 <line:7:3, col:8>
| `-VarDecl 0x4223ab0 <col:3, col:7> a 'int'
|-BinaryOperator 0x4223bd8 <line:8:3, col:11> 'int' '='
| |-DeclRefExpr 0x4223b20 <col:3> 'int' lvalue Var 0x4223ab0 'a' 'int'
| `-CallExpr 0x4223bb0 <col:7, col:11> 'int'
| `-ImplicitCastExpr 0x4223b98 <col:7> 'int (*)()' <FunctionToPointerDecay>
| `-DeclRefExpr 0x4223b48 <col:7> 'int ()' Function 0x42238e0 'foo' 'int ()'
`-ReturnStmt 0x4223c20 <line:9:3, col:10>
`-IntegerLiteral 0x4223c00 <col:10> 'int' 0
Run Code Online (Sandbox Code Playgroud)
a = 5 + foo(); 倾倒:
`-CompoundStmt 0x4a9ec88 <line:6:12, line:10:1>
|-DeclStmt 0x4a9eb08 <line:7:3, col:8>
| `-VarDecl 0x4a9eab0 <col:3, col:7> a 'int'
|-BinaryOperator 0x4a9ec20 <line:8:3, col:15> 'int' '='
| |-DeclRefExpr 0x4a9eb20 <col:3> 'int' lvalue Var 0x4a9eab0 'a' 'int'
| `-BinaryOperator 0x4a9ebf8 <col:7, col:15> 'int' '+'
| |-IntegerLiteral 0x4a9eb48 <col:7> 'int' 5
| `-CallExpr 0x4a9ebd0 <col:11, col:15> 'int'
| `-ImplicitCastExpr 0x4a9ebb8 <col:11> 'int (*)()' <FunctionToPointerDecay>
| `-DeclRefExpr 0x4a9eb68 <col:11> 'int ()' Function 0x4a9e8e0 'foo' 'int ()'
`-ReturnStmt 0x4a9ec68 <line:9:3, col:10>
`-IntegerLiteral 0x4a9ec48 <col:10> 'int' 0
Run Code Online (Sandbox Code Playgroud)