Skip to content

Commit

Permalink
Guided convergence in Rascal: first steps
Browse files Browse the repository at this point in the history
  • Loading branch information
grammarware committed Jun 17, 2012
1 parent 062817c commit 0f5ef68
Show file tree
Hide file tree
Showing 18 changed files with 1,441 additions and 0 deletions.
20 changes: 20 additions & 0 deletions shared/rascal/src/analyse/Metrics.rsc
@@ -0,0 +1,20 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module analyse::Metrics

import syntax::BGF;

public set[str] allNs(list[BGFProduction] ps) = definedNs(ps) + usedNs(ps);
public set[str] allNs(BGFGrammar g) = allNs(g.prods);

public set[str] topNs(list[BGFProduction] ps) = definedNs(ps) - usedNs(ps);
public set[str] topNs(BGFGrammar g) = topNs(g.prods);

public set[str] allTs(list[BGFProduction] ps) = {s | /terminal(str s) := ps};
public set[str] allTs(BGFGrammar g) = allTs(g.prods);
public set[str] usedNs(list[BGFProduction] ps) = {s | /nonterminal(str s) := ps};
public set[str] usedNs(BGFGrammar g) = usedNs(g.prods);

public set[str] definedNs(list[BGFProduction] ps) = {s | production(_,str s,_) <- ps};
public set[str] definedNs(BGFGrammar g) = definedNs(g.prods);

33 changes: 33 additions & 0 deletions shared/rascal/src/converge/Guided.rsc
@@ -0,0 +1,33 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module converge::Guided

import IO;
import Set;
import Map;
import List;
import io::ReadBGF;
import syntax::BGF;
import analyse::Metrics;

list[str] sources =
["antlr","dcg","ecore","emf","jaxb","om","python","rascal-a","rascal-c","sdf","txl","xsd"];

public void main()
{
map[str,BGFGrammar] bgfs = ();
println("Reading the grammars...");
for (src <- sources)
bgfs[src] = readBGF(|home:///projects/slps/topics/convergence/guided/bgf/<src>.bgf|);
println("Parsing the grammarbase with <size(bgfs)> grammars is done.");
println("Starting with the root.");
for (src <- sources)
{
println(" * Roots in <src>: <bgfs[src].roots>");
if (isEmpty(bgfs[src].roots))
{
bgfs[src].roots = toList(topNs(bgfs[src]));
println(" * Roots in <src> changed to tops: <bgfs[src].roots>");
}
}
println("Done.");
}
3 changes: 3 additions & 0 deletions shared/rascal/src/extract/RascalSyntax2BGF.rsc
Expand Up @@ -24,6 +24,8 @@ public void main()
{
Module pt = parse(#Module,|project://fl/src/Concrete.rsc|);
Grammar g = modules2grammar("Concrete", {pt});
//Grammar g = module2grammar("Concrete", {pt});
iprintln(g);
iprintln(grammar2grammar(g));
}

Expand Down Expand Up @@ -58,6 +60,7 @@ BGFExpression rhs2expr(list[Symbol] seq) = syntax::BGF::sequence([symbol2expr(s)
BGFExpression symbol2expr(\sort(str x)) = syntax::BGF::nonterminal(x);
BGFExpression symbol2expr(conditional(\sort(str x),{except(_)})) = syntax::BGF::nonterminal(x); // cannot represent better in BGF
BGFExpression symbol2expr(\lex(str x)) = syntax::BGF::nonterminal(x);
BGFExpression symbol2expr(ParseTree::\lit("\n")) = syntax::BGF::terminal("\\n"); //hack?
BGFExpression symbol2expr(ParseTree::\lit(str x)) = syntax::BGF::terminal(x);
BGFExpression symbol2expr(\iter-seps(Symbol item, list[Symbol] seps)) = iterseps2expr(item,[s | s <- seps, layouts(_) !:= s]);
default BGFExpression symbol2expr(Symbol s) = epsilon();
Expand Down
1 change: 1 addition & 0 deletions shared/rascal/src/io/ReadBGF.rsc
Expand Up @@ -45,6 +45,7 @@ public BGFExpression mapexpr(Node n)
case element(none(),"value",[charData("string")]): return val(string());
case element(none(),"value",[charData("int")]): return val(integer());
case element(none(),"any",[]): return anything();
case element(none(),"terminal",[]): return terminal(" ");// lang::xml::DOM does not preserve whitespace, so this can mean something like a newline
case element(none(),"terminal",[charData(str s)]): return terminal(s);
case element(none(),"nonterminal",[charData(str s)]): return nonterminal(s);
case element(none(),"selectable",[element(none(),"selector",[charData(str s)]),expr]): return selectable(s,mapexpr(expr));
Expand Down
1 change: 1 addition & 0 deletions shared/rascal/src/transform/library/Util.rsc
Expand Up @@ -97,6 +97,7 @@ public tuple[list[BGFProduction],list[BGFProduction],list[BGFProduction]] splitP
return <ps1,ps2,ps3>;
}
// TODO moved to analyse::Metrics
public set[str] allNs(list[BGFProduction] ps) = definedNs(ps) + usedNs(ps);
public set[str] allTs(list[BGFProduction] ps) = {s | /terminal(str s) := ps};
public set[str] usedNs(list[BGFProduction] ps) = {s | /nonterminal(str s) := ps};
Expand Down
20 changes: 20 additions & 0 deletions topics/convergence/guided/bgf/Makefile
@@ -0,0 +1,20 @@
build:
../../../../shared/tools/antlr2bgf ../../../fl/java1/FL.g antlr.bgf
../../../../shared/tools/dcg2bgf ../../../fl/prolog1/Parser.pro dcg.bgf
../../../../shared/tools/sdf2bgf ../../../fl/asfsdf/Syntax.sdf sdf.bgf
../../../../shared/tools/xsd2bgf ../../../fl/xsd/fl.xsd xsd.bgf
../../../../shared/tools/java2bgf ../../../fl/java1 types om.bgf
../../../../shared/tools/java2bgf ../../../fl/java3 fl jaxb.bgf
../../../../shared/tools/ecore2bgf ../../../fl/emf1/fl.ecore ecore.bgf
../../../../shared/tools/ecore2bgf ../../../fl/emf2/model/fl.ecore emf.bgf
../../../../shared/tools/py2bgf ../../../fl/python/parser2.py python.bgf
../../../../shared/tools/rscs2bgf ../../../fl/rascal/src/Concrete.rsc rascal-c.bgf
../../../../shared/tools/rscd2bgf ../../../fl/rascal/src/Abstract.rsc rascal-a.bgf
../../../../shared/tools/txl2bgf ../../../fl/txl/FL.Txl txl.bgf

test:
ls -1 *.bgf | xargs -n1 ../../../../shared/tools/validate bgf

clean:
rm -rf *.bgf

247 changes: 247 additions & 0 deletions topics/convergence/guided/bgf/antlr.bgf
@@ -0,0 +1,247 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<nonterminal>program</nonterminal>
<bgf:expression>
<plus>
<bgf:expression>
<selectable>
<selector>f</selector>
<bgf:expression>
<nonterminal>function</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
</plus>
</bgf:expression>
</bgf:production>
<bgf:production>
<nonterminal>function</nonterminal>
<bgf:expression>
<sequence>
<bgf:expression>
<selectable>
<selector>n</selector>
<bgf:expression>
<nonterminal>ID</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<plus>
<bgf:expression>
<selectable>
<selector>a</selector>
<bgf:expression>
<nonterminal>ID</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
</plus>
</bgf:expression>
<bgf:expression>
<terminal>=</terminal>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>e</selector>
<bgf:expression>
<nonterminal>expr</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<plus>
<bgf:expression>
<nonterminal>NEWLINE</nonterminal>
</bgf:expression>
</plus>
</bgf:expression>
</sequence>
</bgf:expression>
</bgf:production>
<bgf:production>
<nonterminal>expr</nonterminal>
<bgf:expression>
<choice>
<bgf:expression>
<selectable>
<selector>b</selector>
<bgf:expression>
<nonterminal>binary</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>a</selector>
<bgf:expression>
<nonterminal>apply</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>i</selector>
<bgf:expression>
<nonterminal>ifThenElse</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
</choice>
</bgf:expression>
</bgf:production>
<bgf:production>
<nonterminal>binary</nonterminal>
<bgf:expression>
<sequence>
<bgf:expression>
<selectable>
<selector>l</selector>
<bgf:expression>
<nonterminal>atom</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<star>
<bgf:expression>
<sequence>
<bgf:expression>
<selectable>
<selector>o</selector>
<bgf:expression>
<nonterminal>ops</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>r</selector>
<bgf:expression>
<nonterminal>atom</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
</sequence>
</bgf:expression>
</star>
</bgf:expression>
</sequence>
</bgf:expression>
</bgf:production>
<bgf:production>
<nonterminal>apply</nonterminal>
<bgf:expression>
<sequence>
<bgf:expression>
<selectable>
<selector>i</selector>
<bgf:expression>
<nonterminal>ID</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<plus>
<bgf:expression>
<selectable>
<selector>a</selector>
<bgf:expression>
<nonterminal>atom</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
</plus>
</bgf:expression>
</sequence>
</bgf:expression>
</bgf:production>
<bgf:production>
<nonterminal>ifThenElse</nonterminal>
<bgf:expression>
<sequence>
<bgf:expression>
<terminal>if</terminal>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>c</selector>
<bgf:expression>
<nonterminal>expr</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<terminal>then</terminal>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>e1</selector>
<bgf:expression>
<nonterminal>expr</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<terminal>else</terminal>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>e2</selector>
<bgf:expression>
<nonterminal>expr</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
</sequence>
</bgf:expression>
</bgf:production>
<bgf:production>
<nonterminal>atom</nonterminal>
<bgf:expression>
<choice>
<bgf:expression>
<nonterminal>ID</nonterminal>
</bgf:expression>
<bgf:expression>
<nonterminal>INT</nonterminal>
</bgf:expression>
<bgf:expression>
<sequence>
<bgf:expression>
<terminal>(</terminal>
</bgf:expression>
<bgf:expression>
<selectable>
<selector>e</selector>
<bgf:expression>
<nonterminal>expr</nonterminal>
</bgf:expression>
</selectable>
</bgf:expression>
<bgf:expression>
<terminal>)</terminal>
</bgf:expression>
</sequence>
</bgf:expression>
</choice>
</bgf:expression>
</bgf:production>
<bgf:production>
<nonterminal>ops</nonterminal>
<bgf:expression>
<choice>
<bgf:expression>
<terminal>==</terminal>
</bgf:expression>
<bgf:expression>
<terminal>+</terminal>
</bgf:expression>
<bgf:expression>
<terminal>-</terminal>
</bgf:expression>
</choice>
</bgf:expression>
</bgf:production>
</bgf:grammar>

0 comments on commit 0f5ef68

Please sign in to comment.