在python环境下配置和使用Clang

2019.07.25 34 Views 34 Python

这周的工作里,有一步需要给cpp文件生成abstract syntac tree。找了一下,clang是python环境下比较流行的一个。因为装了整整一天,在这里记录一下过程,希望对之后的朋友有帮助。

安装

看一些教程里说clang和python 3兼容有问题,我没仔细研究,宁可信其有吧。
安装前需要单独设置一个Python 2的环境。

conda create -n python2 python=2.7 anaconda

我用的是homebrew安装llvm。clang现在是默认包含在llvm中的,有些教程中写的

brew install --with-toolchain llvm

是不对的,会报错,说没有这个选项。直接按照下面的代码安装即可。

brew install llvm

第三步是安装Python-binding。
安装方法如下.

sudo pip install clang

注意,这里我没有设置clang的版本号,有隐患(python binding和clang的版本号必须一致,才能运行程序),我是通过在程序中单独标注来解决的。

到这一步,配制就完成了。

例子

接下来是一个hello world级别的例子。

test.py

import sys
import clang.cindex
from clang.cindex import Config
from clang.cindex import Cursor
from clang.cindex import CursorKind

Config.set_library_file("/usr/local/Cellar/llvm/8.0.0_1/lib/libclang.dylib")


index = clang.cindex.Index.create()
tu = index.parse('test.cpp')
print tu.get_extent('test.cpp', (1, 2)).begin_int_data

test.cpp

class Person {
};


class Room {
public:
    void add_person(Person person)
    {
        // do stuff
    }

private:
    Person* people_in_room;
};


template <class T, int N>
class Bag<T, N> {
};


int main()
{
    Person* p = new Person();
    Bag<Person, 42> bagofpersons;

    return 0;
}

运行时在文件目录下的terminal中输入python test.py即可。
代码中的Config.set_library_file就是设置使用的clang位置。
输出如下:
3

参考

  1. https://blog.csdn.net/wangtua/article/details/77426883
  2. https://gist.github.com/anonymous/2503232
Comments
Write a Comment