Получение AST для C++?
Я ищу, чтобы получить AST для C++, который я могу затем проанализировать с внешней программой. Какие программы хороши для создания AST для C++? Мне все равно, на каком языке он реализован или в выходном формате (если он легко разбирается).
моя общая цель-преобразовать модульный тестовый стенд C++ в соответствующий тестовый стенд c#.
3 ответов
на самом деле, GCC будет испускать AST на любом этапе конвейера, который вас интересует, включая общие и 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
наши C++ Front End, построенный поверх нашего инструментарий реинжиниринга программного обеспечения DMS может анализировать различные диалекты C++ (включая C++11 и ObjectiveC) и экспортировать этот AST в качестве XML-документа с помощью переключателя командной строки. См.пример ASTs, произведенный этим передним концом.
на практике вам понадобится больше, чем AST; вы не можете много сделать с C++ (или любым другим современным языком) без понимания значения и область действия каждого идентификатора. Для C++ значение / область особенно уродливы. Интерфейс DMS C++ обрабатывает все это; он может создавать полные таблицы символов, связывающие идентификаторы с явными типами C++. Эта информация не сбрасывается в XML с помощью переключателя командной строки, но "технически легко" кодировать логику в DMS, чтобы ходить по таблице символов и выплевывать XML. (есть возможность сбросить эту информацию, только не в формате XML).
Я предупреждаю вас против идеи манипулирования (или даже просто анализируя) XML. Во-первых, XSLT не является особенно хорошим способом понять значение AST, не говоря уже о преобразовании AST, потому что AST представляют контекстно-зависимые языковые структуры (вот почему вы хотите [nee должен иметь] таблицу символов). Вы можете прочитать XML в DOM-подобное дерево, если хотите, и написать свой собственный процедурный код для управления им. Но!--11-->Источник-Источник преобразования - более простой способ; вы можете написать свои преобразования, используя нотацию C++ вместо того, чтобы ведра кода слизи взбираться по структуре данных дерева.
У вас будет другая проблема: как создать допустимый код C++ из преобразованного XML. Если вы не возражаете выплевывать сырой текст, вы можете решить эту проблему чисто специальными способами, ценой отсутствия gaurantee, кроме пота, который генерируемый код синтаксически действителен. Если вы хотите создать представление конечного результата на C++ в виде AST и восстановить из него допустимый текст, вам понадобится prettyprinter, которые технически не сложны, но все же много работы для создания, особенно для такого большого языка, как c++.
наконец, причина, по которой существуют такие инструменты, как DMS, заключается в предоставлении огромного количества инфраструктуры, необходимой для обработки/управления сложной структурой, такой как C++ ASTs. (разбор, анализ, преобразование, prettyprint). Вы можете попытаться воспроизвести все это оборудование самостоятельно, но это обычно плохой компромисс времени/стоимости/производительности. Иск лучше оставаться в экосистеме инструмента, а не избегать его и создавать плохие версии его самостоятельно. Если вы не делали этого раньше, вы узнаете это болезненно.
FWIW, DMS был использован для проведения массового анализа и преобразований исходного кода на C++. См.публикации по DMS и проверьте документы Akers на "Re-engineering C++ Component Models".
Clang основан на такой же философии; существует экосистема инструменты.
YMMV, но я был бы удивлен.