Skip to content

Commit

Permalink
sample execution outputs: negotiated transformations done and submitted!
Browse files Browse the repository at this point in the history
  • Loading branch information
grammarware committed Jan 16, 2013
1 parent 352733a commit d1d0cfb
Show file tree
Hide file tree
Showing 9 changed files with 167 additions and 39 deletions.
73 changes: 37 additions & 36 deletions shared/rascal/src/demo/Negotiated.rsc
Expand Up @@ -2,53 +2,54 @@
module demo::Negotiated

import lib::Rascalware;
import String;
//import IO;
import syntax::BGF;
import syntax::XBGF;
import diff::GDT;
import transform::library::Test;
import transform::NegotiatedXBGF;
import transform::XBGF;
import export::XBNF;
import export::BNF;

BGFGrammar g1 = grammar([],[
production("one","num",val(integer())),
production("two","expression",sequence([nonterminal("num"),terminal("+"),nonterminal("num")])),
production("six","assign",sequence([nonterminal("expression"),terminal("="),nonterminal("expression"),terminal(".")]))
]);
XBGFSequence x = [
renameN("expression","e"),
extract(production("ten","rhs",sequence([nonterminal("e"),terminal(".")])),globally())
];
XBGFSequence e = [
renameN("expression","expr"),
renameN("num","e")
];

public void main()
{
runRenameExample();
runRenameExample1(g1,x);
}

public void runRenameExample()
public void runRenameExample1()
{
str sep = "--------------------";
BGFGrammar g1 = grammar([],[
production("one","num",val(integer())),
production("two","expression",sequence([nonterminal("num"),terminal("+"),nonterminal("num")])),
production("six","assign",sequence([nonterminal("expression"),terminal("="),nonterminal("expression"),terminal(".")]))
]);
XBGFSequence x = [
renameN("expression","e"),
extract(production("ten","rhs",sequence([nonterminal("e"),terminal(".")])),globally())
];
XBGFSequence e = [
renameN("expression","expr"),
renameN("num","e")
];
print("<pad("Original")><pp(g1)>\n<pad("Transformation12")><ppxs(x)>\n<pad("Application")>");
g2 = transformAnyway(x,g1);
print("<pad("Intended esult")><pp(g2)>\n<pad("")>");

print("<pad("TransformationE")><ppxs(e)>\n<pad("Application")>");
g3 = transformAnyway(e,g1);
print("<pad("Evolved original")><pp(g3)>\n<pad("Transformation12")><ppxs(x)>\n<pad("Application")>");
g4 = transformAnyway(x,g3);
print("<pad("Final result")><pp(g4)>\n<pad("")>");
//println("<sep><pp(transformAnyway(x,g1))>\n<sep>");
print("<pad("Original")><pp(g1)><pad("Transformation12")><ppxs(x)>\n<pad("Application")>");
g2 = vtransform(x,g1);
print("<pad("Result")><pp(g2)><pad("")>");
}

str pad("") = center("",50,"-")+"\n";
default str pad(str x) = center(" <x>: ",50,"-")+"\n";
public void runRenameExample2()
{
print("<pad("Original")><pp(g1)><pad("TransformationE")><ppxs(e)>\n<pad("Application")>");
g2 = vtransform(e,g1);
print("<pad("Evolved original")><pp(g2)>");
print("<pad("Transformation12")><ppxs(x)>\n<pad("Attempted application")>");
g3 = vtransform(x,g2);
}

str ppxs(XBGFSequence xs) = mapjoin(ppx,xs,"\n");
str ppx(renameN(x,y)) = "renameN(<x>,<y>);";
str ppx(extract(p,globally())) = "extract(<pp(p)>);";
default str ppx(XBGFCommand s) = "??<s>??";
public void runRenameExample3()
{
print("<pad("Original")><pp(g1)><pad("TransformationE")><ppxs(e)>\n<pad("Application")>");
g2 = vtransform(e,g1);
print("<pad("Evolved original")><pp(g2)>");
print("<pad("Transformation12")><ppxs(x)>\n<pad("Negotiated application")>");
g3 = transformAnyway(x,g2);
print("<pad("Final result")><pp(g3)><pad("")>");
}
4 changes: 2 additions & 2 deletions shared/rascal/src/export/BNF.rsc
Expand Up @@ -4,8 +4,8 @@ module export::BNF
import lib::Rascalware;
import syntax::BGF;

public str pp(grammar([],BGFProdList ps)) = pp(ps);
public default str pp(BGFGrammar bgf) = "Roots: <bgf.roots>\n<pp(bgf.prods)>";
public str pp(grammar([],BGFProdList ps)) = "<pp(ps)>\n";
public default str pp(BGFGrammar bgf) = "Roots: <bgf.roots>\n<pp(bgf.prods)>\n";

public str pp(BGFProdList ps) = mapjoin(pp,ps,"\n");

Expand Down
13 changes: 13 additions & 0 deletions shared/rascal/src/export/XBNF.rsc
@@ -0,0 +1,13 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module export::XBNF

import lib::Rascalware;
import syntax::XBGF;
import syntax::BGF;
import export::BNF;

// TODO this is only a first sketchy setup, need to generate the whole thing!
public str ppxs(XBGFSequence xs) = mapjoin(ppx,xs,"\n");
public str ppx(renameN(a,b)) = "renameN(<a>,<b>);";
public str ppx(extract(p,globally())) = "extract(<pp(p)>);";
public default str ppx(XBGFCommand s) = "??<s>??";
5 changes: 5 additions & 0 deletions shared/rascal/src/lib/Rascalware.rsc
Expand Up @@ -65,6 +65,11 @@ public str replace(str w, map[str,str] m)
return w;
}

// fancy lines in output or debug messages
public str pad("") = center("",50,"-")+"\n";
public default str pad(str x) = center(" <x>: ",50,"-")+"\n";


// classic Levenshtein distance: done for negotiated grammar transformations, but possibly of greater use
public int levenshtein(str x, str y)
{
Expand Down
17 changes: 16 additions & 1 deletion shared/rascal/src/transform/XBGF.rsc
Expand Up @@ -21,6 +21,7 @@ import transform::library::Yacc; // yaccify, deyaccify
import transform::library::Util;
import transform::Results;
import IO;
import export::XBNF;

public XBGFResult transform(abridge(BGFProduction p), BGFGrammar g)
= transform::library::Chaining::runAbridge(p,g);
Expand Down Expand Up @@ -155,10 +156,24 @@ public BGFGrammar transform(XBGFSequence xbgf, BGFGrammar g)
// TODO: later redo with keyword parameters?
public XBGFResult vtransform(XBGFCommand x, BGFGrammar g)
{
println("[XBGF] <x>.");
println("[XBGF] <ppx(x)>");
return transform(x,g);
}

public BGFGrammar vtransform(XBGFSequence xbgf, BGFGrammar g)
{
XBGFResult out = <ok(),normalise(g)>;
for (XBGFCommand step <- xbgf)
{
out = vtransform(step,out.g);
thw(out.r);
out.g = normalise(out.g);
}
return out.g;
}



// legacy code
XBGFResult runStrip(str a, BGFGrammar g)
{
Expand Down
3 changes: 3 additions & 0 deletions topics/transformation/negotiated/README.txt
@@ -0,0 +1,3 @@
success.txt conventional successful grammar transformation
failure.txt conventional failing grammar transformation
negotiated.txt negotiated grammar transformation
31 changes: 31 additions & 0 deletions topics/transformation/negotiated/failure.txt
@@ -0,0 +1,31 @@
rascal>import demo::Negotiated;
ok

rascal>runRenameExample2()
------------------- Original: --------------------
[one] num ::= INT ;
[two] expression ::= num "+" num ;
[six] assign ::= expression "=" expression "." ;
---------------- TransformationE: ----------------
renameN(expression,expr);
renameN(num,e);
------------------ Application: ------------------
[XBGF] renameN(expression,expr);
[XBGF] renameN(num,e);
--------------- Evolved original: ----------------
[one] e ::= INT ;
[two] expr ::= e "+" e ;
[six] assign ::= expr "=" expr "." ;
--------------- Transformation12: ----------------
renameN(expression,e);
extract([ten] rhs ::= e "." ;);
------------- Attempted application: -------------
[XBGF] renameN(expression,e);
|project://slps/src/transform/Results.rsc|(928,1,<28,58>,<28,59>): "Nonterminal must not be fresh: expression"
somewhere in: thw
somewhere in: vtransform
somewhere in: runRenameExample2
somewhere in: $shell$


rascal>
37 changes: 37 additions & 0 deletions topics/transformation/negotiated/negotiated.txt
@@ -0,0 +1,37 @@
rascal>import demo::Negotiated;
ok

rascal>runRenameExample3()
------------------- Original: --------------------
[one] num ::= INT ;
[two] expression ::= num "+" num ;
[six] assign ::= expression "=" expression "." ;
---------------- TransformationE: ----------------
renameN(expression,expr);
renameN(num,e);
------------------ Application: ------------------
[XBGF] renameN(expression,expr);
[XBGF] renameN(num,e);
--------------- Evolved original: ----------------
[one] e ::= INT ;
[two] expr ::= e "+" e ;
[six] assign ::= expr "=" expr "." ;
--------------- Transformation12: ----------------
renameN(expression,e);
extract([ten] rhs ::= e "." ;);
------------ Negotiated application: -------------
[XBGF] renameN(expression,e);
Nonterminal must not be fresh: expression!
[XBGF] renameN(expr,e);
Nonterminal must be fresh: e!
[XBGF] renameN(expr,e1);
[XBGF] extract([ten] rhs ::= e1 "." ;);
----------------- Final result: ------------------
[one] e ::= INT ;
[two] e1 ::= e "+" e ;
[six] assign ::= e1 "=" rhs ;
[ten] rhs ::= e1 "." ;
--------------------------------------------------
ok

rascal>
23 changes: 23 additions & 0 deletions topics/transformation/negotiated/success.txt
@@ -0,0 +1,23 @@
rascal>import demo::Negotiated;
ok

rascal>runRenameExample1()
------------------- Original: --------------------
[one] num ::= INT ;
[two] expression ::= num "+" num ;
[six] assign ::= expression "=" expression "." ;
--------------- Transformation12: ----------------
renameN(expression,e);
extract([ten] rhs ::= e "." ;);
------------------ Application: ------------------
[XBGF] renameN(expression,e);
[XBGF] extract([ten] rhs ::= e "." ;);
-------------------- Result: ---------------------
[one] num ::= INT ;
[two] e ::= num "+" num ;
[six] assign ::= e "=" rhs ;
[ten] rhs ::= e "." ;
--------------------------------------------------
ok

rascal>

0 comments on commit d1d0cfb

Please sign in to comment.