  Context: Domain-specific languages (DSLs) enable domain experts to specify
tasks and problems themselves, while enabling static analysis to elucidate
issues in the modelled domain early. Although language workbenches have
simplified the design of DSLs and extensions to general purpose languages,
static analyses must still be implemented manually.
  Inquiry: Moreover, static analyses, e.g., complexity metrics, dependency
analysis, and declaration-use analysis, are usually domain-dependent and cannot
be easily reused. Therefore, transferring existing static analyses to another
DSL incurs a huge implementation overhead. However, this overhead is not always
intrinsically necessary: in many cases, while the concepts of the DSL on which
a static analysis is performed are domain-specific, the underlying algorithm
employed in the analysis is actually domain-independent and thus can be reused
in principle, depending on how it is specified. While current approaches either
implement static analyses internally or with an external Visitor, the
implementation is tied to the language's grammar and cannot be reused easily.
Thus far, a commonly used approach that achieves reusable static analysis
relies on the transformation into an intermediate representation upon which the
analysis is performed. This, however, entails a considerable additional
implementation effort.
  Approach: To remedy this, it has been proposed to map the necessary
domain-specific concepts to the algorithm's domain-independent data structures,
yet without a practical implementation and the demonstration of reuse. Thus, to
make static analysis reusable again, we employ relational Reference Attribute
Grammars (RAGs) by creating such a mapping to a domain-independent overlay
structure using higher-order attributes.
  Knowledge: We describe how static analysis can be specified on
analysis-specific data structures, how relational RAGs can help with the
specification, and how a mapping from the domain-specific language can be
performed. Furthermore, we demonstrate how a static analysis for a DSL can be
externalized and reused in another general purpose language.
  Grounding: The approach was evaluated using the RAG system JastAdd. To
illustrate reusability, we implemented two analyses with two addressed
languages each: a cycle detection analysis used in a small state machine DSL
and for detecting circular dependencies in Java types and packages, and an
analysis of variable shadowing, applied to both Java and the Modelica modelling
language. Thereby, we demonstrate the reuse of two analysis algorithms in three
completely different domains. Additionally, we use the cycle detection analysis
to evaluate the efficiency by comparing our external analysis to an internal
reference implementation analysing all Java programs in the Qualitas Corpus and
thereby are able to show that an externalized analysis incurs only minimal
overhead.
  Importance: We make static analysis reusable, again, showing the practicality
and efficiency of externalizing static analysis for both DSLs and general
purpose languages using relational RAGs.
