3

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

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

4

1 回答 1

9

从 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
于 2016-04-24T10:31:06.403 回答