Что вы не указали, какие именно «анализы» вы хотели сделать. Большинство анализов на C++ требуют, чтобы у вас были точные данные таблицы символов, так что, когда вы сталкиваетесь с символом foo, у вас есть представление, что это такое. (Вы технически даже не знаете, что у + нет такой таблицы символов!) Вам также нужна общая информация о типе; если у вас есть выражение «a * b», каков тип результата? Наличие информации «имя и тип» является ключом к почти всему, что вы хотите сделать для анализа.
Если вы настаиваете на clang, то здесь есть и другие ответы. Я не знаю, он обеспечивает разрешение имен и типов.
Если у вас необходимо имя и тип разрешения, тогда другое решение будет DMS Software Reengineering Toolkit. DMS предоставляет универсальный компилятор, такой как инфраструктура для синтаксического анализа, анализа, преобразования и разбора (регенерация исходного кода из структур данных компилятора). DMS промышленно-силовой интерфейс C++ (он также имеет много других интерфейсов) обеспечивает полное разрешение имен и типов в соответствии со стандартом ANSI, а также диалоги GCC и MS VC++.
Преобразования кода могут быть реализованы с помощью интерфейса дерева абстрактных синтаксисов, предоставляемых DMS, или с помощью правил преобразования шаблонов, написанных в поверхностном синтаксисе вашего целевого языка (в данном случае C++). Вот простое преобразование с использованием языка правил:
domain Cpp~GCC3; -- says we want patterns for C++ in the GCC3 dialect
rule optimize_to_increment(lhs:left_hand_side):expression -> expression
" \lhs = \lhs + 1 " -> " \lhs++" if no_side_effects(lhs).
Это косвенно работает на НРХ построенный DMS, чтобы изменить их. Условие позволяет узнать о произвольных свойствах переменных шаблона (в данном случае, lhs), включая ограничения по имени и типу, если хотите.
DMS использовался много раз для очень сложного анализа программ и преобразования кода на C++.Мы создаем инструменты для тестирования C++ с помощью инструментария кода C++ довольно очевидным образом с использованием DMS. На веб-сайте есть библигация с документами, описывающая, как DMS использовался для реструктуризации архитектуры крупной линейки программного обеспечения для полетов военных самолетов. Этот вид деятельности буквально вливает C++ в одну архитектурную форму в другую, применяя большое количество шаблонов направленных преобразований, таких как выше.
Возможно, вам будет очень легко реализовать ваше оборудование. И вам не нужно ждать, пока он созреет.
Я склонен думать, что clang должен предоставлять информацию о разрешении имен и типов - как еще они компилируют LLVM и предоставляют полезные сообщения об ошибках (более полезно, чем gcc на данном этапе). – aneccodeal
Конечно, clang-the-compiler имеет таблицы символов. Доступна ли она в АСТ в удобной форме? Разве clang-the-compiler даже строит полные АСТ? Доступна ли она для нескольких единиц компиляции одновременно? Что бы я сделал, если бы я разрабатывал такой инструмент (и делал с DMS), но это отличается от того, что они на самом деле делали. Я просто не знаю. –