0% ont trouvé ce document utile (0 vote)
127 vues5 pages

Flex

Cours outils flex

Transféré par

Karim Ammani
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
127 vues5 pages

Flex

Cours outils flex

Transféré par

Karim Ammani
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
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.

Vous aimerez peut-être aussi