Assignment Composing Strategies
Pt
Goal
The goal of this assignment is to learn to understand and use the basic strategy combinators.
Rather than constructing a complete transformation you should construct several small strategies.
You are free (encouraged) to use operators from the Stratego library.
The sources of the Stratego Standard Library can be found in
- /projects/stratego/ssl/spec
Also you can browse the online documentation at
Finding the right definition is a bit of an art. Here are some methods
- Look in the module index for a module with a name that suggests a relation with your application
- Guess a plausible name and
grep in the sources
- Just browse the library sources
Testing
Tests must be implemented using
Stratego Unit, which is a unit-testing framework for Stratego. The Stratego Unit page explains how to create sunit modules and how to write tests.
Iteration
The following module defining various iteration strategies is part of the Stratego Standard Library:
-------------------------------------------
module iteration
imports conditional
strategies
repeat(s, c) = rec x(s; x <+ c)
repeat(s) = rec x(try(s; x))
repeat1(s, c) = rec x(s; (x <+ c))
repeat1(s) = repeat1(s, id)
repeat-until(s, c) = rec x(s; (c <+ x))
while(c, s) = rec x(try(c; s; x))
do-while(s, c) = rec x(s; try(c; x))
while-not(c, s) = rec x(c <+ s; x)
for(i, c, s) = i; while-not(c, s)
-------------------------------------------
Write a module
iteration-test.str which defines tests for each of
these strategies.
The tests should (1) define a sample strategy that is defined in
terms of these operators using some custom made rules, and (2) apply
it to sample terms.
The tests should be such that the
difference between the various
iteration operators is illustrated. Include comments that explains
this difference.
List Operations
The following are strategies implementing list operations:
- filter
- zip
- fetch
- qsort
- map
- partition
- conc
- concat
Find out the definitions of these strategies in the library and
use them to implement the following transformations on lists.
- Sort a list of integers in descending order
- Sort a list of strings in ascending order
- Find the first Let binding in a list of Tiger expressions and replace it with its body
- Replace all Let binding in a list of Tiger expressions and replace them with their bodies
- Reduce a list of expressions to only those expressions that are variables or constants
- Split a list of expressions into a pair of a list of atomic expressions and a list of non-atomic expressions
- Concatenate two lists
- Concatenate a list of lists into one list
- For each element in a list of expressions generate a new name using
new, then combine the list of names with the list of expressions to form a sequence of assignments assigning the expression to a variable using the new name.
Include definitions for these transformations with tests in a
single module
list-transformations.str.
Congruence
A format checker is a `transformation' which checks the format of
a term. For instance, the
TAS-Format component of the Tiger compiler
checks if a term is a well-formed Tiger abstract syntax tree.
Format checkers can be defined nicely using congruence operators.
See
for the soure of the
TAS-Format component.
Define a format checker
SEF-Format that checks that expressions are side-effect free, and issues a warning (using debug) if that is not the case.
According to this format statement constructors (assignments, loops, etc)
should not occur nested in expressions. Function calls should only occur
as the top-level expression of an assignment.
Use this component to check the output of the
liftargs component.
You should get warnings in the places where your transformation does
not lift non-atomic arguments.
Submit
Submit the following files
- iteration-test.str
- list-transformations.str
- SEF-Format.str
- Makefile
- any files needed in your tests