使用libclang在Python中用C ++解析

时间:2016-04-23 08:40:54

标签: python c++ parsing libclang

经过一些研究和一些问题后,我最终探索了libclang库,以便用Python解析C ++源文件。

给出一个C ++源代码

ABC.rar

我正在尝试识别令牌 int fac(int n) { return (n>1) ? n∗fac(n−1) : 1; } for (int i = 0; i < linecount; i++) { sum += array[i]; } double mean = sum/linecount; 作为函数名称,fac作为变量名称,n作为变量名称,{{1} }作为变量名称,以及每个位置。我最终感兴趣标记化

我已阅读了一些非常有用的文章(eli'sGaetan's)以及一些堆栈溢出问题3511319713236500

然而,鉴于我是Python的新手并且正在努力理解libclang的基础知识,我非常感谢一些示例代码块,它实现了上面的内容,供我学习和理解。

1 个答案:

答案 0 :(得分:5)

从libclang API中可以看出,提取令牌的适当方法是什么。但是,您很少需要(或想要)下降到这个级别 - 光标层通常更有用。

但是,如果这是您所需要的 - 最小的示例可能类似于:

import clang.cindex

s = '''
int fac(int n) {
    return (n>1) ? n*fac(n-1) : 1;
}
'''

idx = clang.cindex.Index.create()
tu = idx.parse('tmp.cpp', args=['-std=c++11'],  
                unsaved_files=[('tmp.cpp', s)],  options=0)
for t in tu.get_tokens(extent=tu.cursor.extent):
    print t.kind

哪个(对于我的clang版本)产生

TokenKind.KEYWORD
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.KEYWORD
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION
TokenKind.KEYWORD
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.LITERAL
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.LITERAL
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION
TokenKind.LITERAL
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION