parse(Atoms,Tree) :-
        start_symbol(S),
        parse(S,Tree,Atoms,[]), printTree(Tree,4).

parse((B,C),Tree,I,J) :-
        !, (parse(B,TreeB,I,K), parse(C,TreeC,K,J)),
        Tree = [*,TreeB,TreeC].
parse((B;C),Tree,I,J) :-
        !, (parse(B,Tree,I,J) ; parse(C,Tree,I,J)).
parse({Goal},Tree,I,J) :-
        !, call(Goal), Tree = [], I = J.
parse([],Tree,I,J) :-
        !, Tree = [], I = J.
parse([W],Tree,I,J) :-
        !, Tree = [W], I = [W|J].

parse(A,Tree,I,J) :-
        (A ---> Body),
        parse(Body,TreeBody,I,J),
        Tree = [A,TreeBody].
parse(A,Tree,I,J) :-
        I = [W|J],
        word(W,A),
        Tree = [A,W].

printTree([A|Trees],I) :- 
        !, printTree(A,I),
        J is I + 3, printTrees(Trees,J).
printTree(A,I) :-
        nl, tab(I), writeq(A).

printTrees([T|Ts],I) :-
        printTree(T,I),
        printTrees(Ts,I).
printTrees([],_I).


