经过一些研究和几个问题,我最终探索了libclang库,以便在Python中解析C++源文件。
给定一个C++源代码
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
标识为变量名称,将i
标识为变量名称,将mean
标识为变量名称,以及每个位置。我最终对标记化感兴趣。我已经阅读了一些非常有用的文章(eli's,Gaetan's)以及一些堆栈溢出问题35113197,13236500。
但是,鉴于我是Python的新手,并且努力理解libclang的基础知识,因此,我非常感谢一些示例代码块,这些代码实现了以上示例,供我学习和理解。
最佳答案
从libclang API尚不清楚哪种合适的提取 token 的方法是什么。但是,很少有人需要(或想要)下降到这一级别-游标层通常更有用。
但是,如果这是您所需要的-一个最小的示例可能类似于:
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