I would recommend creating your DSL on top of an existing language (internal DSL). I've done this a few times with Python, creating systems where the consumer of the DSL writes a python file that is used as a configuration file for the system. The configuration file uses constructs (classes, functions) that I have defined. These constructs form the DSL.
IMO, a language like Python (IronPython or Jython if the host system is .NET or Java) or Ruby (IronRuby, JRuby) is better for basing your DSL on than Java or C#.
In my case the host systems has also been (C)Python, so choosing Python for the DSL has been the natural thing.
Some pros:
- Lower cost of building. There is a lot less for you to implement. You can focus on the problem at hand instead of spending time to implement a parser/compiler/interpreter.
- Access to the host language: Your language will have access to the full power of the existing language/platform.