3. AST的遍历 序列化 Consumer
1. AST的遍历¶
遍历是通过RecursiveASTVisitor模板类来完成的,RecursiveASTVisitor按照深度优先的模式从最顶部一般是TranslationUnitDecl开始对语法树的每个节点进行遍历,能够以前序或者后序的方式进行遍历
该模板类主要实现三个任务
-
遍历整个AST,通过Traverse()方法来完成,它是整个遍历过程中的入口函数
-
对每个node节点,通过WalkUpFrom()方法来完成类的等级遍历,对于派生类,遍历时需要先遍历其父类,然后遍历派生类
-
对给定的node节点,通过Visit*()方法来执行真正的节点遍历
其中上述三种方法都不是特指某一个方法,而是一个方法组,如Traverse*包括TraverseDecl、TraverseStmt以及TranverseType等,WalkUpFrom和Visit方法同理,三种方法存在调用关系,最上层是Traverse,实现在不同node间的移动,中间是WalkUpFrom,对node的基础结构进行解析,存在父类需要先遍历父类,最底层是Visit方法,主要是对某一个实际的node进行遍历解析。
2. AST序列化¶
可以将clang AST序列化并保存在以PCH为扩展名的文件中,可以避免重复处理不同项目源文件中的相同头文件,从而加快编译速度,当选择使用PCH文件时,所有头文件都预编译为单个PCH文件,并且在编译一个翻译单元时,预编译头文件中的信息会被惰性获取(只用在用到时才获取)。
3. ASTConsumer¶
ASTConsumer是一个抽象基类,功能是用来访问AST,可以将AST的生成和访问进行隔离,基于该抽象类继承的子类主要有:
在进行每一个TopLevelDecl的解析后,都会调用Consumer中的方法,用来访问AST,不同的Consumer要实现的功能并不一致。