Skip to content

Commit

Permalink
reading BGF and XBGF completed in a kind of a neat fashion
Browse files Browse the repository at this point in the history
  • Loading branch information
grammarware committed Jun 1, 2012
1 parent 2ed2dbd commit ad31398
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 61 deletions.
2 changes: 1 addition & 1 deletion shared/rascal/src/Main.rsc
@@ -1,4 +1,4 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - CWI}
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module Main

import IO;
Expand Down
61 changes: 61 additions & 0 deletions shared/rascal/src/io/ReadBGF.rsc
@@ -0,0 +1,61 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module io::ReadBGF

import IO;
import syntax::BGF;
import lang::xml::DOM;

public BGFGrammar readBGF(loc f)
{
if (document(element(namespace(_,"http://planet-sl.org/bgf"),"grammar",L)) := parseXMLDOMTrim(readFile(f)))
return grammar([s | element(none(),"root",[charData(s)]) <- L],[mapprod(p) | p <- L, element(namespace(_,"http://planet-sl.org/bgf"),name,kids) := p]);
else
throw "<f> is not an BGF file";
}

public BGFProduction mapprod(Node n)
{
str label = "";
str lhs = "";
BGFExpression rhs;
if (element(namespace(_,"http://planet-sl.org/bgf"),"production",kids) := n)
{
for (k <- kids)
switch (k)
{
case element(none(),"label",[charData(str s)]) : label = s;
case element(none(),"nonterminal",[charData(str s)]) : lhs = s;
case element(namespace(_,"http://planet-sl.org/bgf"),"expression",[expr]): rhs = mapexpr(expr);
}
return production (label, lhs, rhs);
}
else
throw "ERROR in mapprod:\n<n>";
}

public BGFExpression mapexpr(Node n)
{
switch(n)
{
// just in case
case element(namespace(_,"http://planet-sl.org/bgf"),"expression",[e]): return mapexpr(e);
// regular alternatives
case element(none(),"epsilon",[]): return epsilon();
case element(none(),"empty",[]): return empty();
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",[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));
case element(none(),"sequence",kids): return sequence([mapexpr(k) | k <- kids]);
case element(none(),"choice",kids): return choice([mapexpr(k) | k <- kids]);
case element(none(),"marked",[expr]): return marked(mapexpr(expr));
case element(none(),"optional",[expr]): return optional(mapexpr(expr));
case element(none(),"plus",[expr]): return plus(mapexpr(expr));
case element(none(),"star",[expr]): return star(mapexpr(expr));
case element(none(),"starsepplus",[e1,e2]): return starsepplus(mapexpr(e1),mapexpr(e2));
case element(none(),"starsepstar",[e1,e2]): return starsepstar(mapexpr(e1),mapexpr(e2));
default: throw "ERROR in mapexpr:\n<n>";
}
}
71 changes: 13 additions & 58 deletions shared/rascal/src/io/ReadXBGF.rsc
@@ -1,18 +1,19 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - CWI}
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module io::ReadXBGF

import IO;
import syntax::BGF;
import syntax::XBGF;
import lang::xml::DOM;
import io::ReadBGF;

public XBGFSequence readXBGF(loc f)
{
Node N = parseXMLDOMTrim(readFile(f));
XBGFSequence xbgfs = [];
//XBGFCommand x;
if (document(element(namespace(_,"http://planet-sl.org/xbgf"),"sequence",L)) := N)
return [mapxbgf(element(namespace("xbgf","http://planet-sl.org/xbgf"),name,kids)) | element(namespace(_,"http://planet-sl.org/xbgf"),name,kids) <- L];
return [mapxbgf(step) | step <- L, element(namespace(_,"http://planet-sl.org/xbgf"),name,kids) := step];
else
throw "<f> is not an XBGF file";
}

XBGFCommand mapxbgf(Node el)
Expand Down Expand Up @@ -99,65 +100,19 @@ XBGFCommand mapxbgf(Node el)
case element(_,"atomic",L): return atomic([mapxbgf(element(namespace("xbgf","http://planet-sl.org/xbgf"),name,kids)) | element(namespace(_,"http://planet-sl.org/xbgf"),name,kids) <- L]);
case element(_,"strip",[element(none(),str s,[])]): return strip(s);
// default
case element(_,elname,elkids):
{
println("ERROR mapping "+elname);
println(elkids);
return;
}
default:
if(element(_,elname,elkids):=el)
throw "ERROR mapping <elname> with kids:\n<elkids>";
else
throw "Unknown ERROR in mapxbgf";
}
}
else
{
println("ERROR with:");
println(el);
}
throw "ERROR with:\n<el>";
}

BGFContext mapcontext(Node n)
{return globally();}

BGFProduction mapprod(Node n)
{
str label = "";
str lhs = "";
BGFExpression rhs;
if (element(namespace(_,"http://planet-sl.org/bgf"),"production",kids) := n)
{
for (k <- kids)
switch (k)
{
case element(none(),"label",[charData(str s)]) : label = s;
case element(none(),"nonterminal",[charData(str s)]) : lhs = s;
case element(namespace(_,"http://planet-sl.org/bgf"),"expression",[expr]): rhs = mapexpr(expr);
}
return production (label, lhs, rhs);
}
else
{println("ERROR in mapprod");println(n);return;}
}

BGFExpression mapexpr(Node n)
{
switch(n)
{
case element(namespace(_,"http://planet-sl.org/bgf"),"expression",[e]): return mapexpr(e);
case element(none(),"epsilon",[]): return epsilon();
case element(none(),"empty",[]): return empty();
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",[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));
case element(none(),"sequence",kids): return sequence([mapexpr(k) | k <- kids]);
case element(none(),"choice",kids): return choice([mapexpr(k) | k <- kids]);
case element(none(),"marked",[expr]): return marked(mapexpr(expr));
case element(none(),"optional",[expr]): return optional(mapexpr(expr));
case element(none(),"plus",[expr]): return plus(mapexpr(expr));
case element(none(),"star",[expr]): return star(mapexpr(expr));
case element(none(),"starsepplus",[e1,e2]): return starsepplus(mapexpr(e1),mapexpr(e2));
case element(none(),"starsepstar",[e1,e2]): return starsepstar(mapexpr(e1),mapexpr(e2));
default: {println("ERROR in mapexpr");println(n);return;}
}
// TODO: not implemented
return globally();
}
6 changes: 5 additions & 1 deletion shared/rascal/src/syntax/BGF.rsc
@@ -1,6 +1,10 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - CWI}
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module syntax::BGF

data BGFGrammar =
grammar (list[str] roots, list[BGFProduction] prods)
;

data BGFProduction =
production (str label, str lhs, BGFExpression rhs)
;
Expand Down
2 changes: 1 addition & 1 deletion shared/rascal/src/syntax/XBGF.rsc
@@ -1,4 +1,4 @@
@contributor{Vadim Zaytsev - vadim@grammarware.net - CWI}
@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI}
module syntax::XBGF

import syntax::BGF;
Expand Down

0 comments on commit ad31398

Please sign in to comment.