经过一些研究和一些问题后,我最终探索了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's,Gaetan's)以及一些堆栈溢出问题35113197,13236500。
然而,鉴于我是Python的新手并且正在努力理解libclang的基础知识,我非常感谢一些示例代码块,它实现了上面的内容,供我学习和理解。
答案 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