with liste_symbole;
with pile_symbole;
with Ada.Integer_Text_io;use Ada.Integer_Text_io;
with Ada.Text_io;use Ada.Text_io;
procedure main_postfixe is
erreur, mal_formee:exception;
package liste_char is new liste_symbole(Character);
use liste_char;
package pile_int is new pile_symbole(Integer);
use pile_int;
type Reponse is (o,n);
package reponse_io is new Enumeration_io(Reponse);
-- évaluation de l'expression
-- on empile chaque chiffre;
lorsque l'on tombe sur un opérateur
-- on évalue la sous-expression
qu'on empile de nouveau
procedure evaluer(l:in out Liste;
s: out Integer) is
x,y:Integer;
p:Pile:=vide;
unSymbole:Character;
begin
loop
exit when estVide(l);
extraire(l,unSymbole);
case unSymbole
is
when '0'..'9'
=>
x:=Character'pos(unSymbole);
-- valeur ASCII de '0'=48
empiler(x-48,p);
when others
=>
x:=sommet(p);
depiler(p);
y:=sommet(p);
depiler(p);
case unSymbole is
when '+' => empiler(x+y,p);
when '-' => empiler(x-y,p);
when '*' => empiler(x*y,p);
when '/' => empiler(x/y,p);
when others => raise erreur;
end case;
end case;
end loop;
-- vérifier
qu'il ne reste plus qu'un élément dans la pile
-- sinon cela signifie
que l'expression est mal formée
s:=sommet(p);
depiler(p);
if not estVide(p)
then
raise mal_formee;
end if;
end evaluer;
laListe:Liste:=vide;
unSymbole:Character;
encore:Reponse:=o;
resultat:Integer;
begin
-- on saisit l'expression
postfixée dans une liste
loop
exit when encore=n;
-- détecter les erreurs
de saisie
-- imposer que seuls des
caractères soient saisis
loop
begin
get(unSymbole);
insererEnQueue(unSymbole,laListe);
put("voulez vous
saisir un nouveau symbole ? ('o'/'n') : ");
reponse_io.get(encore);
exit;
exception
when DATA_ERROR
=>
skip_line;put("
saisie erronée, recommencez!");
end;
end loop;
end loop;
-- affichage du résultat
evaluer(laListe,resultat);
put("La valeur de l'expression
est : ");
put(resultat, WIDTH=>2);
exception
-- le caractère extrait
de la liste n'est ni un chiffre
-- ni un symbole d'opérateur
when erreur =>
put_line("Le caractère
de la liste n'est pas un symbole valide!");
-- vérifier qu'une
tentative d'évaluation n'ait pas lieu
-- alors qu'il n'y a plus
qu'une seule opérande
when pile_vide =>
put_line(" la pile est vide
: impossible de retourner son sommet !");
when mal_formee => put_line("l'expression
est ma formée !");
end main_postfixe;