Я занимаюсь своей диссертацией, и мне приходится анализировать и маркировать исходный код в отдельные функции. Для каждой функции я хотел бы извлекать имена типов, называемых именами функций и типами приведения. Является ли 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; }
Спасибо за ваши предложения. Прочитав мою книгу, я пришел к документации. Он говорит, что вы можете использовать clang для разных этапов компиляции. Если я прав, меня интересует этап предварительной обработки и этап анализа и семантического анализа. Эти этапы могут быть вызваны с использованием флага -fsyntax. Однако использование этого флага clang не возвращает файл AST, как указано в документации. Есть идеи? Я пропустил некоторые инструменты, например, из llvm, поэтому он не генерирует AST? –
Я не могу точно сказать о цели '-fsyntax-only', но я предполагаю, что это там для более легкой отладки и, возможно, для какого-то статического анализа, когда нам не нужно действовать после того, как семантический анализ будет выполнен. 'libclang' покрывает все, что вам нужно, оно в основном делает все до генерации кода, оно включает в себя предварительную обработку (макросы # include, макросы C), лексирование, синтаксический анализ и семантический анализ. – AlexDenisov
У меня появилась идея прочитать статьи, которые вы опубликовали. Я могу понять, что clang является компилятором, но также они предоставляют все свои отдельные компоненты для создания моего собственного инструмента препроцессора, который я могу настроить, как мне нравится, используя их библиотеки и функции? Поскольку это выходит за рамки моего проекта, есть ли что-то, готовое к использованию? –