Trước tiên tôi xin khuyên bạn nên đọc chương 9 (Notation) của The Practice of Programming bởi Kernighan và Pike.
Khi bạn đã làm điều đó, hãy quay lại đây với các câu hỏi cụ thể về cách ánh xạ các khái niệm trong chương đó với các thiết kế cụ thể cho các vấn đề bạn muốn giải quyết.
Mẫu cơ bản là viết một thông dịch viên được chuyển qua đối số 'lệnh' và có thể là đối số 'môi trường' và thực hiện lệnh (trong môi trường). Sau đó, bạn có tùy chọn viết một trình phân tích cú pháp, có một chuỗi 'script' và chuyển đổi nó thành một đối tượng 'lệnh' hợp lệ (ví dụ: một DSL bên ngoài); hoặc bạn cung cấp một thư viện để giúp người dùng xây dựng đối tượng 'lệnh' một cách rõ ràng trong cùng một ngôn ngữ bạn đang sử dụng (internal-DSL).
Kernighan and Pike thực hiện tốt công việc hiển thị cả thông dịch viên tầm thường và phức tạp như thế nào. Nếu bạn muốn có chiều sâu hơn, thì tôi khuyên bạn nên đọc The Essentials of Programming Languages bởi Daniel Friedman et al. Xây dựng ít nhất một trình thông dịch khác nhau cho mỗi chương và trình bày cách triển khai các tính năng như biến, chức năng, phạm vi, đối tượng, lớp, gõ tĩnh và tiếp tục. Tuy nhiên, tôi khuyên bạn nên thử sức với một DSL tầm thường trước tiên, nếu không thì đó chỉ là lý thuyết - một cuốn sách thú vị hơn nhiều khi nó được thực hiện có liên quan và thiết thực bởi kinh nghiệm trước đây của bạn.
Đề xuất nghiêm túc: Triển khai nó bằng Groovy, Scala hoặc Clojure. – Mike
Điều đó hoàn toàn phụ thuộc vào mức độ phức tạp mà bạn muốn DSL. – NawaMan
+1 vì không sử dụng Java cho việc này. Nếu có, tôi sẽ sử dụng Ruby (hoặc JRuby). – cletus