3

我正在编写一个 Clang 工具,并且试图弄清楚如何在访问程序 AST 的情况下评估字符串文字。给定以下程序:

class DHolder { 
public:
  DHolder(std::string s) {}
};

DHolder x("foo");    

我在 Clang 工具中有以下代码:

const CXXConstructExpr *ctor = ... // constructs `x` above
const Expr *expr = ctor->getArg(0); // the "foo" expression
???

如何在我的工具中从Expr表示"foo"字符串文字到实际的 C++ 字符串?我试图做类似的事情:

// From ExprConstant.cpp
Evaluate(result, info, expr);

但我不知道如何初始化resultinfo参数。

有什么线索吗?

4

2 回答 2

4

我意识到这是一个老问题,但我刚才遇到了这个问题,当时我无法使用stringLiteral()绑定到任何参数(代码不是 C++11)。例如,我有一个CXXMMemberCallExpr

addProperty(object, char*, char*, ...); // has 7 arguments, N=[0,6]

AST 转储显示前面StringLiteral是一个CXXBindTemporaryExpr. 因此,为了让我的 memberCallExpr 查询绑定 using hasArgument(N,expr()),我将查询包装为bindTemporaryExpr()(为了便于阅读,此处显示在单独的行中):

memberCallExpr(
    hasArgument(6, bindTemporaryExpr( 
        hasDescendant(stringLiteral().bind("argument"))
        )
    )
)
于 2015-06-05T17:42:22.927 回答
3

正确的方法是使用 AST 匹配器来匹配字符串文字并将名称绑定到它,以便以后可以引用它,如下所示:

StatementMatcher m = 
    constructExpr(hasArgument(0, stringLiteral().bind("myLiteral"))).bind("myCtor");

然后在匹配回调中执行以下操作:

const CXXConstructExpr *ctor = 
    result.Nodes.getNodeAs<CXXConstructExpr("optionMatcher");

const StringLiteral *optNameLiteral = 
    result.Nodes.getNodeAs<StringLiteral>("optName");

然后可以通过以下方式访问文字

optNameLiteral->getString().str();
于 2013-08-28T11:57:34.120 回答