2015-06-12 19 views
6

Recursivevisitor sınıfını kullanarak clang AST'nin belirli alt çizgilerini kullanabilirim ama yapmak istediğim, Clang AST düğümünü düğüm tarafından çaprazlamaktır.Clang AST nasıl manuel olarak taşınır?

Bu konuda bana yardımcı olabilecek herhangi birine minnettar olurum.

Şimdiden teşekkürler.

+0

sorun ne? –

+0

@ m.s. RecursiveASTVisitor ile yanlış bir şey yoktur, sadece AST'deki tüm MethodCall'ların kümesi gibi, sadece belirli alt katmanları geçiştirir, ama istediğim, AST'nin tüm düğümleri üzerinden birtakım bilgilerden bazılarını çıkararak geçiş yapmaktır. her düğüm. Bu nedenle, AST düğümünü düğüm tarafından çaprazlamak için bir yönteme ihtiyacım var. – hbn1991

cevap

12

RecursiveASTVisitor ihtiyacınız olanı yapabilir. hile olacaktır RecursiveASTVisitor` türetilmiş sınıf (örneğin MyClass) için member methodsTraverseDecl(Decl *x), TraverseStmt(Stmt *x) ve TraverseType(QualType x) uygulanması

. Kombine, bu üç yöntem sizi AST'nizdeki her bir düğüme götürecektir.

Örnek: `RecursiveASTVisitor` ile

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

çok teşekkür ederim bu hile yapabilir düşünüyorum :) – hbn1991

+0

RecursiveASTVisitor belgelerinin daha fazla Traverse ...() yöntemleri listeler. Bunlar da uygulanmamalı mı? Yoksa bu travesti mi? –

+0

Bu yöntemlerden herhangi birini kullanabilirsiniz, ancak genellikle en soyut türleri (Expr, Stmt), örneğin IfStmt öğesinde, sonra/İleri bölümlerini (gerçek türlerini önemsemeden) koşullu olarak çaprazlamak istiyorsanız, çaprazlamak isteyeceksiniz. . –