AST, генерируемый связыванием Python в Libclang, не может проанализировать определенные токены в исходных кодах C++

Я использую связывание Python Libclang. У меня есть в основном два запроса:

  1. Я хочу знать, как мы можем анализировать библиотечные функции, которые не определены ни пользователем, ни для которых библиотека была включена... Например, когда у меня есть следующий исходный код -

     char* a=(char *)malloc(4);
    
    • Libclang не может выполнить синтаксический анализ malloc(), поскольку в этот код не был включен ни stdlib, ни пользовательское определение для malloc.
  2. Объект, не определенный с помощью конструктора, не распознается AST Libclang. Например, в исходном коде -

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

Было бы здорово, если кто-то может предложить обходной путь. Возможно, есть флаг, который при установке может этого избежать?

1 ответ

Вам необходимо добавить следующий аргумент

-x C++ -std= C++11

при вызове parse, в противном случае по умолчанию используется синтаксический анализ кода C для файлов.h. Вы можете переименовать файл заголовка в.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');
}
Другие вопросы по тегам