% ## 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,[]),
!.