gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:56 34 4
gpt4 key购买 nike

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

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

最佳答案

从 libclang API 中并不能立即看出提取 token 的适当方法是什么。但是,您很少需要(或想要)下降到这个级别 - 游标层通常更有用。

但是,如果这是您的需要 - 一个最小的示例可能类似于:

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

关于python - 在 Python 中使用 libclang 在 C++ 中进行解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808565/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com