Я не использовал CodeSmith, но я довольно много сделал для генерации кода. Примечательно, что я написал большую часть системы управления конфигурацией (CM) для системы WiMAX, где код CM был сгенерирован для 3 различных платформ. Единственным отличием была модель CM для каждой платформы.
Модель была на собственном доменно-специфическом языке (DSL), для которого у нас был парсер. Язык представлял собой базовый стиль контейнера / элемента, в котором контейнеры могли вкладываться и иметь идентификатор, а элементы имели предопределенные типы. Документация была атрибутом элементов и контейнеров. Вы можете добавить Lua фрагменты к определениям элемента и контейнера, чтобы выполнить семантическую проверку (например, значение находится в правильном диапазоне, если это IP-адрес, это в диапазоне CIDR, определенном в другом месте, и т. Д.).
Парсер сгенерировал синтаксическое дерево, которое мы затем добавили в шаблоны. Язык шаблонов был частичной реализацией C StringTemplate . Мы использовали его для генерации:
- API C для конкретной модели, к которому приложения могут обращаться для получения значений конфигурации,
- Собранный код Lua для проверки модели и предоставления полезных сообщений об ошибках,
- Два «бэкэнда» для API, который будет управлять значениями в памяти (для временного манипулирования моделью) и в системе базы данных (для совместного использования между процессами),
- Анализатор и средство записи файла конфигурации,
- документация HTML и
- Реализация интерфейса командной строки (CLI) для интерактивного просмотра и изменения конфигурации.
Оглядываясь назад, я должен был просто использовать Lua напрямую в качестве DSL. Это было бы более многословно, но наличие синтаксического анализатора и множества доступных шаблонов Lua позволило бы сэкономить много усилий при разработке.
Для вещей, которые имеют повторяющуюся структуру и четко определенные правила относительно того, что эти вещи должны делать, генерация кода может быть замечательной вещью.