1

我尝试过的代码如下:

if(const ArraySubscriptExpr *array = Result.Nodes.getNodeAs<ArraySubscriptExpr>("array"))
    {
        llvm::outs() << array->getBase() <<'\n';
    }

getBase()应该打印数组标识符,但它正在打印地址,例如0x559f7da7e838。如何打印数组名称/标识符?例如,在arr[i] = 40 的情况下; 我想打印arr

4

1 回答 1

1

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;
        }
    }
}
于 2020-06-23T20:39:27.190 回答