3

我在VisitBinaryOperator()Clang 的覆盖方法中有以下代码:

Expr* lhs = E->getLHS();  
Expr* rhs = E->getRHS();  

lhs我想从表达式和中提取整数变量名称及其值rhs

假设我有,x = 10;那么我想从中x获取标识符。 如果我有, 那么我想从中获取标识符并作为子表达式lhs10rhs
x = x + 10;xlhsx + 10rhs

同样对于类型,: int identifier当我转储lhs类型时我会得到这个

QualType type_lhs = lhs->getType();  
type_lhs->dump();  

如何为 clang 做到这一点?

4

1 回答 1

5

用于dyn_cast确定您在 LHS 上的表达方式:

if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(lhs)) {
  // It's a reference to a declaration...
  if (VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
    // It's a reference to a variable (a local, function parameter, global, or static data member).
     std::cout << "LHS is " << VD->getQualifiedNameAsString() << std::endl;
  }
}

如果要处理 LHS 上的其他表达式形式,则需要更复杂的代码。如果您想在那里处理任意代码,请查看RecursiveASTVisitor.

要评估右侧的值(假设它是 Clang 可以评估的值,like 10, not like x + 10),请使用ExprEvaluate*函数之一:

llvm::APSInt Result;
if (rhs->EvaluateAsInt(Result, ASTContext)) {
  std::cout << "RHS has value " << Result.toString(10) << std::endl;
}
于 2012-12-08T07:51:37.100 回答