Vous êtes sur la page 1sur 5

Analyse lexicale

10

L'outil Lex (gnrateur danalyseur Lexical) Introduction


Lex est un utilitaire d'Unix. Son grand frre fLex est un produit GNU. Lex accepte en entre des spcifications d'units Lexicales sous forme de dfinitions rgulires et produit un programme crit dans le langage C qui, une fois compil, reconnat ces units Lexicales. Ce programme est donc un analyseur Lexical). > Lex fichier.l donne le fichier Lex.yy.c qu'il faut compiler avec Lex : > gcc Lex.yy.c l l Le fichier de spcifications Lex contient des expressions rgulires suivies d'actions (rgles de traduction). L'analyseur Lexical obtenu lit le texte d'entre caractre par caractre jusqu' ce qu'il trouve le plus long prfixe du texte d'entre qui corresponde l'une des expressions rgulires. Dans le cas o plusieurs rgles sont possibles, c'est la premire rgle rencontre (de haut en bas) qui l'emporte. Il excute alors l'action correspondante. Dans le cas o aucune rgle ne peut tre slectionne, l'action par dfaut consiste copier le caractre du fichier d'entre en sortie. Programme Lex Lex.l Lex.yy.c Compilateur Lex Compilateur C Analyseur Lex.yy.c Excutable

Texte d'nte Les expressions rguliers Lex rsultant Lexical

Flot des units Lexicales

Une expression rgulire Lex se compose de caractres normaux et de mta-caractres, qui ont une signification spciale: $, \, ^, [,], {,}, <, >, +, -, *, /,|,?. Le tableau suivant donne les expressions rgulires reconnues par Lex. Attention, Lex fait la diffrence entre les minuscules et les majuscules. Expression c \c "s " Signification tout caractre c qui nest pas oprateur ou mtacaractre caractre littral c (lorsque c est un mtacaractre) chane de caractres nimporte quel caractre, sauf retour la ligne (\n) lexpression qui suit ce symbole dbute une ligne lexpression qui prcde ce symbole termine une ligne nimporte quel caractre de s nimporte quel caractre qui nest pas dans s 0 ou plusieurs occurrences de r 1 ou plusieurs occurrences de r 0 ou 1 occurrence de r Exemple a \+ \. "bonjour " a.b ^abc abc$ [abc] [^xyz] b* a+ d?

.
^ $ [s] [^s] r* r+ r?

Compilation, 3LMD 2011 -2012

Universit de Biskra

Mr. Meadi M.Nadjib

Analyse lexicale r{m} r{m,n} r1r2 r1|r2 r1/r2 (r) <x>r m occurrences de r entre m et n occurrences de r r1 suivie de r2 r1 ou r2 r1 si elle est suivie de r2 r r si Lex se trouve dans ltat x e{3} f{2,4} ab c|d ab/cd (a|b)?c <x>abc

11

Structure d'un fichier Lex


Un fichier de description pour Lex est form de trois parties, selon le schma suivant : %{ Dclaration en C des variables, des constants,etc. %} Dclaration des dfinitions rgulires. %% Expression rgulires et actions correspondantes %% Dclaration des procdures auxiliaires Dans lequel aucune partie n'est obligatoire. Cependant, le sparateur "%%" est utilis pour sparer entre les dclarations et expression rgulires et actions correspondantes (le productions).

A. Partie des dclarations


La section Dclarations peut elle mme se composer de : a.Bloc littral Cette partie d'un fichier Lex peut contenir : Commence par %{ et se termine par %}. O %{ et %} doivent tre placs en dbut de ligne. Contient des dclarations et dfinitions en C. Est copi tel quel dans le fichier Lex.yy.c produit par la commande Lex Les dfinitions et dclarations quil contient sont globales au programme produit par Lex. b.Dfinitions Associations didentificateurs des expressions rgulires. . Ces dfinitions sont de la forme : notion Exemple : separ espace lettre chiffre ident nbre [ \t\n] {separ}+ [A-Za-z] [0-9] {lettre}({lettre}|{chiffre})* {chiffre}+(\.{chiffre}+)?(E[+\-]?{chiffre}+)? expression rgulire

Remarque Lorsquon se rfre une expression rgulire en utilisant un identificateur, celui-ci est mis entre accolades. Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib

Analyse lexicale c. Conditions de dpart Les conditions de dpart permettent de dfinir plusieurs tats de Lex Exemple %start etat1 etat2 . O etat1, tat2 sont les tats possibles de Lex

12

B. Partie des productions


Contient deux parties Partie gauche : - spcification des expressions rgulires reconnues - pour une chane de lettres et de chiffres, les guillemets peuvent tre omis - identificateurs dexpressions mis entre accolades Partie droite : - actions excutes lorsque units Lexicales reconnues - actions dfinies avec syntaxe C - si scanner appel par parser YACC, alors : - les attributs de lunit Lexicale reconnue doivent tre dposs dans yylval - lunit Lexicale reconnue doit tre retourne Exemple { \t\n}{ /* pas d action */ } ``<=``{return(PPE);} ``<>``{return(DIF);} ``<`` {return(PPQ);} ``=`` {return(EGA);} ``>=``{return(PGE);} ``>`` {return(PGQ);} ``:=`` {return(AFF);} if {return(si);} then {return(alors);} else {return(sinon);} {ident}{yylval = yytext; return(id);} {nbre}{yylval = yytext; return(nb);} Remarques En cas de conflit, Lex choisit toujours la rgle qui produit le plus long lexme. prog action1 program action2 La deuxime rgle sera choisie. Si plusieurs rgles donnent des lexmes de mmes longueurs, Lex choisit la premire. prog action1 [a-z]+ action2 La premire rgle sera choisie. Si aucune rgle ne correspond au flot d'entre, Lex choisit sa rgle par dfaut implicite : .|\n {ECHO} recopie le flot d'entre sur le flot de sortie

Compilation, 3LMD 2011 -2012

Universit de Biskra

Mr. Meadi M.Nadjib

Analyse lexicale

13

C. Section Procdures auxiliaires


Section optionnelle qui permet de : - dfinir toutes les fonctions utilises dans les actions associes aux expressions reconnues - dfinir (si ncessaire) le programme principal (main()).

Exemples
Ce premier exemple compte le nombre de voyelles, consonnes et caractres de ponctuations d'un texte entr au clavier. %{ int nbVoyelles, nbConsonnes, nbPonct; %} consonne [b-df-hj-np-tv-xz] ponctuation [,;:?!\.] %% [aeiouy] nbVoyelles++; {consonne} nbConsonnes++; {ponctuation} nbPonct++; .|\n // ne rien faire %% main() {nbVoyelles = nbConsonnes = nbPonct = 0; yylex(); printf("Il y a %d voyelles, %d consonnes et %d ponctuations.\n",nbVoyelles, nbConsonnes, nbPonct); }

Variables et fonctions prdfinies


char yytext[ ] : tableau de caractres qui contient la chane d'entre qui a t accepte. int yyleng : longueur de cette chane. int yylex() : fonction qui lance l'analyseur (et appelle yywrap()). yylval: retourne la valeur associ l'unit lexicale reconnue. ECHO afficher l'unit lexicale reconnue (quivalente printf("%s",yytext); ) FILE *yyout: fichier de sortie. FILE *yyin: fichier d'entre int yywrap(): fonction toujours appele en fin de flot d'entre. Elle ne fait rien par dfaut, mais l'utilisateur peut la redfinir dans la section des fonctions auxiliaires. yywrap() retourne 0 si l'analyse doit se poursuivre (sur un autre fichier d'entre) et 1 sinon. unput(char c) : remet le caractre dans le flot d'entre. int yylineno : numro de la ligne courante. yymore(): fonction qui concatne la chane actuelle yytext avec celle qui a t reconnue avant yyless(): fonction admettant un entier comme argument, yyless(k>0) : supprime les (yyleng-k) derniers caractres de yytext, dont la longueur devient alors k - recule le pointeur de lecture sur le fichier dentre de (yyleng-k) positions, les caractres supprims de yytext seront donc considrs pour la reconnaissance des prochaines units yyterminate() : fonction qui stoppe l'analyseur .

Compilation, 3LMD 2011 -2012

Universit de Biskra

Mr. Meadi M.Nadjib

Analyse lexicale

14

Exemple
L'exemple suivant insert le numro de ligne chaque ligne dans un fichier. %{ int yylineno; %} %% ^(.*)\n printf("%4d\t%s", ++yylineno, yytext); %% int main(int argc, char *argv[]) { yyin = fopen(argv[1], "r"); yylex(); fclose(yyin); }

Etude de cas

Compilation, 3LMD 2011 -2012

Universit de Biskra

Mr. Meadi M.Nadjib