Téléchargez aux formats PDF ou lisez en ligne sur Scribd
£4 itablissement : ISSAT Gafsa
Département : Informatique et Télécommunication
Matiére
Techniques de Compilation Enseignante : Yosra Didi
‘Niveau:
ene Année LISI: GloT & GRx
TP N°l
L’outil (F)lex
1. Rappel:
La tiche 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 & :
- Définir les unités lexicales.
- Modéliser chaque unité lexicale par une expression réguliére.
- Représenter chaque expression réguliére par un diagramme de tra
- Construire le diagramme global.
- Implémenter 3 la main le diagramme obtenu,
Généralement, l'implémentation a la main d’un diagramme avec un grand nombre d’états est
jouter ou modifier une unité
une tache qui n’est pas assez facile, En outre, si on a besoin d’
lexicale, il faut parcourir tout le programme pour effectuer les modifications nécessaires.
Plusieurs outils ont été batis pour simplifier cette tache. (Flex par exemple)
2, Flex:
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é, reconnait ces unités lexicales. L’exécutable obtenu lit le
texte d’entrée caractére par caractére jusqu’a l’identification de plus long préfixe du texte
source qui concorde avec I’une des expressions réguliéres.
U. Lexicales : Expr. Régulléres. —p| Flex |—> Lexyy.c—»| Compilateur
¢
_—
Texte source —»| Analyseurlexical |» Unités lexicales : lexémes...Un fichier de spécifications Flex se compose de quatre parties :
Mt
Les déclarations en ¢
%}
Déclaration des définitions réguliéres
%%
Régles de traduction
%%
Bloc principal et fonctions auxiliaires en C
Définitions régulidres :
Une définition réguligre permet d’associer un nom a une expression réguliére et de se référer
par la suite dans la section de régles a ce nom, plutét qu’a l'expression réguliére.
Régles de traductio
exp: { action:}
exp: { actions}
expa { actions}
‘Chaque exp: est une expression réguliére qui modélise une unité lexicale,
‘Chaque action; est une suite d'instructions en C.
3. Premier pas avec Flex :
1. Commencer par l’installation des outils Flex et CodeBloks (outils de développement utilisant
Ie langage C).
2. Ecrire le programme Flex
%%
(0|1)+ printf ("c'est un nombre binaire");
.* printf ("ce n'est pas un nombre binaire"
%W%
int yywrapQ {return 1;)
main (Q)
{
yylex 0;
}3, Ouvrir un nouveau fichier texte et taper le code ci-dessus. Le fichier doit étre enregistré avec
extension .| (exemple : binaire.l)
4, Placer le fichier obtenu dans ‘C:\Program Files\GnuWin32\bin
5. A partir de invite de commande, lancer la commande :
C:\Program Files\GnuWin32\bin> flex binaire.1
6. En cas de réussite, le fichier lex.yy.c est généré dans le méme répertoire.
7. Exécuter le programme
8. Modifier l’exercice précédent pour qu’il n'affiche que les nombres binaires reconnus.
Exercice d’application :
Ecrire et compiler le fichier de spécifications suivant :
Wi
ab { printf("Nombre pair de ‘a et'b!: Yes\n", yytext); }
ba { printf{"Nombre pair de 'a' et'b!: Yos\n", yytext); }
(a+)(b+)+ { printi("Des a" d'abord et des 'b' ensuite : %s\n", yytext); }
(alb)+ {/* ignorer les autres occurrences de'a' et 'b!*/ }
. {/* ignorer tout autre caractére */ }
“We
int yywrap() {
retum 1;
}
int main() {
yylex(;
retum 0;
}
3. Tester les entrées ab, a, aaa, ba, aabb, abab, bbaa, aabbbaabb
4, Méme question en permutant les deux lignes :
(alb)+ { /* ignorer les autres occurrences de ‘a’ et'b! */ }
ab { printf("Nombre pair de ‘a et'b' : Yes\n", yytext); }
ba { printf("Nombre pair de 'a' et 'b' : %sin", yytext); }
5. Y'a-t-il une différence ? Laquelle ? Pourquoi ?
6. On considére l’unité lexicale id définie comme suit : un identificateur est une séquence de
lettres et de chiffres. Le premier caractére doit étre une lettre. Ecrire a l'aide de Flex un
analyseur lexical qui permet de reconnaitre a partir d'une chaine d’entrée I’unité lexicale id.7. Modifier 'exercice précédent pour que Ianalyseur lexical reconnaisse les deux unités
lexicales id et nb sachant que nb est une unité lexicale qui désigne les entiers naturels.
5. Annexe :
Variables :
yin fichier de lecture (par défaut : stdin)
yout fichier d°écriture (par défaut : stdout)
char yytext [] : tableau de caractéres qui contient le lexéme accepté.
int yyleng : 1a longueut du lexéme accepté.
Fonctions :
int yylex () : fonction qui lance ’analyseur.
Int yywrap () : fonction qui est toujours appelée 4 la fin du texte d’entrée. Elle retourne 0 si l'analyse
doit se poursuivre et 1 sinon,
Expressions régulidres Flex :
cle caractére ¢
. tout caractére seul, sauf retour a la ligne
[J wn des caractéres spécifiés [abed ABCD0123]
- un intervalle de caractére si dans [ ] [a-dA-D0-3]
?.0 ow 1 occurrence 1079 est 109 ou 19
étition (zéro ou plus) [ab]*
+ répétition (au moins une) [ab]}+ est [ab][ab]*
| alternative 000|1 10]101/011
() groupement d’expressions (0}2/418)*
{} permet de définir des répétitions if (def)? est if(def)\{0,1}
$ comme le dernier caractére de "expression, il signifie la fin de la ligne,
‘comme le premier caractére de I’expression, il signifie le début de la ligne ou le complément dans
oven”
Exercice 1:
Ecrire un programme Flex qui remplace chaque occurrence du mot "bon" par "mauvai
Exercice 2
Ecrire un programme Flex qui lit une chaine de bits et remplace chacun de ces bits par une
lettre "b", mais aussi, il remplace un "0" suivi d’un autre "0" par une lettre "a" et remplace un
4"1" suivi d’un autre "1" par une lettre "c
Exercice 3
Forire un programme Flex qui compte le nombre d’ occurrence de chaque lettre minuscule dans
tun fichier texte. Le résultat doit étre stocké dans un tableau « t » de 26 entiers : on met dans «
1{0] » le nombre d’oceurrence de Ia lettre "a", ... et ainsi de suite. Le programme affichera
ensuite ce tableau.
Exercice 4
Ecrire un programme Flex qui extrait d'un fichier texte tous les mots dont la longueur est
strictement inférieure & 10. Un mot étant une chaine de lettres (minuscules ou majuscules), Il
ya trois fagons pour effectuer cet exercice
1. enutilisant strlen sur la variable yytext.
2. en utilisant la variable yyleng,
3. sans utiliser ni strlen, ni yyleng.
Exercice 5
Ecrire un programme Flex qui extrait dun fichier texte, le mot le plus court, le mot le plus
Tong et les mots qui sont des palindromes.