Algorithmique Évaluation d expressions Luc Brun luc.brun@greyc.ensicaen.fr Évaluation d expressions p.1/38
Plan Les différents types d expressions Expression complètement parenthésée (ECP), Expression préfixée (EPRE), Expression postfixée (EPOST), Expression infixée (EINF). Évaluation d expressions postfixée, complètement parenthésée, Conversion d expressions ECP à postfixée, infixée à postfixée. Évaluation d expressions p.2/38
Définition d une expression Définition : Une expression est une suite de variables combinées par un ensemble d opérateurs avec éventuellement un jeux de parenthèses ouvrantes et fermantes. Exemple : X (A + B) (C + D) NB : On ne fait pas intervenir de constantes ou de fonctions (petite simplification). L évaluation d une expression implique la définition d un environnement (affectation de chaque variable à une valeur). Évaluation d expressions p.3/38
Les opérateurs Opérateurs binaires opérateurs arithmétiques opérateurs logiques Opérateurs unaires opérateurs arithmétiques NB : +,. opérateurs logiques {+,,,/}, {<,>,,,, =,et,ou}, {, } non. Évaluation d expressions p.4/38
Expression complètement parenthésée Une expression complètement parenthésée se construit à partir des règles suivantes : 1. Une variable est une ECP, 2. si x et y sont des ECP et β un opérateur binaire, alors (x β y) est une ECP, 3. si x est une ECP et α un opérateur unaire alors (α x) est une ECP, 4. Il n y a pas d autre ECP que celles formées par les 3 règles précédentes. Évaluation d expressions p.5/38
Grammaire des ECP Grammaire BNF (Backus-Naur Form) <ecp> ( <ecp><optbin><ecp>) (<optun><ecp>) <variable> <optbin> + / < = > et ou <optun> non <variable> A B C... Z Évaluation d expressions p.6/38
Exemples d ECP ECP conformes : ((A+B)*C) (((A/B)=C)et(E<F)) ( A) ECP non conformes : (A) ((A+B)) A B Évaluation d expressions p.7/38
Expressions préfixées Les expressions préfixées (EPRE) se construisent à partir des 4 règles suivantes : 1. une variable est une EPRE, 2. si x et y sont des EPRE et β un opérateur binaire alors β x y est une EPRE, 3. Si x est une EPRE et α un opérateur unaire, alors α x est une EPRE, 4. il n y a pas d autres EPRE que celles formées à partir des 3 règles précédentes. Évaluation d expressions p.8/38
Grammaire des EPRE Règles : <epre> <optbin> <epre> <epre> <optun><epre> <variable> <optbin> + / < = > et ou <optun> non <variable> A B C... Z NB : Seule la première règle a été changée. Évaluation d expressions p.9/38
Exemples d EPRE Expressions correctes : EPRE ECP + - A B C ((A-B)+C) et non < A B C ((non(a<b))et C) non = + A B C (non ((A+B)=C)) Expressions incorrectes A - + B C non B C Évaluation d expressions p.10/38
Expressions postfixées Expressions utilisées par les calculatrices HP (cf TP Web) et données par les 4 règles : 1. une variable est une EPOST, 2. si x et y sont des EPOST et β un opérateur binaire alors x y β est une EPOST, 3. Si x est une EPOST et α un opérateur unaire, alors x α est une EPOST, 4. il n y a pas d autres EPOST que celles formées à partir des 3 règles précédentes. Évaluation d expressions p.11/38
Grammaire des EPOST Règles : <epost> <epost> <epost> <optbin> <epost> <optun> <variable> <optbin> + / < = > et ou <optun> non <variable> A B C... Z NB : Seule la première règle a été changée. Évaluation d expressions p.12/38
Exemples d EPOST ECP EPRE EPOST (((A+B)-C)/D) / - + A B C D A B + C - D / ((A < B) et (non C)) et < A B non C A B < C non et ((non (A < B)) et (C>D)) et non < A B > C D A B < non C D > et Évaluation d expressions p.13/38
Expressions Infixées Écriture ECP sans ambiguï té mais parfois un peu lourde. Suppressions de certaines parenthèses par 2 données implicites : 1. Priorité des opérateurs A B + C ((A B) + C) 2. Priorité à gauche pour les opérateurs de même priorité A + B C ((A + B) C) Les parenthèses imposent des priorités A B C ((A B) C) A (B C) (A (B C)) Évaluation d expressions p.14/38
Priorité des opérateurs Opérateur Priorité ( 0 <,, =,,<,,> 1 ou, +, - 2 et, *, / 3,, non 4 Évaluation d expressions p.15/38
Grammaire des EINF {expr} : expression éventuellement présente un nombre quelconque de fois. <einf> <esimple> {<op1> <esimple>} <esimple> <terme>{<op2><terme>} <terme> <facteur>{<op3><facteur>} <facteur> <variable> <op4><facteur> (<einf>) <op1> < = > <op2> + ou <op3> / et <op4> non <variable> A B C... Z Évaluation d expressions p.16/38
Exemples d EINF EINF ECP A*B+C-D (((A * B) +C)-D) A+B*C (A+(B * C)) A=B et C>D ((A=(B et C))> D) A et B ou C et D ((A et B) ou (C et D)) A et (B ou C) et D ((A et (B ou C)) et D) non A et B ou C et non D (((non A) et B) ou (C et (non D))) Évaluation d expressions p.17/38
Évaluation d expression L évaluation s effectue par rapport à un environnement (affectation des variables). Idée : Ordonnancer l évaluation de façon à ce que l évaluation d une opération s effectue sur des variables ou des expressions déjà évaluées. Soit S appliquant β sur x et y. evaluation(s) = opération(β, si variable(x) alors valeur(x) sinon evaluation(x), si variable(y) alors valeur(y) sinon evaluation(y)) Évaluation d expressions p.18/38
Exemple d évaluation Soit à évaluer S=(A+(B*C)) avec A = 2,B = 3,C = 4. evaluation(s) = opération(+,a,évaluation(b*c)) = opération(+,a,opération(*,b,c)) = opération(+,2,opération(*,3,4)) = opération(+,2,12) = 14 Évaluation d expressions p.19/38
Évaluation d une expression postfixée Les opérandes apparaissent avant l opération. L évaluation d une opération fournie soit le résultat soit un nouvel opérande. 10 3 + 5 6 - - = 13 5 6 - - = 13-1 - = 14 Idée : empiler les opérandes, dépiler pour effectuer une opération. Évaluation d expressions p.20/38
Exemple d évaluation d une EPOST évaluons A B * C D + / avec A=2,B=3,C=2,D=1 2 3 2 6 pile vide empiler A empiler B evaluer * AB*CD+/# AB*CD+/# AB*CD+/# AB CD+/# 2 6 1 2 6 empiler C empiler D évaluer + evaluer / AB*CD+/# AB*CD+/# AB*CD+ /# AB*CD+/ # 3 6 2 Évaluation d expressions p.21/38
Évaluation d EPOST : Énumération des cas Soit epost[1..max] une chaîne de caractères contenant une EPOST et i une position dans la chaîne. Si epost[i]= # : l évaluation est terminé. Résultat en sommet de pile. Si epost[i] # Si epost[i] est une variable : empiler sa valeur Si epost[i] est un opérateur : 1. on dépile son (ou ses 2 opérandes), 2. on effectue l opération et 3. on empile le résultat. Évaluation d expressions p.22/38
Évaluation d EPOST : l algorithme fonction evalpost (epost : Tableau[1...MAX] decaratère ) : Réel Déclaration i :Entier,valG,valD :Réel,p : Pile début p creer() i 1 tant que epost[i] # faire si variable(epost[i]) alors empiler(epost[i],p) sinon si unaire(epost[i]) alors vald dépiler(p) vald oper1(epost[i],vald) empiler(vald,p) sinon vald dépiler(p) valg dépiler(p) vald oper2(valg,epost[i],vald) empiler(vald,p) finsi finsi i i+1 fintantque retourner sommet(p)évaluation d expressions p.23/38
Évaluation d ECP Utilisation d une pile à travers trois types d actions : 1. Si le symbole lu est un opérateur : on l empile 2. si c est une variable : on empile sa valeur, 3. Si c est une parenthèse droite : (a) on dépile une sous expression et (b) on empile le résultat. Évaluation d expressions p.24/38
Évaluation d ECP : Exemple évaluons (A * (B+C)) avec A=2,B=3,C=1. 2 * 2 (A*(B+C))# (A (B+C))# (A*( B+C))# * 2 3 * 2 (A*(B+C))# + 3 * 2 1 + 3 * 2 4 * 2 8 (A*(B+C))# (A*(B+C ))# (A*(B+C))# (A*(B+C))# Évaluation d expressions p.25/38
Évaluation d ECP : l algorithme fonction evalecp (ecp : Tableau[1...MAX] decaratère ) : Réel Déclaration i :Entier,op :Caratère,valG,valD :Réel,p : Pile début p creer() i 1 tant que ecp[i] # faire si variable(ecp[i]) alors empiler(valeur(ecp[i]),p) continuer finsi si operateur(ecp[i]) alors empiler(ecp[i],p) continuer finsi vald dépiler(p) op dépiler(p) si unaire(op) alors empiler(oper1(op,vald),p) sinon valg dépiler(p) emp.(op2(valg,op,vald),p) finsi finsi i i+1 fintantque Évaluation d expressions p.26/38
Conversion ECP à EPOST ECP lisibles, tapé par exemple dans un code source, EPOST directement interprétable par une machine. Nécessité de convertir. Remarque : Lors de la lecture d une ECP on rencontre les opérandes dans le même ordre que dans l EPOST. Seul l opérateur est placé à la fin. (A + B) AB+ Idée : Empiler les opérateurs et les dépiler sur les parenthèses fermantes. Opérateur : empiler, variable : écrire dans chaî ne résultat. parenthèse fermante : dépiler un opérateur parenthèse ouvrante : ne rien faire. Évaluation d expressions p.27/38
Exemple de conversion Convertissons (A * (B+C)) * * * A A A A B (A*(B+C))# (A (B+C))# (A*( B+C))# (A*(B+C))# + * + * A B A B C A B C + A B C + * (A*(B+ C))# (A*(B+C))# (A*(B+C))# (A*(B+C))# * Évaluation d expressions p.28/38
Conversion ECP à EPOST : l algorithme procédure convecpepost ( E ecp : Tableau[1... M AX] decaratère, S epost : Tableau[1... M AX] decaratère ) Déclaration indecp,indepost :Entier,p : Pile début p creer() indecp 1 indepost 1 tant que ecp[indecp] # faire si operateur(ecp[i]) alors empiler(ecp[i],p) continuer finsi si variable(ecp[i]) alors epost[indepost] ecp[indecp] indepost indepost+1 continuer finsi si ecp[i]= ) alors epost[indepost] dépiler(p) indepost indepost+1 finsi indecp indecp+1 fintantque epost[indepost] # Évaluation d expressions p.29/38
Conversion ECP/EPOST : Amélioration Détection d erreurs de syntaxe dans l ECP. La pile ne doit pas être vide avant la fin (trop de parenthèses fermantes) et vide à la fin (pas assez). Un caractère d ECP est soit : un opérateur, une variable, une parenthèse fermante, une parenthèse ouvrante. Évaluation d expressions p.30/38
Conversion EINF à EPOST Problème compliqué par l absence de parenthèses. On applique les règles suivantes : variable : empiler. opérateur : empiler. Il faut dépiler auparavant tous les opérateurs de priorité supérieure ou égale. parenthèse gauche : empiler. Délimite une sous expression. parenthèse droite : dépiler jusqu à une parenthèse gauche. Évaluation d expressions p.31/38
Exemple de conversion (1/2) Convertissons A*B+C/(D+E) * * + A A A B A B* A*B+C/(D+E)# A B+C/(D+E)# A*B+C/(D+E)# A*B+ C/(D+E)# + / + A B *C A B *C A B* C + A B* C D A*B+C/(D+E)# A*B+C/ (D+E)# A*B+C/( D+E)# A*B+C/(D+E)# ( / + ( / + Évaluation d expressions p.32/38
Exemple de conversion (2/2) A*B+C/(D+E) ( / + + ( / + A B *C D A B *C D A B* C D E A*B+C/(D+E)# A*B+C/(D+ E)# A*B+C/(D+E)# / + A B* C D E + A B* C D E + / + A*B+C/(D+E)# A*B+C/(D+E)# Évaluation d expressions p.33/38 + ( / +
Conversion EINF/EPOST : Points délicats Trois points délicats : Empilement d une opération, Rencontre d une parenthèse fermante, Fin de l algorithme et vidage de la pile. Évaluation d expressions p.34/38
Empilement d une opération procédure traiteropt ( E op :Caratère, S epost : Tableau[1...MAX] decaratère E/S p : Pile,indpost : Naturel ) Déclaration dépil : Booléen,élément : Caratère début dépil non vide(p) tant que dépil faire si priorité(sommet(p)) priorité(op) alors élément depiler(p) epost[indpost] élément indpost indpost+1 dépil non vide(p) sinon dépil faux finsi fintantque empiler(op) Évaluation d expressions p.35/38
Rencontre d une parenthèse fermante procédure traiterpf ( S epost : Tableau[1...MAX] decaratère, E/S indpost : Naturel,p : Pile ) Déclaration élément : Caratère début élément dépiler(p) tant que élément ( faire epost[indpost] élément indpost indpost+1 élément depiler(p) fintantque fin Évaluation d expressions p.36/38
Vidage de la pile procédure traiterfin ( S epost : Tableau[1...MAX] decaratère, E/S indpost : Naturel,p : Pile ) Déclaration élément : Caratère début tant que non vide(p) faire epost[indpost] depiler(p) indpost indpost+1 fintantque epost[indpost] # fin Évaluation d expressions p.37/38
Conversion EINF/EPOST : l algorithme procédure conveinfepost ( E einf : Tableau[1... M AX] decaratère, S epost : Tableau[1... M AX] decaratère ) Déclaration indinf,indpost :Entier,p : Pile début p creer() indinf 1 indpost 1 tant que einf[indinf] # faire si operateur(einf[indinf]) alors indpost indpost+1 continuer finsi si einf[i]= ) alors traiterpf(epost,indpost,p) sinon traiteropt(einf[indinf],epost,indpost,p) empiler( ( ) ; continuer finsi si variable(einf[indinf]) alors epost[indpost] einf[indinf] finsi indinf indinf+1 fintantque Évaluation d expressions p.38/38 traiterfin(epost,indpost,p)