Vous êtes sur la page 1sur 4

28/10/2015

IV. Outils lex pour gnrer un analyseur


lexical
Un programme crit en langage LEX construit d'une manire

automatique un analyseur lexical qui lit des caractres dans un flux


d'entre et crit des token dans un flux de sortie.

Il prend en entre un ensemble d'expressions rgulires et de

dfinitions rgulires et produit en sortie un code cible en langage


C.

Ce code en langage C doit tre compil par le compilateur du

langage C pour produire un excutable qui est un analyseur lexical


correspondant au langage dfini par les expressions rgulires
d'entre.

Plusieurs langages drivs de LEX existent;


Flex produit du C++
Jlex produit du Java
57

IV. 1. Structure d'un programme FLEX


Un programme source en langage lex est constitu de 3
sections dlimites par %%:
%{
dclarations (en C) des variables, constantes,
Partie 1 : dclaration
%}
Dclaration de dfinitions rgulires
%%

Partie 2 : Rgles de

traduction
Partie 3 : fonctions en C

expressions rgulires + actions raliser


%%
Bloc principal et fonctions auxiliaires en C

58

o avec expi une expression rgulire ou une dfinition rgulire de la 1re

La 1re partie est constitue de:

partie

dclarations en langage C des bibliothques, variables, structures,

unions...
dclarations de dfinitions rgulires utilisables par les rgles de
traduction.
Exemple :

blancs [\t\n ]+
lettre [A-Za-z]
chiffre10 [0-9]

o actioni est l'action raliser par l'analyseur lexical si un lexme est

accept par expi .

Exemple

"<=" {printf("\n Operateur relationnel: PPE\n");}


"<>" {printf("\n Operateur relationnel: DIF\n");}

La 2me partie comporte les rgles de traduction, ce sont des

suites dinstructions de la forme :


exp1
exp2

action1
action2

59

60

La 3me partie est une suite de fonctions en C qui aident l'analyse

des rgles de traduction de la 2me partie.


Cette partie peut contenir une fonction main du langage C.
Remarques:
Le code doit commencer la 1re colonne.
La 1re partie et la dernire sont facultatives.
Le fichier LEX doit avoir l'extension .l

61

Exemple de programme crit en FLEX : nom_fichier.l


Partie 1 :
//dclarations en C
%{
#include<stdio.h>
%}
lettre [a-zA-Z]
chiffre [0-9]
id {lettre}({lettre}|{chiffre})*
nb (\+|\-)?{chiffre}+(\.{chiffre}+)?((e|E)(\+|\-)?{chiffre}+)?
%%

62

28/10/2015

Partie 2 :
sinon {printf("\n Mot cl: ELSE\n");}
si
{printf("\n Mot cl: IF\n");}
alors {printf("\n Mot cl: THEN\n");}
{id} {printf("\n Identificateur:%s\n",yytext);}
{nb} {printf("\n Nombre:%s\n",yytext);}
"<=" {printf("\n Operateur relationnel: PPE\n");}
"<>" {printf("\n Operateur relationnel: DIF\n");}
"<"
{printf("\n Operateur relationnel: PPQ\n");}
">=" {printf("\n Operateur relationnel: PGE\n");}
>" {printf("\n Operateur relationnel: PGQ\n");}
"==" {printf("\n Operateur relationnel: EGA\n");}
"("
{printf("\n PO\n");}
")"
{printf("\n PF\n");}
.
{printf("\n%s: Caractre non reconnu\n",yytext);}
63

Partie 3 :
int main()
{
FILE *fichier;
printf("Nom du fichier analyser");
scanf("%s",&fichier);
yyin=fichier;
yylex();
return 0;
}

64

Remarques:
"." est un oprateur qui veut dire tous caractre sauf le
retour la ligne.
yytext est un pointeur sur la chane analyse.
yyin correspond l'entre
yylex() est la fonction principale du programme crit en
LEX.

Installation Flex
Tlcharger MinGW de http : //www.mingw.org
Installation de MinGW
Installer les gcc, Flex et Bison du catalogue de MinGW
Ajouter le chemin de MinGW, flex et bison la variable

denvironnement Path de windows.

Options de compilation: (lignes de commandes)


1/ flex nom_fichier.l
=> produit lex.yy.c
2/ gcc lex.yy.c -lfl
65

66

Installation Flex

Installation Flex

Tlcharger MinGW de http : //www.mingw.org

Tlcharger MinGW de http : //www.mingw.org


Installation de MinGW

67

68

28/10/2015

69

70

Installer les gcc, Flex et Bison du catalogue


de MinGW

71

72

Ajouter le chemin de MinGW, flex et bison la


variable denvironnement Path de windows
C:\MinGW
C:\MinGW\msys\1.0\bin

73

74

28/10/2015

Ajouter les chemins :

C:\MinGW\bin
C:\MinGW\msys\1.0\bin

75