:: Enseignements :: ESIPE :: E4INFO :: 2008-2009 :: Compilation ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Introduction à l'analyse lexicale |
Le but de ce TD est d'implanter un analyseur lexical en utilisant le
générateur de compilateurs
Tatoo pour récupérer des lexèmes reçus
sur un flot.
Exercice 1 - Préliminaire
Télécharger et installer la version de Tatoo
ici.
L'archive contient un répertoire
lib contenant les archives jar nécessaires et un répertoire
doc contenant la javadoc.
Les instructions d'utilisation sont décrites dans le
tutoriel.
Exercice 2 - Analyse lexicale simple
Écrire, en utilisant le générateur de compilateurs Tatoo, un programme qui extraît les chaînes ab* d'un texte arrivant en entrée standard.
Ce texte n'est susceptible de contenir que ce type de chaînes !
Pour cela, vous suivrez les étapes suivantes, en vous aidant de l'aide du tutoriel:
- décrire les règles dans un fichier .ebnf ;
- à l'aide d'une tâche ant, générer les classes implantant les automates associées aux règles ;
-
écrire l'analyseur lexical qui utilise les classes générées;
cet analyseur lexical affichera chaque chaîne ab* reconnue en précisant leur taille.
Rappel: pour terminer la saisie en entrée standard, faire Ctrl-d.
- Tester votre programme.
- Que se passe-t-il lorsque vous validez votre saisie par un retour à la ligne ? Pourquoi?
- Permettre au lexeur d'ignorer le retour à la ligne. Que se passe-t-il ?
- Entrer dans le lexeur des chaînes non valides (ex. "ddfe") suivies de chaînes valides. Qu'observez-vous?
-
Faire en sorte que le lexeur soit strict, c'est-à-dire que lorsqu'il rencontre une chaîne non valide, le programme se termine.
Pour cela, vous devrez remplacer la DefaultLexerErrorRecoveryPolicy par une NoErrorRecoveryPolicy.
(cf. Javadoc de la classe fr.umlv.tatoo.runtime.tools.builder)
-
Personnaliser l'affichage de l'erreur en attrapant l'exception LexingException.
Utiliser, par exemple, la méthode getLocalizedMessage() de cette classe pour afficher où se trouve l'erreur.
Exercice 3 - Analyse lexicale des commentaires
En suivant les mêmes étapes que pour l'exercice précédent, écrire, en utilisant le générateur de compilateurs Tatoo, un programme qui extraît les commentaires d'un fichier texte passé en argument.
Les commentaires correspondent à ceux du Java et du C : sur une ligne avec // et sur plusieurs lignes avec /* .... */.
Indiquer le type de commentaire reconnu.
On suppose que le texte peut contenir autre chose que des commentaires.
Modifier votre analyseur pour qu'il affiche le texte tel quel sans les commentaires.
Exercice 4 - Analyse lexicale des commentaires avec activateur
Avec Tatoo, il est possible d'activer certaines règles suivant l'état où l'on se trouve dans la reconnaissance des lexèmes.
Pour cela, on utilise la classe
RuleActivator (cf. Javadoc de Builder).
Ce système permet de simplifier les expressions rationnelles utilisées.
Le but de cet exercice est d'implanter un tel système pour la reconnaissance des commentaires.
Il existe trois états :
- le cas où l'on est en dehors d'un commentaire (OutOfComment)
- le cas où l'on est dans un commentaire sur une ligne (InLineComment)
- le cas où l'on est dans un commentaire sur plusieurs lignes (InMultilineComment)
-
Pour chacun de ces trois états, imaginer les différentes règles que l'on doit activer.
Attention, les règles sont différentes de celles de l'exercice précédent !
Par exemple, lorsque l'on est dans l'état OutOfComment, il faut activer trois règles :
- (A) une règle reconnaissant '//'
- (B) une règle reconnaissant '/*'
- (C) une règle reconnaissant n'importe quel caractère
Attention, l'ordre des règles a de l'importance !
Si l'on est dans cet état et que la règle A a été utilisée pour reconnaître le token courant, on passe dans l'état InLineComment et les règles associées sont activées.
- A partir de cette réflexion, modifier le fichier .ebnf
- Ecrire une classe State qui représente un état dans la reconnaissance. Elle contiendra une méthode getActiveRules qui renvoie le tableau des règles actives lorsque que l'on est dans cet état. On pourra faire une énumération de State: ex. OutOfComment, InLineComment, InMultilineComment.
- A partir de là, implanter un RuleActivator dont la méthode activeRules() dépendra de l'état courant de la reconnaissance.
- Modifier le LexerListener implanté dans l'exercice précédent. La méthode ruleVerified(...) modifiera l'état courant suivant la règle qui a permis de reconnaître le token courant.
- Ajouter le RuleActivator lors de la création du lexeur puis tester votre analyseur.
© Université de Marne-la-Vallée