Существует два типа DSL; внешний и встроенный.
Внешний DSL полностью отделен от вашего языка хоста, т.е. вы пишете его вне языка, но обычно используется для генерации кода на языке хоста. Для этого подхода XText с XPand, вероятно, являются лучшими инструментами, поскольку простой файл грамматики генерирует полный редактор на основе Eclipse для нового DSL, и вы можете использовать шаблоны кода в XPand для генерации реального кода Java. XTend и XPand написаны на Java, но это случайно, так как они могут быть написаны на чем угодно, если в конце процесса вы получите код Java. Недостатком этого подхода является то, что для любой достаточно сложной проблемы язык станет довольно сложным, и потребуется много работы по грамматике и даже больше по шаблонам генерации кода. Вы не можете использовать какие-либо функции на главном языке, такие как оценка выражений, поэтому все это необходимо перестроить в DSL, если вам это нужно. XText вскоре будет включать XBase, который является частичным языком, который будет включать выражения, чтобы помочь здесь.
Другой подход - это встроенный DSL, в котором высокоуровневые доменные функции выражаются на языке хоста либо с помощью конструкций более высокого порядка (таких как HOF и монады), обычно встречающихся в функциональных языках, либо с помощью средств метапрограммирования, таких как макросы (например, Lisp). ). В Java нет ни одного из них, поэтому это плохой выбор для работы с DSL (или большинством других форм абстрактного программирования). Spring Roo предлагает тип метапрограммирования для Java с использованием генерации, так что может быть вариант. В противном случае Scala, вероятно, является наиболее популярным языком Java, подобным JVM, и обладает необходимыми средствами.
Встроенные DSL обычно намного проще, чем внешние DSL, потому что у вас есть полная поддержка основного языка, поэтому я рекомендую попробовать Scala.