Vous êtes sur la page 1sur 5

Universit des Sciences et de la Technologie Houari Boumediene

Facult dElectronique et dInformatique


Dpartement dInformatique

Anne Universitaire : 2012/2013


Module Compilation

Master 1 :IL

Manuel de FLEX
1. FLEX :
FLEX est un gnrateur d'Analyseur Lexical. Il est souvent utilis avec un analyseur syntaxique. Un
Analyseur Lexical est un programme permettant danalyser un flux de chaines de caractres et le segment en
lexmes (Tokens).

Ces derniers reprsentent les entits lexicales dun langage. A titre dexemple : les

identifiants de variables et de fonctions, les mots cls, les oprateurs, etc...


Un document FLEX comporte trois parties principales dont chacune delles est encadre par le symbole
%% :

1.1. Premire partie: Les expressions rgulires


Cette section permet de donner les expressions rgulires des diffrentes entits lexicales (lexme) de notre
langage de programmation sous la forme suivante :
<identificateur_de_lentit> <expression regulire>

Un identificateur_de_lentit : Doit commencer par une lettre, et ne comportant que des


caractres alphanumriques, des underscores (_) et des tirets (-).

Une expression rgulire : Doit tre une expression rgulire valide.

Exemple :
Entit lexicale

Expression rgulire

chiffre [09]
entier

p. 1

{chiffre} + /*utilisation dune entit lexicale dj dfinie*/

R.ELNAGGER

1.2. Deuxime partie : Les rgles de traduction


Cette section est capitale. Elle comporte lensemble des actions associes chaque entit lexicale.
Une rgle de traduction est de la forme suivante :<pattern> <action>

Un pattern: cest lexpression rgulire dcrivant un lexme.

Une action: cest le code C qui sera excut chaque fois ou le lexme correspondant apparait.

Exemple : {entier} {printf ("lentit reconnu est un entier\n");}


pattern

action

1.2. Troisime partie : Code additionnel


Cest la dernire section dun document FLEX. Elle contient le post-code C. Ce dernier reprsente
le code que nous voulons excuter. Il y sera recopi tel quel la fin du fichier lex.yy.c.
Exemple :

// Dclarations C (pr-code)
%{
# include <stdio.h>
%}

// Dfinitions
chiffre [09]
entier {chiffre} +
reel
{chiffre} + "." {chiffre}
%%

// Rgles de traduction
{entier} {ECHO;
printf ("\n") ; }
{reel}
{printf ("%s", yytext); printf ("\n") ;
}
%%
// Code Additionnel (post-code C)
int main ( ) {
yylex ( ) ;
return 0 ;
}
p. 2

R.ELNAGGER

2. Macro-action de FLEX :
yylex

Permet de lancer lanalyseur lexical.

yywrap

Elle est appele par le lexer quand il rencontre la fin du fichier. Elle doit,
soit obtenir un nouveau flux d'entre et retourner simplement la valeur 0, soit
renvoyer 1, signifiant que la totalit des flux a t consomme et que le lexer
a fini sa tche.

yyterminate

Permet de provoquer la fin dexcution du lexer.

ECHO

Affiche lunit lexicale reconnue (quivalente printf ("%s", yytext))

yytext

Rcupre le texte formant le lexme reconnu.

yyleng

Dtermine la longueur du texte contenue dans yytext

yylval

Est une variable globale utilise par FLEX pour stocker la valeur correspondante au Token reconnu.

yylineno

Est le numro de la ligne courante.

yyin

Fichier dentre.

yyout

Fichier de sortie.

Fonctions

Variables

3. Commandes de Compilation :
FLEX lit un fichier de lextension (*.l), et gnre un code C (lex.yy.c) pour la compilation.

Entre
cc lex.yy.c o TP lfl

TP.l

FLEX

Lex.yy.c
(yylex)

CC

TP.exe

Sortie

Pour compiler le programme :


Pour excuter le programme :
Pour arrter le programme :

p. 3

$ flex TP.l
$ cc lex.yy.c o TP lfl
$ ./TP
$ Ctrl+c

R.ELNAGGER

4. Caractres spciaux :
"\[]^-?.*+|()$/{}%<>
Pour utiliser ces caractres comme "caractres ordinaires", il faut les protger en plaant dans une chane
entoure de double-quotes (") ou en les plaant aprs un \ .Les caractres \n, \t correspondent respectivement au
saut de ligne et la tabulation.
5. Expressions rgulires :
" : Une chane de caractres entoure par double-quotes reprsente la chane elle-mme.
"abc" signifie la chane abc

[ ] : Une chane de caractres entre crochets reprsente un de ses lments. Dans ce contexte, | et
- indique un intervalle et ^ dsigne lexclusion.

[xyz] : x, y ou z
[a-zA-Z] : toutes les lettres minuscules et majuscules
[^0-9] : tous les caractres sauf les chiffres

. : Tout caractre sauf \n


| : Oprateur dalternance
x|y|z : quivalent [xyz]
[a-z]|[A-Z] : toutes les lettres minuscules et majuscules

* et + : Oprateur de rptition (* : zro ou plusieurs fois, + : une ou plusieurs fois)


(x|y)* : chane de longueur positive ou nulle constitue des caractres x ou y
[a-z]+ : chane de longueur strictement positive constitue de lettres minuscules

: Oprateur doccurrence zro ou une fois


ab?c : chane abc ou chane ac

: Condition de reconnaissance
ab/cd : chane ab seulement si elle est suivie de la chane cd

p. 4

R.ELNAGGER

$ et ^ : Dbut de ligne et fin de ligne


ab$ : chane ab en fin de ligne
^ab : chane ab seulement si elle est en dbut de ligne (aprs \n ou $)
{}

: Oprateur de rptition borne - Dfinition


a{1, 5} : chane de longueur comprise entre 1 et 5 constitue du caractre a
a{2, } : chane de longueur suprieure ou gale 2 constitue du caractre a
a{2, 2} : chane de longueur 2 constitue du caractre a
a{digit} : chane prdfinie de nom digit

p. 5

Expression
abc

Exemple
abc

abc*

ab, abc, abcc, abccc,

abc+

abc, abcc, abccc,

a(bc)+

abc, abcbc, abcbcbc,

a(bc) ?

a, abc

[abc]

a, b, c

[a-z]

a, b, c, d, z

[a\-z]

a, -, z

[-az]

-, a, z

[a-zA-Z0-9]+

Un ou plusieurs caractres alphanumriques

[ \t\n]+

Espaces

[^ab]

Tous les caractres sauf : a, b

[a^b]

a, ^, b

[a|b]

a, |, b

a|b

a ou b

R.ELNAGGER