0

在 clang AST 消费者内部,我有一个用于 FunctionDecl 的 walker。如何遍历函数声明中的 DeclStmt、Statements、BinaryOperator。请举个例子。

4

1 回答 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*方法等来调整遍历。如果不是这种情况,您始终可以使用StmtVisitorDeclVisitorTypeVisitorTypeLocVisitor实现自己的遍历器。

我希望这些信息对您有用并且对您有所帮助。与 Clang 一起愉快地进行黑客攻击!

于 2019-06-11T09:32:17.307 回答