ClangAST Consumer:如何遍历FunctionDecl中的语句,VarDecl,BinaryOperator?

时间:2019-06-11 08:44:57

标签: c++ clang abstract-syntax-tree llvm-clang clang-ast-matchers

在叮当声的AST使用者中,我有一个用于FunctionDecl的助行器。如何遍历函数声明中的DeclStmt,Statements,BinaryOperator。请举一个例子。

1 个答案:

答案 0 :(得分:0)

问题不多。举一个例子,您想通过这种遍历完成什么就更清楚了。因此,有了这么多信息,我只能在这里建议最通用的解决方案。

Clang为AST访问者和遍历者提供了一些课程。 Visitors pattern的典型代表,而 traversers 是也遍历每个节点的子代的访问者。主要的 traverser RecursiveASTVisitor 。您可以在manualdocumentation中阅读它。

这里是一个例子:

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;
  }
};

此解决方案将访问ANY函数声明,声明语句和二进制表达式。如果您想要更优化的方法,可以通过重新定义 Traverse * 方法等来调整遍历。如果不是这种情况,您始终可以使用StmtVisitorDeclVisitorTypeVisitorTypeLocVisitor来实现自己的 traverser

我希望这些信息对您有所帮助。使用Clang进行快乐的黑客入侵!