湖南大学SCCI并行计算组-LLVM Clang AST 03-使用libclang(C Routine)操作AST

Clang官网
Clang AST官网简介


湖南大学 SCCI 并行计算组
LLVM Clang AST 03
使用 libclang (C Routine) 操作 AST

访问 AST 子结点

总头文件
clang-c/Index.h

总依赖库
libclang.a
or
libclang.so


1. CXCursorVisitor类型的例程

CXCursorVisitor类型官方解释

CXCursorVisitor类型定义

typedef enum CXChildVisitResult (*CXCursorVisitor)(CXCursor cursor, CXCursor parent, CXClientData client_data);

这是一个 Function 的类型定义,目的是用 CXCursorVisitor 作为这一系列函数的类型,简化函数写法,可以便于作为其他Function的参数使用。

2. CXChildVisitResult类型的枚举

CXChildVisitResult类型官方解释

CXCursorVisitor类型定义

enum CXChildVisitResult
{
	//终止游标遍历
	CXChildVisit_Break,
	
	//继续遍历其兄弟结点
	CXChildVisit_Continue,
	
	//递归遍历该游标的子结点, 使用相同的访问者和客户端数据。
	CXChildVisit_Recurse
};

该枚举类型的值,用来控制clang_visitChildren例程的访问模式。

3. clang_visitChildren() 例程

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;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值