Где я могу найти стандартную грамматику BNF или YACC для языка С++?
Я пытаюсь работать над генератором кода, чтобы помочь модулю тестирования старого смешанного проекта C/С++. Я не считаю, что какой-либо независимый инструмент может генерировать код заглушки из объявления. Поэтому я решил построить один, это не должно быть так сложно.
Пожалуйста, кто-нибудь может указать мне стандартную грамматическую ссылку, лучше описываемую языком yacc.
Надеюсь, я не изобретаю колесо, пожалуйста, помогите мне в этом случае.
С наилучшими пожеланиями,
Кевин
Ответы
Ответ 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.
После повторного чтения вашего комментария...
Я думаю, этот инструмент точно соответствует вашим потребностям.