【问题标题】:Using libclang to parse in C++ in Python在 Python 中使用 libclang 在 C++ 中进行解析
【发布时间】:2016-04-23 08:40:53
【问题描述】:

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

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

【问题讨论】:

  • 如果你有 Clang 或其他工具,你不会自己标记语言元素;解析器内置了这种能力。问题在于你如何得到结果。您可以在stackoverflow.com/a/36681568/120163 看到 C 词法分析器的输出问题是,API Clang 提供了什么来提供对此类令牌的访问?
  • 如果 libclang 提供一个标记化工具,那就更好了。但是,我正在努力首先获得与您提到的输出类似的输出,其次,使用该输出来处理我的需求,如我描述中示例中所述。有什么指导方针吗?
  • 我的观点更多的是关于谁在进行标记化。如果 you 打算这样做,则尚不清楚 clang 将如何提供帮助或您为什么想要它。 (个人怀疑如果您拥有的只是令牌,无论您如何获得它们,您是否会用 C++ 代码做很多有趣的事情)。我对 Clang API 了解不多。也许这个答案会对你有所帮助:stackoverflow.com/a/25371656/120163
  • 您至少应该尝试写一些东西,在您提供的链接中有足够的提示,然后如果您遇到问题,请发布您的脚本。

标签: python c++ parsing libclang


【解决方案1】:

从 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

【讨论】:

  • 看起来很棒!但是,正如here 所见,我正在努力让 libclang 运行。有什么想法可以克服这个错误,以便我测试你的答案吗?
  • 您能否提供一个链接,我可以在哪里阅读有关 parse()get_tokens() 等 libclang 方法的信息?很难找到参考源和/或文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2021-02-19
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多