在 clang AST 消费者内部,我有一个用于 FunctionDecl 的 walker。如何遍历函数声明中的 DeclStmt、Statements、BinaryOperator。请举个例子。
问问题
485 次
1 回答
1
问题中没有太多信息。举一个你想用这种遍历方式完成什么的例子会更清楚。所以,有了这么多信息,我只能在这里建议最通用的解决方案。
Clang 为 AST 访问者和遍历者提供了一些类。访问者是模式的典型代表,而遍历者是也遍历每个节点的子节点的访问者。主要的遍历器是RecursiveASTVisitor。您可以在手册或文档中了解它。
这是一个例子:
class Traverser : public RecursiveASTVisitor<Traverser> {
public:
bool VisitFunctionDecl(FunctionDecl *D) {
D->dump();
return true;
}
bool VisitDeclStmt(DeclStmt *DS) {
DS->dump();
return true;
}
bool VisitBinaryOperator(BinaryOperator *BO) {
BO->dump();
return true;
}
};
该解决方案将访问任何函数声明、声明语句和二进制表达式。如果您想要更优化的方法,您可以通过重新定义Traverse*方法等来调整遍历。如果不是这种情况,您始终可以使用StmtVisitor、DeclVisitor、TypeVisitor和TypeLocVisitor实现自己的遍历器。
我希望这些信息对您有用并且对您有所帮助。与 Clang 一起愉快地进行黑客攻击!
于 2019-06-11T09:32:17.307 回答