/** * Implosion of AsFix lists. */ module stratego/asfix/implode/list /** * Flatten list constructs * * Note: these rules are not used by implode-asfix: they are only * applied in flat-list. */ rules FlatList: appl(prod([cf(iter(_))],cf(iter-star(_)),_),[x]) -> <FlatList>x FlatList: appl(prod([],cf(iter-star(_)),_),[]) -> [] FlatList: appl(prod(_,cf(iter(_)),_),[x]) -> [x] FlatList: appl(prod(_,cf(iter(_)),_),[x|xs]) -> z where rec x ( \ appl(prod(_,cf(iter(_)),_),[a]) -> [a] \ <+ \ appl(prod(_,cf(iter(_)),_),[a,b]) -> <concat>[<x>a, <x>b] \ <+ \ appl(prod(_,cf(iter(_)),_),[a,w,b]) -> <concat>[<x>a,[w],<x>b] \ ) => z FlatList: appl(prod([cf(iter-sep(_,_))],cf(iter-star-sep(_,_)),_),[x]) -> <FlatList>x FlatList: appl(prod([], cf(iter-star-sep(_,_)),_),[]) -> [] FlatList: appl(prod(_,cf(iter-sep(_,_)),_),[x]) -> [x] FlatList: appl(prod(_,cf(iter-sep(_,_)),_),[x|xs]) -> z where rec x ( \ appl(prod(_,cf(iter-sep(_,_)),_),[a]) -> [a] \ <+ \ appl(prod(_,cf(iter-sep(_,_)),_),[a,b,c]) -> <concat>[<x>a, [b],<x>c] \ <+ \ appl(prod(_,cf(iter-sep(_,_)),_),[a,w1,b,w2,c]) -> <concat>[<x>a, [w1,b,w2],<x>c] \ ) => z rules ImplodeOptionalList : appl(prod([], cf(opt(s)), _), []) -> [] where <is-asfix-list> s ImplodeOptionalList : appl(prod([cf(s)], cf(opt(s)), _), [x]) -> x where <is-asfix-list> s ImplodeOptionalList : appl(prod([], opt(s), _), []) -> [] where <is-asfix-list> s ImplodeOptionalList : appl(prod([s], opt(s), _), [x]) -> x where <is-asfix-list> s strategies is-list-sort = iter(id) + iter-sep(id, id) + iter-star(id) + iter-star-sep(id, id) is-asfix-list = rec x( is-list-sort + seq(map(lit(id) + layout() + x)) )