2015-06-12 13 views
6

Ich kann die spezifischen Teilbäume von AST mit dem recursivevisitor-Klasse durchqueren, aber was ich tun möchte, ist das Queren AST Ast für Knoten.Wie durchqueren Sie AST manuell?

Ich wäre wirklich dankbar, wenn mir jemand dabei helfen könnte.

Vielen Dank im Voraus.

+0

, was ist falsch mit 'RecursiveASTVisitor'? –

+0

@ m.s. Es ist nichts falsch mit dem RecursiveASTVisitor, es ist nur so, dass es nur bestimmte Unterbäume durchläuft, zum Beispiel wie die Menge aller MethodCalls im AST, aber was ich will, ist durch alle Knoten des AST zu gehen, eins nach dem anderen zu extrahieren jeder Knoten. Deshalb brauche ich eine Methode, um den AST Knoten für Knoten zu durchlaufen. – hbn1991

Antwort

12

RecursiveASTVisitor kann tun, was Sie brauchen.

Umsetzung der member methodsTraverseDecl(Decl *x), TraverseStmt(Stmt *x) und TraverseType(QualType x) für Ihre RecursiveASTVisitor` abgeleitete Klasse (z MyClass) den Trick. Kombiniert führen diese drei Methoden Sie zu jedem einzelnen Knoten in Ihrem AST.

Beispiel:

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

Vielen Dank, ich denke, dies könnte den Trick tun :) – hbn1991

+0

Die Dokumentation von RecursiveASTVisitor listet mehr Traverse ...() -Methoden. Sollten diese nicht auch umgesetzt werden? Oder wird diese Traversion duplizieren? –

+0

Sie können jede der Methoden verwenden, aber normalerweise werden Sie wahrscheinlich die abstraktesten Typen (Expr, Stmt) durchqueren, zum Beispiel in IfStmt, wenn Sie die Then/Else-Teile bedingt durchlaufen möchten (ohne sich um ihren tatsächlichen Typ zu kümmern). . –