Petite calculatrice symbolique
Cet ensemble de classes forme une petite calculatrice symbolique.
Cette calculatrice exécute séquentiellement des instructions qui peuvent
être des affectations ou des évaluations. Chaque instruction doit être
donnée sur une ligne. Les lignes sont soit lues dans un fichier si un
nom de fichier est donné sur la ligne de commande soit sur l'entrée
standard. Les instructions prennent les formes suivantes :
- expression
- L'expression est évaluée et le résultat est affiché.
- variable = expression
- L'expression est évaluée et le résultat est affecté à
la variable.
- variable := expression
- L'expression non évaluée est affectée à la variable.
Les expressions sont construites à partir des constantes flottantes et
des variables avec les quatre opérations arithmétiques (+,
-, * et /) et les parenthèses ( et
). Un exemple de telle expression est x + 3 * z * (4 -
x).
L'évaluation d'une expression se fait dans l'environnement de la
calculatrice. Si une variable à évaluer n'est pas définie dans
l'environnement, c'est à dire si aucune expression ne lui a été affectée
auparavant, une exception est levée.
Voici un petit exemple d'utilisation pour bien saisir la différence
entre les deux types d'évaluation.
x := y
x <- y
x
Erreur : 2 : Variable inconnue : y
y = 1
y <- 1.0
x
x = 1.0
y = 2
y <- 2.0
x
x = 2.0
x = y
x <- 2.0
y = 3
y <- 3.0
x
x = 2.0
La documentation Javadoc.
L'organisation en classes est la suivante :
- Classes principales
- Classe Main
- Cette classe contient la méthode main qui réalise la boucle
toplevel. Elle est chargée d'ouvrir le fichier dont le nom est
éventuellement donné sur la ligne de commande. Ensuite elle lit chaque
ligne et la fait exécuter à la calculatrice.
- Classe Calc
- Calculatrice proprement dite. Elle exécute les instructions,
stocke les affectations dans un environnement et affiche les résultats
des évaluations.
- Interfaces et classes pour les expressions arithmétiques. Les
expressions arithmétiques sont représentées par des arbres binaires. Les
noeuds internes de ces arbres sont des opérateurs binaires et les
feuilles sont des constantes ou des variables.
- Interface ArithExpr
-
- Interface pour tous les noeuds des arbres (noeuds
internes et feuilles).
- Interfaces et classes pour les environnements
- Interface Environment
- Interface d'un environnement
- Classe HashEnv
- Implémentation d'un environnement par une table de hachage
- Interfaces et classes pour les parseurs
- Interface ArithExprParser
- Interface d'un parseur.
- Classe InfixParser
- Implémentation d'un parseur pour les expressions en notation infixe.
- Classe PrefixParser
- Implémentation d'un parseur pour les expressions en notation préfixe.
- Exceptions
- Classe UnboundVariableException
- Exception levée lorsqu'une évaluation rencontre une variable
à laquelle n'est affectée aucune expression.