Получение AST для C ++? - PullRequest
       3

Получение AST для C ++?

12 голосов
/ 26 января 2012

Я ищу AST для C ++, который затем можно проанализировать с помощью внешней программы.Какие программы хороши для создания AST для C ++?Мне все равно, на каком языке он реализован или в каком формате вывода (при условии, что он легко разбирается).

Моя общая цель - преобразовать стенд модульного тестирования C ++ в соответствующий тестовый стенд C #.

Ответы [ 3 ]

12 голосов
/ 26 января 2012

Вы можете использовать clang и особенно libclang для анализа кода C ++. Это очень качественная, написанная от руки библиотека для лексирования, анализа и компиляции кода C ++, но она также может генерировать AST.

Clang также поддерживает C, Objective-C и Objective-C ++. Сам Clang написан на C ++.

6 голосов
/ 26 января 2012

На самом деле, GCC будет излучать AST на любой интересующей вас стадии конвейера, включая формы GENERIC и GIMPLE.Проверьте (множество) параметров командной строки, начиная с -fdump- - например, -fdump-tree-original-raw

Это один из самых простых (…) способов работы, так как вы можете использовать его в произвольном коде;просто передайте соответствующие CFLAGS или CXXFLAGS в большинство файлов Makefile:

    make CXXFLAGS=-fdump-tree-original-raw all

… и вы получите «дела».

Обновлено: Увидел это аккуратномаленькая графическая система, основанная на GCC AST при проверке моего имени флага :-) Google FTW.

http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast

2 голосов
/ 26 января 2012

Наш 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, но я был бы удивлен.

...