unit utilisateur;
(* Interface utilisateur de PetitBasic. *)

interface

procedure 	interface_utilisateur;

implementation

uses outils, lexical, lignes, execute, interpreteur, commandes;

procedure interface_utilisateur;
(* Interface utilisateur de PetitBasic. *)

function est_commande (t : TYPE_LEXEMES) : boolean;
(* Renvoie true si t est une commande. *)

begin
	est_commande := (t >= COMMANDE_LIST) and (t <= COMMANDE_SYSTEM);
end;

var	fin	: boolean;
	buffer	: string;
	t	: TYPE_LEXEMES;
	n	: word;
	l	: LIGNE;
	booleen	: boolean;

begin
	fin := false;
	initialise_interpreteur;
	initialise_executeur;
	repeat
		write('> ');
		readln(buffer);

		initialise_analyseur_lexical(buffer);
		t := prend_lexeme;
		if t = LITERAL_ENTIER then begin
			if not chaine_a_numero(lexeme, n) then
				writeln('Num‚ro de ligne incorrect!')
			else begin
				t := prend_lexeme;
				if t = FIN_DE_LIGNE then begin
					l := cherche_ligne(n);
					if l = nil then
						writeln('Instruction nul!')
					else
						detruit_ligne(l);
				end else begin
					l := cherche_ligne(n);
					if l = nil then
						l := cree_ligne(n, buffer)
					else
						writeln('Cette ligne existe d‚j…!');
				end;
			end;
			termine_analyseur_lexical;
		end else begin
			if est_commande(t) then begin
				if t = COMMANDE_SYSTEM then begin
					fin := true;
					termine_analyseur_lexical;
				end else
					interprete_commande(t);
			end else begin
				termine_analyseur_lexical;
				booleen := interprete_ligne(buffer);
			end;
		end;
	until fin = true;
	termine_interpreteur;
	termine_executeur;
end;

end.