Skip to content

Commit

Permalink
added xbgf:split, a reverse of xbgf:unite
Browse files Browse the repository at this point in the history
git-svn-id: https://slps.svn.sourceforge.net/svnroot/slps@1195 ab42f6e0-554d-0410-b580-99e487e6eeb2
  • Loading branch information
grammarware committed May 9, 2012
1 parent e028ea3 commit 86d77d7
Show file tree
Hide file tree
Showing 21 changed files with 388 additions and 74 deletions.
10 changes: 10 additions & 0 deletions shared/prolog/readXbgf.pro
Expand Up @@ -318,6 +318,16 @@ xml2xbgf(T,detour(P2))
child(name(bgf:production),T,P1),
xmlToP(P1,P2).

xml2xbgf(T,split(N,Ps2,Ls2))
:-
self(name(xbgf:split),T),
child(name(nonterminal),T,Nonterminal),
children(name(bgf:production),T,Ps1),
children(name(label),T,Ls1),
content(Nonterminal,N),
maplist(xmlToP,Ps1,Ps2),
maplist(content,Ls1,Ls2).

xml2xbgf(T,stripL(L))
:-
self(name(xbgf:strip),T),
Expand Down
45 changes: 45 additions & 0 deletions shared/prolog/xbgf1.pro
Expand Up @@ -1294,6 +1294,51 @@ detour(P1,g(Rs,Ps1),g(Rs,Ps2))
[N]),
append(Ps1,[P1],Ps2).

%
% p([l(split)], f, ','([n(n), n(n)]))
%
% Nonterminal splitting, a form of "de-unification"
%
% TODO: works only on labels, should eventually be implemented for all kinds of scopes/contexts
%
split(N1,Ps0,Ls1,g(Rs,Ps1),g(Rs,Ps2))
:-
allNs(g(Rs,Ps1),Ns1),
definedNs(g([],Ps0),[N0]),
require(
(member(N1,Ns1)),
'Source name ~q for splitting must not be fresh.',
[N1]),
require(
(\+ member(N0,Ns1)),
'Target name ~q for splitting must be fresh.',
[N0]),
changelhs(N0,N1,Ps0,Ps0p),
removeprods(Ps0p,g(Rs,Ps1),g(Rs,Ps3)),
import(Ps0,g(Rs,Ps3),g(Rs,Ps4)),
replaceLs(n(N1),n(N0),Ls1,g(Rs,Ps4),g(Rs,Ps2)).

changelhs(_,_,[],[]).
changelhs(N1,N2,[P1|Ps1],[P2|Ps2])
:-
P1 = p(L,N3,X),
(
N1 == N3,
P2 = p(L,N2,X)
;
P2 = p(L,N3,X)
),
changelhs(N1,N2,Ps1,Ps2).

removeprods([],G1,G1).
removeprods([P0|Ps0],g(Rs,Ps1),g(Rs,Ps3)) :- removeV(P0,g(Rs,Ps1),g(Rs,Ps2)), removeprods(Ps0,g(Rs,Ps2),g(Rs,Ps3)).

replaceLs(_,_,[],G1,G1).
replaceLs(X1,X2,[L1|Ls],g(Rs,Ps1),g(Rs,Ps3))
:-
replaceL(X1,X2,L1,g(Rs,Ps1),g(Rs,Ps2)),
replaceLs(X1,X2,Ls,g(Rs,Ps2),g(Rs,Ps3)).

%
% p([l(stripL)], f, n(l))
% p([l(stripLs)], f, true)
Expand Down
16 changes: 16 additions & 0 deletions shared/xsd/xbgf.xsd
Expand Up @@ -167,6 +167,7 @@
<xsd:element ref="xbgf:disappear"/>
<xsd:element ref="xbgf:narrow"/>
<xsd:element ref="xbgf:downgrade"/>
<xsd:element ref="xbgf:split"/>
</xsd:choice>
</xsd:group>
<xsd:group name="concrete-revising-transformation">
Expand Down Expand Up @@ -1162,6 +1163,21 @@
</xsd:complexType>
</xsd:element>

<xsd:element name="split">
<xsd:annotation>
<xsd:documentation>
The reverse of <ldf:keyword>unite</ldf:keyword>.
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nonterminal" type="bgf:nonterminal"/>
<xsd:element ref="bgf:production" maxOccurs="unbounded"/>
<xsd:group ref="xbgf:scope" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="equate">
<xsd:annotation>
<xsd:documentation>
Expand Down
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split1.baseline
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>b</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<terminal>d</terminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split1.bgf
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>b</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>d</terminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
13 changes: 13 additions & 0 deletions topics/transformation/xbgf/tests/split1.xbgf
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<xbgf:sequence xmlns:bgf="http://planet-sl.org/bgf" xmlns:xbgf="http://planet-sl.org/xbgf">
<xbgf:split>
<nonterminal>foo</nonterminal>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<terminal>d</terminal>
</bgf:expression>
</bgf:production>
</xbgf:split>
</xbgf:sequence>
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split2.baseline
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>b</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split2.bgf
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>b</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
13 changes: 13 additions & 0 deletions topics/transformation/xbgf/tests/split2.xbgf
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<xbgf:sequence xmlns:bgf="http://planet-sl.org/bgf" xmlns:xbgf="http://planet-sl.org/xbgf">
<xbgf:split>
<nonterminal>foo</nonterminal>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
</xbgf:split>
</xbgf:sequence>
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split3.baseline
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>wez</nonterminal>
<bgf:expression>
<nonterminal>bar</nonterminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split3.bgf
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>wez</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
14 changes: 14 additions & 0 deletions topics/transformation/xbgf/tests/split3.xbgf
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<xbgf:sequence xmlns:bgf="http://planet-sl.org/bgf" xmlns:xbgf="http://planet-sl.org/xbgf">
<xbgf:split>
<nonterminal>foo</nonterminal>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
<label>B</label>
</xbgf:split>
</xbgf:sequence>
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split4.baseline
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<nonterminal>bar</nonterminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
24 changes: 24 additions & 0 deletions topics/transformation/xbgf/tests/split4.bgf
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<label>A</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<terminal>a</terminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>B</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
<bgf:production>
<label>D</label>
<nonterminal>foo</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
</bgf:grammar>
14 changes: 14 additions & 0 deletions topics/transformation/xbgf/tests/split4.xbgf
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<xbgf:sequence xmlns:bgf="http://planet-sl.org/bgf" xmlns:xbgf="http://planet-sl.org/xbgf">
<xbgf:split>
<nonterminal>foo</nonterminal>
<bgf:production>
<label>D</label>
<nonterminal>bar</nonterminal>
<bgf:expression>
<nonterminal>foo</nonterminal>
</bgf:expression>
</bgf:production>
<label>B</label>
</xbgf:split>
</xbgf:sequence>
17 changes: 8 additions & 9 deletions topics/transformation/xbgf/tests/unite_eq.baseline
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>

<xns1:grammar xmlns:xns1="http://planet-sl.org/bgf">
<xns1:production>
<nonterminal>a</nonterminal>
<xns1:expression>
<epsilon/>
</xns1:expression>
</xns1:production>
</xns1:grammar>
<bgf:grammar xmlns:bgf="http://planet-sl.org/bgf">
<bgf:production>
<nonterminal>a</nonterminal>
<bgf:expression>
<epsilon/>
</bgf:expression>
</bgf:production>
</bgf:grammar>

0 comments on commit 86d77d7

Please sign in to comment.