Skip to content

Commit

Permalink
implement addC for adding conjunctive clauses
Browse files Browse the repository at this point in the history
  • Loading branch information
grammarware committed Jan 21, 2013
1 parent e897435 commit 056468a
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 43 deletions.
91 changes: 54 additions & 37 deletions shared/rascal/src/demo/IslandBoolean.rsc
Expand Up @@ -5,22 +5,38 @@ import lib::Rascalware;
import syntax::BGF;
import syntax::XBGF;
import transform::XBGF;
//import diff::GDT;
import diff::GDT;
import io::ReadBGF;
import io::WriteBGF;
import export::BNF;
import export::XPNF;
import mutate::Mutations;
import IO;

public void ppAll()
{
println(export::XPNF::ppxs(afterMutations+m2+m3));
}

public void go()
{
g0 = readBGF(|home:///projects/slps/topics/grammars/csharp/ecma-334-1/grammar.bgf|);
g1 = readBGF(|home:///mutatedF1.bgf|);
g2 = vtransform(skeletonise,g1);
println(pp(subgrammar(g2,"compilation-unit")));
}

public void gold()
{
//g0 = readBGF(|home:///projects/slps/topics/grammars/csharp/ecma-334-1/grammar.bgf|);
g0 = readBGF(|home:///projects/slps/topics/grammars/csharp/ecma-334-1/good.bgf|);
println(gdtv(grammar(["compilation-unit"],g0.prods),subgrammar(g0,"compilation-unit")));
g1 = mutate([
deyaccifyAll,
unchainAll,
inlinePlus
//,inlineLazy
],subgrammar(g0,"compilation-unit"));
//],subgrammar(g0,"compilation-unit"));
],g0);
//writeBGF(g1,|home:///mutated2.bgf|);
g2 = vtransform(afterMutations,g1);
//println(pp(transform([afterMutations[0],afterMutations[1],afterMutations[2],afterMutations[3],afterMutations[4]],g1)));
Expand All @@ -33,11 +49,12 @@ public void go()
//println(pp(g4));
//for (p:production(_,"attribute-section",_) <- g4.prods) iprintln(p);
//println(pp(g3));
writeBGF(g4,|home:///mutatedF.bgf|);
writeBGF(g4,|home:///mutatedF2.bgf|);
//iprintln(afterMutations);
}

XBGFSequence m3 = [
splitT(",]",[",","]"],innt("attribute-section")),
factor(
choice([
sequence([
Expand Down Expand Up @@ -87,7 +104,6 @@ XBGFSequence m3 = [
),
inline("namespace-declaration"),
inline("type-declaration"),
horizontal(innt("attribute-section-insides")),
bypass()
];

Expand Down Expand Up @@ -291,6 +307,7 @@ XBGFSequence afterMutations = [
globally()),
inline("using-directive"),
// adapt global attribute
splitT(",]",[",","]"],innt("global-attribute-section")),
factor(
choice([
sequence([
Expand Down Expand Up @@ -340,37 +357,38 @@ XBGFSequence afterMutations = [

XBGFSequence skeletonise = [
// addC([] using-directive-insides ::= not-semicolon ;)
addC([production("","using-directive-insides",nonterminal("not-semicolon"))]),
// addC([] global-attribute-section-insides ::= not-right-square-bracket ;)
addC([production("","global-attribute-section-insides",nonterminal("not-right-square-bracket"))]),
// addC([] attribute-section-insides ::= not-right-square-bracket ;)
addC([production("","attribute-section-insides",nonterminal("not-right-square-bracket"))]),
// addC([] struct-interfaces ::= not-left-curly ;)
addC([production("","struct-interfaces",nonterminal("not-left-curly"))]),
// addC([] class-base ::= not-left-curly ;)
addC([production("","class-base",nonterminal("not-left-curly"))]),
// addC([] interface-base ::= not-left-curly ;)
addC([production("","interface-base",nonterminal("not-left-curly"))]),
// addC([] enum-base ::= not-left-curly ;)
addC([production("","enum-base",nonterminal("not-left-curly"))]),
// addC([] enum-body-insides ::= balanced-curlies ;)
addC([production("","enum-body-insides",nonterminal("balanced-curlies"))]),
// addC([] namespace-body-insides ::= balanced-curlies ;)
addC([production("","namespace-body-insides",nonterminal("balanced-curlies"))]),
// addC([] class-member-declarations ::= balanced-curlies ;)
addC([production("","class-member-declarations",nonterminal("balanced-curlies"))]),
// addC([] struct-member-declarations ::= balanced-curlies ;)
addC([production("","struct-member-declarations",nonterminal("balanced-curlies"))]),
// addC([] interface-member-declarations ::= balanced-curlies ;)
addC([production("","interface-member-declarations",nonterminal("balanced-curlies"))]),
// addC([] formal-parameter-list ::= not-right-parenthesis ;)
addC([production("","formal-parameter-list",nonterminal("not-right-parenthesis"))]),
// addC([] qualified-identifier ::= not-whitespace ;)
addC([production("","qualified-identifier",nonterminal("not-whitespace"))]),
// define([] identifier ::= not-whitespace ;)
define([production("","identifier",nonterminal("not-whitespace"))]),
// addC([] type ::= not-whitespace ;)
addC([production("","type",nonterminal("not-whitespace"))])
addC(production("lex-UD","using-directive-insides",nonterminal("not-semicolon"))),
// addC( global-attribute-section-insides ::= not-right-square-bracket ;)
addC(production("lex-GAS","global-attribute-section-insides",nonterminal("not-right-square-bracket"))),
// addC( attribute-section-insides ::= not-right-square-bracket ;)
addC(production("lex-AS","attribute-section-insides",nonterminal("not-right-square-bracket"))),
// addC( struct-interfaces ::= not-left-curly ;)
addC(production("lex-SI","struct-interfaces",nonterminal("not-left-curly"))),
// addC( class-base ::= not-left-curly ;)
addC(production("lex-CB","class-base",nonterminal("not-left-curly"))),
// addC( interface-base ::= not-left-curly ;)
addC(production("lex-IB","interface-base",nonterminal("not-left-curly"))),
// addC( enum-base ::= not-left-curly ;)
addC(production("lex-EB","enum-base",nonterminal("not-left-curly"))),
// addC( enum-body-insides ::= balanced-curlies ;)
//addC(production("","enum-body-insides",nonterminal("balanced-curlies"))),
// addC( namespace-body-insides ::= balanced-curlies ;)
//addC(production("","namespace-body-insides",nonterminal("balanced-curlies"))),
// addC( class-member-declarations ::= balanced-curlies ;)
//addC(production("","class-member-declarations",nonterminal("balanced-curlies"))),
// addC( struct-member-declarations ::= balanced-curlies ;)
//addC(production("","struct-member-declarations",nonterminal("balanced-curlies"))),
// addC( interface-member-declarations ::= balanced-curlies ;)
//addC(production("","interface-member-declarations",nonterminal("balanced-curlies"))),
// addC( formal-parameter-list ::= not-right-parenthesis ;)
addC(production("lex-FPL","formal-parameter-list",nonterminal("not-right-parenthesis"))),
// addC( qualified-identifier ::= not-whitespace ;)
addC(production("lex-QI","qualified-identifier",nonterminal("not-whitespace"))),
// define( identifier ::= not-whitespace ;)
define([production("lex-I","identifier",nonterminal("not-whitespace"))]),
// addC( type ::= not-whitespace ;)
//addC(production("","type",nonterminal("not-whitespace")))
bypass()
];

BGFGrammar doTrafo(BGFGrammar g)
Expand All @@ -389,4 +407,3 @@ public void run()
println(pp(g2));
writeBGF(g2,|home:///unmutated.bgf|);
}

1 change: 1 addition & 0 deletions shared/rascal/src/export/XBNF.rsc
Expand Up @@ -11,6 +11,7 @@ public str ppxs(XBGFSequence xs) = mapjoin(ppx,xs,"\n");

public str ppx(XBGFCommand::abridge(BGFProduction p)) = "abridge(<pp(p)>)";
public str ppx(XBGFCommand::abstractize(BGFProduction p)) = "abstractize(<pp(p)>)";
public str ppx(XBGFCommand::addC(BGFProduction p)) = "addC(<pp(p)>)";
public str ppx(XBGFCommand::addH(BGFProduction p)) = "addH(<pp(p)>)";
public str ppx(XBGFCommand::addV(BGFProduction p)) = "addV(<pp(p)>)";
public str ppx(XBGFCommand::anonymize(BGFProduction p)) = "anonymize(<pp(p)>)";
Expand Down
1 change: 1 addition & 0 deletions shared/rascal/src/export/XPNF.rsc
Expand Up @@ -11,6 +11,7 @@ public str ppxs(XBGFSequence xs) = "\\begin{align*}\n&<mapjoin(ppx,xs,"; \\\\\n&

public str ppx(XBGFCommand::abridge(BGFProduction p)) = "\\mathbf{abridge}(<ppnf(p)>)";
public str ppx(XBGFCommand::abstractize(BGFProduction p)) = "\\mathbf{abstractize}(<ppnf(p)>)";
public str ppx(XBGFCommand::addC(BGFProduction p)) = "\\mathbf{addC}(<ppnf(p)>)";
public str ppx(XBGFCommand::addH(BGFProduction p)) = "\\mathbf{addH}(<ppnf(p)>)";
public str ppx(XBGFCommand::addV(BGFProduction p)) = "\\mathbf{addV}(<ppnf(p)>)";
public str ppx(XBGFCommand::anonymize(BGFProduction p)) = "\\mathbf{anonymize}(<ppnf(p)>)";
Expand Down
1 change: 1 addition & 0 deletions shared/rascal/src/normal/BGF.rsc
Expand Up @@ -36,6 +36,7 @@ public BGFExpression normalise(BGFExpression e)
case choice([BGFExpression e2]) => e2
case optional(epsilon()) => epsilon()
case optional(empty()) => epsilon() // not present in Prolog
case selectable("",e4) => e4 // not present in Prolog
case plus(epsilon()) => epsilon()
case star(epsilon()) => epsilon()
case sepliststar(X1,epsilon()) => star(X1)
Expand Down
1 change: 1 addition & 0 deletions shared/rascal/src/syntax/XBGF.rsc
Expand Up @@ -11,6 +11,7 @@ data XBGFCommand =
| abstractize(BGFProduction p) // marked
| addH(BGFProduction p) // marked
| addV(BGFProduction p)
| addC(BGFProduction p) // conjunctive extension
| anonymize(BGFProduction p)
| appear(BGFProduction p) // marked
| bypass()
Expand Down
13 changes: 8 additions & 5 deletions shared/rascal/src/transform/XBGF.rsc
Expand Up @@ -10,7 +10,8 @@ import transform::library::Brutal; // replace
import transform::library::Chaining; // abridge, detour, chain, unchain
import transform::library::Factoring; // factor, distribute
import transform::library::Folding; // fold, unfold, extract, inline, downgrade, upgrade
import transform::library::Intermittent; // addH, removeH, vertical, horizontal
import transform::library::Conjunction; // addC
import transform::library::Disjunction; // addH, removeH, vertical, horizontal
import transform::library::Labels; // renameL, unlabel, designate; renameS, anonymize, deanonimize
import transform::library::Massage; // massage
import transform::library::Nonterminals; // renameN, equate, splitN, clone, reroot, unite
Expand All @@ -28,8 +29,10 @@ public XBGFResult transform(abridge(BGFProduction p), BGFGrammar g)
= transform::library::Chaining::runAbridge(p,g);
public XBGFResult transform(abstractize(BGFProduction p), BGFGrammar g)
= transform::library::Terminals::runAbstractize(p,g);
public XBGFResult transform(addC(BGFProduction p), BGFGrammar g)
= transform::library::Conjunction::runAddC(p,g);
public XBGFResult transform(addH(BGFProduction p), BGFGrammar g)
= transform::library::Intermittent::runAddH(p,g);
= transform::library::Disjunction::runAddH(p,g);
public XBGFResult transform(addV(BGFProduction p), BGFGrammar g)
= transform::library::Productions::runAddV(p,g);
public XBGFResult transform(anonymize(BGFProduction p), BGFGrammar g)
Expand Down Expand Up @@ -73,7 +76,7 @@ public XBGFResult transform(factor(BGFExpression e1, BGFExpression e2, XBGFScope
public XBGFResult transform(fold(str x, XBGFScope w), BGFGrammar g)
= transform::library::Folding::runFold(x,w,g);
public XBGFResult transform(horizontal(XBGFScope w), BGFGrammar g)
= transform::library::Intermittent::runHorizontal(w,g);
= transform::library::Disjunction::runHorizontal(w,g);
public XBGFResult transform(importG(list[BGFProduction] ps), BGFGrammar g)
= transform::library::Productions::runImportG(ps,g);
public XBGFResult transform(inject(BGFProduction p), BGFGrammar g)
Expand All @@ -99,7 +102,7 @@ public XBGFResult transform(rassoc(BGFProduction p), BGFGrammar g)
public XBGFResult transform(redefine(list[BGFProduction] ps), BGFGrammar g)
= transform::library::Productions::runRedefine(ps,g);
public XBGFResult transform(removeH(BGFProduction p), BGFGrammar g)
= transform::library::Intermittent::runRemoveH(p,g);
= transform::library::Disjunction::runRemoveH(p,g);
public XBGFResult transform(removeV(BGFProduction p), BGFGrammar g)
= transform::library::Productions::runRemoveV(p,g);
public XBGFResult transform(renameL(str x, str y), BGFGrammar g)
Expand Down Expand Up @@ -131,7 +134,7 @@ public XBGFResult transform(unlabel(str x), BGFGrammar g)
public XBGFResult transform(upgrade(BGFProduction p1, BGFProduction p2), BGFGrammar g)
= transform::library::Folding::runUpgrade(p1,p2,g);
public XBGFResult transform(vertical(XBGFScope w), BGFGrammar g)
= transform::library::Intermittent::runVertical(w,g);
= transform::library::Disjunction::runVertical(w,g);
public XBGFResult transform(widen(BGFExpression e1, BGFExpression e2, XBGFScope w), BGFGrammar g)
= transform::library::Width::runWiden(e1,e2,w,g);
public XBGFResult transform(yaccify(list[BGFProduction] ps), BGFGrammar g)
Expand Down
23 changes: 23 additions & 0 deletions shared/rascal/src/transform/library/Conjunction.rsc
@@ -0,0 +1,23 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
@wiki{addC}
module transform::library::Conjunction

import syntax::BGF;
import syntax::XBGF;
import transform::Results;
import transform::library::Util;

XBGFResult runAddC(BGFProduction p, BGFGrammar g)
{
<ps1,ps2,ps3> = splitPbyW(g.prods,innt(p.lhs));
if ([BGFProduction q] := ps2)
{
if (p.lhs != q.lhs)
return <problemStr("Incorrect splitting by nonterminal scope",p.lhs),g>;
// Checking the label for emptyness is unnecessary, normalisations will follow anyway
pq = production("",p.lhs,allof([selectable(p.label,p.rhs),selectable(q.label,q.rhs)]));
return <ok(),grammar(g.roots, ps1 + [pq] + ps3)>;
}
else
return <problemStr("Nonterminal must be defined horizontally",p.lhs),g>;
}
@@ -1,6 +1,6 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
@wiki{addH,horizontal,removeH,vertical}
module transform::library::Intermittent
module transform::library::Disjunction

//import lib::Rascalware;
import syntax::BGF;
Expand Down

0 comments on commit 056468a

Please sign in to comment.