TP1 Ing
TP1 Ing
TP1 Ing
1. Rappel :
La tâche principale d’un analyseur lexical est de lire un texte source (suite de caractères) et
de produire comme résultat une suite d’unités lexicales. La reconnaissance des unités
lexicales est basée sur la notion d’expressions régulières.
Théoriquement, la construction d’un analyseur lexical consiste à :
Généralement, l’implémentation à la main d’un diagramme avec un grand nombre d’états est
une tâche qui n’est pas assez facile. En outre, si on a besoin d’ajouter ou modifier une unité
lexicale, il faut parcourir tout le programme pour effectuer les modifications nécessaires.
Plusieurs outils ont été bâtis pour simplifier cette tâche. (Flex par exemple)
exemple)
L’outil Flex (version GNU de LEX) est un générateur d’analyseurs lexicaux. Il accepte en
entrée des unités lexicales sous formes d’expressions régulières et produit un programme
écrit en langage C qui, une fois compilé, reconnaît ces unités lexicales. L’exécutable obtenu
lit le texte d’entrée caractère par caractère jusqu’à l’identification de plus long préfixe du
texte source qui concorde avec l’une des expressions régulières.
1
Un fichier de spécifications Flex se compose de quatre parties :
%{
Les déclarations en c
%}
%%
Règles de traduction
%%
Définitions régulières :
Une définition régulière permet d’associer un nom à une expression régulière et de se référer
par la suite dans la section de règles à ce nom, plutôt qu’à l’expression régulière.
Règles de traduction :
exp1 { action1}
exp2 { action2}
... …
expn { actionn}
Chaque expi est une expression régulière qui modélise une unité lexicale.
Chaque actioni est une suite d'instructions en C.
Variables :
yyin: fichier de lecture (par défaut: stdin)
yyout : fichier d’écriture (par défaut: stdout)
char yytext [] : tableau de caractères qui contient le lexème accepté.
int yyleng : la longueur du lexème accepté.
Fonctions :
int yylex ( ) : fonction qui lance l’analyseur.
Int yywrap ( ) : fonction qui est toujours appelée à la fin du texte d’entrée. Elle retourne 0 si
l’analyse doit se poursuivre et 1 sinon.
2
^ comme le premier caractère de l’expression, il signifie le début de la ligne ou le
complément dans [ ] \”[^\”\n]*\”
%%
(0|1)+ printf ("c'est un nombre binaire");
. * printf ("ce n'est pas un nombre binaire");
%%
int yywrap(){return 1;}
main ()
{
yylex ();
}
3. Exercices :
1. Modifier l’exercice précédent pour qu’il n’affiche que les nombres binaires reconnus.
2. Ecrire et compiler le fichier de spécifications suivant :
3. Tester les entrées babbaaab abbb aabb baabbbb bbaabbba baabbbbab aaabbbba.
3
4. Même question en permutant les deux lignes :