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

Using libclang to parse in C++ in Python

经过一些研究和一些问题,我最终探索了 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) as well as some stack overflow questions , 13236500

但是,鉴于我是 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