【译】Parsing C++ in Python with Clang

本文不是全部翻译,仅仅针对重要内容,添加了一些的实战经验,方便日后查阅
原文地址:https://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/

Clang开发团队意识到,Clang不仅仅可以被用来作为编译器,还可以作为分析C/C++/Objc代码的工具。事实上苹果自带的Xcode代码编译底层用的就是Clang。
libclang是clang一个强大的开发接口,本质上是一个C API,可以进行词法和语法分析,比如它可以让用户以AST结构去检验分析一段代码。
python bindings是位于clang.cindex模块下的内容,可以理解为他是建立在python和clang中间的一个桥梁。

1. Setting up

搭建环境:ubuntu16.04,python 3.5.2
注意python2支持clang4,但是python3不支持,需要做一些修改,其他版本没有试过所以不提供建议

  1. 安装clang编译器
sudo apt-get install clang-4.0
  1. 安装python bindings
sudo pip install clang==4.0

这里装4.0版本是因为,看到一篇文章说ubuntu16.4最高只支持4.0,所以没试更高的版本。这里的版本号也是很必要写明白的,因为两个安装要一直,默认不写版本号是不匹配的,如果安错了,运行会报错,删了重安就好。

sudo apt-get remove clang
pip uninstall clang

3.修改文件使python3支持clang4.0
找到** clang/cindex.py , _init_py 文件,在这里(Add python3 support to clang.cindex)下载文件然后替换掉
我的文件地址:
/usr/local/lib/python3.5/dist-packages/clang** ,如果页面中三个文件都有就都替换掉,没有就只替换上面的两个。

2.工作原理

先看下面代码,首先导入库文件,第二行configset的内容是让python代码能找到libclang,回忆一下前面安装的时候并没有进行关联,也可以不在代码中关联,直接设置PYTHONPATH和LD_LIBRARY_PATH,但是我设置还是会报错,所以在代码中设置config关联了。

import clang.cindex
Config.set_library_file("/usr/lib/llvm-4.0/lib/libclang-4.0.so.1")
index = clang.cindex.Index.create()
tu = index.parse(test.c)

index代表的是一组翻译单元,可以理解为是打开了工具的大门,然后通过调用parse方法具体的去剖析一段代码,给出你想要的信息。
这里的信息就是AST结构的源码分析,每一个节点都是一个cursor,tu可以认为是根节点,是AST结构抓取的开始节点。
cursor重要的属性和方法包括:

  • kind 节点的种类,可以在https://github.com/llvm-mirror/clang/blob/master/bindings/python/clang/cindex.py查看所有种类
  • spelling ,源码中对应的内容,名称,ID等
  • location,对应源码中的位置
  • get_children 孩子节点

猜你喜欢

转载自blog.csdn.net/Bazingaea/article/details/89157342