Все, что связано с точным анализом C ++, требует, по сути, всего внешнего интерфейса C ++ где-то (иначе вы не получите ответов или они будут неправильными, и это плохо работает, когда у вас есть «большие» приложения). Здесь не так много практических ответов.
Уже упоминалось, что GCCXML является производным от GCC пакетом, поэтому он имеет необходимый интерфейс C ++. Он создает XML, поэтому он будет производить БОЛЬШОЙ вывод, который вам нужно будет прочитать, чтобы сформировать «структуру данных в памяти», предложенную в другом ответе. К сожалению, GCCXML уже строит эту структуру данных в памяти, затем экспортирует ее как XML и заставляет вас строить ее заново. Конечно, вы можете просто использовать GCC, который строит структуру данных в памяти, но тогда вам нужно взломать GCC, чтобы он был тем, что вы хотите, и он действительно, действительно хочет быть компилятором. Это означает, что вам придется сражаться за то, чтобы подчинить его своей воле (и объясняет, почему существует GCCXML: большинство людей не хотят этого боя).
Не упоминается интерфейс Edison Design Group C ++ (EDG), который строит его напрямую в структуре данных памяти. Это передняя часть; вам придется делать весь анализ самостоятельно, но ваша задача может быть достаточно простой, так что это не сложно.
Последнее известное мне решение - мое: C ++ FrontEnd для DMS. DMS является основой для построения анализа программ, а его C ++ FrontEnd - это полный интерфейс для C ++ (например, делает все, что делают внешние интерфейсы GCC и Edison: синтаксический анализ, построение дерева, разрешение имени / типа). И вам придется закодировать свой специальный анализ во многом так же, как для GCCXML и EDG, пройдя по структурам данных «в памяти», созданным DMS.
Что действительно отличается, так это то, что DMS можно затем использовать для фактического изменения исходного кода путем обновления тех, которые находятся в структурах данных в памяти, и восстановления компилируемого кода из этих структур памяти, включая исходные комментарии.
person
Ira Baxter
schedule
19.02.2010
#include
в форвардные объявления. Исходные файлы должны иметь#include
. - person Thomas Matthews   schedule 20.02.2010