/**
* Implosion of AsFix Layout
*/
module stratego/asfix/implode/layout
strategies
/**
* Layout can be ignored.
*/
is-ignorable-syntax =
is-layout
/**
* Literals can be ignored.
*/
is-ignorable-syntax =
?appl(prod(_, lit(_), _), _)
/**
* Case insensitive literals can be ignored.
*
* @todo This is questionable: you cannot preserve the case of a literal in this way.
*/
is-ignorable-syntax =
?appl(prod(_, cilit(_), _), _)
/**
* In AsFix2ME, literals can occur directly as arguments of an
* application. For this reason, we include literals in the possible
*/
is-ignorable-syntax =
?lit(_)
is-ignorable-syntax =
?cilit(_)
strategies
is-layout =
?appl(prod(_, cf(opt(layout())), _), _)
is-layout =
cf(opt(layout()))
/**
* @todo Find out why this strategy is used.
*/
is-layout' =
appl(prod(id, cf(opt(layout)), id), id)
+ cf(opt(layout))
+ layout(id)
strategies
rm-layout =
rec x(
try(
appl(id, filter(not(is-layout); x))
+ amb(map(x))
)
)
rules
ImplodeLayout :
appl(prod(_,cf(layout()),_), x) -> <concat-strings> x
ImplodeLayout :
appl(prod(_,cf(opt(layout())),_),[]) -> layout([])
ImplodeLayout :
appl(prod(_,cf(opt(layout())),_),[xs]) -> layout([xs])
/**
* @todo Move to a more appropiate place.
*/
signature
constructors
layout : List(Foo) -> Layout