То, что вы не указали, это то, какой «анализ» вы хотели сделать. Большинство анализов C ++ требуют, чтобы у вас были точные данные таблицы символов, чтобы при обнаружении символа foo вы имели некоторое представление о том, что это такое. (Технически вы даже не знаете, что такое + без такой таблицы символов!) Вам также нужна информация об общем типе; если у вас есть выражение "a * b", каков тип результата? Наличие информации «имя и тип» является ключом практически ко всему, что вы хотите сделать для анализа.
Если вы настаиваете на лязге, то здесь есть другие ответы. Я не знаю, это обеспечивает разрешение имени и типа.
Если вам нужно разрешение имен и типов, тогда другим решением будет DMS Software Reengineering Toolkit . DMS предоставляет универсальный компилятор, такой как инфраструктура для анализа, анализа, преобразования и анализа (восстановление исходного кода из структур данных компилятора). Промышленный интерфейс C ++ DMS промышленного уровня (он также имеет множество других языковых интерфейсов) обеспечивает полное разрешение имен и типов в соответствии со стандартом 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).
Это неявно работает с AST, созданными DMS, для их изменения. Условный
позволяет запрашивать произвольные свойства переменных шаблона (в данном случае lhs ), включая ограничения имени и типа, если хотите.
DMS много раз использовался для очень сложного анализа программ и преобразования кода C ++. Мы создаем инструменты для покрытия тестов C ++, применяя код C ++ довольно очевидным образом, используя DMS. На сайте есть библиография с бумагами, описывающими, как DMS использовалась для реструктуризации архитектуры большой линейки программного обеспечения для военных самолетов. Этот вид деятельности буквально вливает C ++ в одной архитектурной форме в другую, применяя большое количество преобразований, направленных на паттерны, таких как описанные выше.
Вероятно, будет очень легко внедрить ваши инструменты. И вам не нужно ждать, пока оно созреет.