module stratego/rtg/util imports stratego/rtg/signature strategies /** * Returns the right hand sides of productions of the specified non terminal. * * @type RTG -> List(ProdRuleRHS) */ rtg-productions-of(|nt : NonTerm) = ?RTG(_, ProdRules(<id>)) ; filter(?ProdRule(nt, <id>)) ; concat /** * @type RTG -> List(Nonterm) */ rtg-start-nonterms = ?RTG(Start(<id>), ProdRules(<id>)) strategies /** * Rewrites an rtg to one rhs in a prodrule. * * @type RTG -> RTG */ rtg-ungroup-productions = RTG(id, ProdRules(rtg-ungroup-productions)) /** * Rewrites an list of prodrules to one rhs in a prodrule. * * @type List(ProdRule) -> List(ProdRule) */ rtg-ungroup-productions = map(\ ProdRule(nt, rhss) -> <map(!ProdRule(nt, [<id>]))> rhss \) ; concat strategies /** * @type RTG -> RTG */ rtg-group-productions = RTG(id, ProdRules(rtg-group-by-nonterm)) /** * @type List(ProdRule) -> List(ProdRule) */ rtg-group-by-nonterm = rtg-group-by( \ ProdRule(nt, _) -> nt \ // key producer , \ ProdRule(_, rhss) -> rhss \ // reducer to vales , \ (nt, rhsss) -> ProdRule(nt, <concat> rhsss) \ // builder ) strategies rtg-group-by(k, r, build) = ?items ; map(k) ; make-set ; map(rtg-build-group-by-pairs(k, r, build, !items)) rtg-build-group-by-pairs(k, r, build, items) = ?key ; where(<items; filter(where(k; ?key)); map(r)> () => values) ; <build> (key, values)