Где я могу найти стандартную грамматику BNF или YACC для языка C ++? - PullRequest
22 голосов
/ 05 марта 2009

Я пытаюсь работать над своего рода генератором кода, чтобы помочь юнит-тестированию унаследованного проекта на C / C ++. Я не считаю, что какой-либо независимый инструмент может генерировать код заглушки из декларации. Поэтому я решил построить один, это не должно быть так сложно.

Пожалуйста, кто-нибудь может указать мне стандартную грамматическую ссылку, лучше описанную языком yacc.

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

С наилучшими пожеланиями, Kevin

Ответы [ 6 ]

24 голосов
/ 05 марта 2009

Из C ++ FAQ Lite :

38.11 Существует ли грамматика языка Си ++, доступная для yacc?

Основная грамматика YACC, которую вы хотите от Эда Виллинка. Эд считает, что его грамматика полностью соответствует

ISO / ANSI C ++ стандарт , однако он не гарантирует: «грамматика нет, - говорит он, - использовался в гневе. Вы можете получить грамматику без подпрограммы действия или грамматика с фиктивными процедурами действий . Вы также можно получить соответствующий лексер . Для тех, кто интересно, как он достигает контекстно-свободный синтаксический анализатор (нажав все неясности плюс небольшое количество ремонт будет сделан позже после разбора завершено), вы можете прочитать глава 4 его дипломная работа .

Существует также очень старая грамматика yacc это не поддерживает шаблоны, исключения, ни пространства имен; плюс это отклоняется от основного языка в некоторые тонкие способы. Вы можете получить это грамматика здесь или здесь .

4 голосов
/ 14 ноября 2012

Недавно я нашел несколько файлов грамматики для C ++ (C ++ 1998: ISO / IEC 14882: 1998 и C ++ 2008: ISO / IEC SC22 / WG21 N2723 = 08-0233 ) на веб-сайте по грамматике . Грамматики представлены в обозначениях Enahnced BNF, DMS BNF, BGF, SDF и Rascal . Жаль, что грамматики C ++, похоже, не обновляются (без C ++ 2003 или C ++ 11).

2 голосов
/ 26 июля 2010

Для другого подхода вы могли бы рассмотреть возможность создания контрейлерной копии на существующем компиляторе.

GCC-XML"скомпилирует" C ++ в файлы XML с большим количеством полезной информации; это может быть достаточно для ваших целей.

К сожалению, GCC-XML поддерживается только на 1/4, и заставить его работать может быть ... интересно. Удачи, если вы идете по этому маршруту.

2 голосов
/ 05 марта 2009

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

Что еще хуже, C ++ 1x значительно усложнит грамматику. Чтобы достичь идеального анализа C ++, анализатору потребуется реализовать достаточно стандарта, чтобы правильно выполнить разрешение перегрузки, включая вывод аргументов шаблона, что, в свою очередь, потребует механизма понятий, лямбда-выражений и, по сути, почти всех язык, за исключением двухэтапного поиска имен и спецификаций исключений, которые, если я правильно помню, не нуждаются в реальной реализации для успешного анализа программы.

По сути, вы на полпути к компилятору, если вы можете анализировать C ++.

2 голосов
/ 05 марта 2009

Я нашел этот недавно. Я не пробовал, поэтому не уверен, что это работает. Не могли бы вы дать больше информации об инструменте, который вы пытаетесь разработать? Я загрузил эту грамматику, потому что я работаю над инструментом инструментов, чтобы я мог добавить информацию о покрытии для моей платформы модульного тестирования .

Перечитав свой комментарий ...

Я думаю этот инструмент точно соответствует вашим потребностям.

1 голос
/ 17 июня 2009

Наш инструментарий реинжиниринга программного обеспечения DMS можно получить с помощью надежного полнофункциональный парсер C ++. Увидеть http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Это строит AST и таблицы символов и может вывести тип любого выражения. DMS позволяет проводить произвольные анализы и преобразования в коде C ++.

Одно «простое» преобразование - это использование кода для сбора тестового покрытия данные; мы предлагаем это как инструмент COTS. Посмотрите эту статью, чтобы понять, как это делает DMS: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

РЕДАКТИРОВАТЬ сентябрь 2013 г. (этот ответ становился немного устаревшим): C ++ в DMS анализатор синтаксического анализа / обработки имен / управления потоком обрабатывает полный C ++ 11, в вариантах ISO, GNU и Microsoft. Это также проанализирует (и сохранит) исходный код, содержащий большинство условий препроцессора. Имеет явную грамматику управление процессом анализа, в отличие от GCC или Clang.

...