/** * Implosion of AsFix to an AST. */ module stratego/asfix/implode imports libstratego-lib stratego/asfix/signature stratego/asfix/implode/alternative stratego/asfix/implode/constructor stratego/asfix/implode/conc stratego/asfix/implode/concrete-syntax stratego/asfix/implode/injection stratego/asfix/implode/layout stratego/asfix/implode/lexical stratego/asfix/implode/list stratego/asfix/implode/sort stratego/asfix/implode/tuple /** * Main entry points for implosion of AsFix */ strategies implode-asfix = implode-asfix(true) implode-asfix-skip-concrete-syntax = implode-asfix(false) /** * @param Succeed if concrete syntax must be imploded. */ implode-asfix(implode-concrete) = ?parsetree(<id>, _) ; rec x( ImplodeLexical <+ where(not(implode-concrete)) ; skip-concrete(x) <+ appl(id, filter(not(is-ignorable-syntax))) ; ( ImplodeOptionalList; x <+ ReplCons(x) <+ ImplodeInjection; x <+ ImplodeTuple; x <+ ImplodeAlternative; x) <+ amb(map(x)) <+ all(x) ) strategies /** * Implodes a slight variant of the asfix format, similar to * the command-line implodePT tool. Don't use this imploder, * unless you know you need it. */ implode-parsetree = ?t; prim("STRSGLR_implode_parsetree", t) /** * Alternative entry-points used by implode-asfix */ strategies /** * Replace applications by application of sort symbol */ asfix-appl-to-sort = topdown(repeat(ApplToSort)) /** * Flatten lexical sub trees in the parse tree */ asfix-flat-lex = downup2(try(ImplodeLexical), try(ImplodeLayout)) /** * Remove layout nodes from the parse tree */ asfix-remove-layout = topdown(try( appl(prod(filter(not(is-layout')),id,id),filter(not(is-layout'))))) /** * Remove literal nodes from the parse tree */ asfix-remove-lit = topdown(try(is-list;filter(not(lit(id))))) /** * Flatten Alternatives: appl(alt(a,alt(b,alt(c,d))),[d]) -> alt(4,d) */ asfix-flat-alt = topdown(try(ImplodeAlternative)) /** * Replace appl nodes with their cons attribute if available. */ asfix-replace-appl = topdown(try(appl(id,id); Cns)) ; conc-to-cons /** * Flatten injections in a parse tree */ asfix-flat-injections = bottomup(try(ImplodeInjection)) /** * Flatten list constructs */ asfix-flat-list = topdown(try(FlatList)) /** * Replace sequence by tuples */ asfix-remove-seq = topdown(try(ImplodeTuple))