From a3da9b34c94acd021d6817f480d9bf8080671cae Mon Sep 17 00:00:00 2001 From: grammarware Date: Sat, 2 Jun 2012 00:56:13 +0200 Subject: [PATCH] abridge, abstractize/concretize, addV/removeV, addH/removeH, anonymize/deanonymize, appear/disappear, inject/project are (re)done --- shared/rascal/src/Sync.rsc | 23 +- shared/rascal/src/io/ReadXBGF.rsc | 2 +- shared/rascal/src/io/WriteXBGF.rsc | 2 +- shared/rascal/src/normal/BGF.rsc | 13 +- shared/rascal/src/syntax/XBGF.rsc | 2 +- shared/rascal/src/transform/XBGF.rsc | 285 ++++++++++++------ shared/rascal/src/transform/XBGFTest.rsc | 280 ++++++++--------- .../xbgf/tests/add_vertical_middle.baseline | 27 ++ .../xbgf/tests/add_vertical_middle.bgf | 21 ++ .../xbgf/tests/add_vertical_middle.xbgf | 13 + .../tests/add_vertical_scattered.baseline | 39 +++ .../xbgf/tests/add_vertical_scattered.bgf | 33 ++ .../xbgf/tests/add_vertical_scattered.xbgf | 13 + .../xbgf/tests/appear_q.baseline | 36 +-- topics/transformation/xbgf/tests/appear_q.bgf | 18 +- .../transformation/xbgf/tests/appear_q.xbgf | 52 ++-- .../xbgf/tests/appear_s.baseline | 36 +-- topics/transformation/xbgf/tests/appear_s.bgf | 18 +- .../transformation/xbgf/tests/appear_s.xbgf | 50 ++- 19 files changed, 593 insertions(+), 370 deletions(-) create mode 100644 topics/transformation/xbgf/tests/add_vertical_middle.baseline create mode 100644 topics/transformation/xbgf/tests/add_vertical_middle.bgf create mode 100644 topics/transformation/xbgf/tests/add_vertical_middle.xbgf create mode 100644 topics/transformation/xbgf/tests/add_vertical_scattered.baseline create mode 100644 topics/transformation/xbgf/tests/add_vertical_scattered.bgf create mode 100644 topics/transformation/xbgf/tests/add_vertical_scattered.xbgf diff --git a/shared/rascal/src/Sync.rsc b/shared/rascal/src/Sync.rsc index a7ff404e..42a7a539 100644 --- a/shared/rascal/src/Sync.rsc +++ b/shared/rascal/src/Sync.rsc @@ -14,17 +14,7 @@ public void main() { loc base = |home:///projects/slps/topics/transformation/xbgf/tests|; int cx = 1; - str buffer = ""; - for (f <- listEntries(base), endsWith(f,".xbgf")) - { - xbgf = readXBGF(base+f); - bgf = readBGF(base+replaceLast(f,".xbgf",".bgf")); - bl = readBGF(base+replaceLast(f,".xbgf",".baseline")); - buffer += "test bool x() { return transform(,)==; }\n"; - cx+=1; - } - writeFile(|project://slps/src/transform/XBGFTest.rsc|, - "@contributor{Super Awesome Automated XBGF Test Suite Synchroniser} + str buffer = "@contributor{Super Awesome Automated XBGF Test Suite Synchroniser} '@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI} 'module transform::XBGFTest ' @@ -32,6 +22,15 @@ public void main() 'import syntax::XBGF; 'import transform::XBGF; ' - '"+replaceAll(buffer,"import","\\import")); + '"; + for (f <- listEntries(base), endsWith(f,".xbgf")) + { + xbgf = readXBGF(base+f); + bgf = readBGF(base+replaceLast(f,".xbgf",".bgf")); + bl = readBGF(base+replaceLast(f,".xbgf",".baseline")); + buffer += "test bool test_() { return transform(,)==; }\n"; + cx+=1; + } + writeFile(|project://slps/src/transform/XBGFTest.rsc|, buffer); } diff --git a/shared/rascal/src/io/ReadXBGF.rsc b/shared/rascal/src/io/ReadXBGF.rsc index a9c98f01..1c633eaa 100644 --- a/shared/rascal/src/io/ReadXBGF.rsc +++ b/shared/rascal/src/io/ReadXBGF.rsc @@ -49,7 +49,7 @@ XBGFCommand mapxbgf(Node el) case element(_,"fold",[element(none(),"nonterminal",[charData(str s)])]): return fold(s,globally()); case element(_,"fold",[element(none(),"nonterminal",[charData(str s)]),w]): return fold(s,mapcontext(w)); case element(_,"horizontal",[w]): return horizontal(mapcontext(w)); - case element(_,"import",ps): return \import([mapprod(p) | p <- ps]); + case element(_,"import",ps): return importG([mapprod(p) | p <- ps]); case element(_,"inject",[prod]): return inject(mapprod(prod)); case element(_,"inline",[charData(str s)]): return inline(s); case element(_,"introduce",ps): return introduce([mapprod(p) | p <- ps]); diff --git a/shared/rascal/src/io/WriteXBGF.rsc b/shared/rascal/src/io/WriteXBGF.rsc index b17db119..dff66708 100644 --- a/shared/rascal/src/io/WriteXBGF.rsc +++ b/shared/rascal/src/io/WriteXBGF.rsc @@ -51,7 +51,7 @@ Node xbgf2xml(XBGFCommand step) case fold(str s,globally()): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"fold",[element(none(),"nonterminal",[charData(s)])]); case fold(str s, w): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"fold",[element(none(),"nonterminal",[charData(s)]),element(none(),"in",[context2xml(w)])]); case horizontal(w): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"horizontal",[context2xml(w)]); - case \import(ps): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"import",[prod2xml(p) | p <- ps]); + case importG(ps): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"import",[prod2xml(p) | p <- ps]); case inject(prod): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"inject",[prod2xml(prod)]); case inline(str s): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"inline",[charData(s)]); case introduce(ps): return element(namespace("xbgf","http://planet-sl.org/xbgf"),"introduce",[prod2xml(p) | p <- ps]); diff --git a/shared/rascal/src/normal/BGF.rsc b/shared/rascal/src/normal/BGF.rsc index 5e626a24..f22ebe27 100644 --- a/shared/rascal/src/normal/BGF.rsc +++ b/shared/rascal/src/normal/BGF.rsc @@ -21,10 +21,10 @@ public BGFExpression normalise(BGFExpression e) case optional(epsilon()) => epsilon() case plus(epsilon()) => epsilon() case star(epsilon()) => epsilon() - case sequence([*L1,sequence(L),*L2]) => sequence(L1+L+L2) - case sequence([*L1,epsilon(),*L2]) => sequence(L1+L2) - case choice([*L1,choice(L),*L2]) => choice(L1+L+L2) - case choice([*L1,X1,*L2,X1,*L3]) => choice([*L1,X1,*L2,*L3]) + case sequence([L1*,sequence(L),L2*]) => sequence(L1+L+L2) + case sequence([L1*,epsilon(),L2*]) => sequence(L1+L2) + case choice([L1*,choice(L),L2*]) => choice(L1+L+L2) + case choice([L1*,X1,L2*,X1,L3*]) => choice([*L1,X1,*L2,*L3]) }; } @@ -52,4 +52,7 @@ test bool n12(){return normalise(tw(choice([choice([terminal("1"),terminal("2")] ==tw(choice([terminal("1"),terminal("2"),terminal("3")]));} test bool n13(){return normalise(tw(choice([terminal("1"),terminal("2"),terminal("2"),terminal("3")]))) ==tw(choice([terminal("1"),terminal("2"),terminal("3")]));} - \ No newline at end of file +test bool n14(){return normalise(production("","N",sequence([epsilon(),nonterminal("a"),nonterminal("b")]))) + == production("","N",sequence([nonterminal("a"),nonterminal("b")]));} + + \ No newline at end of file diff --git a/shared/rascal/src/syntax/XBGF.rsc b/shared/rascal/src/syntax/XBGF.rsc index 292a4f71..f8a1dd69 100644 --- a/shared/rascal/src/syntax/XBGF.rsc +++ b/shared/rascal/src/syntax/XBGF.rsc @@ -30,7 +30,7 @@ data XBGFCommand = | factor(BGFExpression e1, BGFExpression e2, XBGFContext w) | fold(str x, XBGFContext w) | horizontal(XBGFContext w) - | \import(list[BGFProduction] ps) + | importG(list[BGFProduction] ps) | inject(BGFProduction p) // marked | inline(str x) | introduce(list[BGFProduction] ps) diff --git a/shared/rascal/src/transform/XBGF.rsc b/shared/rascal/src/transform/XBGF.rsc index c8a00349..4e289324 100644 --- a/shared/rascal/src/transform/XBGF.rsc +++ b/shared/rascal/src/transform/XBGF.rsc @@ -2,6 +2,7 @@ module transform::XBGF import IO; +import List; import syntax::BGF; import syntax::XBGF; import normal::BGF; @@ -13,81 +14,82 @@ public BGFGrammar transform(XBGFSequence xbgf, BGFGrammar g) { switch(step) { - case abridge(BGFProduction p): g1 = runAbridge(p,g); - case abstractize(BGFProduction p): g1 = runAbstractize(p,g); - case addH(BGFProduction p): g1 = runAddH(p,g); - case addV(BGFProduction p): g1 = runAddV(p,g); - case anonymize(BGFProduction p): g1 = runAnonymize(p,g); - case appear(BGFProduction p): g1 = runAppear(p,g); - case chain(BGFProduction p): g1 = runChain(p,g); - case clone(str x, str y, XBGFContext w): g1 = runClone(x,y,w,g); - case concatT(list[str] xs, str y, XBGFContext w): g1 = runConcatT(xs,y,w,g); - case concretize(BGFProduction p): g1 = runConcretize(p,g); - case deanonymize(BGFProduction p): g1 = runDeanonymize(p,g); - case define(list[BGFProduction] ps): g1 = runDefine(ps,g); - case designate(BGFProduction p): g1 = runDesignate(p,g); - case detour(BGFProduction p): g1 = runDetour(p,g); - case deyaccify(str x): g1 = runDeyaccify(x,g); - case disappear(BGFProduction p): g1 = runDisappear(p,g); - case distribute(XBGFContext w): g1 = runDistribute(w,g); - case downgrade(BGFProduction p1,BGFProduction p2): g1 = runDowngrade(p1,p2,g); - case eliminate(str x): g1 = runEliminate(x,g); - case equate(str x, str y): g1 = runEquate(x,y,g); - case extract(BGFProduction p, XBGFContext w): g1 = runExtract(p,w,g); - case factor(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runFactor(e1,e2,w,g); - case fold(str x, XBGFContext w): g1 = runFold(x,w,g); - case horizontal(XBGFContext w): g1 = runHorizontal(w,g); - case \import(list[BGFProduction] ps): g1 = runImport(ps,g); - case inject(BGFProduction p): g1 = runInject(p,g); - case inline(str x): g1 = runInline(x,g); - case introduce(list[BGFProduction] ps): g1 = runIntroduce(ps,g); - case iterate(BGFProduction p): g1 = runIterate(p,g); - case lassoc(BGFProduction p): g1 = runLAssoc(p,g); - case massage(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runMassage(e1,e2,w,g); - case narrow(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runNarrow(e1,e2,w,g); - case permute(BGFProduction p): g1 = runPermute(p,g); - case project(BGFProduction p): g1 = runProject(p,g); - case rassoc(BGFProduction p): g1 = runRAssoc(p,g); - case redefine(list[BGFProduction] ps): g1 = runRedefine(ps,g); - case removeH(BGFProduction p): g1 = runRemoveH(p,g); - case removeV(BGFProduction p): g1 = runRemoveV(p,g); - case renameL(str x, str y, XBGFContext w): g1 = runRenameL(x,y,w,g); - case renameN(str x, str y, XBGFContext w): g1 = runRenameN(x,y,w,g); - case renameS(str x, str y, XBGFContext w): g1 = runRenameS(x,y,w,g); - case renameT(str x, str y, XBGFContext w): g1 = runRenameT(x,y,w,g); - case replace(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runReplace(e1,e2,w,g); - case reroot(list[str] xs): g1 = runReroot(xs,g); - case splitN(str x, list[BGFProduction] ps, XBGFContext w): g1 = runSplitN(x,ps,w,g); - case splitT(str x, list[str] ys, XBGFContext w): g1 = runSplitT(x,ys,w,g); - case unchain(BGFProduction p): g1 = runUnchain(p,g); - case undefine(list[str] xs): g1 = runUndefine(xs,g); - case unfold(str x, XBGFContext w): g1 = runUnfold(x,w,g); - case unite(str x, str y): g1 = runUnite(x,y,g); - case unlabel(str x): g1 = runUnlabel(x,g); - case upgrade(BGFProduction p1, BGFProduction p2): g1 = runUpgrade(p1,p2,g); - case vertical(XBGFContext w): g1 = runVertical(w,g); - case widen(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runWiden(e1,e2,w,g); - case yaccify(list[BGFProduction] ps): g1 = runYaccify(ps,g); - case atomic(list[XBGFCommand] steps): g1 = runAtomic(steps,g); - case strip(str a): g1 = runStrip(a,g); + case abridge(BGFProduction p): g1 = runAbridge(p,g1); + case abstractize(BGFProduction p): g1 = runAbstractize(p,g1); + case addH(BGFProduction p): g1 = runAddH(p,g1); + case addV(BGFProduction p): g1 = runAddV(p,g1); + case anonymize(BGFProduction p): g1 = runAnonymize(p,g1); + case appear(BGFProduction p): g1 = runAppear(p,g1); + case chain(BGFProduction p): g1 = runChain(p,g1); + case clone(str x, str y, XBGFContext w): g1 = runClone(x,y,w,g1); + case concatT(list[str] xs, str y, XBGFContext w): g1 = runConcatT(xs,y,w,g1); + case concretize(BGFProduction p): g1 = runConcretize(p,g1); + case deanonymize(BGFProduction p): g1 = runDeanonymize(p,g1); + case define(list[BGFProduction] ps): g1 = runDefine(ps,g1); + case designate(BGFProduction p): g1 = runDesignate(p,g1); + case detour(BGFProduction p): g1 = runDetour(p,g1); + case deyaccify(str x): g1 = runDeyaccify(x,g1); + case disappear(BGFProduction p): g1 = runDisappear(p,g1); + case distribute(XBGFContext w): g1 = runDistribute(w,g1); + case downgrade(BGFProduction p1,BGFProduction p2): g1 = runDowngrade(p1,p2,g1); + case eliminate(str x): g1 = runEliminate(x,g1); + case equate(str x, str y): g1 = runEquate(x,y,g1); + case extract(BGFProduction p, XBGFContext w): g1 = runExtract(p,w,g1); + case factor(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runFactor(e1,e2,w,g1); + case fold(str x, XBGFContext w): g1 = runFold(x,w,g1); + case horizontal(XBGFContext w): g1 = runHorizontal(w,g1); + case \import(list[BGFProduction] ps): g1 = runImport(ps,g1); + case inject(BGFProduction p): g1 = runInject(p,g1); + case inline(str x): g1 = runInline(x,g1); + case introduce(list[BGFProduction] ps): g1 = runIntroduce(ps,g1); + case iterate(BGFProduction p): g1 = runIterate(p,g1); + case lassoc(BGFProduction p): g1 = runLAssoc(p,g1); + case massage(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runMassage(e1,e2,w,g1); + case narrow(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runNarrow(e1,e2,w,g1); + case permute(BGFProduction p): g1 = runPermute(p,g1); + case project(BGFProduction p): g1 = runProject(p,g1); + case rassoc(BGFProduction p): g1 = runRAssoc(p,g1); + 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 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 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); + case splitT(str x, list[str] ys, XBGFContext w): g1 = runSplitT(x,ys,w,g1); + case unchain(BGFProduction p): g1 = runUnchain(p,g1); + case undefine(list[str] xs): g1 = runUndefine(xs,g1); + case unfold(str x, XBGFContext w): g1 = runUnfold(x,w,g1); + case unite(str x, str y): g1 = runUnite(x,y,g1); + case unlabel(str x): g1 = runUnlabel(x,g1); + case upgrade(BGFProduction p1, BGFProduction p2): g1 = runUpgrade(p1,p2,g1); + case vertical(XBGFContext w): g1 = runVertical(w,g1); + case widen(BGFExpression e1, BGFExpression e2, XBGFContext w): g1 = runWiden(e1,e2,w,g1); + case yaccify(list[BGFProduction] ps): g1 = runYaccify(ps,g1); + case atomic(list[XBGFCommand] steps): g1 = runAtomic(steps,g1); + case strip(str a): g1 = runStrip(a,g1); default: throw "Unknown XBGF command "; } } return g1; } -BGFGrammar runAbridge(BGFProduction prod, grammar(roots,prods)) +BGFGrammar runAbridge(BGFProduction prod, grammar(roots, ps)) { if (production(_,x,nonterminal(x)) !:= prod) throw "Production cannot be abridged."; - if (prod notin prods) + if (prod notin ps) throw "Production not found."; - return grammar(roots, prods - prod); + return grammar(roots, ps - prod); } -BGFGrammar runAbstractize(BGFProduction p1, grammar(roots,ps)) +BGFGrammar runAbstractize(BGFProduction p1, grammar(roots, ps)) { - if (unmark(p1) notin ps) + p2 = unmark(p1); + if (p2 notin ps) throw "Production rule not found."; for (/marked(e) := p1) if (terminal(_) !:= e) @@ -95,28 +97,47 @@ BGFGrammar runAbstractize(BGFProduction p1, grammar(roots,ps)) return runProject(p1,grammar(roots, ps)); } -BGFGrammar runAddH(BGFProduction p, BGFGrammar g) +BGFGrammar runAddH(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = unmark(p1); + p3 = demark(p1); + if (p3 notin ps) + throw "Production rule not found."; + return grammar(roots, ps - p3 + p2); } -BGFGrammar runAddV(BGFProduction p, BGFGrammar g) +BGFGrammar runAddV(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + if (production(_,str x,_) := p1) + { + = splitN(ps,x); + //ps2 = [p | p <- ps, production(_,x,_) := p]; + if (isEmpty(ps2)) + throw "Nonterminal must be defined."; + if (p1 in ps2) + throw "Production rule is already present."; + return grammar(roots, ps1 + ps2 + p1 + ps3); + } } -BGFGrammar runAnonymize(BGFProduction p, BGFGrammar g) +BGFGrammar runAnonymize(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = unmark(p1); + p3 = demarkS(p1); + if (p2 notin ps) + throw "Production rule not found."; + return grammar(roots, ps - p2 + p3); } -BGFGrammar runAppear(BGFProduction p, BGFGrammar g) +BGFGrammar runAppear(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = demark(p1); + if (p2 notin ps) + throw "Production rule not found."; + for (/marked(e) := p1) + if (optional(_) !:= e && star(_) !:= e) + throw " does not have an optional part marked."; + return grammar(roots, ps - p2 + unmark(p1)); } BGFGrammar runChain(BGFProduction p, BGFGrammar g) @@ -137,16 +158,24 @@ BGFGrammar runConcatT(list[str] xs, str y, XBGFContext w, BGFGrammar g) return g; } -BGFGrammar runConcretize(BGFProduction p, BGFGrammar g) +BGFGrammar runConcretize(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = demark(p1); + if (p2 notin ps) + throw "Production rule not found."; + for (/marked(e) := p1) + if (terminal(_) !:= e) + throw "Concretize only works with marked terminals, use inject instead."; + return runInject(p1,grammar(roots, ps)); } -BGFGrammar runDeanonymize(BGFProduction p, BGFGrammar g) +BGFGrammar runDeanonymize(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = unmark(p1); + p3 = demarkS(p1); + if (p3 notin ps) + throw "Production rule not found."; + return grammar(roots, ps - p3 + p2); } BGFGrammar runDefine(list[BGFProduction] ps, BGFGrammar g) @@ -173,12 +202,16 @@ BGFGrammar runDeyaccify(str x, BGFGrammar g) return g; } -BGFGrammar runDisappear(BGFProduction p, BGFGrammar g) +BGFGrammar runDisappear(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = unmark(p1); + if (p2 notin ps) + throw "Production rule not found."; + for (/marked(e) := p1) + if (optional(_) !:= e && star(_) !:= e) + throw " does not have an optional part marked."; + return grammar(roots, ps - p2 + demark(p1)); } - BGFGrammar runDistribute(XBGFContext w, BGFGrammar g) { // TODO @@ -233,10 +266,13 @@ BGFGrammar runImport(list[BGFProduction] ps, BGFGrammar g) return g; } -BGFGrammar runInject(BGFProduction p, BGFGrammar g) +BGFGrammar runInject(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = demark(p1); + if (p2 notin ps) + throw "Production rule not found."; + p3 = unmark(p1); + return grammar(roots, ps - p2 + p3); } BGFGrammar runInline(str x, BGFGrammar g) @@ -283,8 +319,6 @@ BGFGrammar runPermute(BGFProduction p, BGFGrammar g) BGFGrammar runProject(BGFProduction p1, grammar(roots, ps)) { - if (/marked(e) !:= p1) - throw " must contain markers."; p2 = unmark(p1); if (p2 notin ps) throw "Production rule not found."; @@ -304,16 +338,28 @@ BGFGrammar runRedefine(list[BGFProduction] ps, BGFGrammar g) return g; } -BGFGrammar runRemoveH(BGFProduction p, BGFGrammar g) +BGFGrammar runRemoveH(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + p2 = unmark(p1); + p3 = demark(p1); + if (p2 notin ps) + throw "Production rule not found."; + return grammar(roots, ps - p2 + p3); } -BGFGrammar runRemoveV(BGFProduction p, BGFGrammar g) +BGFGrammar runRemoveV(BGFProduction p1, grammar(roots, ps)) { - // TODO - return g; + if (production(_,str x,_) := p1) + { + <_,ps2,_> = splitN(ps,x); + if (isEmpty(ps2)) + throw "Nonterminal must be defined."; + if (p1 notin ps2) + throw "Production rule is not in the grammar."; + if ([p1] == ps2) + throw "Cannot remove the last production rule of with removeV, use undefine or eliminate."; + return grammar(roots, ps - p1); + } } BGFGrammar runRenameL(str x, str y, XBGFContext w, BGFGrammar g) @@ -431,18 +477,57 @@ BGFGrammar runStrip(str a, BGFGrammar g) } // END OF XBGF -BGFProduction unmark (BGFProduction p) = innermost visit(p) +BGFProduction unmark (BGFProduction p1) +{ + if (/marked(_) !:= p1) + throw " must contain markers."; + p2 = innermost visit(p1) { case marked(BGFExpression e) => e }; + return normalise(p2); +} -BGFProduction demark (BGFProduction p) +BGFProduction demark (BGFProduction p1) { - p2 = innermost visit(p) + if (/marked(_) !:= p1) + throw " must contain markers."; + p2 = innermost visit(p1) { - case marked(BGFExpression e) => epsilon() + case sequence([L1*,marked(BGFExpression e),L2*]) => sequence(L1 + L2) + case choice([L1*,marked(BGFExpression e),L2*]) => choice(L1 + L2) } return normalise(p2); } - \ No newline at end of file +// remove selectors from marked subexpressions +BGFProduction demarkS (BGFProduction p1) +{ + if (/marked(_) !:= p1) + throw " must contain markers."; + p2 = innermost visit(p1) + { + case marked(selectable(str selector, BGFExpression expr)) => expr + } + return normalise(p2); +} + +tuple[list[BGFProduction],list[BGFProduction],list[BGFProduction]] splitN(list[BGFProduction] ps, str x) +{ + bool hit = false; + list[BGFProduction] ps1 = []; + list[BGFProduction] ps2 = []; + list[BGFProduction] ps3 = []; + for (p <- ps) + if (production (_,x,_) := p) + { + hit = true; + ps2 += p; + } + elseif (hit) + ps3 += p; + else + ps1 += p; + return ; +} + diff --git a/shared/rascal/src/transform/XBGFTest.rsc b/shared/rascal/src/transform/XBGFTest.rsc index d489f0ab..69537304 100644 --- a/shared/rascal/src/transform/XBGFTest.rsc +++ b/shared/rascal/src/transform/XBGFTest.rsc @@ -6,142 +6,144 @@ import syntax::BGF; import syntax::XBGF; import transform::XBGF; -test bool x1() { return transform([abridge(production("bracket","expr",nonterminal("expr")))],grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr")),production("bracket","expr",nonterminal("expr"))]))==grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr"))]); } -test bool x2() { return transform([abstractize(production("","A",sequence([nonterminal("b"),marked(terminal("x")),nonterminal("c"),terminal("y")])))],grammar([],[production("","A",sequence([nonterminal("b"),terminal("x"),nonterminal("c"),terminal("y")]))]))==grammar([],[production("","A",sequence([nonterminal("b"),nonterminal("c"),terminal("y")]))]); } -test bool x3() { return transform([addH(production("","N",choice([marked(terminal("x")),nonterminal("a"),nonterminal("b")])))],grammar([],[production("","N",choice([nonterminal("a"),nonterminal("b")]))]))==grammar([],[production("","N",choice([terminal("x"),nonterminal("a"),nonterminal("b")]))]); } -test bool x4() { return transform([addH(production("","expr",sequence([optional(choice([marked(terminal("+")),terminal("-")])),nonterminal("int")])))],grammar([],[production("","expr",sequence([optional(terminal("-")),nonterminal("int")]))]))==grammar([],[production("","expr",sequence([optional(choice([terminal("+"),terminal("-")])),nonterminal("int")]))]); } -test bool x5() { return transform([addV(production("","expr",nonterminal("id")))],grammar([],[production("","expr",nonterminal("int"))]))==grammar([],[production("","expr",nonterminal("int")),production("","expr",nonterminal("id"))]); } -test bool x6() { return transform([anonymize(production("","A",sequence([selectable("first",terminal("a")),marked(selectable("second",terminal("a"))),marked(selectable("third",terminal("a")))])))],grammar([],[production("","A",sequence([selectable("first",terminal("a")),selectable("second",terminal("a")),selectable("third",terminal("a"))]))]))==grammar([],[production("","A",sequence([selectable("first",terminal("a")),terminal("a"),terminal("a")]))]); } -test bool x7() { return transform([anonymize(production("unary","expr",sequence([marked(selectable("op",nonterminal("unary_op"))),nonterminal("expr")])))],grammar([],[production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]))==grammar([],[production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([nonterminal("unary_op"),nonterminal("expr")]))]); } -test bool x8() { return transform([appear(production("","foo",sequence([nonterminal("bar"),marked(optional(nonterminal("qux")))])))],grammar([],[production("","foo",sequence([nonterminal("bar")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),optional(nonterminal("qux"))]))]); } -test bool x9() { return transform([appear(production("","foo",sequence([nonterminal("bar"),marked(star(nonterminal("qux")))])))],grammar([],[production("","foo",sequence([nonterminal("bar")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("qux"))]))]); } -test bool x10() { return transform([chain(production("binary","expr",nonterminal("binexpr")))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",nonterminal("binexpr")),production("","binexpr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } -test bool x11() { return transform([concretize(production("","A",sequence([nonterminal("b"),marked(terminal("x")),nonterminal("c")])))],grammar([],[production("","A",sequence([nonterminal("b"),nonterminal("c")]))]))==grammar([],[production("","A",sequence([nonterminal("b"),terminal("x"),nonterminal("c")]))]); } -test bool x12() { return transform([deanonymize(production("","A",sequence([selectable("first",terminal("a")),marked(selectable("second",terminal("a"))),marked(selectable("third",terminal("a")))])))],grammar([],[production("","A",sequence([selectable("first",terminal("a")),terminal("a"),terminal("a")]))]))==grammar([],[production("","A",sequence([selectable("first",terminal("a")),selectable("second",terminal("a")),selectable("third",terminal("a"))]))]); } -test bool x13() { return transform([deanonymize(production("unary","expr",sequence([marked(selectable("op",nonterminal("unary_op"))),nonterminal("expr")])))],grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([nonterminal("unary_op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]); } -test bool x14() { return transform([define([production("","op",terminal("+")),production("","op",terminal("-"))])],grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])),production("","op",terminal("+")),production("","op",terminal("-"))]); } -test bool x15() { return transform([designate(production("intexpr","expr",nonterminal("int")))],grammar([],[production("","expr",nonterminal("int"))]))==grammar([],[production("intexpr","expr",nonterminal("int"))]); } -test bool x16() { return transform([detour(production("bracket","expr",nonterminal("expr")))],grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr"))]))==grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr")),production("bracket","expr",nonterminal("expr"))]); } -test bool x17() { return transform([deyaccify("foo")],grammar([],[production("","foo",epsilon()),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x18() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("wez")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("wez"))]))]); } -test bool x19() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } -test bool x20() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("wez"),nonterminal("foo")]))]))==grammar([],[production("","foo",sequence([star(nonterminal("wez")),nonterminal("bar")]))]); } -test bool x21() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } -test bool x22() { return transform([disappear(production("","foo",sequence([nonterminal("bar"),marked(optional(nonterminal("qux")))])))],grammar([],[production("","foo",sequence([nonterminal("bar"),optional(nonterminal("qux"))]))]))==grammar([],[production("","foo",sequence([nonterminal("bar")]))]); } -test bool x23() { return transform([disappear(production("","foo",sequence([nonterminal("bar"),marked(star(nonterminal("wez"))),nonterminal("qux")])))],grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("wez")),nonterminal("qux")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),nonterminal("qux")]))]); } -test bool x24() { return transform([distribute(inlabel("bcd"))],grammar([],[production("bcd","a",sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])])),production("efg","a",sequence([nonterminal("e"),choice([nonterminal("f"),nonterminal("g")])]))]))==grammar([],[production("bcd","a",choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])])),production("efg","a",sequence([nonterminal("e"),choice([nonterminal("f"),nonterminal("g")])]))]); } -test bool x25() { return transform([distribute(innt("foo"))],grammar([],[production("","foo",sequence([nonterminal("bar"),choice([nonterminal("qux"),nonterminal("wez")])]))]))==grammar([],[production("","foo",choice([sequence([nonterminal("bar"),nonterminal("qux")]),sequence([nonterminal("bar"),nonterminal("wez")])]))]); } -test bool x26() { return transform([downgrade(production("","a",sequence([marked(nonterminal("b")),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])))],grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]))==grammar([],[production("","a",sequence([nonterminal("d"),nonterminal("e"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]); } -test bool x27() { return transform([eliminate("intexpr")],grammar([],[production("","expr",nonterminal("int")),production("","intexpr",nonterminal("int"))]))==grammar([],[production("","expr",nonterminal("int"))]); } -test bool x28() { return transform([equate("foo","bar")],grammar([],[production("","foo",nonterminal("wez")),production("","bar",nonterminal("wez"))]))==grammar([],[production("","bar",nonterminal("wez"))]); } -test bool x29() { return transform([equate("foo","bar")],grammar([],[production("","foo",choice([star(nonterminal("wez")),terminal("x")])),production("","bar",choice([terminal("x"),star(nonterminal("wez"))]))]))==grammar([],[production("","bar",choice([terminal("x"),star(nonterminal("wez"))]))]); } -test bool x30() { return transform([equate("foo","bar")],grammar([],[production("","foo",star(nonterminal("wez"))),production("","foo",terminal("x")),production("","bar",terminal("x")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("","bar",star(nonterminal("wez"))),production("","bar",terminal("x"))]); } -test bool x31() { return transform([equate("foo","bar")],grammar([],[production("","foo",choice([star(nonterminal("wez")),terminal("x")])),production("","bar",choice([terminal("x"),star(nonterminal("wez"))])),production("go","wez",sequence([nonterminal("foo"),terminal("!")])),production("stay","wez",sequence([nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","bar",choice([terminal("x"),star(nonterminal("wez"))])),production("go","wez",sequence([nonterminal("bar"),terminal("!")])),production("stay","wez",sequence([nonterminal("bar"),nonterminal("wez")]))]); } -test bool x32() { return transform([extract(production("","xs",star(nonterminal("x"))),inlabel("l2"))],grammar([],[production("l1","a",star(nonterminal("x"))),production("l2","b",star(nonterminal("x")))]))==grammar([],[production("l1","a",star(nonterminal("x"))),production("l2","b",nonterminal("xs")),production("","xs",star(nonterminal("x")))]); } -test bool x33() { return transform([extract(production("","xs",star(nonterminal("x"))),innt("a"))],grammar([],[production("","a",star(nonterminal("x"))),production("","b",star(nonterminal("x")))]))==grammar([],[production("","a",nonterminal("xs")),production("","xs",star(nonterminal("x"))),production("","b",star(nonterminal("x")))]); } -test bool x34() { return transform([extract(production("","ClassOrInterfaceDeclaration",choice([nonterminal("ClassDeclaration"),nonterminal("InterfaceDeclaration")])),globally())],grammar([],[production("","TypeDeclaration",choice([nonterminal("ClassDeclaration"),nonterminal("InterfaceDeclaration"),terminal(";")]))]))==grammar([],[production("","TypeDeclaration",choice([nonterminal("ClassOrInterfaceDeclaration"),terminal(";")])),production("","ClassOrInterfaceDeclaration",choice([nonterminal("ClassDeclaration"),nonterminal("InterfaceDeclaration")]))]); } -test bool x35() { return transform([extract(production("","qux",sequence([nonterminal("bar"),nonterminal("wez")])),globally())],grammar([],[production("","foo",sequence([star(sequence([nonterminal("bar"),nonterminal("wez")])),nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","foo",sequence([star(nonterminal("qux")),nonterminal("qux")])),production("","qux",sequence([nonterminal("bar"),nonterminal("wez")]))]); } -test bool x36() { return transform([extract(production("","ParExpression",sequence([terminal("("),nonterminal("Expression"),terminal(")")])),globally())],grammar([],[production("","IfThenStatement",sequence([terminal("if"),terminal("("),nonterminal("Expression"),terminal(")"),nonterminal("Statement")]))]))==grammar([],[production("","IfThenStatement",sequence([terminal("if"),nonterminal("ParExpression"),nonterminal("Statement")])),production("","ParExpression",sequence([terminal("("),nonterminal("Expression"),terminal(")")]))]); } -test bool x37() { return transform([factor(choice([nonterminal("b"),sequence([nonterminal("b"),nonterminal("c")])]),sequence([nonterminal("b"),choice([epsilon(),nonterminal("c")])]),globally())],grammar([],[production("","a",choice([nonterminal("b"),sequence([nonterminal("b"),nonterminal("c")])]))]))==grammar([],[production("","a",sequence([nonterminal("b"),choice([epsilon(),nonterminal("c")])]))]); } -test bool x38() { return transform([factor(choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]),sequence([nonterminal("b"),choice([nonterminal("d"),nonterminal("c")])]),globally())],grammar([],[production("","a",choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]))]))==grammar([],[production("","a",sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])]))]); } -test bool x39() { return transform([factor(choice([sequence([nonterminal("c"),nonterminal("d"),nonterminal("e")]),sequence([nonterminal("c"),nonterminal("f"),nonterminal("g")])]),sequence([nonterminal("c"),choice([sequence([nonterminal("d"),nonterminal("e")]),sequence([nonterminal("f"),nonterminal("g")])])]),globally())],grammar([],[production("","a",choice([nonterminal("a"),nonterminal("b"),sequence([nonterminal("c"),nonterminal("d"),nonterminal("e")]),sequence([nonterminal("c"),nonterminal("f"),nonterminal("g")]),nonterminal("h"),nonterminal("i")]))]))==grammar([],[production("","a",choice([nonterminal("a"),nonterminal("b"),sequence([nonterminal("c"),choice([sequence([nonterminal("d"),nonterminal("e")]),sequence([nonterminal("f"),nonterminal("g")])])]),nonterminal("h"),nonterminal("i")]))]); } -test bool x40() { return transform([factor(choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]),sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])]),innt("a"))],grammar([],[production("","a",choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]))]))==grammar([],[production("","a",sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])]))]); } -test bool x41() { return transform([fold("bar",globally())],grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]); } -test bool x42() { return transform([fold("bar",inlabel("l1"))],grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]); } -test bool x43() { return transform([fold("bar",innt("foo"))],grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]); } -test bool x44() { return transform([horizontal(innt("decs"))],grammar([],[production("onedec","decs",nonterminal("dec")),production("moredecs","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]))==grammar([],[production("","decs",choice([selectable("onedec",nonterminal("dec")),selectable("moredecs",sequence([nonterminal("dec"),nonterminal("decs")]))]))]); } -test bool x45() { return transform([horizontal(innt("decs"))],grammar([],[production("","decs",nonterminal("dec")),production("","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]))==grammar([],[production("","decs",choice([nonterminal("dec"),sequence([nonterminal("dec"),nonterminal("decs")])]))]); } -test bool x46() { return transform([\import([production("","A",sequence([nonterminal("B"),nonterminal("X")])),production("","B",choice([nonterminal("A"),epsilon()]))])],grammar([],[production("","X",sequence([terminal("a"),terminal("b")]))]))==grammar([],[production("","X",sequence([terminal("a"),terminal("b")])),production("","A",sequence([nonterminal("B"),nonterminal("X")])),production("","B",choice([nonterminal("A"),epsilon()]))]); } -test bool x47() { return transform([inject(production("","a",sequence([nonterminal("b"),marked(nonterminal("c")),nonterminal("d")])))],grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("d")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c"),nonterminal("d")]))]); } -test bool x48() { return transform([inline("wez")],grammar([],[production("","foo",nonterminal("wez")),production("","bar",sequence([nonterminal("wez"),terminal(".."),nonterminal("wez")])),production("","wez",star(nonterminal("qux")))]))==grammar([],[production("","foo",star(nonterminal("qux"))),production("","bar",sequence([star(nonterminal("qux")),terminal(".."),star(nonterminal("qux"))]))]); } -test bool x49() { return transform([introduce([production("","c",nonterminal("a")),production("","c",nonterminal("b"))])],grammar([],[production("","a",nonterminal("b")),production("","b",epsilon())]))==grammar([],[production("","a",nonterminal("b")),production("","b",epsilon()),production("","c",nonterminal("a")),production("","c",nonterminal("b"))]); } -test bool x50() { return transform([iterate(production("binary","expr",sequence([star(sequence([nonterminal("expr"),nonterminal("op")])),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([star(sequence([nonterminal("expr"),nonterminal("op")])),nonterminal("expr")]))]); } -test bool x51() { return transform([iterate(production("sequence","expr",plus(nonterminal("expr"))))],grammar([],[production("terminal","expr",val(string())),production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")]))]))==grammar([],[production("terminal","expr",val(string())),production("sequence","expr",plus(nonterminal("expr")))]); } -test bool x52() { return transform([iterate(production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))]))]); } -test bool x53() { return transform([lassoc(production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([star(sequence([nonterminal("expr"),nonterminal("op")])),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } -test bool x54() { return transform([lassoc(production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")])))],grammar([],[production("terminal","expr",val(string())),production("sequence","expr",plus(nonterminal("expr")))]))==grammar([],[production("terminal","expr",val(string())),production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")]))]); } -test bool x55() { return transform([lassoc(production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } -test bool x56() { return transform([massage(sequence([plus(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]),sequence([nonterminal("a"),plus(sequence([nonterminal("b"),nonterminal("a")]))]),globally())],grammar([],[production("","N",sequence([plus(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]))]))==grammar([],[production("","N",sequence([nonterminal("a"),plus(sequence([nonterminal("b"),nonterminal("a")]))]))]); } -test bool x57() { return transform([massage(sequence([optional(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]),sequence([nonterminal("a"),optional(sequence([nonterminal("b"),nonterminal("a")]))]),globally())],grammar([],[production("","N",sequence([optional(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]))]))==grammar([],[production("","N",sequence([nonterminal("a"),optional(sequence([nonterminal("b"),nonterminal("a")]))]))]); } -test bool x58() { return transform([massage(sequence([star(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]),sequence([nonterminal("a"),star(sequence([nonterminal("b"),nonterminal("a")]))]),globally())],grammar([],[production("","N",sequence([star(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]))]))==grammar([],[production("","N",sequence([nonterminal("a"),star(sequence([nonterminal("b"),nonterminal("a")]))]))]); } -test bool x59() { return transform([massage(choice([epsilon(),plus(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([plus(nonterminal("bar")),epsilon()]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x60() { return transform([massage(choice([epsilon(),optional(nonterminal("bar"))]),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([optional(nonterminal("bar")),epsilon()]))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } -test bool x61() { return transform([massage(choice([epsilon(),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),epsilon()]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x62() { return transform([massage(choice([epsilon(),nonterminal("bar")]),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([nonterminal("bar"),epsilon()]))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } -test bool x63() { return transform([massage(choice([plus(nonterminal("bar")),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),plus(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x64() { return transform([massage(choice([optional(nonterminal("bar")),plus(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([plus(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x65() { return transform([massage(choice([optional(nonterminal("bar")),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x66() { return transform([massage(choice([nonterminal("bar"),plus(nonterminal("bar"))]),plus(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([plus(nonterminal("bar")),nonterminal("bar")]))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } -test bool x67() { return transform([massage(choice([nonterminal("bar"),optional(nonterminal("bar"))]),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([optional(nonterminal("bar")),nonterminal("bar")]))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } -test bool x68() { return transform([massage(choice([nonterminal("bar"),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),nonterminal("bar")]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x69() { return transform([massage(optional(nonterminal("bar")),choice([selectable("one",optional(nonterminal("bar"))),selectable("two",optional(nonterminal("bar")))]),globally()),anonymize(production("","foo",choice([plus(nonterminal("bar")),marked(selectable("one",optional(nonterminal("bar")))),selectable("two",optional(nonterminal("bar")))]))),massage(choice([optional(nonterminal("bar")),plus(nonterminal("bar"))]),star(nonterminal("bar")),globally()),anonymize(production("","foo",choice([star(nonterminal("bar")),marked(selectable("two",optional(nonterminal("bar"))))])))],grammar([],[production("","foo",choice([plus(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",choice([optional(nonterminal("bar")),star(nonterminal("bar"))]))]); } -test bool x70() { return transform([massage(star(nonterminal("bar")),choice([selectable("one",star(nonterminal("bar"))),selectable("two",star(nonterminal("bar")))]),globally()),vertical(innt("foo")),massage(star(nonterminal("bar")),choice([epsilon(),plus(nonterminal("bar"))]),inlabel("one")),massage(star(nonterminal("bar")),choice([optional(nonterminal("bar")),plus(nonterminal("bar"))]),inlabel("two")),extract(production("","barplus",plus(nonterminal("bar"))),inlabel("one")),unlabel("one"),unlabel("two"),horizontal(innt("foo"))],grammar([],[production("","foo",star(nonterminal("bar")))]))==grammar([],[production("","foo",choice([epsilon(),optional(nonterminal("bar")),plus(nonterminal("bar")),nonterminal("barplus")])),production("","barplus",plus(nonterminal("bar")))]); } -test bool x71() { return transform([massage(nonterminal("bar"),choice([selectable("one",nonterminal("bar")),selectable("two",nonterminal("bar")),selectable("three",nonterminal("bar"))]),globally())],grammar([],[production("","foo",nonterminal("bar"))]))==grammar([],[production("","foo",choice([selectable("one",nonterminal("bar")),selectable("two",nonterminal("bar")),selectable("three",nonterminal("bar"))]))]); } -test bool x72() { return transform([massage(plus(plus(nonterminal("bar"))),plus(nonterminal("bar")),globally())],grammar([],[production("","foo",plus(plus(nonterminal("bar"))))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } -test bool x73() { return transform([massage(optional(plus(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",optional(plus(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x74() { return transform([massage(star(plus(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",star(plus(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x75() { return transform([massage(plus(optional(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",plus(optional(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x76() { return transform([massage(optional(optional(nonterminal("bar"))),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",optional(optional(nonterminal("bar"))))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } -test bool x77() { return transform([massage(star(optional(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",star(optional(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x78() { return transform([massage(plus(star(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",plus(star(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x79() { return transform([massage(optional(star(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",optional(star(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x80() { return transform([massage(star(star(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",star(star(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x81() { return transform([massage(optional(sequence([star(nonterminal("foo")),optional(nonterminal("bar"))])),choice([epsilon(),sequence([star(nonterminal("foo")),optional(nonterminal("bar"))])]),globally()),massage(optional(nonterminal("bar")),choice([nonterminal("bar"),epsilon()]),globally()),distribute(innt("wez")),massage(sequence([nonterminal("foo"),star(nonterminal("foo"))]),plus(nonterminal("foo")),globally()),massage(choice([nonterminal("foo"),plus(nonterminal("foo"))]),plus(nonterminal("foo")),globally()),factor(choice([plus(nonterminal("foo")),sequence([plus(nonterminal("foo")),nonterminal("bar")])]),sequence([plus(nonterminal("foo")),choice([nonterminal("bar"),epsilon()])]),globally()),massage(choice([nonterminal("bar"),epsilon()]),optional(nonterminal("bar")),globally())],grammar([],[production("","wez",sequence([nonterminal("foo"),optional(sequence([star(nonterminal("foo")),optional(nonterminal("bar"))]))]))]))==grammar([],[production("","wez",sequence([plus(nonterminal("foo")),optional(nonterminal("bar"))]))]); } -test bool x82() { return transform([massage(optional(choice([nonterminal("bar"),nonterminal("qux")])),choice([choice([nonterminal("bar"),nonterminal("qux")]),epsilon()]),globally()),massage(epsilon(),choice([selectable("bar",epsilon()),selectable("qux",epsilon())]),globally()),factor(choice([choice([nonterminal("bar"),nonterminal("qux")]),choice([selectable("bar",epsilon()),selectable("qux",epsilon())])]),choice([choice([nonterminal("bar"),selectable("bar",epsilon())]),choice([nonterminal("qux"),selectable("qux",epsilon())])]),globally()),anonymize(production("","foo",choice([choice([nonterminal("bar"),marked(selectable("bar",epsilon()))]),choice([nonterminal("qux"),selectable("qux",epsilon())])]))),massage(choice([nonterminal("bar"),epsilon()]),optional(nonterminal("bar")),globally()),anonymize(production("","foo",choice([optional(nonterminal("bar")),choice([nonterminal("qux"),marked(selectable("qux",epsilon()))])]))),massage(choice([nonterminal("qux"),epsilon()]),optional(nonterminal("qux")),globally())],grammar([],[production("","foo",optional(choice([nonterminal("bar"),nonterminal("qux")])))]))==grammar([],[production("","foo",choice([optional(nonterminal("bar")),optional(nonterminal("qux"))]))]); } -test bool x83() { return transform([massage(star(selectable("fun",nonterminal("function"))),selectable("fun",star(nonterminal("function"))),globally())],grammar([],[production("","program",star(selectable("fun",nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",star(nonterminal("function"))))]); } -test bool x84() { return transform([massage(sequence([plus(nonterminal("bar")),optional(nonterminal("bar"))]),plus(nonterminal("bar")),globally()),massage(plus(nonterminal("bar")),sequence([optional(nonterminal("bar")),plus(nonterminal("bar"))]),globally())],grammar([],[production("","foo",sequence([plus(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([optional(nonterminal("bar")),plus(nonterminal("bar"))]))]); } -test bool x85() { return transform([massage(sequence([plus(nonterminal("bar")),star(nonterminal("bar"))]),plus(nonterminal("bar")),globally()),massage(plus(nonterminal("bar")),sequence([star(nonterminal("bar")),plus(nonterminal("bar"))]),globally())],grammar([],[production("","foo",sequence([plus(nonterminal("bar")),star(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([star(nonterminal("bar")),plus(nonterminal("bar"))]))]); } -test bool x86() { return transform([massage(sequence([star(nonterminal("bar")),optional(nonterminal("bar"))]),star(nonterminal("bar")),globally()),massage(star(nonterminal("bar")),sequence([optional(nonterminal("bar")),star(nonterminal("bar"))]),globally())],grammar([],[production("","foo",sequence([star(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([optional(nonterminal("bar")),star(nonterminal("bar"))]))]); } -test bool x87() { return transform([massage(sequence([star(nonterminal("bar")),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",sequence([star(nonterminal("bar")),star(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } -test bool x88() { return transform([massage(sequence([nonterminal("bar"),star(nonterminal("bar"))]),plus(nonterminal("bar")),globally()),massage(plus(nonterminal("bar")),sequence([star(nonterminal("bar")),nonterminal("bar")]),globally())],grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([star(nonterminal("bar")),nonterminal("bar")]))]); } -test bool x89() { return transform([narrow(star(nonterminal("function")),plus(nonterminal("function")),globally())],grammar([],[production("","program",selectable("fun",star(nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]); } -test bool x90() { return transform([narrow(plus(nonterminal("function")),nonterminal("function"),inlabel("main"))],grammar([],[production("main","program",selectable("fun",plus(nonterminal("function"))))]))==grammar([],[production("main","program",selectable("fun",nonterminal("function")))]); } -test bool x91() { return transform([narrow(plus(nonterminal("function")),nonterminal("function"),innt("program"))],grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",nonterminal("function")))]); } -test bool x92() { return transform([permute(production("","a",sequence([nonterminal("b"),nonterminal("c"),star(nonterminal("d"))])))],grammar([],[production("","a",sequence([nonterminal("b"),star(nonterminal("d")),nonterminal("c")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c"),star(nonterminal("d"))]))]); } -test bool x93() { return transform([project(production("","a",sequence([nonterminal("b"),marked(nonterminal("c")),nonterminal("d")])))],grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c"),nonterminal("d")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("d")]))]); } -test bool x94() { return transform([rassoc(production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")])))],grammar([],[production("terminal","expr",val(string())),production("sequence","expr",plus(nonterminal("expr")))]))==grammar([],[production("terminal","expr",val(string())),production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")]))]); } -test bool x95() { return transform([rassoc(production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } -test bool x96() { return transform([redefine([production("","a",star(nonterminal("b")))])],grammar([],[production("","a",sequence([terminal("{"),nonterminal("b"),terminal("}")])),production("","b",nonterminal("a"))]))==grammar([],[production("","a",star(nonterminal("b"))),production("","b",nonterminal("a"))]); } -test bool x97() { return transform([removeH(production("","foo",choice([marked(terminal("x")),nonterminal("bar"),nonterminal("wez")])))],grammar([],[production("","foo",choice([terminal("x"),nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","foo",choice([nonterminal("bar"),nonterminal("wez")]))]); } -test bool x98() { return transform([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")]))]); } -test bool x99() { return transform([removeV(production("","expr",nonterminal("id")))],grammar([],[production("","expr",nonterminal("int")),production("","expr",nonterminal("id"))]))==grammar([],[production("","expr",nonterminal("int"))]); } -test bool x100() { return transform([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")]))]); } -test bool x101() { return transform([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")]))]); } -test bool x102() { return transform([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")]))]); } -test bool x103() { return transform([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")]))]); } -test bool x104() { return transform([renameT("x","y",globally())],grammar([],[production("","x",terminal("x"))]))==grammar([],[production("","x",terminal("y"))]); } -test bool x105() { return transform([replace(choice([nonterminal("c"),nonterminal("b")]),nonterminal("d"),innt("a"))],grammar([],[production("","a",choice([nonterminal("b"),nonterminal("c")]))]))==grammar([],[production("","a",nonterminal("d"))]); } -test bool x106() { return transform([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")])]))]); } -test bool x107() { return transform([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"))]); } -test bool x108() { return transform([replace(nonterminal("x"),nonterminal("y"),inlabel("l3"))],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("x")),production("l2","b",nonterminal("x")),production("l3","b",star(nonterminal("y"))),production("l4","c",nonterminal("x"))]); } -test bool x109() { return transform([replace(nonterminal("x"),nonterminal("y"),innt("b"))],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("x")),production("l2","b",nonterminal("y")),production("l3","b",star(nonterminal("y"))),production("l4","c",nonterminal("x"))]); } -test bool x110() { return transform([replace(sequence([nonterminal("bar"),nonterminal("wez")]),terminal("..."),globally())],grammar([],[production("","foo",sequence([star(sequence([nonterminal("bar"),nonterminal("wez")])),nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","foo",sequence([star(terminal("...")),terminal("...")]))]); } -test bool x111() { return transform([reroot(["expr","op"])],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar(["expr","op"],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } -test bool x112() { return transform([splitN("foo",[production("D","bar",terminal("d"))],globally())],grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","foo",terminal("d"))]))==grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","bar",terminal("d"))]); } -test bool x113() { return transform([splitN("foo",[production("D","bar",nonterminal("foo"))],globally())],grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","foo",nonterminal("foo"))]))==grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","bar",nonterminal("foo"))]); } -test bool x114() { return transform([splitN("foo",[production("D","bar",nonterminal("foo"))],inlabel("B"))],grammar([],[production("A","foo",terminal("a")),production("B","wez",nonterminal("foo")),production("D","foo",nonterminal("foo"))]))==grammar([],[production("A","foo",terminal("a")),production("B","wez",nonterminal("bar")),production("D","bar",nonterminal("foo"))]); } -test bool x115() { return transform([splitN("foo",[production("D","bar",nonterminal("foo"))],inlabel("B"))],grammar([],[production("A","foo",terminal("a")),production("B","foo",nonterminal("foo")),production("D","foo",nonterminal("foo"))]))==grammar([],[production("A","foo",terminal("a")),production("B","foo",nonterminal("bar")),production("D","bar",nonterminal("foo"))]); } -test bool x116() { return transform([strip("allLabels")],grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]))==grammar([],[production("","expr",selectable("value",nonterminal("int"))),production("","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]); } -test bool x117() { return transform([strip("allSelectors")],grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([terminal("("),nonterminal("expr"),nonterminal("binary_op"),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([nonterminal("unary_op"),nonterminal("expr")]))]); } -test bool x118() { return transform([unchain(production("binary","expr",nonterminal("binexpr")))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",nonterminal("binexpr")),production("","binexpr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } -test bool x119() { return transform([undefine(["op"])],grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])),production("","op",terminal("+")),production("","op",terminal("-"))]))==grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } -test bool x120() { return transform([undefine(["bar","qux"])],grammar([],[production("","foo",nonterminal("bar")),production("","bar",nonterminal("wez")),production("","wez",nonterminal("qux")),production("","qux",nonterminal("foo"))]))==grammar([],[production("","foo",nonterminal("bar")),production("","wez",nonterminal("qux"))]); } -test bool x121() { return transform([unfold("bar",globally())],grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]); } -test bool x122() { return transform([unfold("bar",inlabel("l1"))],grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]); } -test bool x123() { return transform([unfold("c",globally())],grammar([],[production("","a",choice([nonterminal("b"),nonterminal("c")])),production("","c",nonterminal("b"))]))==grammar([],[production("","a",nonterminal("b")),production("","c",nonterminal("b"))]); } -test bool x124() { return transform([unfold("bar",innt("foo"))],grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]); } -test bool x125() { return transform([unite("b","a")],grammar([],[production("","a",epsilon()),production("","b",epsilon())]))==grammar([],[production("","a",epsilon())]); } -test bool x126() { return transform([unite("bar","foo")],grammar([],[production("","foo",terminal("a")),production("","foo",terminal("b")),production("","bar",terminal("d"))]))==grammar([],[production("","foo",terminal("a")),production("","foo",terminal("b")),production("","foo",terminal("d"))]); } -test bool x127() { return transform([unlabel("intexpr")],grammar([],[production("intexpr","expr",nonterminal("int"))]))==grammar([],[production("","expr",nonterminal("int"))]); } -test bool x128() { return transform([upgrade(production("","a",sequence([marked(nonterminal("b")),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])))],grammar([],[production("","a",sequence([nonterminal("d"),nonterminal("e"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]); } -test bool x129() { return transform([vertical(inlabel("somedecs"))],grammar([],[production("nodecs","decs",epsilon()),production("somedecs","decs",choice([nonterminal("dec"),sequence([nonterminal("dec"),nonterminal("decs")])]))]))==grammar([],[production("nodecs","decs",epsilon()),production("","decs",nonterminal("dec")),production("","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]); } -test bool x130() { return transform([vertical(innt("decs"))],grammar([],[production("","decs",choice([selectable("onedec",nonterminal("dec")),selectable("moredecs",sequence([nonterminal("dec"),nonterminal("decs")]))]))]))==grammar([],[production("onedec","decs",nonterminal("dec")),production("moredecs","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]); } -test bool x131() { return transform([widen(plus(nonterminal("function")),star(nonterminal("function")),globally())],grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",star(nonterminal("function"))))]); } -test bool x132() { return transform([widen(nonterminal("function"),plus(nonterminal("function")),inlabel("main"))],grammar([],[production("main","program",selectable("fun",nonterminal("function")))]))==grammar([],[production("main","program",selectable("fun",plus(nonterminal("function"))))]); } -test bool x133() { return transform([widen(nonterminal("function"),plus(nonterminal("function")),innt("program"))],grammar([],[production("","program",selectable("fun",nonterminal("function")))]))==grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]); } -test bool x134() { return transform([widen(sequence([nonterminal("bar"),nonterminal("wez")]),star(sequence([nonterminal("bar"),nonterminal("wez")])),globally())],grammar([],[production("","foo",sequence([nonterminal("bar"),nonterminal("wez"),nonterminal("qux")]))]))==grammar([],[production("","foo",sequence([star(sequence([nonterminal("bar"),nonterminal("wez")])),nonterminal("qux")]))]); } -test bool x135() { return transform([yaccify([production("","foo",epsilon()),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))])],grammar([],[production("","foo",star(nonterminal("bar")))]))==grammar([],[production("","foo",epsilon()),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))]); } -test bool x136() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("wez")]))])],grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("wez"))]))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("wez")]))]); } -test bool x137() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))])],grammar([],[production("","foo",plus(nonterminal("bar")))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))]); } -test bool x138() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("wez"),nonterminal("foo")]))])],grammar([],[production("","foo",sequence([star(nonterminal("wez")),nonterminal("bar")]))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("wez"),nonterminal("foo")]))]); } -test bool x139() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))])],grammar([],[production("","foo",plus(nonterminal("bar")))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))]); } +test bool test_abridge() { return transform([abridge(production("bracket","expr",nonterminal("expr")))],grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr")),production("bracket","expr",nonterminal("expr"))]))==grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr"))]); } +test bool test_abstractize() { return transform([abstractize(production("","A",sequence([nonterminal("b"),marked(terminal("x")),nonterminal("c"),terminal("y")])))],grammar([],[production("","A",sequence([nonterminal("b"),terminal("x"),nonterminal("c"),terminal("y")]))]))==grammar([],[production("","A",sequence([nonterminal("b"),nonterminal("c"),terminal("y")]))]); } +test bool test_add_horizontal() { return transform([addH(production("","N",choice([marked(terminal("x")),nonterminal("a"),nonterminal("b")])))],grammar([],[production("","N",choice([nonterminal("a"),nonterminal("b")]))]))==grammar([],[production("","N",choice([terminal("x"),nonterminal("a"),nonterminal("b")]))]); } +test bool test_add_inside() { return transform([addH(production("","expr",sequence([optional(choice([marked(terminal("+")),terminal("-")])),nonterminal("int")])))],grammar([],[production("","expr",sequence([optional(terminal("-")),nonterminal("int")]))]))==grammar([],[production("","expr",sequence([optional(choice([terminal("+"),terminal("-")])),nonterminal("int")]))]); } +test bool test_add_vertical() { return transform([addV(production("","expr",nonterminal("id")))],grammar([],[production("","expr",nonterminal("int"))]))==grammar([],[production("","expr",nonterminal("int")),production("","expr",nonterminal("id"))]); } +test bool test_add_vertical_middle() { return transform([addV(production("","expr",nonterminal("id")))],grammar([],[production("","foo",nonterminal("bar")),production("","expr",nonterminal("int")),production("","bar",nonterminal("foo"))]))==grammar([],[production("","foo",nonterminal("bar")),production("","expr",nonterminal("int")),production("","expr",nonterminal("id")),production("","bar",nonterminal("foo"))]); } +test bool test_add_vertical_scattered() { return transform([addV(production("","expr",nonterminal("id")))],grammar([],[production("","foo",terminal("1")),production("","expr",nonterminal("int")),production("","bar",terminal("2")),production("","expr",nonterminal("real")),production("","wez",terminal("3"))]))==grammar([],[production("","foo",terminal("1")),production("","expr",nonterminal("int")),production("","expr",nonterminal("real")),production("","expr",nonterminal("id")),production("","bar",terminal("2")),production("","wez",terminal("3"))]); } +test bool test_anonymize_multiple() { return transform([anonymize(production("","A",sequence([selectable("first",terminal("a")),marked(selectable("second",terminal("a"))),marked(selectable("third",terminal("a")))])))],grammar([],[production("","A",sequence([selectable("first",terminal("a")),selectable("second",terminal("a")),selectable("third",terminal("a"))]))]))==grammar([],[production("","A",sequence([selectable("first",terminal("a")),terminal("a"),terminal("a")]))]); } +test bool test_anonymize_single() { return transform([anonymize(production("unary","expr",sequence([marked(selectable("op",nonterminal("unary_op"))),nonterminal("expr")])))],grammar([],[production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]))==grammar([],[production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([nonterminal("unary_op"),nonterminal("expr")]))]); } +test bool test_appear_q() { return transform([appear(production("","foo",sequence([nonterminal("bar"),marked(optional(nonterminal("qux")))])))],grammar([],[production("","foo",sequence([nonterminal("bar")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),optional(nonterminal("qux"))]))]); } +test bool test_appear_s() { return transform([appear(production("","foo",sequence([nonterminal("bar"),marked(star(nonterminal("qux")))])))],grammar([],[production("","foo",sequence([nonterminal("bar")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("qux"))]))]); } +test bool test_chain() { return transform([chain(production("binary","expr",nonterminal("binexpr")))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",nonterminal("binexpr")),production("","binexpr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } +test bool test_concretize() { return transform([concretize(production("","A",sequence([nonterminal("b"),marked(terminal("x")),nonterminal("c")])))],grammar([],[production("","A",sequence([nonterminal("b"),nonterminal("c")]))]))==grammar([],[production("","A",sequence([nonterminal("b"),terminal("x"),nonterminal("c")]))]); } +test bool test_deanonymize_multiple() { return transform([deanonymize(production("","A",sequence([selectable("first",terminal("a")),marked(selectable("second",terminal("a"))),marked(selectable("third",terminal("a")))])))],grammar([],[production("","A",sequence([selectable("first",terminal("a")),terminal("a"),terminal("a")]))]))==grammar([],[production("","A",sequence([selectable("first",terminal("a")),selectable("second",terminal("a")),selectable("third",terminal("a"))]))]); } +test bool test_deanonymize_single() { return transform([deanonymize(production("unary","expr",sequence([marked(selectable("op",nonterminal("unary_op"))),nonterminal("expr")])))],grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([nonterminal("unary_op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]); } +test bool test_define() { return transform([define([production("","op",terminal("+")),production("","op",terminal("-"))])],grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])),production("","op",terminal("+")),production("","op",terminal("-"))]); } +test bool test_designate() { return transform([designate(production("intexpr","expr",nonterminal("int")))],grammar([],[production("","expr",nonterminal("int"))]))==grammar([],[production("intexpr","expr",nonterminal("int"))]); } +test bool test_detour() { return transform([detour(production("bracket","expr",nonterminal("expr")))],grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr"))]))==grammar([],[production("constant","expr",nonterminal("int")),production("neg","expr",nonterminal("expr")),production("bracket","expr",nonterminal("expr"))]); } +test bool test_deyaccify_eps() { return transform([deyaccify("foo")],grammar([],[production("","foo",epsilon()),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_deyaccify_left() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("wez")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("wez"))]))]); } +test bool test_deyaccify_left_plus() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } +test bool test_deyaccify_right() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("wez"),nonterminal("foo")]))]))==grammar([],[production("","foo",sequence([star(nonterminal("wez")),nonterminal("bar")]))]); } +test bool test_deyaccify_right_plus() { return transform([deyaccify("foo")],grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } +test bool test_disappear_q() { return transform([disappear(production("","foo",sequence([nonterminal("bar"),marked(optional(nonterminal("qux")))])))],grammar([],[production("","foo",sequence([nonterminal("bar"),optional(nonterminal("qux"))]))]))==grammar([],[production("","foo",sequence([nonterminal("bar")]))]); } +test bool test_disappear_s() { return transform([disappear(production("","foo",sequence([nonterminal("bar"),marked(star(nonterminal("wez"))),nonterminal("qux")])))],grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("wez")),nonterminal("qux")]))]))==grammar([],[production("","foo",sequence([nonterminal("bar"),nonterminal("qux")]))]); } +test bool test_distribute_l() { return transform([distribute(inlabel("bcd"))],grammar([],[production("bcd","a",sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])])),production("efg","a",sequence([nonterminal("e"),choice([nonterminal("f"),nonterminal("g")])]))]))==grammar([],[production("bcd","a",choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])])),production("efg","a",sequence([nonterminal("e"),choice([nonterminal("f"),nonterminal("g")])]))]); } +test bool test_distribute_nt() { return transform([distribute(innt("foo"))],grammar([],[production("","foo",sequence([nonterminal("bar"),choice([nonterminal("qux"),nonterminal("wez")])]))]))==grammar([],[production("","foo",choice([sequence([nonterminal("bar"),nonterminal("qux")]),sequence([nonterminal("bar"),nonterminal("wez")])]))]); } +test bool test_downgrade() { return transform([downgrade(production("","a",sequence([marked(nonterminal("b")),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])))],grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]))==grammar([],[production("","a",sequence([nonterminal("d"),nonterminal("e"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]); } +test bool test_eliminate() { return transform([eliminate("intexpr")],grammar([],[production("","expr",nonterminal("int")),production("","intexpr",nonterminal("int"))]))==grammar([],[production("","expr",nonterminal("int"))]); } +test bool test_equate1() { return transform([equate("foo","bar")],grammar([],[production("","foo",nonterminal("wez")),production("","bar",nonterminal("wez"))]))==grammar([],[production("","bar",nonterminal("wez"))]); } +test bool test_equate2() { return transform([equate("foo","bar")],grammar([],[production("","foo",choice([star(nonterminal("wez")),terminal("x")])),production("","bar",choice([terminal("x"),star(nonterminal("wez"))]))]))==grammar([],[production("","bar",choice([terminal("x"),star(nonterminal("wez"))]))]); } +test bool test_equate3() { return transform([equate("foo","bar")],grammar([],[production("","foo",star(nonterminal("wez"))),production("","foo",terminal("x")),production("","bar",terminal("x")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("","bar",star(nonterminal("wez"))),production("","bar",terminal("x"))]); } +test bool test_equate4() { return transform([equate("foo","bar")],grammar([],[production("","foo",choice([star(nonterminal("wez")),terminal("x")])),production("","bar",choice([terminal("x"),star(nonterminal("wez"))])),production("go","wez",sequence([nonterminal("foo"),terminal("!")])),production("stay","wez",sequence([nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","bar",choice([terminal("x"),star(nonterminal("wez"))])),production("go","wez",sequence([nonterminal("bar"),terminal("!")])),production("stay","wez",sequence([nonterminal("bar"),nonterminal("wez")]))]); } +test bool test_extract_l() { return transform([extract(production("","xs",star(nonterminal("x"))),inlabel("l2"))],grammar([],[production("l1","a",star(nonterminal("x"))),production("l2","b",star(nonterminal("x")))]))==grammar([],[production("l1","a",star(nonterminal("x"))),production("l2","b",nonterminal("xs")),production("","xs",star(nonterminal("x")))]); } +test bool test_extract_nt() { return transform([extract(production("","xs",star(nonterminal("x"))),innt("a"))],grammar([],[production("","a",star(nonterminal("x"))),production("","b",star(nonterminal("x")))]))==grammar([],[production("","a",nonterminal("xs")),production("","xs",star(nonterminal("x"))),production("","b",star(nonterminal("x")))]); } +test bool test_extract_subch() { return transform([extract(production("","ClassOrInterfaceDeclaration",choice([nonterminal("ClassDeclaration"),nonterminal("InterfaceDeclaration")])),globally())],grammar([],[production("","TypeDeclaration",choice([nonterminal("ClassDeclaration"),nonterminal("InterfaceDeclaration"),terminal(";")]))]))==grammar([],[production("","TypeDeclaration",choice([nonterminal("ClassOrInterfaceDeclaration"),terminal(";")])),production("","ClassOrInterfaceDeclaration",choice([nonterminal("ClassDeclaration"),nonterminal("InterfaceDeclaration")]))]); } +test bool test_extract_subseq_multiple() { return transform([extract(production("","qux",sequence([nonterminal("bar"),nonterminal("wez")])),globally())],grammar([],[production("","foo",sequence([star(sequence([nonterminal("bar"),nonterminal("wez")])),nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","foo",sequence([star(nonterminal("qux")),nonterminal("qux")])),production("","qux",sequence([nonterminal("bar"),nonterminal("wez")]))]); } +test bool test_extract_subseq_single() { return transform([extract(production("","ParExpression",sequence([terminal("("),nonterminal("Expression"),terminal(")")])),globally())],grammar([],[production("","IfThenStatement",sequence([terminal("if"),terminal("("),nonterminal("Expression"),terminal(")"),nonterminal("Statement")]))]))==grammar([],[production("","IfThenStatement",sequence([terminal("if"),nonterminal("ParExpression"),nonterminal("Statement")])),production("","ParExpression",sequence([terminal("("),nonterminal("Expression"),terminal(")")]))]); } +test bool test_factor_eps() { return transform([factor(choice([nonterminal("b"),sequence([nonterminal("b"),nonterminal("c")])]),sequence([nonterminal("b"),choice([epsilon(),nonterminal("c")])]),globally())],grammar([],[production("","a",choice([nonterminal("b"),sequence([nonterminal("b"),nonterminal("c")])]))]))==grammar([],[production("","a",sequence([nonterminal("b"),choice([epsilon(),nonterminal("c")])]))]); } +test bool test_factor_global() { return transform([factor(choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]),sequence([nonterminal("b"),choice([nonterminal("d"),nonterminal("c")])]),globally())],grammar([],[production("","a",choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]))]))==grammar([],[production("","a",sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])]))]); } +test bool test_factor_local() { return transform([factor(choice([sequence([nonterminal("c"),nonterminal("d"),nonterminal("e")]),sequence([nonterminal("c"),nonterminal("f"),nonterminal("g")])]),sequence([nonterminal("c"),choice([sequence([nonterminal("d"),nonterminal("e")]),sequence([nonterminal("f"),nonterminal("g")])])]),globally())],grammar([],[production("","a",choice([nonterminal("a"),nonterminal("b"),sequence([nonterminal("c"),nonterminal("d"),nonterminal("e")]),sequence([nonterminal("c"),nonterminal("f"),nonterminal("g")]),nonterminal("h"),nonterminal("i")]))]))==grammar([],[production("","a",choice([nonterminal("a"),nonterminal("b"),sequence([nonterminal("c"),choice([sequence([nonterminal("d"),nonterminal("e")]),sequence([nonterminal("f"),nonterminal("g")])])]),nonterminal("h"),nonterminal("i")]))]); } +test bool test_factor_nt() { return transform([factor(choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]),sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])]),innt("a"))],grammar([],[production("","a",choice([sequence([nonterminal("b"),nonterminal("c")]),sequence([nonterminal("b"),nonterminal("d")])]))]))==grammar([],[production("","a",sequence([nonterminal("b"),choice([nonterminal("c"),nonterminal("d")])]))]); } +test bool test_fold() { return transform([fold("bar",globally())],grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]); } +test bool test_fold_l() { return transform([fold("bar",inlabel("l1"))],grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]); } +test bool test_fold_nt() { return transform([fold("bar",innt("foo"))],grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]); } +test bool test_horizontal_l() { return transform([horizontal(innt("decs"))],grammar([],[production("onedec","decs",nonterminal("dec")),production("moredecs","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]))==grammar([],[production("","decs",choice([selectable("onedec",nonterminal("dec")),selectable("moredecs",sequence([nonterminal("dec"),nonterminal("decs")]))]))]); } +test bool test_horizontal_n() { return transform([horizontal(innt("decs"))],grammar([],[production("","decs",nonterminal("dec")),production("","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]))==grammar([],[production("","decs",choice([nonterminal("dec"),sequence([nonterminal("dec"),nonterminal("decs")])]))]); } +test bool test_import() { return transform([importG([production("","A",sequence([nonterminal("B"),nonterminal("X")])),production("","B",choice([nonterminal("A"),epsilon()]))])],grammar([],[production("","X",sequence([terminal("a"),terminal("b")]))]))==grammar([],[production("","X",sequence([terminal("a"),terminal("b")])),production("","A",sequence([nonterminal("B"),nonterminal("X")])),production("","B",choice([nonterminal("A"),epsilon()]))]); } +test bool test_inject() { return transform([inject(production("","a",sequence([nonterminal("b"),marked(nonterminal("c")),nonterminal("d")])))],grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("d")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c"),nonterminal("d")]))]); } +test bool test_inline() { return transform([inline("wez")],grammar([],[production("","foo",nonterminal("wez")),production("","bar",sequence([nonterminal("wez"),terminal(".."),nonterminal("wez")])),production("","wez",star(nonterminal("qux")))]))==grammar([],[production("","foo",star(nonterminal("qux"))),production("","bar",sequence([star(nonterminal("qux")),terminal(".."),star(nonterminal("qux"))]))]); } +test bool test_introduce() { return transform([introduce([production("","c",nonterminal("a")),production("","c",nonterminal("b"))])],grammar([],[production("","a",nonterminal("b")),production("","b",epsilon())]))==grammar([],[production("","a",nonterminal("b")),production("","b",epsilon()),production("","c",nonterminal("a")),production("","c",nonterminal("b"))]); } +test bool test_iterate_l() { return transform([iterate(production("binary","expr",sequence([star(sequence([nonterminal("expr"),nonterminal("op")])),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([star(sequence([nonterminal("expr"),nonterminal("op")])),nonterminal("expr")]))]); } +test bool test_iterate_p() { return transform([iterate(production("sequence","expr",plus(nonterminal("expr"))))],grammar([],[production("terminal","expr",val(string())),production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")]))]))==grammar([],[production("terminal","expr",val(string())),production("sequence","expr",plus(nonterminal("expr")))]); } +test bool test_iterate_r() { return transform([iterate(production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))]))]); } +test bool test_lassoc_l() { return transform([lassoc(production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([star(sequence([nonterminal("expr"),nonterminal("op")])),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } +test bool test_lassoc_p() { return transform([lassoc(production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")])))],grammar([],[production("terminal","expr",val(string())),production("sequence","expr",plus(nonterminal("expr")))]))==grammar([],[production("terminal","expr",val(string())),production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")]))]); } +test bool test_lassoc_r() { return transform([lassoc(production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } +test bool test_massage_assoc_p() { return transform([massage(sequence([plus(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]),sequence([nonterminal("a"),plus(sequence([nonterminal("b"),nonterminal("a")]))]),globally())],grammar([],[production("","N",sequence([plus(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]))]))==grammar([],[production("","N",sequence([nonterminal("a"),plus(sequence([nonterminal("b"),nonterminal("a")]))]))]); } +test bool test_massage_assoc_q() { return transform([massage(sequence([optional(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]),sequence([nonterminal("a"),optional(sequence([nonterminal("b"),nonterminal("a")]))]),globally())],grammar([],[production("","N",sequence([optional(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]))]))==grammar([],[production("","N",sequence([nonterminal("a"),optional(sequence([nonterminal("b"),nonterminal("a")]))]))]); } +test bool test_massage_assoc_s() { return transform([massage(sequence([star(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]),sequence([nonterminal("a"),star(sequence([nonterminal("b"),nonterminal("a")]))]),globally())],grammar([],[production("","N",sequence([star(sequence([nonterminal("a"),nonterminal("b")])),nonterminal("a")]))]))==grammar([],[production("","N",sequence([nonterminal("a"),star(sequence([nonterminal("b"),nonterminal("a")]))]))]); } +test bool test_massage_ch_ep() { return transform([massage(choice([epsilon(),plus(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([plus(nonterminal("bar")),epsilon()]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_ch_eq() { return transform([massage(choice([epsilon(),optional(nonterminal("bar"))]),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([optional(nonterminal("bar")),epsilon()]))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } +test bool test_massage_ch_es() { return transform([massage(choice([epsilon(),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),epsilon()]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_ch_ex() { return transform([massage(choice([epsilon(),nonterminal("bar")]),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([nonterminal("bar"),epsilon()]))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } +test bool test_massage_ch_ps() { return transform([massage(choice([plus(nonterminal("bar")),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),plus(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_ch_qp() { return transform([massage(choice([optional(nonterminal("bar")),plus(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([plus(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_ch_qs() { return transform([massage(choice([optional(nonterminal("bar")),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_ch_xp() { return transform([massage(choice([nonterminal("bar"),plus(nonterminal("bar"))]),plus(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([plus(nonterminal("bar")),nonterminal("bar")]))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } +test bool test_massage_ch_xq() { return transform([massage(choice([nonterminal("bar"),optional(nonterminal("bar"))]),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([optional(nonterminal("bar")),nonterminal("bar")]))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } +test bool test_massage_ch_xs() { return transform([massage(choice([nonterminal("bar"),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",choice([star(nonterminal("bar")),nonterminal("bar")]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_ch_xx1() { return transform([massage(optional(nonterminal("bar")),choice([selectable("one",optional(nonterminal("bar"))),selectable("two",optional(nonterminal("bar")))]),globally()),anonymize(production("","foo",choice([plus(nonterminal("bar")),marked(selectable("one",optional(nonterminal("bar")))),selectable("two",optional(nonterminal("bar")))]))),massage(choice([optional(nonterminal("bar")),plus(nonterminal("bar"))]),star(nonterminal("bar")),globally()),anonymize(production("","foo",choice([star(nonterminal("bar")),marked(selectable("two",optional(nonterminal("bar"))))])))],grammar([],[production("","foo",choice([plus(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",choice([optional(nonterminal("bar")),star(nonterminal("bar"))]))]); } +test bool test_massage_ch_xx2() { return transform([massage(star(nonterminal("bar")),choice([selectable("one",star(nonterminal("bar"))),selectable("two",star(nonterminal("bar")))]),globally()),vertical(innt("foo")),massage(star(nonterminal("bar")),choice([epsilon(),plus(nonterminal("bar"))]),inlabel("one")),massage(star(nonterminal("bar")),choice([optional(nonterminal("bar")),plus(nonterminal("bar"))]),inlabel("two")),extract(production("","barplus",plus(nonterminal("bar"))),inlabel("one")),unlabel("one"),unlabel("two"),horizontal(innt("foo"))],grammar([],[production("","foo",star(nonterminal("bar")))]))==grammar([],[production("","foo",choice([epsilon(),optional(nonterminal("bar")),plus(nonterminal("bar")),nonterminal("barplus")])),production("","barplus",plus(nonterminal("bar")))]); } +test bool test_massage_ch_xx3() { return transform([massage(nonterminal("bar"),choice([selectable("one",nonterminal("bar")),selectable("two",nonterminal("bar")),selectable("three",nonterminal("bar"))]),globally())],grammar([],[production("","foo",nonterminal("bar"))]))==grammar([],[production("","foo",choice([selectable("one",nonterminal("bar")),selectable("two",nonterminal("bar")),selectable("three",nonterminal("bar"))]))]); } +test bool test_massage_comp_pp() { return transform([massage(plus(plus(nonterminal("bar"))),plus(nonterminal("bar")),globally())],grammar([],[production("","foo",plus(plus(nonterminal("bar"))))]))==grammar([],[production("","foo",plus(nonterminal("bar")))]); } +test bool test_massage_comp_pq() { return transform([massage(optional(plus(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",optional(plus(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_comp_ps() { return transform([massage(star(plus(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",star(plus(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_comp_qp() { return transform([massage(plus(optional(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",plus(optional(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_comp_qq() { return transform([massage(optional(optional(nonterminal("bar"))),optional(nonterminal("bar")),globally())],grammar([],[production("","foo",optional(optional(nonterminal("bar"))))]))==grammar([],[production("","foo",optional(nonterminal("bar")))]); } +test bool test_massage_comp_qs() { return transform([massage(star(optional(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",star(optional(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_comp_sp() { return transform([massage(plus(star(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",plus(star(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_comp_sq() { return transform([massage(optional(star(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",optional(star(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_comp_ss() { return transform([massage(star(star(nonterminal("bar"))),star(nonterminal("bar")),globally())],grammar([],[production("","foo",star(star(nonterminal("bar"))))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_complex() { return transform([massage(optional(sequence([star(nonterminal("foo")),optional(nonterminal("bar"))])),choice([epsilon(),sequence([star(nonterminal("foo")),optional(nonterminal("bar"))])]),globally()),massage(optional(nonterminal("bar")),choice([nonterminal("bar"),epsilon()]),globally()),distribute(innt("wez")),massage(sequence([nonterminal("foo"),star(nonterminal("foo"))]),plus(nonterminal("foo")),globally()),massage(choice([nonterminal("foo"),plus(nonterminal("foo"))]),plus(nonterminal("foo")),globally()),factor(choice([plus(nonterminal("foo")),sequence([plus(nonterminal("foo")),nonterminal("bar")])]),sequence([plus(nonterminal("foo")),choice([nonterminal("bar"),epsilon()])]),globally()),massage(choice([nonterminal("bar"),epsilon()]),optional(nonterminal("bar")),globally())],grammar([],[production("","wez",sequence([nonterminal("foo"),optional(sequence([star(nonterminal("foo")),optional(nonterminal("bar"))]))]))]))==grammar([],[production("","wez",sequence([plus(nonterminal("foo")),optional(nonterminal("bar"))]))]); } +test bool test_massage_distr_ch() { return transform([massage(optional(choice([nonterminal("bar"),nonterminal("qux")])),choice([choice([nonterminal("bar"),nonterminal("qux")]),epsilon()]),globally()),massage(epsilon(),choice([selectable("bar",epsilon()),selectable("qux",epsilon())]),globally()),factor(choice([choice([nonterminal("bar"),nonterminal("qux")]),choice([selectable("bar",epsilon()),selectable("qux",epsilon())])]),choice([choice([nonterminal("bar"),selectable("bar",epsilon())]),choice([nonterminal("qux"),selectable("qux",epsilon())])]),globally()),anonymize(production("","foo",choice([choice([nonterminal("bar"),marked(selectable("bar",epsilon()))]),choice([nonterminal("qux"),selectable("qux",epsilon())])]))),massage(choice([nonterminal("bar"),epsilon()]),optional(nonterminal("bar")),globally()),anonymize(production("","foo",choice([optional(nonterminal("bar")),choice([nonterminal("qux"),marked(selectable("qux",epsilon()))])]))),massage(choice([nonterminal("qux"),epsilon()]),optional(nonterminal("qux")),globally())],grammar([],[production("","foo",optional(choice([nonterminal("bar"),nonterminal("qux")])))]))==grammar([],[production("","foo",choice([optional(nonterminal("bar")),optional(nonterminal("qux"))]))]); } +test bool test_massage_sel_s() { return transform([massage(star(selectable("fun",nonterminal("function"))),selectable("fun",star(nonterminal("function"))),globally())],grammar([],[production("","program",star(selectable("fun",nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",star(nonterminal("function"))))]); } +test bool test_massage_seq_pq() { return transform([massage(sequence([plus(nonterminal("bar")),optional(nonterminal("bar"))]),plus(nonterminal("bar")),globally()),massage(plus(nonterminal("bar")),sequence([optional(nonterminal("bar")),plus(nonterminal("bar"))]),globally())],grammar([],[production("","foo",sequence([plus(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([optional(nonterminal("bar")),plus(nonterminal("bar"))]))]); } +test bool test_massage_seq_ps() { return transform([massage(sequence([plus(nonterminal("bar")),star(nonterminal("bar"))]),plus(nonterminal("bar")),globally()),massage(plus(nonterminal("bar")),sequence([star(nonterminal("bar")),plus(nonterminal("bar"))]),globally())],grammar([],[production("","foo",sequence([plus(nonterminal("bar")),star(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([star(nonterminal("bar")),plus(nonterminal("bar"))]))]); } +test bool test_massage_seq_sq() { return transform([massage(sequence([star(nonterminal("bar")),optional(nonterminal("bar"))]),star(nonterminal("bar")),globally()),massage(star(nonterminal("bar")),sequence([optional(nonterminal("bar")),star(nonterminal("bar"))]),globally())],grammar([],[production("","foo",sequence([star(nonterminal("bar")),optional(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([optional(nonterminal("bar")),star(nonterminal("bar"))]))]); } +test bool test_massage_seq_ss() { return transform([massage(sequence([star(nonterminal("bar")),star(nonterminal("bar"))]),star(nonterminal("bar")),globally())],grammar([],[production("","foo",sequence([star(nonterminal("bar")),star(nonterminal("bar"))]))]))==grammar([],[production("","foo",star(nonterminal("bar")))]); } +test bool test_massage_seq_xs() { return transform([massage(sequence([nonterminal("bar"),star(nonterminal("bar"))]),plus(nonterminal("bar")),globally()),massage(plus(nonterminal("bar")),sequence([star(nonterminal("bar")),nonterminal("bar")]),globally())],grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("bar"))]))]))==grammar([],[production("","foo",sequence([star(nonterminal("bar")),nonterminal("bar")]))]); } +test bool test_narrow_global() { return transform([narrow(star(nonterminal("function")),plus(nonterminal("function")),globally())],grammar([],[production("","program",selectable("fun",star(nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]); } +test bool test_narrow_l() { return transform([narrow(plus(nonterminal("function")),nonterminal("function"),inlabel("main"))],grammar([],[production("main","program",selectable("fun",plus(nonterminal("function"))))]))==grammar([],[production("main","program",selectable("fun",nonterminal("function")))]); } +test bool test_narrow_nt() { return transform([narrow(plus(nonterminal("function")),nonterminal("function"),innt("program"))],grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",nonterminal("function")))]); } +test bool test_permute() { return transform([permute(production("","a",sequence([nonterminal("b"),nonterminal("c"),star(nonterminal("d"))])))],grammar([],[production("","a",sequence([nonterminal("b"),star(nonterminal("d")),nonterminal("c")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c"),star(nonterminal("d"))]))]); } +test bool test_project() { return transform([project(production("","a",sequence([nonterminal("b"),marked(nonterminal("c")),nonterminal("d")])))],grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c"),nonterminal("d")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("d")]))]); } +test bool test_rassoc_p() { return transform([rassoc(production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")])))],grammar([],[production("terminal","expr",val(string())),production("sequence","expr",plus(nonterminal("expr")))]))==grammar([],[production("terminal","expr",val(string())),production("sequence","expr",sequence([nonterminal("expr"),nonterminal("expr")]))]); } +test bool test_rassoc_s() { return transform([rassoc(production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),star(sequence([nonterminal("op"),nonterminal("expr")]))]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } +test bool test_redefine() { return transform([redefine([production("","a",star(nonterminal("b")))])],grammar([],[production("","a",sequence([terminal("{"),nonterminal("b"),terminal("}")])),production("","b",nonterminal("a"))]))==grammar([],[production("","a",star(nonterminal("b"))),production("","b",nonterminal("a"))]); } +test bool test_remove_horizontal() { return transform([removeH(production("","foo",choice([marked(terminal("x")),nonterminal("bar"),nonterminal("wez")])))],grammar([],[production("","foo",choice([terminal("x"),nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","foo",choice([nonterminal("bar"),nonterminal("wez")]))]); } +test bool test_remove_inside() { return transform([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")]))]); } +test bool test_remove_vertical() { return transform([removeV(production("","expr",nonterminal("id")))],grammar([],[production("","expr",nonterminal("int")),production("","expr",nonterminal("id"))]))==grammar([],[production("","expr",nonterminal("int"))]); } +test bool test_rename4() { return transform([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")]))]); } +test bool test_renameL() { return transform([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")]))]); } +test bool test_renameN() { return transform([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")]))]); } +test bool test_renameS() { return transform([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")]))]); } +test bool test_renameT() { return transform([renameT("x","y",globally())],grammar([],[production("","x",terminal("x"))]))==grammar([],[production("","x",terminal("y"))]); } +test bool test_replace_choice() { return transform([replace(choice([nonterminal("c"),nonterminal("b")]),nonterminal("d"),innt("a"))],grammar([],[production("","a",choice([nonterminal("b"),nonterminal("c")]))]))==grammar([],[production("","a",nonterminal("d"))]); } +test bool test_replace_choice_part() { return transform([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")])]))]); } +test bool test_replace_global() { return transform([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"))]); } +test bool test_replace_l() { return transform([replace(nonterminal("x"),nonterminal("y"),inlabel("l3"))],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("x")),production("l2","b",nonterminal("x")),production("l3","b",star(nonterminal("y"))),production("l4","c",nonterminal("x"))]); } +test bool test_replace_nt() { return transform([replace(nonterminal("x"),nonterminal("y"),innt("b"))],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("x")),production("l2","b",nonterminal("y")),production("l3","b",star(nonterminal("y"))),production("l4","c",nonterminal("x"))]); } +test bool test_replace_seq() { return transform([replace(sequence([nonterminal("bar"),nonterminal("wez")]),terminal("..."),globally())],grammar([],[production("","foo",sequence([star(sequence([nonterminal("bar"),nonterminal("wez")])),nonterminal("bar"),nonterminal("wez")]))]))==grammar([],[production("","foo",sequence([star(terminal("...")),terminal("...")]))]); } +test bool test_reroot() { return transform([reroot(["expr","op"])],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar(["expr","op"],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } +test bool test_split1() { return transform([splitN("foo",[production("D","bar",terminal("d"))],globally())],grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","foo",terminal("d"))]))==grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","bar",terminal("d"))]); } +test bool test_split2() { return transform([splitN("foo",[production("D","bar",nonterminal("foo"))],globally())],grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","foo",nonterminal("foo"))]))==grammar([],[production("A","foo",terminal("a")),production("B","foo",terminal("b")),production("D","bar",nonterminal("foo"))]); } +test bool test_split3() { return transform([splitN("foo",[production("D","bar",nonterminal("foo"))],inlabel("B"))],grammar([],[production("A","foo",terminal("a")),production("B","wez",nonterminal("foo")),production("D","foo",nonterminal("foo"))]))==grammar([],[production("A","foo",terminal("a")),production("B","wez",nonterminal("bar")),production("D","bar",nonterminal("foo"))]); } +test bool test_split4() { return transform([splitN("foo",[production("D","bar",nonterminal("foo"))],inlabel("B"))],grammar([],[production("A","foo",terminal("a")),production("B","foo",nonterminal("foo")),production("D","foo",nonterminal("foo"))]))==grammar([],[production("A","foo",terminal("a")),production("B","foo",nonterminal("bar")),production("D","bar",nonterminal("foo"))]); } +test bool test_strip2() { return transform([strip("allLabels")],grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]))==grammar([],[production("","expr",selectable("value",nonterminal("int"))),production("","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]); } +test bool test_strip4() { return transform([strip("allSelectors")],grammar([],[production("constant","expr",selectable("value",nonterminal("int"))),production("binary","expr",sequence([terminal("("),nonterminal("expr"),selectable("op",nonterminal("binary_op")),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([selectable("op",nonterminal("unary_op")),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([terminal("("),nonterminal("expr"),nonterminal("binary_op"),nonterminal("expr"),terminal(")")])),production("unary","expr",sequence([nonterminal("unary_op"),nonterminal("expr")]))]); } +test bool test_unchain() { return transform([unchain(production("binary","expr",nonterminal("binexpr")))],grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",nonterminal("binexpr")),production("","binexpr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]))==grammar([],[production("constant","expr",nonterminal("int")),production("binary","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } +test bool test_undefine1() { return transform([undefine(["op"])],grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")])),production("","op",terminal("+")),production("","op",terminal("-"))]))==grammar([],[production("","expr",nonterminal("int")),production("","expr",sequence([nonterminal("expr"),nonterminal("op"),nonterminal("expr")]))]); } +test bool test_undefine2() { return transform([undefine(["bar","qux"])],grammar([],[production("","foo",nonterminal("bar")),production("","bar",nonterminal("wez")),production("","wez",nonterminal("qux")),production("","qux",nonterminal("foo"))]))==grammar([],[production("","foo",nonterminal("bar")),production("","wez",nonterminal("qux"))]); } +test bool test_unfold() { return transform([unfold("bar",globally())],grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",star(nonterminal("wez"))),production("","bar",star(nonterminal("wez")))]); } +test bool test_unfold_l() { return transform([unfold("bar",inlabel("l1"))],grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]); } +test bool test_unfold_normalize() { return transform([unfold("c",globally())],grammar([],[production("","a",choice([nonterminal("b"),nonterminal("c")])),production("","c",nonterminal("b"))]))==grammar([],[production("","a",nonterminal("b")),production("","c",nonterminal("b"))]); } +test bool test_unfold_nt() { return transform([unfold("bar",innt("foo"))],grammar([],[production("l1","foo",nonterminal("bar")),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]))==grammar([],[production("l1","foo",star(nonterminal("wez"))),production("l2","qux",nonterminal("bar")),production("","bar",star(nonterminal("wez")))]); } +test bool test_unite_eq() { return transform([unite("b","a")],grammar([],[production("","a",epsilon()),production("","b",epsilon())]))==grammar([],[production("","a",epsilon())]); } +test bool test_unite_normal() { return transform([unite("bar","foo")],grammar([],[production("","foo",terminal("a")),production("","foo",terminal("b")),production("","bar",terminal("d"))]))==grammar([],[production("","foo",terminal("a")),production("","foo",terminal("b")),production("","foo",terminal("d"))]); } +test bool test_unlabel() { return transform([unlabel("intexpr")],grammar([],[production("intexpr","expr",nonterminal("int"))]))==grammar([],[production("","expr",nonterminal("int"))]); } +test bool test_upgrade() { return transform([upgrade(production("","a",sequence([marked(nonterminal("b")),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])))],grammar([],[production("","a",sequence([nonterminal("d"),nonterminal("e"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]))==grammar([],[production("","a",sequence([nonterminal("b"),nonterminal("c")])),production("","b",sequence([nonterminal("d"),nonterminal("e")])),production("","b",sequence([nonterminal("f"),nonterminal("g")]))]); } +test bool test_vertical_l() { return transform([vertical(inlabel("somedecs"))],grammar([],[production("nodecs","decs",epsilon()),production("somedecs","decs",choice([nonterminal("dec"),sequence([nonterminal("dec"),nonterminal("decs")])]))]))==grammar([],[production("nodecs","decs",epsilon()),production("","decs",nonterminal("dec")),production("","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]); } +test bool test_vertical_s() { return transform([vertical(innt("decs"))],grammar([],[production("","decs",choice([selectable("onedec",nonterminal("dec")),selectable("moredecs",sequence([nonterminal("dec"),nonterminal("decs")]))]))]))==grammar([],[production("onedec","decs",nonterminal("dec")),production("moredecs","decs",sequence([nonterminal("dec"),nonterminal("decs")]))]); } +test bool test_widen_global() { return transform([widen(plus(nonterminal("function")),star(nonterminal("function")),globally())],grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]))==grammar([],[production("","program",selectable("fun",star(nonterminal("function"))))]); } +test bool test_widen_l() { return transform([widen(nonterminal("function"),plus(nonterminal("function")),inlabel("main"))],grammar([],[production("main","program",selectable("fun",nonterminal("function")))]))==grammar([],[production("main","program",selectable("fun",plus(nonterminal("function"))))]); } +test bool test_widen_nt() { return transform([widen(nonterminal("function"),plus(nonterminal("function")),innt("program"))],grammar([],[production("","program",selectable("fun",nonterminal("function")))]))==grammar([],[production("","program",selectable("fun",plus(nonterminal("function"))))]); } +test bool test_widen_sub() { return transform([widen(sequence([nonterminal("bar"),nonterminal("wez")]),star(sequence([nonterminal("bar"),nonterminal("wez")])),globally())],grammar([],[production("","foo",sequence([nonterminal("bar"),nonterminal("wez"),nonterminal("qux")]))]))==grammar([],[production("","foo",sequence([star(sequence([nonterminal("bar"),nonterminal("wez")])),nonterminal("qux")]))]); } +test bool test_yaccify_eps() { return transform([yaccify([production("","foo",epsilon()),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))])],grammar([],[production("","foo",star(nonterminal("bar")))]))==grammar([],[production("","foo",epsilon()),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))]); } +test bool test_yaccify_left() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("wez")]))])],grammar([],[production("","foo",sequence([nonterminal("bar"),star(nonterminal("wez"))]))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("wez")]))]); } +test bool test_yaccify_left_plus() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))])],grammar([],[production("","foo",plus(nonterminal("bar")))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("foo"),nonterminal("bar")]))]); } +test bool test_yaccify_right() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("wez"),nonterminal("foo")]))])],grammar([],[production("","foo",sequence([star(nonterminal("wez")),nonterminal("bar")]))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("wez"),nonterminal("foo")]))]); } +test bool test_yaccify_right_plus() { return transform([yaccify([production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))])],grammar([],[production("","foo",plus(nonterminal("bar")))]))==grammar([],[production("","foo",nonterminal("bar")),production("","foo",sequence([nonterminal("bar"),nonterminal("foo")]))]); } diff --git a/topics/transformation/xbgf/tests/add_vertical_middle.baseline b/topics/transformation/xbgf/tests/add_vertical_middle.baseline new file mode 100644 index 00000000..9f87641a --- /dev/null +++ b/topics/transformation/xbgf/tests/add_vertical_middle.baseline @@ -0,0 +1,27 @@ + + + + foo + + bar + + + + expr + + int + + + + expr + + id + + + + bar + + foo + + + diff --git a/topics/transformation/xbgf/tests/add_vertical_middle.bgf b/topics/transformation/xbgf/tests/add_vertical_middle.bgf new file mode 100644 index 00000000..536246a2 --- /dev/null +++ b/topics/transformation/xbgf/tests/add_vertical_middle.bgf @@ -0,0 +1,21 @@ + + + + foo + + bar + + + + expr + + int + + + + bar + + foo + + + diff --git a/topics/transformation/xbgf/tests/add_vertical_middle.xbgf b/topics/transformation/xbgf/tests/add_vertical_middle.xbgf new file mode 100644 index 00000000..192435d8 --- /dev/null +++ b/topics/transformation/xbgf/tests/add_vertical_middle.xbgf @@ -0,0 +1,13 @@ + + + + + + expr + + id + + + + + diff --git a/topics/transformation/xbgf/tests/add_vertical_scattered.baseline b/topics/transformation/xbgf/tests/add_vertical_scattered.baseline new file mode 100644 index 00000000..2c6b23b8 --- /dev/null +++ b/topics/transformation/xbgf/tests/add_vertical_scattered.baseline @@ -0,0 +1,39 @@ + + + + foo + + 1 + + + + expr + + int + + + + expr + + real + + + + expr + + id + + + + bar + + 2 + + + + wez + + 3 + + + diff --git a/topics/transformation/xbgf/tests/add_vertical_scattered.bgf b/topics/transformation/xbgf/tests/add_vertical_scattered.bgf new file mode 100644 index 00000000..311c945a --- /dev/null +++ b/topics/transformation/xbgf/tests/add_vertical_scattered.bgf @@ -0,0 +1,33 @@ + + + + foo + + 1 + + + + expr + + int + + + + bar + + 2 + + + + expr + + real + + + + wez + + 3 + + + diff --git a/topics/transformation/xbgf/tests/add_vertical_scattered.xbgf b/topics/transformation/xbgf/tests/add_vertical_scattered.xbgf new file mode 100644 index 00000000..192435d8 --- /dev/null +++ b/topics/transformation/xbgf/tests/add_vertical_scattered.xbgf @@ -0,0 +1,13 @@ + + + + + + expr + + id + + + + + diff --git a/topics/transformation/xbgf/tests/appear_q.baseline b/topics/transformation/xbgf/tests/appear_q.baseline index 5abb5564..5013e27f 100644 --- a/topics/transformation/xbgf/tests/appear_q.baseline +++ b/topics/transformation/xbgf/tests/appear_q.baseline @@ -1,20 +1,20 @@ - - foo - - - - bar - - - - - qux - - - - - - - \ No newline at end of file + + foo + + + + bar + + + + + qux + + + + + + + diff --git a/topics/transformation/xbgf/tests/appear_q.bgf b/topics/transformation/xbgf/tests/appear_q.bgf index d4df9333..1de0a8ca 100644 --- a/topics/transformation/xbgf/tests/appear_q.bgf +++ b/topics/transformation/xbgf/tests/appear_q.bgf @@ -1,13 +1,9 @@ - - foo - - - - bar - - - - - \ No newline at end of file + + foo + + bar + + + diff --git a/topics/transformation/xbgf/tests/appear_q.xbgf b/topics/transformation/xbgf/tests/appear_q.xbgf index ecb93cf2..c71ddd3e 100644 --- a/topics/transformation/xbgf/tests/appear_q.xbgf +++ b/topics/transformation/xbgf/tests/appear_q.xbgf @@ -1,28 +1,26 @@ - - - - - foo - - - - bar - - - - - - - qux - - - - - - - - - + + + + + foo + + + + bar + + + + + + + qux + + + + + + + + + diff --git a/topics/transformation/xbgf/tests/appear_s.baseline b/topics/transformation/xbgf/tests/appear_s.baseline index 9fd89b0d..e4ce1a34 100644 --- a/topics/transformation/xbgf/tests/appear_s.baseline +++ b/topics/transformation/xbgf/tests/appear_s.baseline @@ -1,20 +1,20 @@ - - foo - - - - bar - - - - - qux - - - - - - - \ No newline at end of file + + foo + + + + bar + + + + + qux + + + + + + + diff --git a/topics/transformation/xbgf/tests/appear_s.bgf b/topics/transformation/xbgf/tests/appear_s.bgf index d4df9333..1de0a8ca 100644 --- a/topics/transformation/xbgf/tests/appear_s.bgf +++ b/topics/transformation/xbgf/tests/appear_s.bgf @@ -1,13 +1,9 @@ - - foo - - - - bar - - - - - \ No newline at end of file + + foo + + bar + + + diff --git a/topics/transformation/xbgf/tests/appear_s.xbgf b/topics/transformation/xbgf/tests/appear_s.xbgf index 1b28f313..79f2ecd2 100644 --- a/topics/transformation/xbgf/tests/appear_s.xbgf +++ b/topics/transformation/xbgf/tests/appear_s.xbgf @@ -1,28 +1,26 @@ - - - - foo - - - - bar - - - - - - - qux - - - - - - - - - + + + + foo + + + + bar + + + + + + + qux + + + + + + + + +