2016-06-05 6 views
3

Я занимаюсь своей диссертацией, и мне приходится анализировать и маркировать исходный код в отдельные функции. Для каждой функции я хотел бы извлекать имена типов, называемых именами функций и типами приведения. Является ли clang правильным инструментом для такого рода работы? Если да, как я могу это сделать?Как использовать 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; 
} 

ответ

5

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

Вы должны посмотреть libclang.

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

Parsing C++ in Python with Clang Эли Бендерский

Introduction to libclang Майком Ash

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

+0

Спасибо за ваши предложения. Прочитав мою книгу, я пришел к документации. Он говорит, что вы можете использовать clang для разных этапов компиляции. Если я прав, меня интересует этап предварительной обработки и этап анализа и семантического анализа. Эти этапы могут быть вызваны с использованием флага -fsyntax. Однако использование этого флага clang не возвращает файл AST, как указано в документации. Есть идеи? Я пропустил некоторые инструменты, например, из llvm, поэтому он не генерирует AST? –

+0

Я не могу точно сказать о цели '-fsyntax-only', но я предполагаю, что это там для более легкой отладки и, возможно, для какого-то статического анализа, когда нам не нужно действовать после того, как семантический анализ будет выполнен. 'libclang' покрывает все, что вам нужно, оно в основном делает все до генерации кода, оно включает в себя предварительную обработку (макросы # include, макросы C), лексирование, синтаксический анализ и семантический анализ. – AlexDenisov

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^