:: Enseignements :: ESIPE :: E4INFO :: 2008-2009 :: Compilation :: Tutoriel Tatoo ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Implanter un analyseur lexical |
Génération des classes du lexeur par Tatoo
La première étape est d'écrire les règles de reconnaissance des lexèmes dans le fichier de spécification EBNF.
Cette étape est décrite dans le chapitre
description du fichier EBNF.
Il est alors possible de générer un package contenant les classes Java implémentant les composants fondamentaux du lexeur.
Il contient deux classes :
-
LexerDataTable qui permet de créer une table qui pour chaque règle associe un automate de reconnaissance.
-
RuleEnum qui est une énumération des règles.
La génération de ce package dédié au lexeur peut être réalisée à l'aide d'une tâche
ant.
Pour l'exemple,
simple-lexer, le fichier
build.xml permet de générer le package dédié au lexeur dont les règles sont décrites dans
simple-lexer.ebnf.
La tâche associée génère un package
fr.umlv.tatoo.tutorial.simplelexer.lexer contenant les classes
LexerDataTable et
RuleEnum.
Le package est placé dans le répertoire de destination
gen-src.
Si vous utilisez Eclipse :
Ne pas oublier d'importer dans votre projet les librairies
tatoo.jar et
tatoo-runtime.jar qui se trouvent dans le répertoire
lib.
Ne pas oublier non plus de mettre
gen-src comme répertoire possible de vos sources.
Utiliser le menu
properties du projet, puis cliquer sur
Java Build Path.
ATTENTION : ne pas oublier pas de regénérer le package à chaque fois que vous modifiez le fichier .ebnf
et de rafraichir le répertoire
gen-src dans l'arborescence d'Eclipse (touche F5).
Création et utilisation du lexeur
Une fois le package dédié au lexeur généré, il s'agit maintenant de créer le lexeur à appliquer sur un buffer de caractères.
La classe
fr.umlv.tatoo.runtime.tools.builder.Builder dans
tatoo-runtime.jar contient des méthodes simples à cet effet (cf. la javadoc).
La création du lexeur nécessite, au minimum, d':
- un LexerDataTable créé à partir de la méthode statique createTable() de la classe LexerDataTable générée par Tatoo.
- un Reader lisant le texte en entrée que l'on veut compiler
- un listeneur de type LexerListener<R,B> indiquant les actions à réaliser chaque fois qu'un token est reconnu.
(R est le type des règles (en général, RuleEnum), B est le type des buffers (en général, TokenBuffer)).
La création du lexeur de type
SimpleLexer se fait à l'aide de la méthode
lexer(), comme indiqué ci-dessous :
SimpleLexer lexer = Builder.lexer(lexerDataTable).
reader(reader).
listener(lexerListener).
create();
La méthode
run() lance le lexeur.
Vous pouvez spécifier la stratégie de recouvrement des erreurs (interface LexerErrorRecoveryPolicy).
Par défaut (classe DefaultLexerErrorRecoveryPolicy), le lexeur est permissif et autorise des caractères non reconnus par les règles.
Dans ce cas, il affiche un message mais continue au caractère suivant.
Pour que le lexeur soit plus strict, il faut lui asssigner une statégie
NoLexerErrorRecoveryPolicy (cf. Javadoc de
Builder).
Ci-dessous nous donnons l'exemple du fichier EBNF et de l'implantation d'un lexeur qui reconnaît les tokens des expressions entrées dans une calculatrice simple et indique pour chacun son type.
© Université de Marne-la-Vallée