【问题标题】:AST generated by Libclang’s python binding unable to parse certain tokens in C++ source codes由 Libclang 的 python 绑定生成的 AST 无法解析 C++ 源代码中的某些标记
【发布时间】:2014-07-17 13:52:03
【问题描述】:

我正在使用 Libclang 的 python 绑定。我基本上有两个疑问:

  1. 我想知道我们如何解析既不是由用户定义也不是包含库的库函数.. 例如当我有以下源代码时 –

     char* a=(char *)malloc(4);
    
    • Libclang 无法解析 malloc( ),因为此代码中既没有包含 stdlib,也没有为 malloc 提供用户定义的定义。
  2. Libclang 的 AST 无法识别未使用构造函数定义的对象。例如,在源代码中 -

    vector<int> color;
    color.push_back(1);
    color.push_back(2);
    

push_back( ) 语句不会被解析,但如果这样写:

        vector<int> color=new vector<int>();
        color.push_back(1);
        color.push_back(2);

它解析正确。

  • 这种行为的另一个令人惊讶的表现是当此类对象作为函数参数传递给用户定义的函数时。例如

    bool check(int **grid, vector<char> color){
    color.push_back('a');
    }
    

push_back() 仍然没有被识别,但是当它被写入时,事情被正确解析了

    bool check(int **grid, vector<char> color, int anc, int cur){
    vector<char> color = new vector<int>()
    color.push_back('a');

如果有人能够提出解决方法,那就太好了。也许有一个标志可以在设置时避免这种情况?

【问题讨论】:

    标签: python c++ parsing clang libclang


    【解决方案1】:

    您需要添加以下参数

    -x c++ -std=c++11

    调用 parse 时,默认为 .h 文件解析 C 代码。 您可以将头文件重命名为 .hpp

    这是我的帮助脚本的样子。

    from cindex import *
    def get_cursor_from_file(filename,my_args=[]):
        index = Index.create()
        options = TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD
        file_obj = index.parse(filename,args=my_args,options=options)
        for i in file_obj.diagnostics:
            print i
        return file_obj.cursor
    
    
    x = get_cursor_from_file('test.cpp')
    
    for c in x.get_children():
        print c.spelling
    

    我测试的源文件是这样的

    #include <vector>
    using namespace std;
    int main(){
     char* a=(char *)malloc(4);
     vector<int> color;
    
     vector<int> *color2=new vector<int>();
     color.push_back(1);
     color.push_back(2);
    }
    
    bool check(int **grid, vector<char> color){
        color.push_back('a');
    }
    

    【讨论】:

    • 谢谢,但 id 并不能解决我对解析 的疑问。我能够解析 cpp 文件,但我无法解析上面提到的代码,而且它并没有告诉该文件不可解析!我认为这个答案不是我想要的。感谢您的回复。
    • 我尝试解析它,并取回了一个有效的游标。 new 运算符返回一个指针,因此您的文本应该是 vector * color = new ...
    • 我在从 C++ 源文件解析 vector&lt;double&gt; vecd; 时遇到了完全相同的问题。你知道如何在代码中设置-x c++-std=c++11(在Python中使用libclang)吗?
    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多