在Python中使用libclang解析C++

2023-12-24

经过一些研究和几个问题后,我最终探索了libclang https://pypi.python.org/pypi/clang/3.5库以便在 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作为变量名称,以及每个位置。我最终感兴趣标记化 them.

我读过一些非常有用的文章(eli's http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/, Gaetan's http://blog.glehmann.net/2014/12/29/Playing-with-libclang/)以及一些堆栈溢出问题35113197 https://stackoverflow.com/questions/35113197/finding-anonymous-enums-with-libclang, 13236500 https://stackoverflow.com/questions/13236500/how-to-parse-single-file-using-python-bindings-to-clang.

然而,鉴于我是 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中使用libclang解析C++ 的相关文章

  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • numpy.polyval() 的反函数

    我想知道 np polyval 是否有一个方便的反函数 我在其中给出 y 值并求解 x 我知道我可以做到这一点的一种方法是 import numpy as np Set up the question p np array 1 1 10 y
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • 嘲笑会员用户

    我目前正在开发一个 asp net mvc 2 应用程序 它使用默认的 SqlMembershipProvider 进行身份验证 我已经实现了一个控制器方法 通过调用读取当前用户的 ProviderUserKeyMembership Get
  • 剥离 OLE 标头信息 (MS Access / SQL Server)

    我有一个 C 应用程序需要支持二进制数据库内容 图像等 当使用 MS Access 或 MS SQL Server 时 此数据被包装在 OLE 对象内 如何去除此 OLE 标头信息 请注意 我不能只查找特定标签的开头 因为内容可以是 png
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 简单的喷射器将具体类型与生活方式结合起来

    我正在寻找一种可以使用指定的生活方式注册具体类型的方法 基本上如下所示 public void SomeFunction Type concrete Lifestyle lifestyle gt container Register con
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • matplotlib 后端 - 我关心吗?

    gt gt gt import matplotlib gt gt gt print matplotlib rcsetup all backends u GTK u GTKAgg u GTKCairo u MacOSX u Qt4Agg u
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • ValueError:序列太大;不能大于 32

    我写了这段代码 from Crypto Cipher import AES import numpy as np import cv2 base64 BLOCK SIZE 16 PADDING pad lambda s s BLOCK SI
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • tkinter 库 treectrl 转换为 exe 安装程序时出现 cx_freeze 错误

    我使用的是 python 版本 3 7 我使用了这个名为 treectrl 的外部库 当我运行 py 文件时它工作得很好 但是当我使用 cx freeze 转换为 exe 文件时 它给了我错误 NomodulleFound 名为 tkint
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn
  • 具有可导出私钥的证书的“错误密钥”例外

    我正在尝试使用非对称加密来加密然后解密文件 我已经使用 makecert 创建了一个测试证书并将其安装到我的个人本地计算机存储中 将来我必须在多个服务器上安装此证书 这就是为什么我使用 pe 标志创建它 即使用可导出的私钥 证书已成功创建并
  • Maya python 连接选择的属性

    我一直在尝试制作一个简单的脚本 它将采用两个视口选择 然后基本上将第二个视口的旋转连接到第一个 我不确定如何正确地从视口选择中为对象创建变量 这是我的尝试 但不起作用 import maya cmds as cmds sel cmds ls
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I
  • VSCode IntelliSense 认为 Python 'function()' 类存在

    VSCode IntelliSense 正在完成一个名为的 Python 类function 这似乎不存在 例如 这似乎是有效的代码 def foo value return function value foo 0 But functio
  • print() 函数的有趣/奇怪的机制

    我正在学习Python 我目前正在学习如何定义自己的函数 并且在尝试理解返回值和打印它之间的区别时遇到了一些困难 我读到的关于这个主题的描述对我来说不太清楚 所以我开始自己尝试 我想我现在已经明白了 如果我没记错的话 区别在于你可以传递 a

随机推荐

  • C++ 检查 if 语句可以被 constexpr 计算

    有没有一种方法可以决定是否可以对某些内容进行 constexpr 求值 并将结果用作 constexpr 布尔值 我的简化用例如下 template
  • go 中 for 循环构造与 range 关键字之间的区别

    考虑以下代码 它只打印所有 ENV 变量 package main import fmt os func main for i env range os Environ fmt Println i env 在这里 os Environ 应该
  • Chrome 未加载最新版本的 Web Worker 脚本(运行缓存版本)

    If I edit my web worker script and refresh the page the web worker script is a cached version I am reasonably confident
  • 在 iOS 中从所有 3 个麦克风进行录音

    据我了解 iPhone5 有 3 个独立的麦克风 参见here http www finalpointlogic com wp content uploads 2012 10 iPhone Mic jpg 是否可以同时从所有 3 个麦克风录
  • 上传与流星集合相关的图像

    我很难理解将图像上传到某个 Meteor 集合的整个过程 例如 belongs to 和 has one 与 Rails 的关联 我有一个投资组合项目集合 这是文件 PortfolioItems new Mongo Collection p
  • 将所有列从 int64 转换为 int32

    我们现在的问题是 更改 Pandas 中列的数据类型 https stackoverflow com questions 15891038 change data type of columns in pandas它真的很好解释了如何更改列
  • docker compose 覆盖 ports 属性而不是合并它

    我的 docker compose 配置如下所示 docker compose yml version 3 5 services nginx ports 8080 8080 docker compose prod yml version 3
  • Angular2-子组件中输入字段的模板驱动表单验证

    我正在努力添加template driven form validation在我的 angular2 应用程序中 我有一个叉子https plnkr co edit phhe74kAUmNZgNSmcsvm p preview https
  • PyInstaller不包含依赖文件

    我正在尝试在我的中创建一个 use PyInstallerproject https github com AJahJahRiddim md edit 这个项目使用weasyprint 但是当我运行pyinstaller时 它失败了 因为w
  • XHTML 1.0 过渡型与 XHTML 1.0 严格型?

    就 SEO 而言 从客户的角度来看 我应该使用 XHTML 1 0 Transitional 还是 XHTML 1 0 Strict 为什么有些人仍然使用 Transitional 如果我们使用过渡而不是严格 我们会失去一些东西吗 XHTM
  • 如何找到android TextView每行的字符数?

    所以我在android中有一个TextView 其宽度为屏幕的整个长度 填充为dip 5 如何计算屏幕上一行的字符数 我想换句话说 我正在尝试获取文本视图的列数 我考虑过根据文本大小和宽度进行手动计算 但是1 不知道相关性 2 由于填充以d
  • 如何更准确地绘制图表?

    我有一个数据集 其中包含1440 rows 297 columns 我试图绘制03 jan 2018就时间 X 轴 和密度 Y 轴 而言 但我遇到了一个问题 结果图不够清晰 X轴也没有出现 我想做像这样的东西 https i stack i
  • 如何拦截所有 Nancy 请求

    我看过这个帖子 南希 如何捕获所有请求 无论动词或路径如何 https stackoverflow com questions 17591494 nancy how do i capture all requests irrespectiv
  • Backbone.js - 从集合创建中获取 id

    我正在使用以下方法将模型添加到集合中create方法和 api 响应良好 模型似乎已正确返回并查看console dir resp 这就是我一直在寻找的东西 但是 当我尝试访问时runningorderid 哪一个是id定义为idAttri
  • jQuery 函数语法差异

    如何 function code jQuery 与 不同 document ready function 在jquery中 我知道什么是ready函数确实如此 它会等待 HTML 加载完毕后再开始 然而 确实 function 照着做 我知
  • 从远程 Git 存储库中删除所有文件和历史记录,而不删除存储库本身

    如果有人能告诉我如何删除 git 存储库上的每个文件 文件夹而不实际删除存储库本身 我将不胜感激 我也想删除与这些文件相关的所有历史记录 正如我所解释的这个答案 https stackoverflow com questions 18112
  • 将图像文件保存到临时目录

    我有一个名为 Image png 的图像文件 它保存在我的主包中 位于项目导航器层次结构中的 ViewController swift 文件旁边 我想将此图像的副本保存到临时目录 我以前没有做过 请问我可以使用什么代码 像这样的事情应该可以
  • scrapy 不打印异常的堆栈跟踪

    是否有一种特殊的机制来强制 scrapy 打印出所有 python 异常 堆栈跟踪 我犯了一个简单的错误 错误地获取了列表属性 导致 AttributeError 没有在日志中完整显示 出现的是 2015 11 15 22 13 50 sc
  • LinqKit 谓词生成器抛出 TypeLoadException?

    我在尝试执行使用 PredicateBuilder 动态构建的查询时遇到问题 我能够构建查询 但是在执行查询本身时 我得到以下 TypeLoadException 运行时 return context SearchRecords AsExp
  • 在Python中使用libclang解析C++

    经过一些研究和几个问题后 我最终探索了libclang https pypi python org pypi clang 3 5库以便在 Python 中解析 C 源文件 给定一个 C 源代码 int fac int n return n