Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
TP N°1
Une fois l’analyseur lexical est mis en œuvre, il analyse le fichier source pour chercher les
occurrences d’expressions régulières.
Lorsqu’un mot est reconnu, l’analyseur lexical exécute le code C correspondant à l’expression
régulière qui dénote ce mot.
Procédure :
- On crée le fichier source avec un éditeur de texte.
- On compile le fichier source par : flex scan.flex
- On compile le fichier obtenu "lex.yy.c" par : gcc -o scan lex.yy.c –lfl
%{
#include<stdio.h>
#define N 100
int x = 12;
float z = 1.5; // une variable globale
int fct(int, float); // une fonction globale
%}
- « Nom » : un identificateur qui sert à nommer une expression régulière pour l’avoir
référencer ultérieurement.
- Le nom doit être non indenté.
- Une définition d’une expression régulière doit tenir sur une seule ligne.
Exemple :
2
o Un motif est une expression régulière qui peut référencer les expressions régulières
définies dans la section des définitions.
o Une action est séparée de son motif par au moins un espace (ou une tabulation).
o L’analyseur lexical déclenche une action autant de fois qu’il trouve un lexème qui
correspond au motif associée à cette action.
o Les règles sont toutes écrites entre les deux symboles « %% ».
Exemple :
Exemple (complet) :
3
'\n'.
[abj-oZ] a, b, j, k, l, m, n, o,Z}
r{2, 5} 2, 3, 4 ou 5 occurrences de r
4
Le compilateur Flex traduit le fichier de description en un programme source C
comportant une routine « yylex() ».
La routine « yylex() » active sur l’entrée standard un AFD construit à partir des
expressions régulières et déclenche les actions décrites lorsqu’un lexème est reconnu.
Flex produit un seul AFD, union des automates correspondant à chacune des
expressions régulières.
Les états finaux de cet automate indiquent l’action à réaliser.
Les transitions entre états sont représentées dans une table de transition.
Cette table est parcourue dans la routine « yylex() » par le code qui anime l’automate.
5
Par défaut, la routine « yylex() » relance l’automate après la terminaison de chaque
action et ne se termine qu’à la fin du fichier d’entrée : la boucle est alors interne à «
yylex() » et les actions du fichier Flex font tout le travail du traitement des unités
lexicales.
L’autre méthode consiste à forcer la terminaison de « yylex() » pour chaque unité
lexicale reconnue en terminant chaque action par une instruction « return i ; » ou « i »
est une expression de type « int ». Le traitement associé à une unité lexicale peut alors
être complété par l’appelant et la boucle est réalisée par ce dernier.
Exemple :
– on peut spécifier la longueur maximale d’un lexème en utilisant la macro-définition
suivante :
2. REJECT
- demande à l’analyseur de poursuivre avec la ”deuxième meilleure” règle qui convenait
à l’entrée (ou un préfixe de l’entrée).
- Le code suivant va compter à la fois le nombre de mots en entrée, et appeler la routine
« My_routine() » à chaque fois que « bon » est rencontré :
6
7
- Sans REJECT, toute occurrence de ”bon” dans l’entrée ne sera pas comptée comme
mot, car l’analyseur n’exécute normalement qu’une action par élément lexical.
- On voit très bien alors que l’action REJECT favorise à un analyseur d’exécuter plus
qu’une action à la fois.
4. La routine yymore() :
- Indique à l’analyseur que la prochaine fois qu’il reconnaît une règle, le lexème
correspondant devra être concaténé à la valeur actuelle de yytext au lieu de le remplacer.
- Exemple : pour l’entrée « mega-octets », le code suivant écrira ”mega-mega-octets” :
5. La routine yyless(n) :
-Renvoie tout sauf les « n » premiers caractères du lexème courant dans le flot d’entrée, où ils
seront réexaminés quand l’analyseur recherchera la correspondance suivante.
-Les variables globales yytext et yyleng sont ajustées adéquatement.
6. La routine yyless(n) :
7. La routine yyterminate() :