TP2
Département Génie Logiciel Techniques de
et Systémes d’Information Compilatio:
GLSI Flex
(Applications)
iveau :
1** année cycle ingénieurs
Exercices 1:
1. Compléter et exécuter le programme suivant :
or
int nbl, nbc, abm;
3} =
Majuscul [A-2]
Minuscul [a-z]
nom {Majuscul} {Minuscul}+
8
{nom} — nbm++; nbc=nbe+yyleng;
{\n] nbl++;
5 nbe++;
88
int yywrap() {return 1;}
int main{
yylex();
print£("td %d %d",nbe,nbl,nbm) ;
i
Le code est donné comme suit :
2. Modifier le programme pour qu’il puisse lire et traiter ces données d'un fichier texte.
a
int nbl, nbc, nbm;
}
Majuscul [A-Z)
Minuscul [a-z]
nom {Majuscul} (Minuscul} +
a8
{nom} nbm++;_nbe=nbetyyleng;
t\a] nbl++;
: nbe++;
38
int yywrap() (return 1;)
int main(int arge, char ** argv)
{
if (argo)
yyin=fopen(argv[1], "r");
yylex();
print£("td 4d %d",nbe, nbl, nbm) ;
i
Ist 1
2008-2010Note:
argc : est un entier qui est égal au nombre de paramétres dans la ligne de commande.
argv : est un pointeur sur un tableau de pointeurs : chaque pointeur du tableau pointe sur le
début des chaines respectives (chaines représentant les paramétres).
3. Compiler le programme avec Flex pour obtenir lex.yy.c. Compiler lex.yy.c avec
CodeBloks pour obtenir lex.yy.exe. Créer dans le méme répertoire un fichier texte qui
contient un ensemble de mots et de lignes (exemple : test.txt). A partir de Vinvite de
commande, exécuter la commande lex.yy.exe test.txt.
Exercice 2 :
Parmi les taches secondaires d’un analyseur lexical : L’élimination des commentaires, des
espaces, gestion de numéros de lignes du programme source...etc.
Ecrire & V’aide de Flex un analyseur lexical qui permet de supprimer les lignes qui
commencent pat # (considérons que chaque ligne qui commence par # est un commentaire),
éliminer les espaces, remplacer les ‘,’ par des ‘,’ et retoumner le reste inchangé, L’analyseur
doit aussi afficher le nombre de lignes du programme source.
Exercice 3:
On considére un répertoire téléphonique ott chaque ligne est écrite selon le format suivant :
Channouf belgacem @ 04 25 32 15 88
Ben salah jalel @85 75 89 56 56
Soufi mohamed amine@ 45 78 12 37 57
Touons omar chatty @78 65 42 15 19
Brun leon paul @54 89 67 32 45
Donner et exprimer en Flex les définitions régulitres pour décrire nom, prénom et téléphone.
1. On s’est restreint aux noms et prénoms exclusivement composés de caractéres
alphanumériques.
2. Le nom doit commencer par une lettre majuscule.
3. On pourra avoir plusieurs prénoms (écrits qu’en minuscules) séparés par un nombre
quelconque de blancs.
4, Le numéro de téléphone est composé de 5 paires de digits séparées par un blanc.
Exercice 4:
1. Ecrire a l'aide de Flex un analyseur lexical qui reconnait les unités lexicales
suivantes :
ENTIER : une constante entiére
REEL : une constante réelle
IDENT : un identificateur type C
OP-ARTHM: +,-,*,/
OP-REL:<,>,<=
AFFE
MOTCLE: if, else, while
CHAINE : une chaine de caractéres entre guillemets
COMMENTAIRE : une ligne commengant par #
Ist 2 2009-20102. Votre analyseur devra ignorer les espaces, tabulations, passages & la ligne et les
lignes vides.
3. Afficher pour chaque lexéme, son type (ENTIER, REEL....etc.) et sa valeur.
4, Traiter quelques cas d’erreurs en affichant le numéro de la ligne, le type de ’erreur et
la chaine qui pose le probléme.
Par exemple, si le fichier en entrée est le suivant :
" fichier exemple "
ifa>b a=a+2
"chaine deux " # commmentaire
3545.3 -04
trucl x1 1x
"chaine incomplete
t
fin
L’analyseur doit indiquer :
OP- ARTHM: +
ENTIER :2
CHAINE : "chaine deux"
COMMENT : # commmentaire
REEL : 3.500000
"Chatne incompléte ** Erreur : ligne 6 ** fin de chaine attendue
Ist 3 2009-2010