% --- Eingabeaufforderung und Parseaufrufe   H.Leiss, 2008

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

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).

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

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

satzende([46,10]).  % <Punkt><Return>

% tokenize(+String,-Atomlist).
tokenize(String,Atomlist) :-
    name(Atom,String),
    concat_atom(AtomlistK,' ',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(Dateiname) :-
   % atom_concat(Dateiname,'.aus',Ausgabe),
   % tell(Ausgabe), % ggf. Ausgabedatei öffnen
   open(Dateiname,read,Strom),
   parsen(Strom),
   close(Strom),
   % told,          % ggf. Ausgabedatei schließen
   nl,write('Fertig.').

parsen(Strom) :-
   read_sentence(Strom, Satz, []),
   (Satz = [] -> true  % Dateiende 
   ; tokenize(Satz,Atome),
       nl,writeq(Atome),nl,
       (setof(Baum,parse(Atome,Baum),Trees)
       -> showTrees(Trees,3), nl
       ; nl, tab(3),
           write('* keine Analysen gefunden *'),
           nl),
       parsen(Strom)   % weitere Sätze
   ).

