Rappel : les expressions arithmétiques sont uniquement celles dont la grammaire est définie dans l'énonçé.

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;