Prima Mi raccomando di leggere il capitolo 9 (Notation) di The Practice of Programming da Kernighan e Pike.
Quando hai finito, torna qui con domande specifiche su come mappare i concetti in quel capitolo a progetti specifici per i problemi che vuoi risolvere.
Lo schema di base è scrivere un interprete che ha passato un argomento 'comando', ed eventualmente un argomento 'ambiente' ed esegue il comando (nell'ambiente). Hai quindi la possibilità di scrivere un parser, che accetta una stringa 'script' e la converte in un oggetto 'comando' valido (ad esempio un DSL esterno); oppure fornisci una libreria per aiutare gli utenti a costruire esplicitamente l'oggetto 'comando' nella stessa lingua che stai usando (internal-DSL).
Kernighan e Pike fanno un buon lavoro nel mostrare quanto sia banale e complesso un interprete. Se si desidera una maggiore profondità, suggerirei di leggere The Essentials of Programming Languages di Daniel Friedman et al. Che crea almeno un interprete diverso per capitolo e dimostra come implementare funzionalità come variabili, funzioni, ambiti, oggetti, classi, tipizzazione statica e continuazioni.
Tuttavia, suggerirei di provare prima una semplice DSL, altrimenti è solo una teoria - un libro è molto più interessante quando è reso pertinente e pratico dalla tua precedente esperienza.
Suggerimento serio: implementarlo utilizzando Groovy, Scala o Clojure. – Mike
Ciò dipende totalmente dalla complessità con cui vorresti che fosse la DSL. – NawaMan
+1 per non utilizzare Java per questo. Se mai, userei Ruby (o JRuby). – cletus