Xt Archive

Stratego -- Strategies for Program Transformation
Some ideas for making advanced Stratego features more accessible to new users.

Goals

  • Easy to define a syntax for language X and implement a source-to-? or source-to-source transformation for it.

  • Easy to define a transformation for language X, which is already supported by some package (e.g. java-front).

  • Easy to reuse existing syntax definitions. Languages should be 'components' that more or less hide their internal implementation.

XT Archives: Tool and File Integration

One of the problems of XT is that there are many file types for a single subject language. These file types are used by several tools. The users needs to know how to generate all these files and he needs to pass these files explicitly to all the tools.

xtar (xt archive) is a solution to this problem. xtar collects the standard set of files for a specific language into a single zip archive (compare to a jar file). This archive can then be passed to all the XT tools and they just take out the files that they need. The user doesn't need to know what specific files a tool need.

The only input of xtar tool is an SDF module. It takes a -i argument for this module and probably should accept the include flags of pack-sdf. xtar will integrate the following tools:

  • pack-sdf
  • sdf2table
  • sdf2rtg
  • rtg2sig
  • ppgen

The resulting xtar will contain all the files related to a language: a A.def, A.tbl, A.rtg (A.rtg-nf), A.str (A.rtree) and A.pp (A.pp.af). Hence, the xtar contains all the files required to implement a transformation for language A. Furthermore, the archive might contain meta information (compare the a jar manifest).

Components of this archive, in particular the .pp, must be overrideable.


Below are some more adventurous and unclear ideas. These are not directly related to the idea of XT Archives.

Flexible Composition of XTC Repositories

Problem: users more or less need to be in an Autoconf/Automake environment if they need to do composition.

The XTC repository mechanism should be more flexible. Most important: a tool should be able to locate resources from multiple repositories. Also, repositories should be more dynamic: currently repositories are only constructed at install-time.

The configuration of the XTC repositories to use should be more flexible. It should be possible to extend the resources visible to StrategoXT components, without difficult repository construction.

Ideas:

  • Automatically load repositories in a /home/fred/.xtc directory. Packages could provide an 'activate' tool that adds their repository to this directory.

  • Use a ":" separated environment variable 'XTC_REPOS'. This variable can contain multiple XTC repositories, which are all loaded.

  • On-request extension of the XTC bindings. The zip archive of language specific files should for example be accepted by the Stratego compiler. These files are registered and the entries refer to the files in the zip file.

(Karl) I specifically suggest some configuration guidelines for the XTC tools:

  • Every XTC tool will perform a fixed search for dynamic configuration settings, starting with searching for ${prefix}/etc/xtc/xtc.conf, then ${HOME}/.xtc/config (or .xtc.conf), then any environment variables, such as XTC_REPOS. Settings will be overriden upon rediscovery.

  • Easy programmatic inspection of the XTC repository, and xtars, allowing for searching, e.g.: xtc-query Java.sdf will find all available Java.sdfs, and explain the precedence order. (User may have his own experimental stuff in ~/.xtc/myjavastuff.xtar that inadvertently takes precedence over /usr/share/xtc/myjavastuff.xtar).

Also:

  • Documentation; inasmuch as this exists, it should either be in the xtar bundle itself, or referenced in a way that allows for easy queries and subsequent display in a web browser.

In this way, the 'language archive' can be used completely transparantly by the Stratego compiler and other tools.

Include Resources in Executable

Transformation tools should be more or less self-contained, at least they should contain their data files to avoid all the problems in locating this data.

At least, all external files can be packed into one xtar, which is bundled along with the binary. If all auxiliary tools know how to deal with xtars, we have reduced the deployment from binary + heaploads of extra stuff to binary + data, which is already a big improvement.

  • Parse-tables could be included in the binary. They can be written to a temporary file, or libsglr can be used.

  • Transformation tools created in this way should not have a built-in default repository: they should be portable the .xtc mechanism can be used as a default a repository.

  • In-program resources (such as the parse table) should be registered in XTC and can be used as ordinary XTC resources.

  • XTC compositions can be written in a non-automake enviroment.

Inline Meta Files

This is all just an extension of the existing XTC mechanism. Another thing we would like to change is the .meta file. Defining meta information in the program itself is more comprehensible for new users, and it is easier to move files around. The solution is to add a header to a Stratego module. This header will be read separately and the real body will be parsed with the specified syntax. Preferably, this header should be in a concrete syntax.

Example:

    meta
      syntax = StrategoJava

    module foo
    imports
      Java
      java-xtc-tools

    strategies
      main =
        xtc-io-wrap(
          xtc-parse-java
        ; do-my-stuff
        ; xtc-pp-java
        )