integer - 如何从 clang 中的 Expr* 获取整数变量名称及其值

标签 integer clang

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

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

我想从表达式 lhsrhs 中提取整型变量名及其值。

假设我有 x = 10;,那么我想从 lhs10 中获取标识符 x来自 rhs
如果我有 x = x + 10; 那么我想从 lhsx + 10 中获取标识符 x作为 rhs

的子表达式

同样对于类型,当我转储 lhs 类型

时,我得到了这个 : int identifier
QualType type_lhs = lhs->getType();  
type_lhs->dump();  

如何为 clang 做到这一点?

最佳答案

使用 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 可以计算的值,例如 10,而不是 x + 10),请使用 ExprEvaluate* 函数:

llvm::APSInt Result;
if (rhs->EvaluateAsInt(Result, ASTContext)) {
  std::cout << "RHS has value " << Result.toString(10) << std::endl;
}

关于integer - 如何从 clang 中的 Expr* 获取整数变量名称及其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13189848/

相关文章:

c++ - Linux - 运行 valgrind 时不显示源文件/行

c++ - rand() 总是在应用程序重启时返回相同的序列

java - 从其他 Activity 获取整数变量

java - 在java中按降序或升序打印整数范围

c++ - 如何设置 CMake 与 clang 交叉编译 Windows 上嵌入的 ARM?

xcode - 在mac上,g++(clang)默认无法搜索/usr/local/include和/usr/local/lib

c - 将包含数字和字母的字符串放入结构中的 int 指针中

java - 在 Java 中使用指定的开始和结束索引查找数组中的最大整数,**递归**

从终端进行 iPhone 静态代码分析未能找到丢失的 ivar 版本

c - 如何为当前项目配置 .ycm_extra_conf.py include PATH