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;