3

VisitBinaryOperator()clangのオーバーライドされたメソッドに次のコードがあります。

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

lhs式andから整数変数名とその値を抽出したいrhs

を持っているとします。次に、とからx = 10;識別子を取得したいとします。 私が持っている場合 、識別子を取得し、サブ式として取得したいxlhs10rhs
x = x + 10;xlhsx + 10rhs

また、タイプについては、タイプをダンプするときにこれを取得してい: int identifierますlhs

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

これはclangでどのように行うことができますか?

4

1 に答える 1

5

dyn_castLHS にどのような表現があるかを判断するために使用します。

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 が評価できるものであると仮定して10) 、の関数の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 に答える