:: Enseignements :: ESIPE :: E4INFO :: 2009-2010 :: Génération de code ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Evaluation par Grammar Evaluator |
Le but de ce TD est d'implémenter un évaluateur de variables en utilisant un GrammarEvaluator.
Préliminaires
Télécharger et décompresser l'archive
gc-ir2-td2.zip.
Importer le répertoire
td2 dans votre projet eclipse.
Mettre à jour les archives
tatoo.jar dans le répertoire
build-lib et
motocity-tatoo.jar dans
build-lib/motocity.
Exercice 1 - Evaluation d'expressions arithmétiques
Le but de l'exercice est d'implémenter le même évaluateur que le TP précédent, mais en utilisant un TerminalEvaluator et un GrammarEvaluator.
-
Reprendre le fichier td2_1.ebnf qui décrit le lexeur et le parseur de l'évaluateur d'expressions arithmétiques.
Modifier-le pour typer les terminaux et les non-terminaux (cf. cours).
-
Reprendre la classe Exo1AnalyzerMain.java.
Compléter l'implémentation du TerminalEvaluator.
Chaque méthode est associée à un terminal (qui a été typé dans l'EBNF)
et renvoie sa valeur (dans le type donné) quand ils sont lus en entrée.
-
Compléter le GrammarEvaluator qui implémente des méthodes associées aux productions de la grammaire.
Les méthodes ont le même nom que les productions.
Chacune d'elles est appelée lorsque qu'une réduction par sa production est effectuée.
Une production aura une méthode associée dans le GrammarEvaluator seulement si au moins l'un de ses symboles est typé dans l'EBNF.
Il existe également une méthode acceptStart qui est appelée à chaque fois que la séquence entrée est reconnue par la grammaire.
-
Tester.
Exercice 2 - Evaluation de variables
Le but de l'exercice est d'écrire un évaluateur de variables (booléennes et réelles).
Par exemple, l'analyseur devra évaluer les variables définies comme dans le code suivant :
let x = true;
let y = false != x;
let zoo1 = 2.4 - 1.2 * 2;
let zoo2= zoo1 == 2.1;
Le code à reconnaître est une séquence d'instructions d'affectation (let var = expr;):
var est une variable et expr une expression.
Une expression peut contenir des valeurs de types booléen ou réel.
Les valeurs sont sous la forme de variables (ex. x et zoo1) ou de constantes (ex. true,false et 2.4).
Les opérateurs sont +,- et * (pour les réels) ainsi que == et != (pour tous les deux types).
L'évaluation des variables ci-dessus donnera:
x = true
y = true
zoo1 = 0.0
zoo2 = false
-
Modifier les règles lexicales et la grammaire de l'exercice précédent pour reconnaître des séquences d'affectations de variables.
Ne vous souciez pas, pour l'instant, des contraintes sur les types dans la grammaire !!
-
Dans l'EBNF, typer maintenant les terminaux et non-terminaux pour la future implémentation du TerminalEvaluator et du GrammarEvaluator.
Une expression (expr) sera désormais un Object car elle peut être évaluée soit comme un booléen soit comme un réel.
-
Préparer le squelette d'un nouvel analyseur en vous basant sur Exo1AnalyzerMain.java et sur les interfaces TerminalEvaluator et et GrammarEvaluator générées à partir du nouvel EBNF.
- Implémenter le TerminalEvaluator.
- Ecrire une classe Exo2Exception qui implémente une RuntimeException contenant un message d'erreur.
-
Implémenter le GrammarEvaluator.
La méthode acceptStart devra afficher la valeur des différentes variables utilisées.
Indications:
- Ecrire et utiliser une méthode double asDouble(Object exp) qui renvoie la valeur de l'objet exp si c'est un Double ou lève une exception Exo2Exception sinon.
- Utiliser la méthode equals pour tester l'égalité et l'inégalité entre les expressions.
- Utiliser une HashMap<String,Object> pour stocker les valeurs des variables.
© Université de Marne-la-Vallée