2015-06-12 62 views
6

我可以使用recursivevisitor類遍歷clang AST的特定子樹,但我想要做的是按節點遍歷叮噹AST節點。如何手動遍歷ngng AST?

如果有人能幫助我,我會很感激。

在此先感謝。

+0

什麼錯'RecursiveASTVisitor'? –

+0

@ m.s。 RecursiveASTVisitor沒有什麼問題,它只是遍歷特定的子樹,例如像AST中所有MethodCalls的集合,但我想要的是遍歷AST的所有節點,逐個提取一些關於每個節點。這就是爲什麼我需要一個方法來遍歷節點的AST節點。 – hbn1991

回答

12

遞歸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; 
    } 
}; 
+0

非常感謝你,我認爲這可能會訣竅:) – hbn1991

+0

RecursiveASTVisitor的文檔列出了更多的遍歷...()方法。這些也不應該被執行嗎?還是會重複顛倒? –

+0

您可以使用任何方法,但通常您可能想要遍歷最抽象的類型(Expr,Stmt),例如在IfStmt中如果要有條件地遍歷Then/Else部分(而不關心它們的實際類型) 。 –