我想匹配任何具有调用表达式的语句作为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'
| …Run Code Online (Sandbox Code Playgroud) 我编写了一个多行C宏,出于可读性的考虑,我想在每行的第80列插入字符'\'.一个例子可能有助于理解我需要什么.假设宏最初是这样的:
#define MY_MACRO \
expression \
a_longer_expression \
\
a_super_jumbo_size_expression \
macro_ends_here
Run Code Online (Sandbox Code Playgroud)
我希望最终结果是这样的:
#define MY_MACRO \
expression \
a_longer_expression \
\
a_super_jumbo_size_expression \
macro_ends_here
Run Code Online (Sandbox Code Playgroud)
因此,每行应填充从最后一个非空格字符到第79列的空格,然后在第80列中插入'\',包括空行.
这可能使用vim,sed或awk吗?如果是,怎么样?