经过一些研究和几个问题后,我最终探索了libclang https://pypi.python.org/pypi/clang/3.5库以便在 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
作为变量名称,以及每个位置。我最终感兴趣标记化 them.
我读过一些非常有用的文章(eli's http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/, Gaetan's http://blog.glehmann.net/2014/12/29/Playing-with-libclang/)以及一些堆栈溢出问题35113197 https://stackoverflow.com/questions/35113197/finding-anonymous-enums-with-libclang, 13236500 https://stackoverflow.com/questions/13236500/how-to-parse-single-file-using-python-bindings-to-clang.
然而,鉴于我是 Python 新手,并且很难理解 libclang 的基础知识,我非常感谢一些实现上述内容的示例代码块,供我学习和理解。
从 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)