![]() |
Énumérations, design Pattern de Visiteur |
On souhaite pouvoir évaluer des expressions arithmétiques sur des
double
utilisant dans un premier temps uniquement des
additions et des soustractions. De plus, on veut saisir ces
expressions sur l'entrée standard (Scanner
).
PLUS
et
MINUS
au lieu des opérateurs
« +
» et
« -
» . Par exemple:
> java EvalPrefixe MINUS PLUS 5 7 PLUS 1 2 9,000000Pour cela, déclarer le type énuméré
Operation
correspondant regroupant PLUS
et MINUS
,
et écrire une méthode récursive static double eval(Scanner
sc)
qui réalise l'évaluation.
> java EvalPrefixe - + 5 7 + 1 2 9,000000il faut associer à chaque opérateur («
+
» ,
« -
» ) une opération du type
énuméré (PLUS
, MINUS
). Faites cela en
utilisant une table de hachage statique.
operatorSign()
qui donne la chaîne
de caractères représentant cette opération (qui à PLUS
associe « +
» ). La table de
hachage peut alors être remplie de manière générique comme
ceci :
for (Operation op : Operation.values()) map.put(op.operatorSign(), op);
eval()
).
Toujours dans le domaine des expressions arithmétiques, on désire
maintenant construire l'AST (Abstract Syntax Tree) des
expressions. Pour cela, créer des types Expr
(expressions génériques), BinOp
(opérateurs binaires
génériques), Const
, Plus
et
Minus
(classes concrètes).
accept()
. Par exemple, vous devrez
ajouter dans toutes les classes concrètes de l'AST le code
suivant :
public void accept(ExprVisitor v) { v.visit(this); }Par ailleurs, les algorithmes doivent implanter l'interface
ExprVisitor
suivante :
interface ExprVisitor { public void visit(Const c); public void visit(Plus p); public void visit(Minus m); }
accept()
que dans la super-classe commune à tous les types de noeuds
(Expr
) (la méthode aurait alors été héritée dans tous
les sous-types) ? Pourquoi ? ToStringExprVisitor
qui implante
l'interface ExprVisitor
pour réaliser l'affichage
infixe de l'AST que votre parseur a construit (modifications de
Expr
et ses sous-types interdites).
Expr
et ses sous-types
interdites).
visit()
retournent quelque chose.