Stratego is a declarative language for the implementation of program transformation systems (for example compilers) as term rewriting systems. [Term rewriting](https://en.wikipedia.org/wiki/Rewriting) is a declarative approach for the implementation of program transformations. Stratego is a language that uses declarative rewrite rules, but gives some control over how the rewrite rules are applied. This helps with keeping the rewrite rules clean and unencumbered by the details of rewriting strategies (like number of passes and order). Stratego was created by [Prof Eelco Visser](https://eelcovisser.org/). The original paper describing the ideas behind Stratego is [A Core Language for Rewriting](https://eelcovisser.org/publications/1998/VisserB98.pdf). I was one of the main developers of the Stratego/XT program transformation system, which combines the Stratego language with tools for implementing end-to-end program transformations (eg parsers, pretty-printers, libraries). A good introduction to the system is the system paper [Stratego/XT 0.17: A Language and Toolset for Program Transformation](https://s3.us-west-2.amazonaws.com/martin.bravenboer.name/docs/est08.pdf). After I started my work on Doop, the Stratego team moved to develop [Spoofax](https://spoofax.dev/), which is an implementation of Stratego and related tools in for the JVM, primarily offered as an Eclipse plugin. I personally still have a soft spot for the original command-line (C) implementation of Stratego/XT. The Stratego/XT implementation has not been maintained since 2009, but I have recently started working on restoring the implementation to properly function on modern operating systems. This is still very much work in progress. I will make an announcement here when it is in usable state. - https://github.com/mbravenboer/strategoxt - https://github.com/mbravenboer/sdf - https://github.com/mbravenboer/aterm