TP 1
TP 1
TP 1
Conseils préliminaires
— Le sujet est long, mais plusieurs exercices (et leurs solutions !) sont très courts.
— Les espaces ont une signification particulière en flex. En particulier, les défi-
nitions régulières (premier bloc) ou des motifs d’unités lexicales (second bloc)
doivent commencer en tout début de ligne.
— Une ligne commençant par un ou plusieurs espaces sera interprétée comme du
code C. On peut en profiter pour insérer des commentaires C précédés par des
espaces, sans que cela ne gêne le fonctionnement de l’analyseur lexical.
— Scénario d’utilisation de flex :
— Écrire le programme flex dans un fichier portant l’extension .l, par exemple
tp1-ex1.l.
— Compiler l’analyseur lexical avec flex tp1-ex1.l, ceci engendre un fichier
lex.yy.c.
— Compiler le fichier C obtenu avec gcc, puis tester l’exécutable a.out obtenu
(fonctionnement semblable à un filtre Unix tel que cat).
— Si le compilateur gcc produit un message d’erreur relatif à l’absence de la fonc-
tion yywrap(), ajouter une option %option noyywrap en en-tête du fichier .l,
ou compiler le fichier lex.yy.c avec l’option de liaison -lfl.
— Une condition de démarrage permet de créer des « mini-analyseurs » au sein de
l’analyseur principal.
Pour déclarer une condition de démarrage exclusive, on ajoute l’en-tête %x NOM,
où NOM est le nom de la condition. Les règles dont les motifs sont préfixés par
<NOM> ne seront pris en compte que si l’on a préalablement exécuté l’action
BEGIN(NOM);, et tous les autres motifs sont ignorés. Pour revenir à la condition
initiale, on exécute BEGIN(INITIAL);.
Une condition de démarrage inclusive fonctionne de manière similaire, à la dif-
férence qu’elle doit être déclarée avec la directive %s NOM, et que les règles sans
condition restent actives lorsqu’on exécute BEGIN(NOM);.
1
x Exercice 1. Que fait le programme flex suivant ?
"/*" printf("<SE>");
"*/" printf("<ES>");
"\\n" printf("<ASN>");
"("|"["|"{" printf("<PO>");
")"|"]"|"}" printf("<PF>");
"?"+ printf("<?;%d>",yyleng);
. ;
%%
int main() {
yylex();
return 0;
}
Explorer le contenu du fichier lex.yy.c engendré par la commande flex.
x Exercice 3.
1. Écrire une expression rationnelle lex qui définit les commentaires du C (ouverts
par /* et fermés par */, potentiellement sur plusieurs lignes).
Rappel : la norme précise qu’on ne peut pas imbriquer les commentaires C les
uns dans les autres.
2. Améliorer la lisibilité de la reconnaissance des commentaires en utilisant des
conditions de démarrage (voir l’extrait du manuel de flex fourni).
3. Reprendre les unités lexicales chaîne Pascal et chaîne C de l’exercice précédent
en utilisant les conditions de démarrage.
2
x Exercice 4. Mots de moins de 10 lettres
Ecrire un programme flex qui extrait d’un texte tous les mots de moins de dix
lettres, sans utiliser la fonction strlen ou la variable yyleng.
3
x Exercice 8. Coupures de mots
Les traitements de texte coupent parfois les mots en fin de ligne, en insérant un tiret
juste avant le retour à la ligne. Ecrire un programme flex qui supprime les coupures
d’un texte, en rétablissant les mots en fin de ligne. On fera attention au caractère qui
suit la fin du mot, de façon à ne pas laisser d’espace en début de ligne et à ne pas
envoyer une ponctuation à la ligne. Si l’on prend le texte suivant :
pour me distraire
.
mais ceci :