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 + { + }+ + +