Какие есть хорошие инструменты для получения быстрого старта для парсинга и анализа Си/Си++ кода?
В частности, я'м глядя на инструменты с открытым исходным кодом, которые обрабатывают на C/C++ препроцессор и язык. Предпочтительно, чтобы эти инструменты использовали бы Лекс/yacc (или Flex/Зубр) для грамматики, и не быть слишком сложными. Они должны справиться с последним стандартом ANSI с/C++ определений.
Здесь's то, что я'вэ нашел до сих пор, но не'т посмотрел на них подробно (мысли?):
Я'м надеясь использовать это как отправную точку для перевода с/С++ код в новую игрушку язык.
Спасибо! -Мэтт
(Добавлено 2/9): только одно уточнение: я хочу, чтобы для извлечения семантической информации из препроцессора в дополнение к Си/Си++ кода сам. Я не'т хотим, чтобы на "#определение функции foo 42", чтобы исчезнуть в число "и 42", но остаются прикрепленными к именем "фу" и. Это, к сожалению, исключает ряд решений, которые выполняются препроцессором первый и единственный корабль на С/C++ дерево разбора)
Парсинг C++ - это очень трудно, потому что грамматика неразрешимые. Цитировать в <а href="и http://www.yosefk.com/c++fqa/неисправен.сообщение: дефект-2" и>Йоси Крейниным</а>:
очень сложная грамматика
"не очень" и должен интерпретироваться в буквальном смысле, потому что все популярные языки есть в <а href="и http://en.wikipedia.org/wiki/Context-free_grammar">контекстно-свободной</а> (или "почти" в контекстно-свободную) грамматику, в то время как в C++ на <а href="и http://en.wikipedia.org/wiki/Undecidability">неразрешимые</а> грамматика. Если вы как компиляторы и анализаторы, вы, наверное, знаете, что это значит. Если вы'повторно не в такого рода вещи, там'ы на <а href="и http://www.yosefk.com/c++fqa/конструкторы.сообщение: fqa-10.19" и>простой пример</а> показывает проблемы с парсингом С++: это АА ВВ(СС);` определения объекта или объявление функции? Получается, что ответ сильно зависит от кода до заявление - "в контексте" по. Это показывает (на интуитивном уровне), что c++ грамматики вполне контекста.
В ANTLR генератор парсеров обладает грамматика на Си/Си++ и препроцессор. Я'ве никогда не использовал его, поэтому я могу'т сказать, насколько полный его анализ С++ будет. Сам ANTLR является полезным инструментом для меня на пару раз для обработки намного проще языков.
В зависимости от вашей проблемы GCCXML может быть ваш ответ. В основном он анализирует исходный код, используя GCC и тогда он даст вам легко усваиваемый XML для синтаксического дерева. С GCCXML вы сделали раз и навсегда.
pycparser - это полноценный парсер для C (С99), написанный на Python. Он имеет полностью настраиваемый АСТ серверной, так что'ы используются в качестве основы для любого вида обработки языка вам может понадобиться.
Не'т поддерживать с++, хотя. Конечно, это'ы намного сложнее, чем С.
Обновление (2012): на этот раз ответ, без всякого сомнения, будет лязг - это'ы модульные, поддерживает полный профиль C++ (с Многие C++-11) и имеет относительно дружественный код базы. Она также имеет API языка Си, для привязки к языкам высокого уровня (т. е. для Python).
Посмотрим, как помощи Doxygen строительство, полный исходный код доступен, и это'ы на основе Flex.
Заблуждение кандидата золото, которая представляет собой бесплатный Windows-анализатор набор инструментов явно для создания переводчиков. Их список supported languages относится к языкам, в которых можно реализовать Парсеры, а не список поддерживаемых разбора грамматик.
У них есть только грамматики для C и C#, не c++.
Парсинга C++ - это очень сложная задача.
Там'ы повышение/дух основы, и пару лет назад они сделали играть с идеей реализации на C++ парсер, но это'ы далеко не полный.
Полностью и правильно парсинг ISO для C++ - это далеко не тривиальная, и там было на самом деле много усилий. Но это по сути сложная работа, что это'т так легко, без перезаписи полный компилятор интерфейс понимание весь C++ и препроцессор. Препроцессор реализация называемые "Волна" доступна от духа людей.
Что сказал, Вы могли бы хотеть взглянуть на свиной/хрю (Эльза), которые является с++ парсер инструментарий, специально предназначенный, чтобы использоваться для исходный код трансформации целей, он используется в Mozilla проект делать крупные статического анализа исходного кода и код переписывать, самое интересное заключается в том, что он не только поддерживает большинство C++, но также препроцессор сам!
С другой стороны, там'ы действительно один проприетарное решение: интерфейс ЭДГ, который может быть использован для почти всех c++ соответствующие усилия.
Лично я хотел проверить Эльза-свинина/хрю-люкс, который используется в Mozilla, кроме того, фонд уже одобрил работу ССЗ Плагины с помощью библиотеки времени выполнения лицензии, таким образом, Я'd и предположим, что все изменится быстро, как только люди могут легко использовать ССЗ-на основе C++ парсер для таких целей используя бинарные Плагины.
Так, в двух словах: если вы баксы: ЭДГ, если вам нужно что-то бесплатное/с открытым исходным кодом сейчас: еще/хрю довольно перспективным, если у вас есть время, вы могли бы хотеть использовать GCC для вашего проекта.
Другой вариант только для кода на языке C cscout.
Грамматики для C++ - нибудь заведомо волосатые. Там'ы хорошая резьба на лямбда-об этом но суть в том, что грамматика С++ может требовать сколь угодно много впередсмотрящим.
За то, что я бы вы делаете, Я'd не думаю о взломе либо по лицензии GNU CC или тутор. В GNU CC в частности, отдельные из поколения язык часть довольно тщательно, так что вы можете быть лучше дом новый G++ бэкенда.
На самом деле, пума и AspectC++ по-прежнему активно поддерживается и обновляется. Я искал в использовании AspectC++, и было интересно по поводу отсутствия обновления себя. Я написала автора, который говорит, что обе AspectC++ и пума все еще разрабатываются. Вы можете получить исходный код через СВН https://svn.aspectc.org/repos или вы можете получать регулярные бинарные сборки на http://akut.aspectc.org. Как с большим количеством отличных проектов c++ эти дни, автор не'т иметь время, чтобы идти в ногу с обслуживания веб-страницы. Имеет смысл, если вы've получили полный рабочий день работа и жизнь.
в <а href="и http://www.cs.berkeley.edu/~smcpeak/элкхаунд/источники/Эльза/" и>Эльза</а> бьется все, кого я знаю руки вниз для C++ парсинг, хотя это не 100% совместимый. Я'м вентилятором. Там'ы модуль, который выводит на C++, так что может быть хорошей отправной точкой для вашего проекта игрушки.
Смотрите наши на <а href="и http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html">предобработчик c++</а> для полноценного парсера на C++: строит АСЦ, таблицы символов, не имя и резолюции типа. Вы даже можете анализировать и сохранять препроцессора директивы. Этот компилятор построен на вершине нашего в <а href="и http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html">ДМС реинжиниринга программного обеспечения Набор инструментов</а>, который позволяет использовать эту информацию для выполнения произвольного изменения исходного кода, используя Источник-Источник преобразований.
ДМС является идеальным механизмом для реализации такого переводчика.
Сказав это, я не'т вижу особого смысла в свои воображаемые задач; я не'т вижу большую ценность в попытке заменить C++, и вы'll найти дом полный переводчик колоссальный объем работы, особенно если ваш цель - "мои игрушки" на язык. И там, скорее всего, мало смысла в парсинг C++ с использованием надежной парсер, если его единственная цель состоит в том, чтобы произвести изоморфная версия C++, которые легче анализировать (подождите, мы постулировали надежный C++ уже!).
Редактировать мая 2012 года: ДМС'ы на C++ теперь ручки GCC3/версии gcc4/с++11,в Microsoft VisualC 2005/2010. Робастно.
Редактировать февраля 2015: теперь поддерживаются в C++14 в GCC и MS диалектов.
Редактировать августа 2015 года: сейчас анализирует и фиксирует оба кода и директивы препроцессора в единое дерево.
Некоторое время назад я попытался написать инструмент, который будет автоматически генерировать модульных тестов для C файлов.
Для preprosessing я поставил файлы через ЦУС. Вывод ужасен, но можно легко отследить, где в исходном коде из предварительно обработанного файла. Но для ваших потребностей, вам может понадобиться что-то еще.
Я использовал М в качестве базы для парсера на C. Он является открытым исходным кодом и использует Lex и yacc. Это легко приступить к работе в короткие сроки без полного понимания Лекс & yacc.
Я также написал приложение c момента Лекс & решение yacc не могли бы мне помочь отследить функциональность в функции и анализа структуры всей функции в один проход. Он стал unmaintainable в короткие сроки и был заброшен.
Что будет, если использовать средство, как гну'ы CFlow, которые могут анализировать код и произвести диаграммы колл-графики, здесь'ы что в opengroup(человек) должна сказать о cflow. GNU-версия cflow поставляется с исходным кодом, открытым исходным кодом, а также ...
Надеюсь, что это помогает, С наилучшими пожеланиями, Том.