我正在为clang编译器开发一个插件,并希望以字符串形式使用if语句的条件表达式。那就是:
if (a + b + c > 10)
return;
以及对代表它的IfStmt节点的引用,我想获得字符串“a + b + c> 10”。
我怀疑这是不可能的,但如果有人有任何见解,我将非常感激。
答案 0 :(得分:1)
提取IfStmt的条件部分,获取其开始和结束位置,并使用它来查询词法分析器以获取基础源代码。
using namespace clang;
class IfStmtVisitor
: public RecursiveASTVisitor<IfStmtVisitor> {
SourceManager &sm; // Initialize me!
CompilerInstance &ci; // Initialize me!
bool VisitIfStmt(IfStmt *stmt) {
Expr *expr = stmt->getCond();
bool invalid;
CharSourceRange conditionRange =
CharSourceRange::getTokenRange(expr->getLocStart(), expr->getLocEnd());
StringRef str =
Lexer::getSourceText(conditionRange, sm, ci.getLangOpts(), &invalid);
if (invalid) {
return false;
}
llvm::outs() << "Condition: " << str << "\n";
return true;
}
};
输入来源:
bool f(int a, int b, int c)
{
if (a + b + c > 10)
return true;
return false;
}
输出:
Condition string: a + b + c > 10
答案 1 :(得分:0)
我相信您可能想尝试查看printPretty
中Stmt
继承的IfStmt
函数。这应该有希望让你接近你想要的。