Как использовать Clang в качестве препроцессора

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

Ниже представлена ​​простая функция C. Жирным шрифтом выделены извлеченные элементы, которые я хочу:

static char func1(unsigned int a, struct foo *b)
{
    int c = 0;
    struct bar *d;

    if (a == 0) {
        d = func2((int) a);
    } else {
        c = func3((struct bar *) b);
    }

    return c;
}

person Andreas Geo    schedule 05.06.2016    source источник


Ответы (1)


Да, Clang - подходящий инструмент для этой работы.

Вам следует взглянуть на libclang.

Вы можете найти достаточно информации в Интернете, но я лично могу порекомендовать две отличные статьи:

Разбор C ++ в Python с помощью Clang Эли Бендерский

Введение в libclang Майка Пепел

Если вы предпочитаете смотреть видео, то могу порекомендовать посмотреть презентацию на libclang здесь: 2010 LLVM Developers ' Встреча, ищите libclang: Thinking Beyond the Compiler

person AlexDenisov    schedule 05.06.2016
comment
Спасибо вам за ваши предложения. Почитав немного, я пришел к документации clang. Это говорит о том, что вы можете использовать clang на разных этапах компиляции. Если я прав, меня интересуют этап предварительной обработки и этап синтаксического анализа и семантического анализа. Эти этапы могут быть вызваны с помощью флага -fsyntax-only. Однако использование этого флага clang не возвращает файл AST, как указано в документации. Любые идеи? Мне не хватает некоторых инструментов, например, из llvm, поэтому он не генерирует AST? - person Andreas Geo; 05.06.2016
comment
Я не могу точно сказать о назначении -fsyntax-only, но я предполагаю, что он существует для упрощения отладки и, возможно, для некоторого статического анализа, когда нам не нужно продолжать после завершения семантического анализа. libclang охватывает все, что вам нужно, в основном это все до генерации кода, включая предварительную обработку (# include, макросы C), лексирование, синтаксический анализ и семантический анализ. - person AlexDenisov; 05.06.2016
comment
Я получил идею из статей, которые вы разместили. Я могу понять, что clang - это компилятор, но они также предоставляют все свои отдельные компоненты для создания моего собственного инструмента препроцессора, который я могу настроить, как мне нравится, используя их библиотеки и функции? Поскольку это выходит за рамки моего проекта, есть ли что-то готовое к использованию? - person Andreas Geo; 05.06.2016