Подтвердить что ты не робот

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

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

Моя общая цель - превратить кровать С++ unit test в соответствующую тестовую кровать для оболочки С#.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

... и вы получите "работы".

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

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

Ответ 3

Наш С++ Front End, построенный поверх DMS Software Reengineering Toolkit может анализировать различные диалекты С++ (включая С++ 11 и ObjectiveC) и экспортировать AST как XML-документ с помощью командной строки. См. примеры АСТ, созданных этим интерфейсом.

Как практический вопрос, вам понадобится больше, чем AST; вы не можете реально многое сделать с С++ (или любым другим современным языком) без понимания смысла и объема каждого идентификатора. Для С++ значение/область действия особенно уродливы. Интерфейс DMS С++ обрабатывает все это; он может создавать полные таблицы символов, связывающие идентификаторы с явными типами С++. Эта информация не сжимается в XML с помощью командной строки, но "технически легко" кодировать логику в DMS, чтобы ходить в таблице символов и выплевывать XML. (есть возможность сбросить эту информацию, просто не в формате XML).

Я предостерегаю вас от идеи манипулировать (или даже просто анализировать) XML. Во-первых, XSLT не является особенно хорошим способом понять смысл АСТ, не говоря уже о преобразовании АСТ, потому что АСТ представляют собой контекстно-зависимые языковые структуры (поэтому вы хотите, чтобы таблица символов была обязательна. Вы можете прочитать XML в дерево, подобное дереву, если хотите, и написать свой собственный процедурный код, чтобы манипулировать им. Но преобразования источника в источник - это более простой способ; вы можете записывать свои преобразования с использованием нотации С++, а не кодов слияния кода по структуре данных дерева.

У вас возникнет другая проблема: как сгенерировать действительный код С++ из преобразованного XML. Если вы не против выплескивать сырой текст, вы можете решить эту проблему чисто специальными способами, ценой отсутствия gaurantee, кроме пота, который сгенерировал код синтаксически. Если вы хотите сгенерировать представление С++ вашего конечного результата как AST и восстановить от него достоверный текст, вам понадобится prettyprinter, который не является технически сложным, но еще много работы по созданию специально для языка, такого же большого, как С++.

Наконец, причина, по которой существуют такие инструменты, как DMS, заключается в том, чтобы предоставить огромное количество инфраструктуры, необходимой для обработки/управления сложной структурой, такой как С++ AST. (анализировать, анализировать, преобразовывать, отпечаток). Вы можете попытаться воспроизвести все это оборудование самостоятельно, но это, как правило, плохое время/затраты/производительность. Претензия заключается в том, что лучше всего оставаться внутри экосистемы инструмента, а не избегать ее и самостоятельно создавать плохие версии. Если вы еще этого не сделали, вы найдете это больно.

FWIW, DMS был использован для проведения массового анализа и преобразования в исходном коде на С++. См. Публикации по DMS и проверьте документы Акерса на "Реконструировать модели компонентов на C++".

Clang основан на той же философии; есть экосистема инструментов.

YMMV, но я был бы удивлен.