Вопрос по c++, abstract-syntax-tree – Получение AST для C ++?

12

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

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

"Закрыто как не конструктивно?" У ОП есть очень четкая просьба, и, честно говоря, ответов не так много, поэтому не может быть много споров. Ответы, представленные на данный момент, подтверждаются конкретными фактами. Ira Baxter

Ваш Ответ

3   ответа
2

C ++ Front End, построенный на вершине егоDMS Software Reengineering 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 и проверьте документы Akers на тему «Перестройка компонентных моделей C ++».

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

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

12

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

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

Для пользы других: libclang (связывание C) ужасен и неполон. Clang (привязка C ++) замечательна. Thomas Eding
я думаю чтоэти видео и слайды очень хорошее начало. Я узнал, как реализовать подсветку синтаксиса, используя их, но это в основном то же самое, вы можете использовать его для обхода AST. user142019
Есть ли причина для блочного цитирования типа «спойлер»? Bart
Я не могу понять, как получить AST от лязга. Есть ли учебники о том, как это сделать? Thomas Eding
ОП не заботился об этом. user142019
6

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

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

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

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

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

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

Похожие вопросы