/**
* Conc to Cons
*
* SDF2 lists are composed by means of a binary concatenation
* operator (\verb|A+ A+ -> A+|) that we translated to
* \verb|Conc| above. In abstract syntax trees we want to
* represent lists by \verb|Cons/Nil| structures. The following
* rules achieve this transformation.
*
* Note: these strategies are not used in the main implode-asfix.
*/
module stratego/asfix/implode/conc
rules
CTC0 : Snoc(x, y) -> Conc(x, Ins(y))
CTC0 : [x | y] -> Conc(Ins(x), y)
CTC1 : Conc(Conc(x, y), z) -> Conc(x, Conc(y, z))
CTC1 : Conc( Conc( a, b, c ), d, e) ->
Conc( a, b, Conc( c, d, e ) )
CTC2 : Conc( x, y, z ) -> <concat>[x,[y],z]
CTC1 : Conc([], x) -> x
CTC1 : Conc(x, []) -> x
CTC2 : Conc(Ins(x), []) -> [x]
CTC2 : Conc(Ins(x), Ins(y)) -> [x, y]
CTC2 : Conc(Ins(x), [y | z]) -> [x, y | z]
CTC3 : Ins(x) -> [x]
CTC4 : Conc([x | y], z) -> Conc(Ins(x), Conc(y, z))
signature
constructors
Ins : a -> List(a)
Conc : List(a) * List(a) -> List(a)
Conc : List(a) * List(a) * List(a) -> List(a)
/**
* @todo Where is this Snoc coming from?
*/
Snoc : List(a) * a -> List(a)
strategies
conc-to-cons =
rec x(repeat(CTC0 + CTC1 + Conc(CTC0, id));
(Conc(id, x) <+ all(x));
try(CTC2; Cons(x, id) + CTC3))