How to Run Stratego Programs¶
Stratego programs that are part of a language project in Spoofax/Eclipse are run by creating a menu entry that invokes a strategy in your program.
Extend Spoofax Menu¶
module $ModuleName
menus
menu: "$Menu" (openeditor)
action: "$MenuEntry" = $Id
Add a new ESV file in the editor/ directory of your project or use an existing one.
In the menus section, create a menu with an appropriate name.
Adding the attribute openeditor ensures that the result of running the program will be opened in an editor.
Add an action entry to the menu with the name of the menu entry and the name of the builder strategy to invoke.
This should add a menu entry Spoofax > Menu > Action to the editor for your language.
Define Builder¶
$Id:
(node, _, _, path, project-path) -> (filename, result)
with filename := <guarantee-extension(|$Extension)> path
with result := <$Strategy>node
In your Stratego program, probably in some top-level file in the trans/ directory of your project, add a 'builder' rewrite rule.
Such a rewrite rule defines the interface between the user-interface (action menu entry) and your program.
A builder has the interface shown above.
When invoking the builder, Spoofax takes care of parsing the program and converting it to abstract syntax term.
It takes a quintuple of the selected AST node, the entire ast, the file path, and the project-path and returns a pair of the filename and result.
The results are computed in the conditions of the builder rule.
The new filename is typically derived from the old file name in path
The result is computed by invoking a strategy on the selected node or on the entire ast.
Example: Parser¶
module Syntax
//...
menus
menu: "Syntax" (openeditor)
action: "Show parsed AST" = debug-show-aterm (source)
debug-show-aterm:
(node, _, _, path, project-path) -> (filename, result)
with
filename := <guarantee-extension(|"aterm")> path
; result := node
The debug-show-aterm provided with new Spoofax projects returns the selected node as result.
Since Spoofax ensures that the content of the editor is parsed, this returns the AST of the editor content as a (pretty-printed) term.
Example: Term Builder¶
module Compilation
menus
menu: "Compilation" (openeditor)
action: "Desugar (AST)" = desugar-aterm
rules
desugar-aterm:
(node, _, _, path, project-path) -> (filename, result)
with filename := <guarantee-extension(|"d.aterm")> path
with result := <desugar>node
The Desugar (AST) menu action calls the desugar-aterm builder, which in turn uses the desugar strategy to transform the selected node.
The result is returned in a file with extension d.aterm.
Example: Pretty Printing Builder¶
module Compilation
menus
menu: "Compilation" (openeditor)
action: "Desugar" = desugar-pp
rules
desugar-pp:
(node, _, _, path, project-path) -> (filename, result)
with filename := <guarantee-extension(|"d.tig")> path
with result := <desugar; pp-tiger-string>node
The Desugar menu action calls the desugar-pp builder.
That strategy transforms the selected node with desugar and pretty-prints the resulting term with pp-tiger-string.
The result is returned in a file with extension d.tig.
Define SPT Tests¶
An alternative way to run transformations is to test them using SPT tests.
This allows you to systematically run a transformation on a number of typical cases.
Run On Save¶
When a Stratego program is applied in production, a transformation can be applied automatically whenever a program in your language is saved.
Created: June 3, 2025