RecursiveASTVisitor có thể thực hiện những gì bạn cần.
Triển khai member methodsTraverseDecl(Decl *x)
, TraverseStmt(Stmt *x)
và TraverseType(QualType x)
cho lớp có nguồn gốc từ RecursiveASTVisitor` (ví dụ: MyClass) sẽ thực hiện thủ thuật. Kết hợp, ba phương thức đó sẽ đưa bạn đến từng nút trong AST của bạn.
Ví dụ:
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;
}
};
whats sai với 'RecursiveASTVisitor'? –
@ m.s. Không có gì sai với RecursiveASTVisitor nó chỉ là nó đi qua các subtrees cụ thể, ví dụ như tập hợp tất cả các MethodCalls trong AST, nhưng cái tôi muốn là duyệt qua tất cả các nút của AST bằng cách trích xuất một số thông tin về mỗi nút. Đó là lý do tại sao tôi cần một phương pháp để đi qua nút AST bằng nút. – hbn1991