Наш C ++ Front End , построенный на основе нашего DMS Software Reingineering Toolkit , может анализировать различные диалекты C ++ (включая C ++ 11 и ObjectiveC) и экспортировать этот AST какXML-документ с переключателем командной строки.См. пример AST, производимых этим интерфейсом.
На практике вам потребуется больше, чем AST;вы не можете сделать многое с C ++ (или любым другим современным языком) без понимания значения и области действия каждого идентификатора.Для C ++ значение / область особенно уродливы.Внешний интерфейс DMS C ++ обрабатывает все это;он может создавать полные таблицы символов, связывающие идентификаторы с явными типами C ++.Эта информация не дампируется в XML с помощью переключателя командной строки, но «технически легко» кодировать логику в DMS для обхода таблицы символов и выплескивания XML.(есть возможность сбросить эту информацию, но не в формате XML).
Я предостерегаю вас от идеи манипулирования (или даже просто анализа) XML.Во-первых, XSLT не очень хороший способ понять значение AST, не говоря уже о преобразовании AST, потому что AST представляют контекстно-зависимые языковые структуры (вот почему вы хотите, чтобы таблица символов была [НЕОБХОДИМО ИМЕТЬ).Вы можете прочитать XML в похожее на дерево дерево, если хотите, и написать собственный процедурный код для управления им.Но преобразования источника в источник - более простой способ;Вы можете написать свои преобразования, используя нотацию C ++, а не фрагменты кода, забирающиеся через древовидную структуру данных.
У вас будет другая проблема: как сгенерировать действительный код C ++ из преобразованного XML.Если вы не возражаете выплевывать необработанный текст, вы можете решить эту проблему исключительно случайным образом, ценой отсутствия гарантии, кроме пота, что сгенерированный код является синтаксически допустимым.Если вы хотите сгенерировать представление C ++ вашего конечного результата в виде AST и восстановить из него действительный текст, вам понадобится prettyprinter , который не является технически сложным, но для его создания требуется много работы, особеннодля такого большого языка, как C ++.
Наконец, причина, по которой существуют такие инструменты, как DMS, заключается в предоставлении огромного количества инфраструктуры, необходимой для обработки / манипулирования сложной структурой, такой как C ++ AST.(разбор, анализ, преобразование, prettyprint).Вы можете попытаться воспроизвести все эти механизмы самостоятельно, но обычно это плохой компромисс между временем, стоимостью и производительностью.Утверждение заключается в том, что лучше всего оставаться в рамках инструментальной экосистемы, а не избегать ее и самостоятельно создавать плохие версии.Если вы раньше этого не делали, вы до боли это выясните.
FWIW, DMS использовался для проведения масштабного анализа и преобразования исходного кода C ++.См. Публикации в DMS и ознакомьтесь с работами Акерса по теме «Перестройка компонентных моделей C ++».
Clang основан на той же философии;есть экосистема инструментов.
YMMV, но я был бы удивлен.