diff --git a/shared/prolog/bgf.pro b/shared/prolog/bgf.pro
index a4e4cabf..c32eb58e 100644
--- a/shared/prolog/bgf.pro
+++ b/shared/prolog/bgf.pro
@@ -15,7 +15,7 @@ rootNs(g(Rs1,_),Rs2)
!.
-% Return all nontmerinals defined by a grammar
+% Return all nonterminals defined by a grammar
definedNs(g(_,Ps),Ns)
:-
@@ -512,7 +512,8 @@ eqXs(';',[[X1|Xs1]],[Xs2])
!,
append(Xs2a,Xs2b,Xs3),
eqXs(';',[Xs1],[Xs3]).
-
+eqXs(sls,[X1,X2],[X3,X4]) :- eqX(X1,X3), eqX(X2,X4).
+eqXs(slp,[X1,X2],[X3,X4]) :- eqX(X1,X3), eqX(X2,X4).
% Subtracting subset test on sets of expressions
diff --git a/shared/prolog/readBgf.pro b/shared/prolog/readBgf.pro
index 7c5c4aff..ed6fadaa 100644
--- a/shared/prolog/readBgf.pro
+++ b/shared/prolog/readBgf.pro
@@ -1,5 +1,5 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Comstruct Prolog-based BGF representation from XML representation %
+% Construct Prolog-based BGF representation from XML representation %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xmlToG(G,g(Rs2,Ps2))
@@ -134,3 +134,21 @@ xmlToX(X1,'+'(X3))
child(element,X1,X2),
xmlToExpression(X2,X3),
!.
+
+xmlToX(X1,sls(X4,X5))
+ :-
+ self(name(sepliststar),X1),
+ !,
+ children(name(bgf:expression),X1,[X2,X3]),
+ xmlToExpression(X2,X4),
+ xmlToExpression(X3,X5),
+ !.
+
+xmlToX(X1,slp(X4,X5))
+ :-
+ self(name(seplistplus),X1),
+ !,
+ children(name(bgf:expression),X1,[X2,X3]),
+ xmlToExpression(X2,X4),
+ xmlToExpression(X3,X5),
+ !.
diff --git a/shared/prolog/writeBgf.pro b/shared/prolog/writeBgf.pro
index 76244554..0c1a8402 100644
--- a/shared/prolog/writeBgf.pro
+++ b/shared/prolog/writeBgf.pro
@@ -84,6 +84,22 @@ xToXml('*'(M),X)
xToExpression(X1,X2),
e(star,[],[X2],X).
+xToXml(sls(M1,M2),X)
+ :-
+ xToXml(M1,X1),
+ xToXml(M2,X2),
+ xToExpression(X1,X3),
+ xToExpression(X2,X4),
+ e(sepliststar,[],[X3,X4],X).
+
+xToXml(slp(M1,M2),X)
+ :-
+ xToXml(M1,X1),
+ xToXml(M2,X2),
+ xToExpression(X1,X3),
+ xToExpression(X2,X4),
+ e(seplistplus,[],[X3,X4],X).
+
xToXml({M},X)
:-
xToXml(M,X1),
diff --git a/shared/prolog/xbgf1.pro b/shared/prolog/xbgf1.pro
index 74cfe6c8..9aac276e 100644
--- a/shared/prolog/xbgf1.pro
+++ b/shared/prolog/xbgf1.pro
@@ -761,6 +761,13 @@ massage_rules(','([X,*(','([Y,X]))]),','([*(','([X,Y])),X])).
%massage_rules(?(','([*(X),*(Y)])),','([*(X),*(Y)])).
%massage_rules(?(';'([X,Y])),';'([?(X),?(Y)])).
+%% Separator lists
+massage_rules(slp(X,Y),','([X,*(','([Y,X]))])).
+massage_rules(slp(X,Y),','([*(','([X,Y])),X])).
+massage_rules(sls(X,Y),?(','([X,*(','([Y,X]))]))).
+massage_rules(sls(X,Y),?(','([*(','([X,Y])),X]))).
+massage_rules(sls(X,Y),?(slp(X,Y))).
+
% We can add a selectable epsilon anywhere
massage_rules(','(L1),','(L2))
:-
@@ -1348,7 +1355,7 @@ unchain(P1,g(Rs,Ps1),g(Rs,Ps4))
[P1]),
append(Ps1a,Ps1b,Ps2),
def(Ps2,N2,N2Ps),
- member(p(_,_,X),N2Ps),
+ [p(_,_,X)] = N2Ps,
require(
(\+ member(N2,Rs) ),
'Nonterminal ~q must not be root.',
diff --git a/shared/xsd/bgf.xsd b/shared/xsd/bgf.xsd
index a02172e6..da922ec4 100644
--- a/shared/xsd/bgf.xsd
+++ b/shared/xsd/bgf.xsd
@@ -113,6 +113,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/topics/transformation/xedd/lll1.try.xedd b/topics/transformation/xedd/lll1.try.xedd
new file mode 100644
index 00000000..6fbc8749
--- /dev/null
+++ b/topics/transformation/xedd/lll1.try.xedd
@@ -0,0 +1,8 @@
+
+
+
+ terminator
+ ;
+ .
+
+
diff --git a/topics/transformation/xedd/lll1to2.xedd b/topics/transformation/xedd/lll1to2.xedd
new file mode 100644
index 00000000..8364a5e8
--- /dev/null
+++ b/topics/transformation/xedd/lll1to2.xedd
@@ -0,0 +1,18 @@
+
+
+
+ group
+ (
+ )
+
+
+ seplist-star
+ {
+ }*
+
+
+ seplist-plus
+ {
+ }+
+
+