:: Enseignements :: ESIPE :: E4INFO :: 2010-2011 :: Génération de code ::
[LOGO]

AST et visiteurs - Correction


Le but de ce TP est de se re-familiariser avec le design pattern visiteur dans le but de parcourir l'AST produit par l'analyse syntaxique.

Préliminaires

Exercice 1 - AST et Visiteur

Soit la grammaire G:

start -> expr
expr -> expr '+' expr
expr -> 'val'

Les symboles '+' et 'val' sont des tokens: 'val' identifie un nombre réel. Le but de l'exercice est d'implanter manuellement la hiérarchie de classes utilisée pour construire l'AST, puis d'écrire un visiteur pour évaluer les expressions arithmétiques reconnues par la grammaire.

  1. Construire manuellement la hiérachie de classes associée à la grammaire, qui sera utilisée pour construire l'AST. Ne pas utiliser Tatoo!
  2. Construire manuellement l'AST associé à l'expression "2.1+10.0+5".
  3. Modifier les classes pour permettre l'utilisation d'un Visiteur. Ecrire une interface Visitor associée à la grammaire.
  4. Ecrire un visiteur qui évalue les expressions arithmétiques.
  5. Tester sur l'AST.


Node.java

Expr.java (symbole non-terminal Expr)

Start.java (symbole non-terminal Start et production start -> expr)

ExprVal.java (production expr -> 'val')

ExprPlus.java (production expr -> expr '+' expr)

Interface Visitor

EvalVisitor



Exercice 2 - Génération automatique de l'AST avec Tatoo et évaluation

Le but de l'exercice est de refaire l'évaluation d'expressions arithmétiques à l'aide d'un visiteur utilisant les classes générées par Tatoo.

  1. Dans le fichier exo2.ebnf, faire en sorte d'associer chaque terminal "utile" à un type, pour qu'il puisse être exploité lors de l'évaluation d'une expression arithmétique par un visiteur.
  2. Générer les classes associées au lexeur, au parseur et à l'AST à l'aide de la tâche ant définie dans build.xml. Regarder les classes générées dans le package ast. A quoi servent-t-elles ?
  3. Dans la classe Td2AnalyzerMain, implanter l'interface Td2TerminalEvaluator chargée d'évaluer la valeur des terminaux.
  4. Ecrire une classe EvalVisitor qui calcule et affiche le résultat de l'expression arithmétique, en implémentant l'interface Visitor générée dans le package ast. Pour information, il est possible d'utiliser le type Void.


exo2.ebnf

EvalVisitor étendant la classe Visitor générée par Tatoo



Exercice 3 - Affichage d'expressions arithmétiques

Ecrire un nouveau visiteur PrintVisitor chargé d'afficher l'expression arithmérique. Si l'on entre l'expression "12.5 + 12 * 2 + 3", le visiteur devra afficher "+ + 12.5 * 2 12 3". Pour information, vous pouvez utiliser le type Void comme type de retour des méthodes visit ou comme celui des paramètres.



PrintVisitor

Td2Exo2AnalyzerMain



Exercice 4 - Evaluation de variables

Le but de l'exercice est d'écrire un évaluateur de variables réelles. Par exemple, l'analyseur devra évaluer les variables définies comme dans le code suivant :

			let x = 2.5;
			let zoo1 = x - 1.2 * 2;
		
Le code à reconnaître est une séquence d'instructions d'affectation (let var = expr;): var est une variable et expr une expression arithmétique. Les valeurs sont sous la forme de variables (ex. x et zoo1) ou de constantes (ex. 2.4). Les opérateurs sont +,- et *.

L'évaluation des variables ci-dessus donnera:
				x = 2.5
				zoo1 = 0.1
			

  1. Modifier les règles lexicales et la grammaire de l'exercice précédent pour reconnaître des séquences d'affectations de variables.
  2. Dans l'EBNF, typer maintenant les terminaux "utiles". Générer les classes de base de l'analyseur avec Tatoo (le fichier de configuration ant est build4.xml).
  3. Implémenter le Td2Exo4TerminalEvaluator dans la classe Td2Exo4AnalyzerMain.
  4. Implémenter un visiteur permettant d'évaluer et afficher les variables.
    Indications:
    • Utiliser une HashMap<String,Double> pour stocker les valeurs des variables.


exo4.ebnf

EvalVisitor

Td2Exo4AnalyzerMain