% ## 5.0 Interface utilisateur  merci Manu

swi_trans([],[]).
swi_trans(L,Lmot):-
    swi_tok(N,T),
    append(L1,[N|LQ],L),
    swi_trans(L1,R),
    swi_trans(LQ,Q),
    append(R,T,RT),
    append(RT,Q,Lmot).
swi_trans(L,[Lmot]):-
    name(Lmot,L).

swi_trans2(L,Lmot):-
    append(L1,[':',':'|LQ],L),
    swi_trans2(L1,LR1),
    swi_trans2(LQ,LRQ),
    append(LR1,[::],LT),
    append(LT,LRQ,Lmot).
swi_trans2(L,Lmot):-
    append(L1,[':','-'|LQ],L),
    swi_trans2(L1,LR1),
    swi_trans2(LQ,LRQ),
    append(LR1,[:-],LT),
    append(LT,LRQ,Lmot).
swi_trans2(L,L).

swi_tok(40,["("]).
swi_tok(41,[")"]).
swi_tok(32,[]).
swi_tok(09,[]).
swi_tok(10,[]).
swi_tok(44,[","]).
swi_tok(59,[';']).
swi_tok(58,[':']).
swi_tok(45,['-']).
swi_tok(126,[~]).

swi_line(Stream,Liste):-
    get0(Stream,Char),
    % 46 est le point
    % 10 est CR
    (Char ==  10 ->          Liste = [];
     Char ==  -1 ->          Liste = [],!,fail;
    %true ->
    %(Char < 0    ->          C is plus(Char,127),
    %                         swi_line(Stream,Reste),
    %                         append([C],Reste,Liste)) ;
    swi_line(Stream,Reste),
    append([Char],Reste,Liste)).

 read_line(Stream,List_mot):-
   swi_line(Stream,List_char),swi_trans(List_char,List_inter),swi_trans2(List_inter,List_mot).

% affichage en cas de mot non reconnu par notre interpréteur
inconnu(X) :- affiche(" Erreur ! "),affiche(X), write(' mot inconnu au bataillon '),nl.

% conversion
nom(N,A,B,C,D,E) :- name(A,Ar),name(B,Br),name(C,Cr),name(D,Dr),
                    name(N,Nr),
                    append(Nr   ,[40] ,LS),
                    append(LS   ,Ar   ,LSr),
                    append(LSr  ,[44] ,LSp),
                    append(LSp  ,Br   ,ABr),
                    append(ABr  ,[44] ,ABCp),
                    append(ABCp ,Cr   ,ABCr),
                    append(ABCr ,[44] ,ABCDp),
                    append(ABCDp,Dr   ,ABCDr),
                    append(ABCDr,[41],E).

writeNolist([M]) :- write(M).

writeList([]).
writeList([[T|Q]|QL]) :- write(T),write(' '),write(Q),nl,
                         writeList(QL).
ajout([],L,L).
ajout([T|Q],L,Lr) :- atom(T),term_to_atom(T,V),
                     name(V,S),append(S,[32,61],U), % 32 61 pour esp =
                     append(L,[U,T],Lrt),ajout(Q,Lrt,Lr).
ajout([_|Q],L,Lr) :- ajout(Q,L,Lr).
% gereRes(A,AA) :- A=..[_|L],atom_to_string(),ajout(L,[],AA).

% analyse permet de traiter les mots autorisés dans notre interpréteur
analyse --> [q].
analyse --> [halt], {bye}.
analyse --> [z]   , {bye}.
analyse --> [c]   , {c,saisie}.
%analyse --> [c]   , ["("],[A],[","],[B],[","],[C],[","],[D],[")"],
%                   {nom(c,A,B,C,D,E),string_to_list(S,E),string_to_atom(S,Atom),
%                    term_to_atom(P,Atom), free_variables(P,L),call(P),
%                    write('   '),writeNolist(L),nl,saisie}.
analyse --> [exit], {bye}.

analyse --> [quit], {bye}.
analyse --> [aide], {aide,saisie}.
analyse --> [c]   , ["("],[X],[")"],
                    {concat('c(',X,Chtmp),concat(Chtmp,')',Finch),
                    term_to_atom(T,Finch),
           name(X,Lv),
           list_var(Lv,Ls),
                    free_variables(T,L),
                    call(T),write('   '),writeDeuxListes(Ls,L),
                    nl,saisie}.
analyse --> [X]   , {inconnu(X),saisie}.

list_var([],[]).
list_var(L,Lv)  :- prem_arg(L,T,Q), ajout2(T,Lv1),
                  list_var(Q,Lv2), append(Lv1,Lv2,Lv).

prem_arg(L,T,Q) :- append(T,[44|Q],L).
prem_arg(L,L,[]).

ajout2(T,[S]) :- name(A,T),my_var(A),concat(A,' = ',Na),
                 string_to_atom(S,Na).
ajout2(_,[]).

my_var(X):-atom(X),name(X,[T|_]),T>64,T<92.

writeDeuxListes([],[]).
writeDeuxListes([TA|QA],[TB|QB]) :-
 affiche(TA),write(TB),nl,writeDeuxListes(QA,QB).


trans([],[]).
trans([T|Q],[T |Q1]) :- T>=0, trans(Q,Q1).
% on chope é converti en \'{e}
%                        92 39 123 101 125 etc.
trans([-23|Q],[92,39,123,101,125|Q1]) :- trans(Q,Q1).

% ne pas toucher à l'ordre !
affiche(X) :- is_list(X), trans(X,Y),writef('%s',[Y]).
affiche(X) :- write(X).

suprime_point(L,L1) :- append(L1,['.'],L).
suprime_point(L,L).

saisie :-
    inc_compt(ligne),
    affiche("MVL - "),
    compt(ligne,X),
    affiche(X),
    affiche(" > "),
    read_line(user_input,L),
    suprime_point(L,L1),
    analyse(L1,[]),
    !.