小编rec*_*ecu的帖子

Clang的hasDescendant匹配器和深度嵌套的AST节点

我想匹配任何具有调用表达式的语句作为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)

clang abstract-syntax-tree

6
推荐指数
0
解决办法
678
查看次数

在文本文件的多行的第80列中插入字符

我编写了一个多行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吗?如果是,怎么样?

vim awk sed

0
推荐指数
2
解决办法
866
查看次数

标签 统计

abstract-syntax-tree ×1

awk ×1

clang ×1

sed ×1

vim ×1