:- module(addTree,[]).

% Ergänze eine Baumausgabe an DCG-Regeln

translate((L --> R), (Ltr --> Rtr)) :-
    translate1(L,Ltr,Baum),      % Ausgabevariable Baum
    translate2(R,Rtr,Baumliste), % Ausgabevariable Baumliste
    Baum = [L|Baumliste].       % Syntaxbaum mit L als Wurzel

% translate1(+Kat,-Uebersetzt,+Baumvariable)
translate1(L,Ltr,Baum) :-
    L =.. [Funktor|Argumente],
    append(Argumente,[Baum],ArgumenteBaum),
    Ltr =.. [Funktor|ArgumenteBaum].

% Test:
% translate2(+Rechts,-RechtsTr,-Baumliste)
% Fall Rechts = (A,B):
translate2((A,B),((Atr,Btr),{Code}),Baeume) :-
    !, translate2(A,Atr,BaeumeA),
       translate2(B,Btr,BaeumeB),
       Code = append(BaeumeA,BaeumeB,Baeume).
% fast ok; aber falsch, wenn BaeumeX eine Variable ist
%
% Fall Rechts = (A;B):
translate2((A;B),Tr,Baeume) :-
    !, translate2(A,Atr,BaeumeA),
       translate2(B,Btr,BaeumeB),
       Tr = ((Atr,{Baeume=BaeumeA})
            ;(Btr,{Baeume=BaeumeB})
            ).

% Fall Rechts = []:
% Fall Rechts = [Atom]:
% Fall Rechts = [Atom|Atome]: behandeln wir nicht
% Fall Rechts = {Prolog}:
%   
% Sonst: R = Kategorie:
translate2(Cat,CatTr,[Baum]) :-
    !, translate1(Cat,CatTr,Baum).

