Можно ли разобрать функцию proto в файле cpp без заголовка с помощью libclang python - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь разобрать файл cpp с помощью libclang и python.

Проблема в том, что когда я не объявляю класс, foo функция игнорируется libclang, пока она находит testString и main().

//test.cpp
std::string test1::foo(){

}

std::string *testString = "";

int main()
{
    return 0;
}

Когда я объявляю класс test1 перед прототипом функции, как показано ниже, он обнаруживает foo функцию.

//test.cpp
class test1{
    private:
    std::string foo();
};

std::string test1::foo(){

}

std::string *testString = "";

int main()
{
    return 0;
}

Мой скромный скрипт синтаксического анализатора:

import sys
import clang.cindex
clang.cindex.Config.set_library_file('C:/Program Files/LLVM/bin/libclang.dll')
def list_nodes(node):
    for c in node.get_children():
        print("-------------------")
        print(c.spelling)
        print(c.access_specifier)
        print(c.type.kind)
        list_nodes(c)


index = clang.cindex.Index.create()
tu = index.parse("test.cpp")
list_nodes(tu.cursor)

Проблема моего проекта в том, что я использую cmake и хочу проанализировать некоторые из файлов cpp и извлечь из них информацию.Поскольку мой проект опирается на cmake, большую часть времени заголовочные и исходные файлы не находятся в одном каталоге.Я не хочу создавать беспорядок с привязкой этих файлов в другом месте.Есть ли практика автоматически получать заголовки из файлов cmake.Или, альтернативно, способ синтаксического анализа этих функций и переменных только в файлах cpp.

1 Ответ

0 голосов
/ 09 октября 2018

Что вы используете в качестве внутреннего инструмента для CMake?Просто обычный make?Если это так, вы можете использовать make -n, чтобы получить список команд, которые должны быть выполнены;они будут содержать необходимые -I /header/locations флаги.

Вы не можете реально анализировать фрагменты кода C ++.Даже у людей есть проблемы с этим, поэтому мы хотим полностью скомпилировать исходный код в StackOverflow.Например, вы предполагаете, что test1 - это class.Но что, если это union?( Да, union может иметь методы ).Чего также не хватает в определении, так это типа метода, virtual или нет.

...