:- module(tokenizer,[read_sentence/3,tokenize/2,
                     satzende/0,parse/0,parsed/0]).

% read_sentence(+Stream,-Sentence,+Seen)
read_sentence(Stream,Sentence,Seen) :-
    get0(Stream,Char),  
    read_sentence(Stream,Sentence,Char,Seen).

% satzzeichen sollen separate Token werden:
% dafuer sorgen, dass vorher und nachher im String ein Blank steht

read_sentence(Stream,Sentence,Char,Seen) :-
    (Char = -1  % Dateiende
    -> reverse(Seen,Sentence)
    ; (Seen = [C|Cs], satzende([C,Char]))    
    -> reverse(Cs,Sentence)
    ; satzzeichen(Char)
    -> read_sentence(Stream,Sentence,[Char,32|Seen])
    ; Char = 32, Seen = [32|_]
    -> read_sentence(Stream,Sentence,Seen)    
    ; Char = 10 % return ignorieren
    -> read_sentence(Stream,Sentence,Seen)
    ; read_sentence(Stream,Sentence,[Char|Seen])).

satzende([46,10]).  % <Punkt><Return>
satzzeichen(C) :-
    member(C,",;.?!:").

% tokenize(+String,-Atomlist). Trenne Sting an den Blank-Stellen
tokenize(String,Atomlist) :-
    name(Atom,String),
    concat_atom(Atomlist,' ',Atom).

/* entferne_komma(AtomlistK,Atomlist).

entferne_komma([AtomK|AtomeK],[Atom|Atome]) :-
    (atom_concat(Atom,',',AtomK)
    -> true
    ; Atom = AtomK),
    entferne_komma(AtomeK,Atome).
entferne_komma([],[]).
*/

satzende :-
    write('Beende die Eingabe mit <Punkt><Return>'),
    nl,read_sentence(user,Sentence,[]),
    name(Satz,Sentence),
    nl,write('Eingabe:   '),writeq(Satz),
    tokenize(Sentence,Atomlist),
    nl,write('Atomliste: '),writeq(user,Atomlist).

parse :-
    write('Beende die Eingabe mit <Punkt><Return>'),
    nl,read_sentence(user,Sentence,[]),
    tokenize(Sentence,Atomlist),
    startsymbol(S),
    addTree:translate1(S,Term,Baum),  
    addDifflists:translate(Term,TermExp,Atomlist,[]),
    nl,write('Aufruf: '), portray_clause(TermExp),
    call(TermExp), 
    write('Baum:   '), nl,showTree(Baum,8),nl,
    fail.
parse.
parsed :-
    write('Beende die Eingabe mit <Punkt><Return>'),
    nl,read_sentence(user,Sentence,[]),
    tokenize(Sentence,Atomlist),
    setof(Baum, parse(Atomlist, Baum), Trees),
    displayTrees(Trees).

parse(Atomlist,Baum) :-
    startsymbol(S),
    addTree:translate1(S,Term,Baum),
    addDifflists:translate(Term,Exp,Atomlist,[]),
    call(Exp).
    
