Libclang的python绑定生成的AST无法解析C ++源代码中的某些令牌

时间:2014-07-17 13:52:04

标签: python c++ parsing clang libclang

我正在使用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);
    
  3. 不会解析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');
    

    如果有人能够建议解决方法,那将会很棒。也许有一个标志,当设置时能够避免这种情况吗?

1 个答案:

答案 0 :(得分:0)

您需要添加以下参数

-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');
}