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

Где я могу найти стандартную грамматику BNF или YACC для языка С++?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Из С++ FAQ Lite:

38.11 Есть ли yacc -способная грамматика С++?

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

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

Ответ 3

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

Ответ 4

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

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

В действительности вы находитесь на полпути к компилятору, если вы можете разобрать С++.

Ответ 5

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

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

EDIT Сентябрь 2013 года (этот ответ немного устарел): DMS С++ анализ парсера/имени/анализа потока управления обрабатывает полный С++ 11, в вариантах ISO-, GNU- и Microsoft. Он также будет анализировать (и сохранять) исходный код, содержащий большинство условий препроцессора. Он имеет явную грамматику вождение процесса синтаксического анализа, в отличие от GCC или Clang.

Ответ 6

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

После повторного чтения вашего комментария...

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