ANALYSE LEXICALE
PHILIPPE LANGEVIN
TABLE DES MATI`
ERES
1. Liste chaˆ
ın´
ee 1
2. Table de symboles 2
3. La commande flex 3
4. Temps de calculs 4
5. Fonction de hachage 4
6. Hachage modulaire 5
7. Travaux dirig´
es 6
8. Travaux pratiques 7
L’analyse lexicale est la premi`
ere phase d’une compilation de texte qui consiste
`
a d´
ecortiquer une source de caract`
eres pour d´
eterminer une s´
equence de lex`
emes :
identificateurs, nombres et symboles sp´
eciaux etc... Les identificateurs rencontr´
es
au cours de l’analyse sont m´
emoris´
es dans une table de symboles utile aux autres
phases du compilateur : analyse syntaxique et production de code. L’objectif de
cette lec¸on est de construire un analyseur lexical qui g`
ere une table de d’identifica-
teurs dans une situation simplifi´
ee. Nous supposerons que la source est un fichier
de caract`
eres contenant des lettres de l’alphabet, quelques symboles de ponctua-
tions et l’espace pour s´
eparer les mots. Il s’agit de lire le texte source en une passe,
caract`
ere par caract`
ere, de former les lex`
emes et de maintenir `
a jour une liste des
mots rencontr´
es et de leur fr´
equence d’apparition. Notre probl`
eme sugg`
ere l’em-
ploi des listes chai n´
ees, dont nous pr´
esenterons une approche objet/m´
ethode qui
peut donner lieu `
a un exercice de programmation orient´
ee objet. Les fonctions de
hachages augmentent les performances de notre analyseur. Enfin, la mise en oeuvre
des algorithmes est facilit´
e par l’utilisation de la commande unix flex.
mots clefs : liste chaˆ
ın´
ee, table de symboles, analyse lexicale, fonction de ha-
chage.
1. LISTE CHAˆ
IN´
EE
Une liste chaˆ
ın´
ee est une structure de donn´
ees dynamique sur laquelle nous pou-
vons appliquer des requˆ
etes et des op´
erations de modifications. Comme dans le cas
des fichiers, un pointeur priv´
e permet l’acc`
es s´
equentiel `
a l’information. La figure
(1) repr´
esente une liste de lettre. Supposons que pointeur d’acc`
es `
a l’information
PA pointe sur le maillon gris´
e. La lecture de l’information se fait par Lire(L)
et l’affectation de l’information se fait par Ecrire(L, x) Les m´
ethodes pre-
decesseur(L) et successeur(L) d´
eplace respectivement le pointeur vers le
maillon pr´
ec´
edent et suivant. La taille d’un objet liste chaˆ
ın´
ee est variable. On peut
1
2
hb
g
fea
c
c
d
FIG. 1 – L’objet liste chaˆ
ın´
ee.
ins´
erer et supprimer des des ´
el’ements par les op´
erations d’insertions et de suppres-
sion. La m´
ethode PostInsertion(c, L) ajoute un maillon imm´
ediatement apr`
es
PA. La m´
ethode PostInsertion(c, L) fait un travail analogue. La m´
ethode
suppression(L) d´
etruit le maillon point´
e, le pointeur se d´
eplace vers le sui-
vant s’il existe et vers le pr´
ec´
edentsinon. Trois fonctions logiques permettent de
contrˆ
oler la liste : vide(L) qui renvoie vrai si la liste est vide, fin(L) retourne vrai
si PA n’a pas de successeur et debut(L) renvoie vrai s’il n’a pas de pr´
ed´
ecesseur.
Enfin, la liste peut ˆ
etre rembobin´
ee sur la tˆ
ete ou sur la queue par tete(L) et
queue(L).
Exercice 1. Utiliser votre langage favori pour implanter l’objet liste chaˆ
ın´
ee et les
m´
ethodes associ´
ees.
RECHERCHE( x, l)
DONNEES x : MACHIN
l : LISTE DE MACHIN
DEBUTSI VIDE(l) ALORS RETOURNER(0)
POINTETETE(L);
TANTQUE NON FIN(L) ET ( x <> INFO(l) )
SUCCESEUR(L)
RETOURNER( NON FIN(l) )
FIN
2. TABLE DE SYMBOLES
L’analyse lexicale consiste en premier lieu `
a convenir de l’alphabet Ades ca-
ract`
eres sens´
es apparaˆ
ıtre dans le fichier source. Dans notre exemple, Aest r´
eduit
aux lettres et `
a l’espace. Nous devons aussi pr´
eciser la grammaire r´
eguli`
ere qui
d´
efinit le langage des lex`
emes `
a reconnaˆ
ıtre. Les caract`
eres interdits sont ignor´
es
et pourront d´
eclencher des messages d’alertes.
LEXICAL ( texte )
3
texte : FICHIER
lst : LISTE
mot : CHAINE
DEBUT
INITIALISER( lst )
TANTQUE NON FINFICHIER( texte )
mot = LEXEME( texte )
ENTETE( lst )
TANTQUE NON FINLISTE( lst ) ET ( MOT(lst) <> mot)
SUCCESSEUR(lst)
SI FINLISTE(lst) ALORS POSTINSERTION(mot, lst)
SINON MISE-A-JOUR(lst)
FIN
On suppose une lecture s´
equentielle d’un fichier de caract`
eres t. La proc´
edure
LEXEME(t) renvoie l’expression du lex`
eme courant qui est recherch´
e dans la liste l
s’il est trouv´
e alors la fr´
equence est incr´
ement´
ee par la proc´
edure MISEAJOUR(l)
sinon un nouveau maillon est ins´
erer en fin de liste.
3. LA COMMANDE FLEX
L’implantation de l’analyseur lexical est imm´
ediate `
a partir de l’outil syst`
eme
flex ( ex lex). Utiliser un copier/coller de la page du manuel de la commande
flex,`
a partir des exemples propos´
es vous ´
editez un fichier mots.lex qui d´
ecrit
le langage des identificateurs :
%{
int traitement( char* mot)
{
// A VOUS DE COMPLETER !
}
%}
ID [a-z][a-z0-9]*
%%
{ID} traitement(yytext);
. printf( "caracteres invalides : %s\n", yytext );
%%
int main( int argc, char** argv )
{
++argv, --argc;
if ( argc > 0 )yyin = fopen( argv[0], "r" );
else yyin = stdin;
yylex();
}
La commande flex appliqu´
ee `
amots.lex construit une source Cqu’il suffit
de compiler par gcc -o mbots yy.lex.c -lfl. Voil`
a, tout es dit, `
a vous
de jouer!
4
4. TEMPS DE CALCULS
Le temps de calculs de l’algorithme Lexical(t) d´
epend de la taille du fichier
Nmais aussi du nombre de mots µdistincts, `
a la louche le temps de calculs est
O(N+µ2). Fixons, Mun entier positif. Les m´
ecanismes de hachage permettent
de diviser par Mle temps de calculs de notre algorithme. Donnons une fonction
Tiroir(mot) qui associe au mot mot de Aun entier de l’intervalle [0, M [et
modifions notre algorithme :
LEXICAL-HACHAGE ( texte )
texte : FICHIER
table : TABLEAU[m] de LISTE.
mot : CHAINE
i : ENTIER
lst : LISTE
DEBUT
POUR i DANS [0, m[
INITIALISER( table[i] )
TANTQUE ( NON FINFICHIER( texte) )
mot = LEXEME( texte )
lst = table[ TIROIR( mot )
ENTETE( lst )
TANTQUE NON FINLISTE( lst ) ET ( MOT(lst) <> mot)
SUCCESSEUR(lst)
SI FINLISTE(lst) ALORS POSTINSERTION(mot, lst)
SINON MISE-A-JOUR(lst)
FIN
LEXICAL-HACHAGE(texte) est est Mfois plus performant que LEXICAL(texte)
d`
es que la fonction TIROIR(mot) r´
epartit ´
equitablement les mots de A, une telle
fonction est une fonction de hachage.
5. FONCTION DE HACHAGE
Comment construire des fonctions de hachage? Remarquons que les mots de
Apeuvent ˆ
etre convertis en des nombres ce qui r´
eduit la recherche des fonctions
de hachages aux cas des entiers. Fixons Met Ndeux entiers naturels, une fonction
de hachage d’un ensemble Xde cardinal ndans l’intervalle [0, M [doit satisfaire
`
a une contrainte d’´
equir´
epartition :
xX, i[0, M [,|Probh(x) = i1
M| ≤ .(1)
Les fonctions de hachages sont rares.
Exercice 2. Paradoxe des anniversaires. La promotion 1999-2000 de maˆ
ıtrise d’in-
formatique est compos´
ee de 25 ´
etudiants. Seriez-vous pr`
es `
a parier 120 Euros
qu’au moins deux ´
etudiants de cette promotion sont n´
es le mˆ
eme jour?
Essayons de nous convaincre de la raret´
e des fonctions de hachages. Supposons
que Mdivise Net essayons d’´
evaluer le nombre de fonctions de hachage avec
= 0. Une telle fonction d´
efinit une partition de Xen Mparties de M´
el´
ements.
Inversement, `
a une telle partition nous pouvons associer M!fonctions mais une
seule d’entre elles est une fonction de hachage...
5
6. HACHAGE MODULAIRE
Soit Bun entier. Le hachage modulaire de base Bapplique les mots Adans
l’intervalle [0, M [. Chaque lettres de Aest cod´
ee par un entier, et le hach´
e du mot
w=a0a1. . . a8nest d´
efini par :
h(w) =
n1
X
i=0
code(ai)Bimod M(2)
Il s’agit donc d´
evaluer un polynˆ
ome dans l’anneau des entiers modulo Mqu’on
implante suivant le sch´
ema d’´
evaluation de H¨
orner.
Exercice 3. Ecrire le code C d’une fonction de hachage `
aMvaleurs. Puis tester
les performances de votre fonction de hachage en fonction de bet M.
La qualit´
e de la fonction de hachage modulaire varie fortement en fonction des
param`
etres. Pour Bfix´
e, il faut ´
eviter de prendre pour Mles valeurs Bk±r, avec
rpetit.
Exercice 4. Testez en fonctions de Bet Mla distribution des hach´
es d’un texte
al´
eatoire.
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !