Académique Documents
Professionnel Documents
Culture Documents
I- Présentation de Lex
Lex est un langage de spécification d’analyseurs lexicaux.Un programme en lex
définit un ensemble de schema qui sont applicables à un flux textuel. Il prend en
entrée la définition des unités lexicales (expression régulière) ; produit le code source
C d’un AFD minimal permettant de reconnaître les mots du langage spécifié par
l’expression régulière. L’automate construit , défini la fonction yylex(void) qui
constitue l’analyseur lexical. Une modification du langage entraine une regénération
du code de l’analyseur.
%{
Partie 1 : Déclarations pour le compilateur C
%}
Partie 2 : Définitions régulières
%%
Partie 3 : Règles traduction
%%
Partie 4 : Fonctions C supplémentaires
Remarque : La compilation du fichier lex avec l'option -t lui fait écrire sa sortie sur
stdout plutôt que sur lex.yy.c, afin qu'il puisse être redirigé.
%{
#include<stdio.h>
%}
%%
.* {printf("ERREUR \n");}
%%
int yywrap(){
return 1 ;
}
%{
#include<stdio.h>
%}
chiffre [0-9]
lettre [a-zA-Z]
alpha ({chiffre}|{lettre})+
%%
.* {printf("ERREUR \n");}
%%
int yywrap(){
return 1;
}
Cas 3 : Donner sous Lex la spécification permettant de supprimer les espaces
multiples entre les mots dans une phrase, de compte le nombre de «a » dans cette
phrase.
%{ int yywrap(){
return 1;
#include<stdio.h> }
int nbreA = 0 ;
int main (void){
%} yylex();
}
%%
%%
Cas 4 : Donner sous Lex la spécification permettant de transfomer toutes les
majuscules dans une phrase en minuscule.
%{
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>
%}
%%
[A-Z] { printf(tolower(yytext) ;}
%%
int yywrap()
{
return 1;
}
int main()
{
%}
%%
^(.*)\n printf("%4d\t%s",++yylineno,yytext);
%%
int yywrap()
{
return 1;
}
int main(int argc,char* argv[])
{
yylineno = 0;
yyin = fopen(argv[1],"r");
yylex();
fclose(yyin);
}
PROCEDURE DE COMPILATION ET EXECUTION DE
L’ANLYSEUR
Pour executer un fichier a l’aide de lex, l’on doit suivre un ensemble d’etapes
qui sont :