在叮当声的AST使用者中,我有一个用于FunctionDecl的助行器。如何遍历函数声明中的DeclStmt,Statements,BinaryOperator。请举一个例子。
答案 0 :(得分:0)
问题不多。举一个例子,您想通过这种遍历完成什么就更清楚了。因此,有了这么多信息,我只能在这里建议最通用的解决方案。
Clang为AST访问者和遍历者提供了一些课程。 Visitors 是pattern的典型代表,而 traversers 是也遍历每个节点的子代的访问者。主要的 traverser 是 RecursiveASTVisitor 。您可以在manual或documentation中阅读它。
这里是一个例子:
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 * 方法等来调整遍历。如果不是这种情况,您始终可以使用StmtVisitor,DeclVisitor,TypeVisitor和TypeLocVisitor来实现自己的 traverser 。
我希望这些信息对您有所帮助。使用Clang进行快乐的黑客入侵!