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

Хорошие инструменты для создания анализатора/анализатора C/С++

Какие хорошие инструменты для быстрого запуска анализа и анализа кода C/С++?

В частности, я ищу инструменты с открытым исходным кодом, которые обрабатывают препроцессор и язык C/С++. Предпочтительно, эти инструменты будут использовать lex/yacc (или flex/bison) для грамматики, а не быть слишком сложными. Они должны обрабатывать последние определения ANSI C/С++.

Вот что я нашел до сих пор, но не смотрел на них подробно (мысли?):

  • CScope - анализатор старой школы C. Тем не менее, похоже, что он не выполняет полный анализ. Описан как прославленный "grep" для нахождения функций C.
  • GCC - Все любимые компиляторы с открытым исходным кодом. Очень сложно, но, похоже, все это. Там есть связанный проект для создания расширений GCC, называемый GEM, но не обновлялся с момента появления GCC 4.1 (2006).
  • PUMA - PUre MAnipulator. (со страницы: "Целью этого проекта является предоставить библиотеку классов для анализа и манипулирования источниками C/С++. Для этого Назначение PUMA предоставляет классы для сканирования, разбора и, конечно, манипулирования C/С++ Источники. "). Это выглядит многообещающим, но не обновлялось с 2001 года. Очевидно, PUMA была включена в AspectС++, но даже этот проект hasn Обновлено с 2006 года.
  • Различные исходные грамматики C/С++. Вы можете получить c-С++ - grammars-1.2.tar.gz, но это было без изменений с 1997 года. Небольшой поиск в Google подтягивает другие основные lex/yacc, которые могут служить отправной точкой.
  • Любые другие?

Я надеюсь использовать это как отправную точку для перевода источника C/С++ на новый язык игрушек.

Спасибо! Матф

(Добавлено 2/9): Просто пояснение: я хочу извлечь семантическую информацию из препроцессора в дополнение к самому C/С++-коду. Я не хочу, чтобы "#define foo 42" исчезал в целое число "42", но оставался прикрепленным к имени "foo". Это, к сожалению, исключает несколько решений, которые сначала запускают препроцессор, и только доставляют дерево синтаксического анализа C/С++.

4b9b3361

Ответ 1

Синтаксический анализ С++ чрезвычайно сложный, поскольку грамматика неразрешима. Процитировать Йосси Крейнин:

Выдающаяся сложная грамматика

"Выдающийся" следует толковать буквально, потому что все популярные языки имеют context-free (или "почти" контекстно-свободные) грамматики, тогда как С++ имеет неразрешимую грамматику. Если вам нравятся компиляторы и парсеры, вы, вероятно, знаете, что это значит. Если вы не занимаетесь этим, там простой пример, показывающий проблему с синтаксическим анализом С++: AA BB(CC); определение объекта или объявление функции? Оказывается, ответ в значительной степени зависит от кода перед выражением - "контекста". Это показывает (на интуитивном уровне), что грамматика С++ вполне контекстно-зависимая.

Ответ 2

Вы можете посмотреть clang, который использует llvm для синтаксического анализа.

Поддержка С++ полностью ссылка

Ответ 3

Генератор синтаксического анализа ANTLR имеет grammar для C/С++, а также для препроцессора. Я никогда не использовал его, поэтому не могу сказать, насколько полным будет его синтаксический анализ С++. ANTLR сам по себе был полезным инструментом для меня несколько раз для анализа более простых языков.

Ответ 4

В зависимости от вашей проблемы GCCXML может быть вашим ответом. В основном он анализирует источник с помощью GCC, а затем дает вам легко усваиваемый XML дерева разбора. С GCCXML вы делаете раз и навсегда.

Ответ 5

pycparser является полным парсером для C (C99), написанным на Python. Он имеет полностью настраиваемую базу данных AST, поэтому она используется в качестве основы для любой обработки языка, которая может вам понадобиться.

Не поддерживает С++. Конечно, это намного сложнее, чем C.


Обновление (2012): на этот раз ответ, без всякого сомнения, будет Clang - он модульный, поддерживает полный С++ (со многими функциями С++ - 11) и имеет относительно дружественную базу кода. Он также имеет API C для привязки к языкам высокого уровня (т.е. для Python).

Ответ 6

Посмотрите, как работает Doxygen, доступен полный исходный код, основанный на гибких настройках.

Вводящим в заблуждение кандидатом является GOLD, который представляет собой бесплатный инструментарий парсера для Windows, предназначенный для создания переводчиков. Их список поддерживаемых языков относится к языкам, на которых можно реализовать синтаксические анализаторы, а не к списку поддерживаемых грамматик разбора.

У них есть только грамматика для C и С#, нет C++.

Ответ 7

Разбор С++ - очень сложная задача.

Там были рамки Boost/Spirit, и пару лет назад они сделали игру с идеей реализации парсера С++, но она далеко не полный.

Полностью и правильно анализируя ISO С++, далека от тривиальной, и на самом деле было много связанных усилий. Но это сложная задача, которая нелегко выполнить, не переписывая полный интерфейс компилятора, понимая все препроцессор С++ и. Предпроцессорная реализация, называемая "волной", доступна от людей Spirit.

Тем не менее, вы можете взглянуть на свиньи /oink (на основе elsa), который представляет собой набор инструментов синтаксического анализатора С++, специально предназначенный для использования в целях преобразования исходного кода, он используется проектом Mozilla для проведения крупномасштабного статического анализа исходного кода и автоматической перезаписи кода, наиболее интересной является то, что он не только поддерживает большую часть С++, но и сам препроцессор

С другой стороны, действительно существует одно единственное доступное решение: интерфейс EDG, который можно использовать для почти всех связанных с С++ усилий.

Лично я хотел бы проверить комплект свиной свиньи на elsa, который используется в Mozilla, кроме того, FSF теперь одобрила работу над gcc плагинов, используя лицензию библиотеки времени выполнения, поэтому я бы предположил, что ситуация скоро изменится, как только люди смогут легко использовать парсер С++ на основе gcc для таких целей, используя двоичные плагины.

Итак, в двух словах: если вы хотите: EDG, если вам нужно что-то бесплатно/с открытым исходным кодом сейчас: else/oink довольно многообещающие, если у вас есть время, вы можете захотеть используйте gcc для своего проекта.

Другой вариант только для кода C cscout.

Ответ 8

Грамматика для С++ - это своего рода печально известный волосатый. Там хороший поток в Lambda об этом, но суть в том, что грамматика С++ может потребовать сколь угодно большого внимания.

Для того, что я могу себе представить, я бы подумал о взломе Gnu CC или Splint. Gnu CC, в частности, довольно подробно отделяет часть генерации языка, поэтому вам может быть лучше создать новый g++-сервер.

Ответ 9

Собственно, PUMA и AspectС++ все еще активно поддерживаются и обновляются. Я изучал использование AspectС++ и задавался вопросом об отсутствии обновлений самостоятельно. Я отправил электронное письмо автору, который сказал, что и AspectС++, и PUMA все еще разрабатываются. Вы можете перейти к исходному коду через SVN https://svn.aspectc.org/repos/ или вы можете получить регулярные бинарные сборки на http://akut.aspectc.org. Как и в настоящее время с множеством отличных проектов на С++, у автора нет времени, чтобы не отставать от обслуживания веб-страниц. Имеет смысл, если у вас есть полная работа и жизнь.

Ответ 10

Elsa превосходит все остальное, что я знаю, руки для синтаксического анализа С++, хотя он не соответствует 100%. Я - фанат. Там есть модуль, который печатает С++, так что это может быть хорошей отправной точкой для вашего проекта игрушек.

Ответ 11

как насчет чего-то более легкого для понимания, например tiny-C или Small C

Ответ 12

Смотрите наш С++ Front End для полнофункционального анализатора С++: строит AST, таблицы символов, называет и разрешение по типу. Вы можете даже разобрать и сохранить препроцессор директивы. Передняя часть С++ построена поверх нашего DMS Software Reengineering Toolkit, который позволяет использовать эту информацию для выполнения произвольных изменения исходного кода с использованием преобразований источника в источник.

DMS - идеальный двигатель для реализации такого переводчика.

Сказав это, я не вижу большого смысла в вашей воображаемой задаче; Я не см. большую ценность при попытке заменить С++, и вы найдете здание полный переводчик - огромная работа, особенно если Цель - "игрушечный" язык. И, вероятно, мало смысла в синтаксический анализ С++ с использованием надежного анализатора, если его единственная цель - создать изоморфная версия С++, которую легче разобрать (подождите, мы постулировали прочный С++ уже!).

EDIT Май 2012: DMS С++ front end теперь обрабатывает GCC3/GCC4/С++ 11, Microsoft VisualC 2005/2010. Надёжная.

EDIT Feb 2015: теперь обрабатывает С++ 14 в диалектах GCC и MS.

EDIT Август 2015: теперь анализирует и фиксирует как код, так и директивы препроцессора в едином дереве.

Ответ 13

A назад я попытался написать инструмент, который будет автоматически генерировать модульные тесты для c файлов.

Для preprosessing я помещаю файлы через GCC. Результат является уродливым, но вы можете легко отслеживать, где в исходном коде из предварительно обработанного файла. Но для ваших нужд вам может понадобиться что-то еще.

Я использовал Metre в качестве основы для синтаксического анализа C. Он является открытым исходным кодом и использует lex и yacc. Это позволило легко встать и запустить за короткое время без полного понимания lex и yacc.

Я также написал приложение C, так как решение lex и yacc не могло помочь мне отслеживать функциональность между функциями и анализировать структуру всей функции за один проход. Это стало незаменимым за короткое время и было оставлено.

Ответ 14

Как насчет использования такого инструмента, как GNU CFlow, который может анализировать код и создавать диаграммы графиков вызовов, вот что opengroup (man-страница) должен сказать о cflow. GNU-версия cflow поставляется с источником и с открытым исходным кодом...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.