AbstractModelling is an essential activity in software engineering. It
typically involves two meta-levels: one includes meta-models that
describe modelling languages, and the other contains models built by
instantiating those meta-models. Multi-level modelling generalizes this approach by allowing models to span an arbitrary
number of meta-levels. A scenario that profits from multi-level
modelling is the definition of language families that can be
specialized (e.g., for different domains) by successive refinements
at subsequent meta-levels, hence promoting language reuse. This
enables an open set of variability options given by all
possible specializations of the language family. However,
multi-level modelling lacks the ability to express closed variability regarding the availability of language primitives or the
possibility to opt between alternative primitive realizations. This
limits the reuse opportunities of a language family. To improve this
situation, we propose a novel combination of product lines with
multi-level modelling to cover both open and closed variability. Our
proposal is backed by a formal theory that guarantees correctness,
enables top-down and bottom-up language variability design, and is
implemented atop the MetaDepth multi-level modelling tool.