Methods and Techniques for the Design and Implementation of Domain-Specific Languages