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

StackOverflow https://stackoverflow.com/questions/526797

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

  • CScope - Анализатор языка Си старой школы.Однако, похоже, не выполняется полный синтаксический анализ.Описывается как прославленный "grep" для поиска функций языка Си.
  • ССАГПЗ - Любимый всеми компилятор с открытым исходным кодом.Очень сложный, но, кажется, справляется со всем этим.Существует связанный проект для создания расширений GCC под названием ДРАГОЦЕННЫЙ КАМЕНЬ, но не обновлялся со времен GCC 4.1 (2006).
  • ПУМА - Чистый МАнипулятор.(со страницы:"Цель этого проекта состоит в том, чтобы предоставить библиотеку классов для анализа и манипулирования исходными текстами на C / C ++.Для этого с этой целью PUMA предоставляет классы для сканирования, синтаксического анализа и, конечно, манипулирования C / C ++ исходными текстами.").Это выглядит многообещающе, но не обновлялось с 2001 года.По - видимому , PUMA была включена в AspectC++, но даже этот проект не обновлялся с 2006 года.
  • Различные необработанные грамматики C / C ++.Вы можете получить c-c++-grammars-1.2.tar.gz, но это не поддерживалось с 1997 года.Небольшой поиск в Google позволяет найти другие базовые грамматики lex / yacc, которые могли бы послужить отправной точкой.
  • Есть еще какие-нибудь?

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

Спасибо!-Мэтт

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

Это было полезно?

Решение

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

Чрезвычайно сложная грамматика

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

Другие советы

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

Теперь полностью поддерживайте C ++ Ссылка

В ANTLR ( АНТЛР ) генератор синтаксического анализа имеет грамматика для C / C ++, а также для препроцессора.Я никогда не использовал его, поэтому не могу сказать, насколько полным будет его синтаксический анализ C ++.ANTLR сам по себе пару раз был для меня полезным инструментом для разбора гораздо более простых языков.

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

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

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


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

Взгляните на то, как доксиген работает, доступен полный исходный код, и он основан на flex.

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

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

Синтаксический анализ C ++ - очень сложная задача.

Есть платформа Boost / Spirit, и пару лет назад они сделали поиграйте с идеей реализации синтаксического анализатора C ++, но это далек от завершения.

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

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

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

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

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

Другим вариантом только для C-кода является cscout.

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

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

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

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

как насчет чего-нибудь более легкого для понимания, например крошечный-C или Маленький C

Смотрите наш Интерфейс C++ для полнофункционального синтаксического анализатора C ++:создает ASTS, таблицы символов, создает имя и разрешение типа.Вы даже можете проанализировать и сохранить препроцессор директивы.Интерфейс C ++ построен поверх нашего Реинжиниринг программного обеспечения DMS Инструментарий, что позволяет использовать эту информацию для выполнения произвольных изменений исходного кода с использованием преобразований от источника к источнику.

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

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

РЕДАКТИРОВАТЬ Май 2012:Интерфейс DMS на C ++ теперь обрабатывает GCC3 / GCC4 / C ++ 11, Microsoft VisualC 2005/2010.Надежно.

РЕДАКТИРОВАТЬ Февраль 2015:Теперь обрабатывает C ++ 14 на диалектах GCC и MS.

РЕДАКТИРОВАТЬ Август 2015:Теперь анализирует и фиксирует как код, так и директивы препроцессора в едином дереве.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top