Stratego FAQ

Stratego -- Strategies for Program Transformation
Q: Can I get Stratego/XT running on Windows?

A: We do not currently provide a pre-built binary of 0.17 on Windows at the moment. You can compile Stratego/XT on Windows using Cygwin, provided you install the necessary libraries in advance. In particular, remember to install util-linux in order to get getopt (required for sdf2-bundle). For the previous stable release, 0.16, we have binary releases.

Q: Can I get Stratego/XT running on OSX?

A: This is Unix! I know this! (Yes, by either installing it through Nix or compiling from sources.)

Q: What's the difference between spinetd and oncetd?

A: The spine topdown traversal applies a strategy parameter at every aterm on a spine from the root to a leaf. The once topdown strategy applies its strategy parameter at only a single location.


    A : Term -> Term
    A : Term * Term -> Term
    A : Term * Term * Term -> Term
    A : Term * Term * Term * Term -> Term
    B : Term -> Term
    B : Term * Term -> Term


    main = !A(0,1,B(2,3),4) ; spinetd((not(int) ; debug(!"> ") <+ fail))

Running main gives you this:

> A(0,1,B(2,3),4)
> B(2,3)

Q: Why does sdf2table (SdfChecker?) always complain that the Main module is not defined?

A: When you run sdf2table in the present (0.17) Stratego/XT, e.g.

$ sdf2table -i Expression.def -o Expression.tbl -m Expression

you will always get the error message that the Main module is undefined:

SdfChecker:error: Main module not defined 

This is a known bug. Ignore it. It's been fixed upstream already, and will trickle into newer Stratego/XT releases.

Technical details: The sdf2table script first does a check of the grammar using sdfchecker before it applies the generator, parsetablegen. sdfchecker is the one emitting the error message. Since parsetablegen is the tool responsible for actually generating the .tbl file, it doesn't matter that sdfchecker is being unreasonably cranky.

If this annoys you unbearably, name your main module Main.sdf.

Q: Where is this "alt" stuff coming from?

A: Don't use alternatives in your SDF, i.e. don't use productions of the form

   "foo" (A | B) "bar" -> C

Instead, write

   "foo" AorB "bar" -> C
   A                -> AorB
   B                -> AorB

This is really equivalent, since the SDF normalizer transforms the first production to

   "foo" (A | B) "bar" -> C
   A                   -> (A | B)
   B                   -> (A | B)

However, asfix-implode interprets the latter to include alt constructors. This is needed to cover cases such as

   "foo" ("a" A | "b" B) "bar" -> C

such that the alternatives can be reconstructed (e.g. when pretty-printing). Since the alternatives need to be named to distinghuish them, this is better written as

  "foo" AorB "bar" -> C {cons("Foo")}
  "a" A            -> AorB {cons("A")}
  "b" B            -> AorB {cons("B")}

so that you can actually control the names used.

Q: Where can I find documentation for SDF?

A: SDF lives at

-- KarlTrygveKalleberg - 30 Oct 2008