回答
遞歸ASTVisitor可以做你所需要的。
實現您RecursiveASTVisitor`派生類(如MyClass的)會做的伎倆的member methodsTraverseDecl(Decl *x)
,TraverseStmt(Stmt *x)
和TraverseType(QualType x)
。綜合起來,這三種方法將帶您到AST中的每個節點。
例子:
class MyClass : public RecursiveASTVisitor<MyClass> {
public:
bool TraverseDecl(Decl *D) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseDecl(D); // Forward to base class
return true; // Return false to stop the AST analyzing
}
bool TraverseStmt(Stmt *x) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseStmt(x);
return true;
}
bool TraverseType(QualType x) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseType(x);
return true;
}
};
非常感謝你,我認爲這可能會訣竅:) – hbn1991
RecursiveASTVisitor的文檔列出了更多的遍歷...()方法。這些也不應該被執行嗎?還是會重複顛倒? –
您可以使用任何方法,但通常您可能想要遍歷最抽象的類型(Expr,Stmt),例如在IfStmt中如果要有條件地遍歷Then/Else部分(而不關心它們的實際類型) 。 –
- 1. 遍歷AST節點
- 2. 使用LLVM遍歷AST
- 3. 的Python AST包:遍歷對象層次
- 4. AST樹的遍歷特定部分
- 5. 如何遍歷由spidermonkey生成的AST(Javascript文件)
- 6. 如何打印手寫AST?
- 7. 如何遍歷
- 8. 如何遞歸遍歷XPath?
- 9. 遍歷塊軌道幫手
- 10. 在C中自動遍歷樹遍歷#
- 11. 如何遍歷SAFEARRAY **
- 12. 如何遍歷int [] []?
- 13. 如何遍歷MultiKeyMap?
- 14. 如何遍歷JsonObject?
- 15. 如何遍歷priority_queue?
- 16. 如何遍歷QStringList
- 17. 如何遍歷System.Windows.SystemParameters?
- 18. 如何遍歷JSON?
- 19. 如何遍歷scalaz
- 20. 如何遍歷dacpac
- 21. 如何遍歷Btree?
- 22. 遍歷樹遍歷
- 23. 如何遍歷DOM來滑動元素?
- 24. 如何自動遍歷組合
- 25. 如何動態遍歷一個包?
- 26. JQuery遍歷XML。如何使其動態?
- 27. android - 如何遍歷所有活動?
- 28. 擺動DefaultStyledDocument遍歷
- 29. 如何在AST遍歷中跳過使用pyc綁定libclang的子樹
- 30. ast模塊使用什麼類型的樹遍歷?
什麼錯'RecursiveASTVisitor'? –
@ m.s。 RecursiveASTVisitor沒有什麼問題,它只是遍歷特定的子樹,例如像AST中所有MethodCalls的集合,但我想要的是遍歷AST的所有節點,逐個提取一些關於每個節點。這就是爲什麼我需要一個方法來遍歷節點的AST節點。 – hbn1991