我尝试的代码如下:
if(const ArraySubscriptExpr *array = Result.Nodes.getNodeAs<ArraySubscriptExpr>("array"))
{
llvm::outs() << array->getBase() <<'n';
}
getBase((应该打印数组标识符,但它正在打印地址,例如0x559f7da7e838。如何打印阵列名称/标识符? 例如,在arr[i] = 40 的情况下;我想打印到达
getBase 返回一个指向基本表达式的指针,因此这就是打印地址的原因。arr[i] 的 AST 是:
| |-ArraySubscriptExpr 0xc04c608 <col:3, col:8> 'double' lvalue
| | |-ImplicitCastExpr 0xc04c5d8 <col:3> 'double *' <LValueToRValue>
| | | `-DeclRefExpr 0xc04c598 <col:3> 'double *' lvalue Var 0xc04c480 'arr' 'double *'
| | `-ImplicitCastExpr 0xc04c5f0 <col:7> 'int' <LValueToRValue>
| | `-DeclRefExpr 0xc04c5b8 <col:7> 'int' lvalue Var 0xc04c518 'i' 'int'
可以看出,数组的名称出现在 ImplicitCastExpr 节点的子节点中,该节点是 ArraySubscriptExpr 的子节点。这对我有用:
if (auto *array = dyn_cast<ArraySubscriptExpr>(st)) {
if (auto *cast = dyn_cast<ImplicitCastExpr>(array->getBase())) {
if (auto *decl = dyn_cast<DeclRefExpr>(cast->getSubExpr())) {
cout << decl->getNameInfo().getAsString() << endl;
}
}
}