There are two approaches to writing DLSs, Internal and External to the implementation language.
With internal DSLs the ruby parser is used (eg. ActiveRecord). It is surprising just how much you can personalise your language and still remain within the syntax of ruby.
see 'Creating DLSs In Ruby'
External languages require you to write a parser. This sounds hard, but there are a few libraries available that simplify the process. Check out multi and sexp gems.
see 'If It's Not Nailed Down, Steal It'