unit commandes;
(* Interpr‚teur de commande de PetitBasic. *)

interface

uses lexical;

procedure 	interprete_commande (t : TYPE_LEXEMES);

implementation

uses outils, lignes, execute, interpreteur;

procedure interprete_commande (t : TYPE_LEXEMES);
(* InterprŠte les commandes donn‚es par l'utilisateur.  L'analyseur lexical
 * est termin‚ par cette proc‚dure.
 *)

procedure fait_list;
(* Affiche le programme Basic de maniŠre s‚quentiel depuis le d‚but. *)

var	l 	: LIGNE;

begin
	termine_analyseur_lexical;
	l := programme;
	while l <> nil do begin
		writeln(l^.chaine);
		l := l^.prochain;
	end;
end;

procedure fait_new;
(* Re-initialise l'interpr‚teur et son environnement. *)

begin
	termine_analyseur_lexical;
	termine_interpreteur;
	termine_executeur;
	initialise_interpreteur;
	initialise_executeur;
end;

procedure fait_run;
(* Execute le programme. *)

begin
	termine_analyseur_lexical;
	interprete_programme;
end;

procedure fait_load;
(* Charge un programme. *)

var     nom	: string;
	f	: text;
	buffer	: string;
	n	: word;
	l	: LIGNE;

begin
	t := prend_lexeme;
	if t <> LITERAL_CHAINE then
		writeln('Usage: load "nom_du_fichier"')
	else begin
		nom := lexeme;
		termine_analyseur_lexical;
		termine_interpreteur;
		initialise_interpreteur;
		assign(f, nom);
		reset(f);
		while not eof(f) do begin
			readln(f, buffer);
			initialise_analyseur_lexical(buffer);
			t := prend_lexeme;
			if t = LITERAL_ENTIER then begin
				if not chaine_a_numero(lexeme, n) then begin
					writeln('Num‚ro de ligne incorrect!');
					writeln(buffer);
				end else begin
					t := prend_lexeme;
					if t = FIN_DE_LIGNE then begin
						writeln(buffer);
						writeln('Instruction nul!')
					end else
						l := cree_ligne(n, buffer);
				end;
			end else begin
				writeln(buffer);
				writeln('Manque num‚ro de ligne!');
			end;
			termine_analyseur_lexical;
		end;
		close(f);
	end;
end;

procedure fait_save;
(* Sauvegarde un programme. *)

var     nom	: string;
	f	: text;
	l	: LIGNE;

begin
	t := prend_lexeme;
	if t <> LITERAL_CHAINE then
		writeln('Usage: save "nom_du_fichier"')
	else begin
		nom := lexeme;
		termine_analyseur_lexical;
		assign(f, nom);
		rewrite(f);
		l := programme;
		while l <> nil do begin
			writeln(f, l^.chaine);
			l := l^.prochain;
		end;
		close(f);
	end;
end;

begin
	case t of
		COMMANDE_LIST	: fait_list;
		COMMANDE_NEW	: fait_new;
		COMMANDE_RUN	: fait_run;
		COMMANDE_LOAD	: fait_load;
		COMMANDE_SAVE	: fait_save;
	else
		writeln('Erreur Interne: Commande inconnu!');
		halt;
	end;
end;

end.