diff --git a/shared/rascal/src/io/ReadXBGF.rsc b/shared/rascal/src/io/ReadXBGF.rsc index 1c633eaa..b4ef9567 100644 --- a/shared/rascal/src/io/ReadXBGF.rsc +++ b/shared/rascal/src/io/ReadXBGF.rsc @@ -65,14 +65,11 @@ XBGFCommand mapxbgf(Node el) case element(_,"redefine",ps): return redefine([mapprod(p) | p <- ps]); case element(_,"remove",[element(none(),"horizontal",[prod])]): return removeH(mapprod(prod)); case element(_,"remove",[element(none(),"vertical",[prod])]): return removeV(mapprod(prod)); - case element(_,"rename",[element(none(),"label",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameL(s1, s2, globally()); - case element(_,"rename",[element(none(),"label",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)]),w])]): return renameL(s1, s2, mapcontext(w)); - case element(_,"rename",[element(none(),"nonterminal",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameN(s1, s2, globally()); - case element(_,"rename",[element(none(),"nonterminal",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)]),w])]): return renameN(s1, s2, mapcontext(w)); + case element(_,"rename",[element(none(),"label",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameL(s1, s2); + case element(_,"rename",[element(none(),"nonterminal",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameN(s1, s2); case element(_,"rename",[element(none(),"selector",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameS(s1, s2, globally()); case element(_,"rename",[element(none(),"selector",[element(none(),"in",[charData(str w)]),element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameS(s1, s2, inlabel(w)); - case element(_,"rename",[element(none(),"terminal",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameT(s1, s2, globally()); - case element(_,"rename",[element(none(),"terminal",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)]),w])]): return renameT(s1, s2, mapcontext(w)); + case element(_,"rename",[element(none(),"terminal",[element(none(),"from",[charData(str s1)]),element(none(),"to",[charData(str s2)])])]): return renameT(s1, s2); case element(_,"replace",[e1,e2]): return replace(mapexpr(e1),mapexpr(e2),globally()); case element(_,"replace",[e1,e2,w]): return replace(mapexpr(e1),mapexpr(e2),mapcontext(w)); case element(_,"reroot",roots): return reroot([r | element(none(),"root",[charData(r)]) <- roots]); diff --git a/shared/rascal/src/io/WriteXBGF.rsc b/shared/rascal/src/io/WriteXBGF.rsc index dff66708..ec43bf9c 100644 --- a/shared/rascal/src/io/WriteXBGF.rsc +++ b/shared/rascal/src/io/WriteXBGF.rsc @@ -67,14 +67,11 @@ Node xbgf2xml(XBGFCommand step) case redefine(ps): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"redefine",[prod2xml(p) | p <- ps]); case removeH(prod): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"remove",[element(none(),"horizontal",[prod2xml(prod)])]); case removeV(prod): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"remove",[element(none(),"vertical",[prod2xml(prod)])]); - case renameL(s1, s2, globally()): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"label",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); - case renameL(s1, s2, w): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"label",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)]),context2xml(w)])]); - case renameN(s1, s2, globally()): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"nonterminal",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); - case renameN(s1, s2, w): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"nonterminal",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)]),context2xml(w)])]); + case renameL(s1, s2): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"label",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); + case renameN(s1, s2): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"nonterminal",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); case renameS(s1, s2, globally()): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"selector",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); case renameS(s1, s2, inlabel(str s)): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"selector",[element(none(),"in",[charData(s)]),element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); - case renameT(s1, s2, globally()): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"terminal",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); - case renameT(s1, s2, w): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"terminal",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)]),context2xml(w)])]); + case renameT(s1, s2): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"rename",[element(none(),"terminal",[element(none(),"from",[charData(s1)]),element(none(),"to",[charData(s2)])])]); case replace(e1,e2,globally()): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"replace",[expr2xml(e1),expr2xml(e2)]); case replace(e1,e2,w): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"replace",[expr2xml(e1),expr2xml(e2),element(none(),"in",[context2xml(w)])]); case reroot(roots): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"reroot",[element(none(),"root",[charData(r)]) | r <- roots]); diff --git a/shared/rascal/src/syntax/XBGF.rsc b/shared/rascal/src/syntax/XBGF.rsc index f8a1dd69..c554e535 100644 --- a/shared/rascal/src/syntax/XBGF.rsc +++ b/shared/rascal/src/syntax/XBGF.rsc @@ -44,10 +44,10 @@ data XBGFCommand = | redefine(list[BGFProduction] ps) | removeH(BGFProduction p) // marked | removeV(BGFProduction p) - | renameL(str x, str y, XBGFContext w) - | renameN(str x, str y, XBGFContext w) - | renameS(str x, str y, XBGFContext w) - | renameT(str x, str y, XBGFContext w) + | renameL(str x, str y) + | renameN(str x, str y) + | renameS(str x, str y, XBGFContext w) // only inlabel(z) + | renameT(str x, str y) | replace(BGFExpression e1, BGFExpression e2, XBGFContext w) | reroot(list[str] xs) //| splitN(list[BGFProduction] ps, list[BGFProduction] qs, XBGFContext w) diff --git a/shared/rascal/src/transform/XBGF.rsc b/shared/rascal/src/transform/XBGF.rsc index acb1b121..79fb97c1 100644 --- a/shared/rascal/src/transform/XBGF.rsc +++ b/shared/rascal/src/transform/XBGF.rsc @@ -53,10 +53,10 @@ public BGFGrammar transform(XBGFSequence xbgf, BGFGrammar g) case redefine(list[BGFProduction] ps): g1 = runRedefine(ps,g1); case removeH(BGFProduction p): g1 = runRemoveH(p,g1); case removeV(BGFProduction p): g1 = runRemoveV(p,g1); - case renameL(str x, str y, XBGFContext w): g1 = runRenameL(x,y,w,g1); - case renameN(str x, str y, XBGFContext w): g1 = runRenameN(x,y,w,g1); + case renameL(str x, str y): g1 = runRenameL(x,y,g1); + case renameN(str x, str y): g1 = runRenameN(x,y,g1); case renameS(str x, str y, XBGFContext w): g1 = runRenameS(x,y,w,g1); - case renameT(str x, str y, XBGFContext w): g1 = runRenameT(x,y,w,g1); + case renameT(str x, str y): g1 = runRenameT(x,y,g1); case replace(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runReplace(e1,e2,w,g1); case reroot(list[str] xs): g1 = runReroot(xs,g1); case splitN(str x, list[BGFProduction] ps, XBGFContext w): g1 = runSplitN(x,ps,w,g1); @@ -376,19 +376,31 @@ BGFGrammar runNarrow(BGFExpression e1, BGFExpression e2, XBGFContext w, g) return runReplace(e1,e2,w,g); } -BGFGrammar runPermute(BGFProduction p, BGFGrammar g) +BGFGrammar runPermute(BGFProduction p, grammar(rs, ps)) { - // TODO + if (production(str l, str n, sequence(L1)) := p) + { + = splitPbyW(ps,innt(n)); + if ([production(_, n, sequence(L2))] := ps2) + { + if (toSet(L1) == toSet(L2)) + return grammar(rs, ps1 + p + ps3); + else + throw "Phrases and must be permutations of each other."; + } + else throw "Permutation requires a single sequence instead of ."; + } + else throw "Permutation parameter requires a sequence instead of

."; return g; } -BGFGrammar runProject(BGFProduction p1, grammar(roots, ps)) +BGFGrammar runProject(BGFProduction p1, grammar(rs, ps)) { p2 = unmark(p1); if (p2 notin ps) throw "Production rule not found."; p3 = demark(p1); - return grammar(roots, ps - p2 + p3); + return grammar(rs, ps - p2 + p3); } BGFGrammar runRAssoc(BGFProduction p, BGFGrammar g) @@ -435,30 +447,45 @@ BGFGrammar runRemoveV(BGFProduction p1, grammar(roots, ps)) } } -BGFGrammar runRenameL(str x, str y, XBGFContext w, BGFGrammar g) +BGFGrammar runRenameL(str x, str y, grammar(rs, ps)) { - // TODO - return g; + if (x == "") throw "Source label must not be empty for renaming, use designate."; + if (y == "") throw "Target label must not be empty for renaming, use unlabel."; + if (size([p | p <- ps, production(x, _, _) := p]) != 1) + throw "Source name for renaming must be fresh and unique."; + if (size([p | p <- ps, production(y, _, _) := p]) != 0) + throw "Target name for renaming must be fresh."; + = splitPbyW(ps,inlabel(x)); + if ([production(x, str n, BGFExpression e)] := ps2) + return grammar(rs, ps1 + production(y, n, e) + ps3); + else + throw "Label is not found or not unique"; // the latter should never happen } -BGFGrammar runRenameN(str x, str y, XBGFContext w, BGFGrammar g) +BGFGrammar runRenameN(str x, str y, grammar(rs, ps)) { - // TODO - return g; + ns = allNs(ps); + if (x notin ns) throw "Source name for renaming must not be fresh."; + if (y in ns) throw "Target name for renaming must be fresh."; + = splitPbyW(ps,innt(x)); + return runReplace(nonterminal(x),nonterminal(y),globally(),grammar(rs,ps1 + [production(l,y,e) | p <- ps2, production(str l,x,BGFExpression e) := p] + ps3)); } -BGFGrammar runRenameS(str x, str y, XBGFContext w, BGFGrammar g) +BGFGrammar runRenameS(str x, str y, XBGFContext w, grammar(rs, ps)) { - // TODO - return g; + = splitPbyW(ps,w); + if (/selectable(x,_) !:= ps2) throw "Source name for renaming must not be fresh."; + if (/selectable(y,_) := ps2) throw "Target name for renaming must be fresh."; + ps4 = visit(ps2){case selectable(x,BGFExpression e) => selectable(y,e)} + return grammar(rs, ps1 + ps4 + ps3); } -BGFGrammar runRenameT(str x, str y, XBGFContext w, grammar(rs, ps)) +BGFGrammar runRenameT(str x, str y, grammar(rs, ps)) { ts = allTs(ps); if (x notin ts) throw "Source name for renaming must not be fresh."; if (y in ts) throw "Target name for renaming must be fresh."; - return runReplace(terminal(x),terminal(y),w,grammar(rs,ps)); + return runReplace(terminal(x),terminal(y),globally(),grammar(rs,ps)); } BGFGrammar runReplace(BGFExpression e1, BGFExpression e2, XBGFContext w, grammar(rs, ps)) diff --git a/shared/rascal/src/transform/XBGFTest.rsc b/shared/rascal/src/transform/XBGFTest.rsc index 1a49010b..d0196922 100644 --- a/shared/rascal/src/transform/XBGFTest.rsc +++ b/shared/rascal/src/transform/XBGFTest.rsc @@ -112,10 +112,10 @@ map[str,tuple[XBGFSequence,BGFGrammar,BGFGrammar]] test_data = ( "remove_inside": <[removeH(production("","expr",sequence([optional(choice([marked(terminal("+")),terminal("-")])),nonterminal("int")])))],grammar([],[production("","expr",sequence([optional(choice([terminal("+"),terminal("-")])),nonterminal("int")]))]),grammar([],[production("","expr",sequence([optional(terminal("-")),nonterminal("int")]))])>, "remove_vertical": <[removeV(production("","expr",nonterminal("id")))],grammar([],[production("","expr",nonterminal("int")),production("","expr",nonterminal("id"))]),grammar([],[production("","expr",nonterminal("int"))])>, "rename4": <[renameS("op","operator",inlabel("binary"))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]),grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("operator",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))])>, -"renameL": <[renameL("binary","binary_expr",globally())],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]),grammar([],[production("constant","expr",nonterminal("int")),production("binary_expr","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))])>, -"renameN": <[renameN("expr","exp",globally())],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]),grammar([],[production("constant","exp",nonterminal("int")),production("binary","exp",sequence([nonterminal("exp"),selectable("op",nonterminal("binary_op")),nonterminal("exp")])),production("unary","exp",sequence([selectable("op",nonterminal("unary_op")),nonterminal("exp")]))])>, +"renameL": <[renameL("binary","binary_expr")],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]),grammar([],[production("constant","expr",nonterminal("int")),production("binary_expr","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))])>, +"renameN": <[renameN("expr","exp")],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]),grammar([],[production("constant","exp",nonterminal("int")),production("binary","exp",sequence([nonterminal("exp"),selectable("op",nonterminal("binary_op")),nonterminal("exp")])),production("unary","exp",sequence([selectable("op",nonterminal("unary_op")),nonterminal("exp")]))])>, "renameS": <[renameS("op","operator",globally())],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]),grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),selectable("operator",nonterminal("binary_op")),nonterminal("expr")])),production("unary","expr",sequence([selectable("operator",nonterminal("unary_op")),nonterminal("expr")]))])>, -"renameT": <[renameT("x","y",globally())],grammar([],[production("","x",terminal("x"))]),grammar([],[production("","x",terminal("y"))])>, +"renameT": <[renameT("x","y")],grammar([],[production("","x",terminal("x"))]),grammar([],[production("","x",terminal("y"))])>, "replace_choice": <[replace(choice([nonterminal("c"),nonterminal("b")]),nonterminal("d"),innt("a"))],grammar([],[production("","a",choice([nonterminal("b"),nonterminal("c")]))]),grammar([],[production("","a",nonterminal("d"))])>, "replace_choice_part": <[replace(choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("e")])]),sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("e")])]),globally())],grammar([],[production("","a",choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")]),sequence([nonterminal("b"),nonterminal("e")])]))]),grammar([],[production("","a",choice([sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("e")])]),sequence([nonterminal("b"),nonterminal("d")])]))])>, "replace_global": <[replace(nonterminal("x"),nonterminal("y"),globally())],grammar([],[production("l1","a",nonterminal("x")),production("l2","b",nonterminal("x")),production("l3","b",star(nonterminal("x"))),production("l4","c",nonterminal("x"))]),grammar([],[production("l1","a",nonterminal("y")),production("l2","b",nonterminal("y")),production("l3","b",star(nonterminal("y"))),production("l4","c",nonterminal("y"))])>,