湖南大学 SCCI 并行计算组
LLVM Clang AST 03
使用 libclang (C Routine) 操作 AST
LLVM Clang AST 03
使用 libclang (C Routine) 操作 AST
总头文件
clang-c/Index.h
总依赖库
libclang.a
or
libclang.so
1. CXCursorVisitor类型的例程
CXCursorVisitor类型定义
typedef enum CXChildVisitResult (*CXCursorVisitor)(CXCursor cursor, CXCursor parent, CXClientData client_data);
这是一个 Function 的类型定义,目的是用 CXCursorVisitor 作为这一系列函数的类型,简化函数写法,可以便于作为其他Function的参数使用。
2. CXChildVisitResult类型的枚举
CXCursorVisitor类型定义
enum CXChildVisitResult
{
//终止游标遍历
CXChildVisit_Break,
//继续遍历其兄弟结点
CXChildVisit_Continue,
//递归遍历该游标的子结点, 使用相同的访问者和客户端数据。
CXChildVisit_Recurse
};
该枚举类型的值,用来控制clang_visitChildren例程的访问模式。
3. clang_visitChildren() 例程
函数名
clang_visitChildren()
函数原型
unsigned clang_visitChildren
(
CXCursor parent,
CXCursorVisitor visitor,
CXClientData client_data
)
参数
-
CXCursor parent
给定的 Cursor -
CXCursorVisitor visitor
给定的函数 visitor,该函数的参数列表必须符合 CXCursorVisitor 函数类型。 -
CXClientData client_data
尚不清楚
详细解释
该例程为给定 Cursor(即参数列表第一个参数,parent)的所有子结点都调用传入的 CXCursorVisitor 类型的函数 visitor,每个子节点都将完成给定 visitor 函数的内容。
例
enum CXChildVisitResult HelloCursor(CXCursor cursor, CXCursor parent, CXClientData client_data)
{
CXString CursorName = clang_getCursorSpelling(Cursor);
CXString parentName = clang_getCursorSpelling(parent);
printf("Hello! I am %s,my father is %s\n",clang_getCString(CursorName),clang_getCString(parentName));
//用来控制是否继续遍历,以及怎么遍历。遍历所有兄弟结点用CXChildVisit_Continue,递归遍历所有子节点用CXChildVisit_Recurse,不接着遍历了用CXChildVisit_Break
return CXChildVisit_Continue;
}
int main(int argc, char ** argv)
{
//创键TransactionUnit所需的上下文环境
CXIndex Index = clang_createIndex(0,0);
//解析代码,并获得对应的TransactionUnit
CXTranslationUnit TU =clang_parseTranslationUnit(Index,NULL,argv,argc,0,0,CXTranslationUnit_None);
//从TU中获取Cursor
CXCursor Cursor = clang_getTranslationUnitCursor(TU);
//访问Cursor的子结点,每个子结点调用HelloCursor函数
clang_visitChildren(Cursor, HelloCursor, NULL);
//销毁TransactionUnit
clang_disposeTranslationUnit(TU);
//销毁Index
clang_disposeIndex(Index);
return 0;
}