Skip to content

Commit

Permalink
(re)done: permute, renameN, renameS, renameL; fixed: reading renameL,…
Browse files Browse the repository at this point in the history
… renameN, renameT (no scope)
  • Loading branch information
grammarware committed Jun 2, 2012
1 parent 52453b6 commit 85b02ba
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 37 deletions.
9 changes: 3 additions & 6 deletions shared/rascal/src/io/ReadXBGF.rsc
Expand Up @@ -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]);
Expand Down
9 changes: 3 additions & 6 deletions shared/rascal/src/io/WriteXBGF.rsc
Expand Up @@ -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]);
Expand Down
8 changes: 4 additions & 4 deletions shared/rascal/src/syntax/XBGF.rsc
Expand Up @@ -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)
Expand Down
63 changes: 45 additions & 18 deletions shared/rascal/src/transform/XBGF.rsc
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
{
<ps1,ps2,ps3> = splitPbyW(ps,innt(n));
if ([production(_, n, sequence(L2))] := ps2)
{
if (toSet(L1) == toSet(L2))
return grammar(rs, ps1 + p + ps3);
else
throw "Phrases <L1> and <L2> must be permutations of each other.";
}
else throw "Permutation requires a single sequence instead of <ps2>.";
}
else throw "Permutation parameter requires a sequence instead of <p>.";
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 <p2> not found.";
p3 = demark(p1);
return grammar(roots, ps - p2 + p3);
return grammar(rs, ps - p2 + p3);
}

BGFGrammar runRAssoc(BGFProduction p, BGFGrammar g)
Expand Down Expand Up @@ -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 <x> for renaming must be fresh and unique.";
if (size([p | p <- ps, production(y, _, _) := p]) != 0)
throw "Target name <y> for renaming must be fresh.";
<ps1,ps2,ps3> = splitPbyW(ps,inlabel(x));
if ([production(x, str n, BGFExpression e)] := ps2)
return grammar(rs, ps1 + production(y, n, e) + ps3);
else
throw "Label <x> 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 <x> for renaming must not be fresh.";
if (y in ns) throw "Target name <x> for renaming must be fresh.";
<ps1,ps2,ps3> = 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;
<ps1,ps2,ps3> = splitPbyW(ps,w);
if (/selectable(x,_) !:= ps2) throw "Source name <x> for renaming must not be fresh.";
if (/selectable(y,_) := ps2) throw "Target name <y> 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 <x> for renaming must not be fresh.";
if (y in ts) throw "Target name <x> 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))
Expand Down
6 changes: 3 additions & 3 deletions shared/rascal/src/transform/XBGFTest.rsc
Expand Up @@ -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"))])>,
Expand Down

0 comments on commit 85b02ba

Please sign in to comment.