Существуют ли бесплатные инструменты для автоматической генерации кода? - PullRequest
2 голосов
/ 21 сентября 2009

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

Однако моя программа довольно ограничена. Я уверен, что мог бы потратить некоторое время, чтобы сделать его более надежным и сделать более аккуратные вещи, но я не хочу тратить время и усилия, если уже есть более надежные инструменты, которые делают то же самое. Я полагаю, что должно быть что-то вроде этого, так как парсеры являются неотъемлемой частью компиляторов, но я не видел инструментов специально для автоматической генерации кода, которые позволили бы легко разбираться со структурами данных, представляющими классы, функции и переменные для C ++ специально. Есть ли инструменты, которые делают это?

Edit:

Надеюсь, это немного прояснит то, что я ищу. Программа, которую я имею, запускается как предварительный шаг в визуальной студии. Он читает мои исходные файлы, составляет список классов, их членов, их функций и т. Д., Который затем используется для генерации нового кода. В настоящее время я просто использую его, чтобы было легко читать и записывать мои структуры данных в простой текстовый файл, но я мог бы делать и другие вещи. Программы чтения и записи файлов выводятся в виде простых файлов .cpp и .h, которые я включаю в остальную часть моего проекта, так же, как и любой другой файл. То, что я ищу, - это инструменты, которые делают подобные вещи, так что я могу решить, стоит ли мне продолжать использовать свой собственный или переключиться на какое-то лучшее решение. Я не ищу ничего, что генерирует машинный код или редактирует код, который я написал.

Ответы [ 8 ]

6 голосов
/ 22 сентября 2009

Необходим полный инструмент для создания синтаксического анализатора, такой как ANTLR или YACC, если вы хотите анализировать C ++ с нуля, но для ваших целей это излишне.

Он читает мои исходные файлы, составляет список классов, их членов, их функций и т. Д., Который затем используется для генерации нового кода.

Два основных варианта:

  • GCC-XML может генерировать список классов, членов и функций. Дистрибутивная версия на их веб-сайте довольно старая; вместо этого попробуйте версию CVS. Я не знаю о наличии порта Windows.
  • Doxygen предназначен для создания документации, но он также может генерировать вывод XML, который вы сможете использовать для выполнения своих задач.

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

Это называется сериализацией. Попробуйте Boost.Serialization или, может быть, libs11n или Буферы протокола Google . Переполнение стека требует дальнейшего обсуждения.

... но я мог бы заниматься и другими вещами.

К другим классным приложениям такого рода автоматической генерации кода относятся рефлексия (проверка членов ваших объектов во время выполнения, использование утка с C ++ и т. Д.) И генерация оболочек для вызова C ++ из языков сценариев. Для библиотеки отражений C ++ см. Reflex . Пример создания оболочек для языков сценариев см. В Boost.Python или SWIG .

.
2 голосов
/ 22 сентября 2009

Не забудьте про Cog . Это требует, чтобы вы знали Python. По сути, он встраивает вывод скриптов Python в ваш код. Его нелепо легко использовать, но он использует совершенно иной подход, чем ANTLR, и его назначение несколько иное.

2 голосов
/ 22 сентября 2009

В справке по C ++ Lite есть ссылки на грамматики YACC для C ++. YACC - это анализатор старой школы, который использовался для создания выходных данных синтаксического анализатора, неуклюжий и сложный в освоении, но очень мощный В настоящее время вы бы использовали Gnu Bison вместо YACC.

1 голос
/ 30 сентября 2009

Если вам нужны инструменты, которые могут анализировать производственный код C ++ и выполнять произвольные анализы и преобразования, см. Наш инструментарий реинжиниринга программного обеспечения DMS и его C ++ интерфейс .

Было бы просто использовать информацию, которую DMS может предоставить о коде C ++, его структурах, типах, экземплярах, для генерации таких функций доступа. Если вы хотите сгенерировать функции доступа на другом языке, DMS предоставляет средства для преобразования кода с языка ввода (в данном случае C ++) на этот целевой язык.

1 голос
/ 23 сентября 2009

I ответил на аналогичный вопрос (разделив исходные файлы на отдельные файлы header и cpp), предложив использовать lzz .

У lzz есть очень мощный синтаксический анализатор C ++, который создает представление для всего, кроме тел функций. Пока вам не нужно содержимое тел функций, вы можете изменить 'lzz', чтобы он выполнял необходимый шаг генерации.

1 голос
/ 21 сентября 2009

Может быть, Boost :: Serialize или ANTLR?

0 голосов
/ 09 декабря 2011

Я уже профессионально использовал движок Nvelocity в сочетании с C # в качестве предварительного шага к кодированию, с очень хорошими результатами.

0 голосов
/ 22 сентября 2009

Mozilla разработала Свинина для такого рода вещей. Я не могу сказать, что его легко использовать (или даже строить), но он находится в производстве.

...