使用 libclang 在 Python 中解析C++

Using libclang to parse in C++ in Python

本文关键字:C++ Python libclang 使用      更新时间:2023-10-16

经过一些研究和一些问题,我最终探索了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的,Gaetan的)以及一些堆栈溢出问题35113197,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