A framework for building declarative DSLs