:: Enseignements :: ESIPE :: E4INFO :: 2008-2009 :: Compilation :: Tutoriel Tatoo ::
[LOGO]

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.