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

2 c++ python parsing libclang

经过一些研究和几个问题,我最终探索了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;
Run Code Online (Sandbox Code Playgroud)

我试图将标记识别 fac为函数名称,n变量名称,i变量名称,mean变量名称以及每个位置。我有兴趣最终将它们标记化

我已经阅读了一些非常有用的文章(eli的Gaetan的),以及一些堆栈溢出问题3511319713236500

但是,鉴于我是Python的新手,并且努力理解libclang的基础知识,因此,我非常感谢一些示例代码块,这些代码实现了以上内容,供我学习和理解。

And*_*ker 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
Run Code Online (Sandbox Code Playgroud)

哪个(对于我的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
Run Code Online (Sandbox Code Playgroud)