Vous êtes sur la page 1sur 75

Compilation

Chapitre2 : Analyse lexical

SMI/S5
Compilation
Prof.: M. BENADDY
A.U. 2015-2016
Introduction
Rle de lanalyseur lexicale : lire les caractres
dentre (programme source) et de produire comme
rsultat une suite dunits lexicales appeles
TOKENS que lanalyseur syntaxique va utiliser.
Les TOKENS sont constitus au fur et mesure de
la lecture du texte source, on distingue deux types
dunits lexicales.
Les units propres au langage, les mots cls, les
sparateurs, les oprateurs, ...etc.
Les units personnalises qui sont cres par le
programmeur (les constantes, les identificateurs).
Prof. M. BENADDY Compilation 2
Introduction

Table des symboles

Programme Unit lexicale


source Analyseur lexical Analyseur syntaxique
Donner l'unit
lexicale suivante (type, val)

Table des erreurs

Remarque: lanalyseur lexical de certains


compilateurs procdent llimination dans le
programme source des commentaires et des
espaces quapparaissent sous forme de caractres
blanc ou de tabulation ou bien les sauts de lignes.
Prof. M. BENADDY Compilation 3
Units lexicales, lexmes, modles
Token:unitlexicale, est une paire de nom et dune valeur optionnelle.
Le nom du token est un symbole abstrait qui reprsente une unit
lexicale, (mot cl, suite de caractre dnotant un identifiant, ...).
Lemodle : est une description de la forme que peut prendre les
lexmes dune unit lexicale.
Cest une rgle qui dcrit lensemble des lexmes pouvant reprsenter
une unit lexicale particulire dans le programme source.
Dans le cas des mots cls, le modle est juste une squence de
caractres qui forme le mot cl.
Pour les identificateurs et dautres units lexicales, le modle est une
structure plus complexes.
Lexme : est une suite de caractres dans le programme sources qui
concorde avec le modle.
Il est identifi par lanalyseur lexical comme instance dun token.

Prof. M. BENADDY Compilation 4


Units lexicales, lexmes, modles
Exemple:

Prof. M. BENADDY Compilation 5


Units lexicales, lexmes, modles
Remarques:Dans la plupart des langages de programmation,
les classes suivantes couvrent la majorit des tokens (units
lexicales).
Un token (unit lexicale) pour chaque mot cl. Le modle pour le
mot cl est le mme que le mot cl.
Les tokens pour les oprateurs, soit individuelle soit par classes
(exemple comparaison de lexemple prcdent).
Une unit lexicale pour tous les identificateurs (nom des
variables, des fonctions, des classes, tableaux, structures...).
Une ou plusieurs units lexicales (tokens) pour les constantes,
les nombres et les chanes de caractres.
Une unit lexicale pour chaque symbole de ponctuation, tels
que, la virgule, le point virgule, les parenthses, les accolades,...
Prof. M. BENADDY Compilation 6
Units lexicales, lexmes, modles
Exemple:float pi = 3.14 ;
La sous chane pi est un lexme dunit lexicale
identificateur, cette unit lexicale est retourne
lanalyseur syntaxique, le retour est souvent ralis en
passant un entier correspondant lunit lexicale. Le
modle de lunit lexicale float est lunit correspondant
la simple chane float qui vrifie lorthographe des mots
cls.

Prof. M. BENADDY Compilation 7


Attributs des units lexicales
Lanalyseur lexical rduit les informations sur les units
lexicales dans les attributs qui leur sont associs.
En pratique une unit lexicale a en gnral un seul attribut :
un pointeur vers lentre dans la table des symboles dans
laquelle linformation sur lunit lexicale est conserve, le
pointeur devient alors lattribut de lentit lexicale.

Prof. M. BENADDY Compilation 8


Attributs des units lexicales
Exemple : en Fortran E = M * C * * 2 (**dsigne la puissance
en Fortran)
Les units lexicales et les valeurs des attributs sont donns
par :
<id, pointeur vers lentre de la table des symboles associ E>
<op_affectation>
<id, pointeur vers lentre de la table des symboles associ M>
<op_multiplication>
<id, pointeur vers lentre de la table des symboles associ C>
<op_exposant>
<nombre, valeur entire 2>
Prof. M. BENADDY Compilation 9
Les mots rservs
Certains langages ne tolrent pas que les mots cls
soient utiliss comme des identificateurs.
Ce qui veut dire que leur signification est prdfinie et ne
peut pas tre chang par le programmeur.
Les mots cls sont installs dans la table des symboles
et quand un identificateur est rencontr il est compar
avec les mots cls de la table de symboles, sil concide
avec un des mots cls de la table le scanner (analyseur
lexicale) gnre le code de ce mot cls, sinon le code de
lidentificateur est transmis.
Exemples : Pascal et C

Prof. M. BENADDY Compilation 10


Les erreurs lexicales
Peu derreurs sont dtectes au niveau lexicale, car un analyseur
lexical dune vision trs localise du programme source.
Exemple: si on rencontre la chane fi dans un programme avec
fi(i==j) lanalyseur lexical ne peut pas dire sil sagit du mot cl if
mal crit ou dun identificateur non dclar.
Comme fi est un identificateur valide, lanalyseur lexical doit
retourner lunit lexicale dun identificateur et laisse une autre
phase du compilateur traiter cette erreur ventuelle, supposant
quune situation se prsente o lanalyseur lexical est
incapable de continuer car aucun de ces modles des units
lexicales ne filtre le prfixe du reste du texte dentre.
Exemple: une variable qui commence par un caractre non
valide (x, y, ...) ce moment-l lanalyseur lexical dclenche
une erreur qui indique la non validit du nom de la variable.
Prof. M. BENADDY Compilation 11
Spcification des units lexicales
La procdure dun analyseur lexical consiste dans un
premier temps en la description des units lexicales
laide des expressions rgulires.
Les expressions rgulires sont une notation importante
pour spcifier les modles, chaque modle reconnat un
ensemble de chanes appels aussi mot, ces
expressions rgulires seront transformes en des
automates qui seront implments sur machine.

Prof. M. BENADDY Compilation 12


Spcification des units lexicales
Motsetlangage:
Lettreetmots:
Soit A un ensemble fini appel alphabet, les lments de A sont
appels des lettres, exemple : A={a,b,c,1,3,h}.

Un mot ou une chane sur un alphabet est une squence finie de
symboles extrait de cet ensemble.
On dfinit A+ lensemble des mots non vides comme le plus petit
ensemble tel que :
Pour toute lettre appartenant lalphabet A, appartiendra A+.

Pour tout mot m A+ et toute lettre A, le mot m A+, (m
reprsente la concatnation du mot m et de la lettre ).
Soit un mot m A+, on dira que m constitue un mot sur A (mot
fait partir de lalphabet A).

Prof. M. BENADDY Compilation 13


Spcification des units lexicales
Motsetlangage:
Oprationssurleslangages:
Plusieurs oprations peuvent sappliquer aux langages.
Pour lanalyse lexicale on sintresse principalement lunion, la
concatnation et la fermeture (de Kleene), on peut aussi gnraliser
lopration exponentiation aux langages en dfinissant L0= { },
Li=LLi-1 ainsi Li est la concatnation de L, i-1 fois avec lui mme.

Remarque: Ces notations sont employes dans lcriture des


expressions rgulires.
Prof. M. BENADDY Compilation 14
Spcification des units lexicales
Motsetlangage:
Oprationssurleslangages:
Exemple:
L = {a, ....,z,A,...,Z}, C={0,...,9}, on peut crer de nouveaux langages
partir des langages L et C, en appliquant les oprateurs prcdents.
L U C est lensemble des lettres et des chiffres.
LC est lensemble des mots forms dune lettre suivie dun chiffre.
L4 est lensemble des mots forms de 4 lettres.
L* est lensemble de tout les mots de lettres, y compris le mot vide, .
L(LUD)* est lensemble des mots de lettres et de chiffres commenant
par une lettre.
C+ est lensemble des mots qui sont constitus dau moins dun chiffre.
Prof. M. BENADDY Compilation 15
Spcification des units lexicales
Expressionsrgulires:
On construit une expression rgulire partir dexpressions
rgulires plus simples, en utilisant les rgles de dfinitions du
langage concern.
Chaque expression rgulire r dnote un langage L(r). Les rgles de
dfinition spcifient comment L(r) est form en combinant de
manire varie les langages dnots par les sous-expressions de r.
Les expressions rgulires sont construites rcursivement partir
dexpressions rgulires plus simples, en utilisant des rgles.
Chaque expression rgulire r dnote un langage L(r), qui est aussi
dfinit rcursivement partir des langages dnots par les sous-
expressions de r.
Les rgles qui dfinissent les expressions rgulires sur un alphabet
et les langages dnots par ces expressions.
Prof. M. BENADDY Compilation 16
Spcification des units lexicales
Expressionsrgulires:
Rgles:
est une expression rgulire, et L() = {}, le langage
dont le seule membre est le mot vide .
Si a est un symbole de , alors a est une expression
rgulire, et L(a) = {a}, c--d le langage avec une seule
chane de caractre, de longueur 1.

Prof. M. BENADDY Compilation 17


Spcification des units lexicales
Expressionsrgulires:
Induction:
On suppose que r et s sont deux expressions rgulires dnotant
les deux langages L(r) et L(s) respectivement.
Il existe quatre rgles dinduction qui permettent de construire des
expressions complexes partir dexpressions rgulires plus
simples.
(r)|(s) est lexpression rgulire qui dnote le langage L(r)UL(s)
(r)(s) est lexpression rgulire qui dnote le langage L(r)L(s),
(r)* est lexpression rgulire dnotant le langage (L(r))*,
(r) est lexpression rgulire qui dnote L(r). Cette rgle signifie
quon peut ajouter des parenthses sans changer le langage
quelle dnote.

Prof. M. BENADDY Compilation 18


Spcification des units lexicales
Expressionsrgulires:
Prioritdesoprateurs:
Loprateur * a la plus haute priorit et est associatif
gauche.
La concatnation a la deuxime priorit et est associatif
gauche.
Le ou (|) a la faible priorit.
En considrant ces conventions, par exemple lexpression
rgulire (a)|((b)*(c) est quivalente a|b*c, les deux
dnotent lensemble des mots forms dun seule ou zro
a ou bien zro ou plusieurs b suivi dun c.

Prof. M. BENADDY Compilation 19


Spcification des units lexicales
Expressionsrgulires:
Exemple:soit lalphabet ={a,b}
Lexpression rgulire a|b dnote le langage {a,b}
(a|b)(a|b) dnote {aa,ab,ba,bb}, le langage de mots de longueur
2 sur lalphabet , une autre expression rgulire est aa|ab|ba|
bb.
a* dnote le langage des mots forms de zro ou plus de a, { ,
a, aa, aaa, ...}.

(a|b)* dnote lensemble des mots forms de zro ou plusieurs a
ou b, {, a, b, aa, ab, ba, bb, aaa, ...}. (a|b)* = (a*b*)*=(a*|b*)*.
a|a*b dnote le langage {a, b, ab, aab, aaab, ...}, c--d le mot a
et lensemble des mots forms de zro ou plusieurs a qui
finissent par b.
Prof. M. BENADDY Compilation 20
Spcification des units lexicales
Expressionsrgulires:
Remarque : Un langage qui peut tre dfinit par une
expression rgulire est appel un ensemble rgulier. Si
deux expressions rgulires r et s dnotent le mme
ensemble rgulier, on dit quils sont quivalents r=s.
Proprits algbriques des expressions rgulires :

Prof. M. BENADDY Compilation 21


Spcification des units lexicales
Expressionsrgulires:
Propritsalgbriquesdesexpressionsrgulires:

Prof. M. BENADDY Compilation 22


Spcification des units lexicales
Expressionsrgulires:
Dfinitionsrgulires:Une dfinition rgulire est une
suite de dfinitions de la forme :

o
Chaque di est un nouveau symbole distinct qui n'appartient
pas
Chaque ri est une expression rgulire sur les symboles :
U {d1,d2,...,di-1}
Prof. M. BENADDY Compilation 23
Spcification des units lexicales
Expressionsrgulires:
Dfinitionsrgulires:
Exemple1 : les identificateurs en C sont des mots forms de
lettres, chiffres, et underscore (_). Une dfinition rgulire de
cet ensemble est la suivante :

lettre A|B|...|Z|a|b|...|z| _
chiffre 0|1|...|9
id lettre(lettre|chiffre)*

Prof. M. BENADDY Compilation 24


Spcification des units lexicales
Expressionsrgulires:
Dfinitionsrgulires:
Exemple2 : Les nombres non signs (entiers ou rels) sont
des chanes, comme 5280, 0.01234, 6.336E4, ou 1.89E-4.
La dfinition rgulire de cette catgorie est donne par
lexpression suivante :

Prof. M. BENADDY Compilation 25


Spcification des units lexicales
Expressionsrgulires:
Extensionsauxexpressionsrgulires:
Les oprateurs de base (lunion, la concatnation et la
fermeture) ont t introduites par Kleene vers 1950, des
extensions on t ajoutes par la suite pour pouvoir
dfinir quelques modles de chanes.
Les extensions suivantes sont incorpores dans utilitaires
sous UNIX tel que Lex, qui sont utiles dans lcriture
danalyseurs lexicaux.

Prof. M. BENADDY Compilation 26


Spcification des units lexicales
Expressionsrgulires:
Extensionsauxexpressionsrgulires:
Loprateur unaire + reprsente, la fermeture positive + de lexpression
rgulire et son langage. Si r est une expression rgulire, alors (r)+ dnote
le langage (L(r))+. Loprateur + a la mme priorit et associativit que
loprateur * (Kleene closure), on peut crire alors, r* = r+| et r+ = rr* =r*r.
Zro ou une instance. Loprateur unaire ? signifie zro ou une
occurrence. C--d r ? est quivalente r|, dune autre faon
L(r?)=L(r)U{}. Loprateur ? a les mmes priorit et associativit que * et
+.
Classes de caractres. Lexpression rgulire a1|a2|...|an, o les ai sont des
symboles de lalphabet, on peut alors les remplacer par [a1a2...an]. quand
a1,a2,...,an form une squence logique, c--d des lettres majuscules
conscutives, des lettres minuscules, ou des chiffres, on peut les
remplacer par a1-an, (on prend juste le premier et dernier lment spars
par un tiret -). Par consquent [abc] a|b|c, et [a-z] a|b|...|z.

Prof. M. BENADDY Compilation 27


Spcification des units lexicales
Expressionsrgulires:
Extensionsauxexpressionsrgulires:

r* = r+| et r+ = rr* =r*r Fermeture de


r? = r| Zro ou une instance
[abc] a|b|c, et [a-z] a|b|...|z Un lment de la classe

Prof. M. BENADDY Compilation 28


Spcification des units lexicales
Expressionsrgulires:
Extensionsauxexpressionsrgulires:
Exemple: en utilisant ces formes abrges rcrire les
expressions rgulires suivantes :
lettre A|B|...|Z|a|b|...|z| _
chiffre 0|1|...|9
id lettre(lettre|chiffre)*

Prof. M. BENADDY Compilation 29


Spcification des units lexicales
Expressionsrgulires:
Extensionsauxexpressionsrgulires:
Exemple: en utilisant ces formes abrges rcrire les
expressions rgulires suivantes :
lettre [A-Za-z_]
chiffre [0-9]
id lettre(lettre|chiffre)*

Prof. M. BENADDY Compilation 30


Reconnaissance de units lexicales
Comment utiliser les modles des units lexicales, pour
construire un programme qui examinera le texte dentre
pour dcider si les lexmes se sont conforme avec les
modles. Considrons cet exemple :

Prof. M. BENADDY Compilation 31


Reconnaissance de units lexicales
Les units lexicales concernes par lanalyseur lexical sont
if, then, else, relop, id, et number, ils sont aussi les
terminaux de la grammaire pour les instructions de
branchement conditionnel.
Les dfinitions rgulires dfinissant les modles de ces
units lexicales sont :

Prof. M. BENADDY Compilation 32


Reconnaissance de units lexicales
Pour ignorer les commentaires et les blancs lanalyseur
lexical doit les reconnatre pour cela, on dfinit lunit lexicale
ws comme suite :

Les caractres blancs (blank), tabulation (tab) et nouvelle


ligne (newline) sont des symboles abstraits utiliss pour
exprimer les caractres ASCII dsignant la mme chose.
Lunit lexicale ws est reconnue par lanalyseur lexical, mais
elle ne sera pas retourne lanalyseur syntaxique, mais, on
reprend lanalyse qui suit lespace blanc.

Prof. M. BENADDY Compilation 33


Reconnaissance de units lexicales
Le but de lanalyseur lexicale est rsum dans le tableau ci-dessous qui montre
pour chaque lexme ou famille de lexmes, quelle unit lexicale (token) qui sera
retourne lanalyseur syntaxique ainsi que sa valeur dattribut.

Lexmes Nomdelunitlexicale Valeurdelattribut

Nimporte quel ws - -
if if -
then then -
else else -
Nimporte quel id id Pointeurverslatabledessymboles
Nimporte quel number Pointeurverslatabledessymboles
number

< relop LT
<= relop LE
= relop EQ
<> relop NE
> relop GT
Prof. M. BENADDY Compilation 34
>= relop GE
Reconnaissance de units lexicales
Diagrammedetransition:
Une tape pour la construction dun analyseur lexical, est de convertir
les modles en des diagrammes, appels diagrammes de transition.
Un diagramme de transition est une collection dtats, relis par des
arcs. Un les tats dans un diagramme de transition sont dfinis comme
suite :
Ltat de dpart est reprsent par un cercle o apparat une flche
entrante
Les tats dacceptation (lexme reconnue) est reprsents par un
cercle double
*
Si un tat dacceptation admet un recul on lui ajoute une toile (*)
Un tat quelconque est reprsent par un cercle
Un arc est reprsent par une flche quittant un tat vers un autre
avec une tiquette <

Prof. M. BENADDY Compilation 35


Reconnaissance de units lexicales
Diagrammedetransition:Diagramme de transition de
relop

Prof. M. BENADDY Compilation 36


Reconnaissance de units lexicales
Diagrammedetransition:Reconnaissance des mots
rservs et des identificateurs
La reconnaissance des mots cls et des identificateur
prsente un problme. En effet, les mots cls (if, then) sont
rservs, il ne sont pas des identificateurs, mais ils se voient
comme des identificateurs.
Pour reconnatre les identificateurs on peut utiliser le
diagramme ci-dessous, qui reconnectera aussi les mots cls
if, then, else de notre exemple.

Prof. M. BENADDY Compilation 37


Reconnaissance de units lexicales
Diagrammedetransition:Reconnaissance des mots
rservs et des identificateurs
Il existe deux solutions pour reconnatre les mots rservs qui
ressemble aux identificateurs :
Initialement Installer les mots cls (mots rservs) dans la table des
symboles.
Un champ dentre dans ladite table indiquera que ses chanes
ne seront pas utilises comme des identificateurs ordinaires, et
indique quelle unit lexicale il reprsente.
Quand on rencontre un identificateur, lappel installID le met
dans la table des symboles sil nest pas encore insr. La
fonction getToken examine la table des symboles du lexme
trouv, et retourne son entre dans ladite table.
Crer des diagrammes de transition spars pour chaque mot cl.

Prof. M. BENADDY Compilation 38


Reconnaissance de units lexicales
Diagrammedetransition:Digramme de reconnaissance
des chiffres

Prof. M. BENADDY Compilation 39


Reconnaissance de units lexicales
Diagrammedetransition:Diagramme de reconnaissance
des blancs
Dans ce diagramme on cherche un ou plusieurs blancs
(espaces), reprsents par delim dans le diagramme.
Typiquement ces caractres peuvent tre des blancs,
tabulation, ou des retours la ligne ou bien dautres
caractres qui ne sont pas considrs par le langage
comme des units lexicales.

Prof. M. BENADDY Compilation 40


Le gnrateur danalyseur lexicale Lex/Flex

Lex/Flex est un outil de gnration automatise danalyseur


lexical, partir de la spcification des expressions rgulires
pour dcrire les modles des units lexicales.
Lex/Flex transforme les modles (expressions rgulires et
dfinitions rgulires) en entre en un diagramme de
transition et gnr le code source correspondant, dans un
fichier appel lex.yy.c, qui simule le diagramme de transition
gnr.
Ce fichier crit en langage C doit tre compil pour le
compilateur du C pour produire un excutable qui sera
l'analyseur lexical du langage dcrit par les modles en
question.

Prof. M. BENADDY Compilation 41


Le gnrateur danalyseur lexicale Lex/Flex

Plusieurs langages drivs de Lex existent :


Flex produit du code crit en C/C++
Jlex produit du code crit en Java
Lecl produit du code crit en Caml
ml-lex produit du code en ML
alex produit du code crit en Haskell
tlc-tcLex produit du code crit en tcl

Prof. M. BENADDY Compilation 42


Le gnrateur danalyseur lexicale Lex/Flex

UtilisationdeLex:
Un fichier lex.l crit en langage Lex, qui dcrit lanalyseur
lexical gnrer est prsent au compilateur Lex en
entre.
Le compilateur Lex transforme lex.l en un programme
crit en C dans un fichier appel lex.yy.c.
Ce fichier est compil par le compilateur C et produit un
fichier excutable a.out qui est le fichier du compilateur
excutable, il prendra en paramtre un fichier crit dans le
langage source et produira en sortie une squence des
units lexicales.

Prof. M. BENADDY Compilation 43


Le gnrateur danalyseur lexicale Lex/Flex

UtilisationdeLex:

Prof. M. BENADDY Compilation 44


Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
Un fichier de description pour Lex est form de trois
parties, spares par des lignes contenant seulement %
%, align gauche, selon le schma suivant :
//Partiesdclarations
%{//(variables,constantes,bibliothquesC,etc.)
%}
//expressionsrgulires,dfinitionsrgulires
%%
//Partieproductions(expressionsrgulires)
%%
//codedeservice(fonctionsutilitaires)

Prof. M. BENADDY Compilation 45


Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
La partie dclarations comporte les dclarations des
variables, structures, unions, dclarations rgulires,
dclaration des bibliothques en C
La partie productions, les dclarations prennent la forme
suivante :
m 1 {action } 1 Les m sont des expressions rgulires ou
i

m 2 {action } 2 des dfinitions rgulires de la partie


... ... dclaration.
m i {action }
i

... ... Les actioni sont les actions raliser par


m n {action }
n lanalyseur lexical si un lexme est accept
par mi. Gnralement crites en langage C,
mais dautres langages peuvent tre utiliss.

Prof. M. BENADDY Compilation 46


Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
La 3me partie contient des fonctions qui peuvent tre
utilises dans les actions de la 2 me partie.
Eventuellement ces fonctions peuvent tre compiles

sparment et charges avec l'analyseur lexical.


Cette partie peut aussi contenir la fonction principale

main pour une ventuelle excution du programme


produit.
Remarque:
Un fichier source en Lex doit avoir l'extension .l
(exemple.l).
Seulement la partie production est obligatoire dans Lex.

Prof. M. BENADDY Compilation 47


Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
Exemple1: Un programme Lex qui affiche le contenu de
son entre standard vers l'cran.
%%
.|\nECHO;
%%
Exemple2 : un programme Lex qui supprime tout les
espaces et tabultations.

%%
[\t]{/*supprimelesespacesettabulations*/}
bye{exit(0);}

Prof. M. BENADDY Compilation 48


Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
Exemple3: Un programme Lex qui reconnat les verbes
en anglais.
On considre la liste des verbes suivants :
is am are were
was be being been
do does did will
would should can could
has have had go

Prof. M. BENADDY Compilation 49


Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
Exemple3: Un programme Lex qui reconnat les verbes
en anglais.
will I
%{ would I
/* should I
* programme Lex qui reconnat les verbes en Anglais can I
*/ could I
%} has I
[\t ]+ /* ignorer les espaces et tabulations */ have I
is I had I
am l go {printf(''%s : is a verb\n'',
are I yytext);}
were I [a-zA-Z]+ {printf(''%s:is not a
was I verb\n'', yytext);}
be l .|\n {ECHO ; /* autres choses
beingbeen I ou retour la ligne */
do I %%
does I main()
did I {
Prof. M. BENADDY Compilation yylex() ; 50
}
Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
Remarques:
yylex() : la fonction principale du programme crit en
LEX.
yytext : pointeur sur le dbut de la chane analyse

(unit lexicale)
Excution :
Lex : lex verbes.l produit un fichier lex.yy.c
gcc : gcc -o verbes lex.y.c -ll (ll : library lex)
Flex : flex verbes.l produit un fichier lex.yy.c
gcc : gcc -o verbes lex.yy.c -lfl (lfl : library fast lex)

Prof. M. BENADDY Compilation 51


Le gnrateur danalyseur lexicale Lex/Flex

StructuredunprogrammeLex:
Exerciced'application:crire un programme en lex qui
reconnat les identificateurs, mot cls et oprateurs en
PASCAL

Prof. M. BENADDY Compilation 52


Le gnrateur danalyseur lexicale Lex/Flex
%{
/*definitionsdesconstantes "<"{printf("relopLT\n");}
LT,LE,EQ,NE,GT,GE, "<=" {printf("relop
IF,THEN,ELSE,ID,NUMBER,RELOP*/ LE\n");}
%} "=" {printf("relop
/*definitionsrgulires*/ EQ\n");;}
delim[\t\n] "<>" {printf("relop
ws{delim}+ NE\n");}
letter[AZaz] ">"{printf("relopGT\n");}
digit[09] ">=" {printf("relop
id{letter}({letter}|{digit})* GE\n");}
number (\+|\)?{digit}+(\.{digit}+)? . {printf("non reconnue
(E[+]?{digit}+)? %s\n",yytext);}
%% %%
{ws}{/*noactionandnoreturn*/} int main(int argc,char
if{printf("motclIF\n");} *argv[])
then{printf("motclTEHN\n");} {
else{printf("motclELSE\n");} yyin=fopen(argv[1],"r");
{id} {printf("identificateur yylex();
%s\n",yytext);} fclose(yyin);
{number} {printf("nombre return0;
%s\n",yytext);} }
Prof. M. BENADDY Compilation 53
Les automates tats finis

Un reconnaisseur pour un langage est un programme qui prend en


entre une chane x et rpond oui si x est une phrase du langage et
non autrement.
On compile une expression rgulire en un reconnaisseur en
construisant un diagramme de transition appel automate fini.
Un automate fini est capable de reconnatre prcisment les
ensembles rguliers.
Il existe types d'automates tats finis:
Lesautomatestatsfinisnondterministes (AFN) n'ont
aucune restrictions sur les tiquettes de leurs arcs. Un symbole
peut tiqueter plusieurs arcs partant d'un mme tat, et la chane
vide est une tiquette possible.
Lesautomatestatsfinisdterministes (AFD), pour lesquels,
ne peuvent pas partir plusieurs transitions du mme tat avec le
mme caractre et n'accepte pas d'-transition.
Prof. M. BENADDY Compilation 54
Les automates tats finis

Automatesfinisnondterministes(AFN):
Un automate fini non dterministe not AFN, not par
l'expression aut = <,E,D,F,T> avec :
Un ensemble de symboles d'entre, l'alphabet du
langage. On considre que la chane vide , n'est jamais un
membre de .
L'ensemble fini E d'tats.
Une fonction de transition qui donne pour chaque tat et
pour chaque symbole de U{}, l'ensemble des tats
suivants T, sous ensemble de ExxE.
L'ensemble D sous-ensemble de E, des tats de dpart.
L'ensemble des tats F, sous-ensemble de E, l'ensemble
des tats d'acceptation ou tats finaux ou tats terminaux.
Prof. M. BENADDY Compilation 55
Les automates tats finis

Automatesfinisnondterministes(AFN):
Exemple :
= {a,b,c} ; E={1, 2, 3, 4} ; D={1} ; F = {3,4} , T
={(1,a,2), (2,b,3),(1,c,4),(3,c,2)}

Prof. M. BENADDY Compilation 56


Les automates tats finis

Automatesfinisnondterministes(AFN):
Graphed'tats:
Un graphe d'tats ressemble un diagramme de
transition, mais dans le cas des AFN, le mme caractre
peut tiqueter deux transitions ou plus en sortie d'un
mme tat et les arcs peuvent tre tiquets par le mme
symbole spciale .
Tous les tats de dpart sont reprsents par un cercle o
apparat une flche entrante :
Les tats terminaux sont reprsents par un cercle double
S'il existe un arc tiquet par un a entre l'tat i et l'tat j,
si le triplet (i, a, j) T on dessine cet arc comme suite :
Prof. M. BENADDY Compilation 57
Les automates tats finis

Automatesfinisnondterministes(AFN):
Graphed'tats:
Exemple:soit le langage (a|b)*abb ; ={a,b} ;
E={0,1,2,3} ; D={0} ; F={3} ; T={(0,a,0),(0,b,0),(0,a,1),
(1,b,2),(3,b,3)}

Prof. M. BENADDY Compilation 58


Les automates tats finis

Automatesfinisnondterministes(AFN):
Graphed'tats:
Notation:
est quivalent

si tout tat d'un ensemble donn tiquettent des


transitions d'un tat i vers un tat j on notera ={a, b, c}
Exemple: = {x, y} ; E ={1, 2 ,3} ; D ={1} ; F ={3} ; T ={(1,
y, 1), (1, x, 2), (2, y, 2), (2, x, 3), (3, x, 3), (3, y, 3)}

Prof. M. BENADDY Compilation 59


Les automates tats finis

Tabledetransition:
Une autre mthode de reprsentation d'un automate est la
table de transitions, pour dcrire la fonction de transition T
on utilisera une table M indice par E et , tel que si e
E, a , e' M(e,a) ssi (e, a, e') T
Exemple: table de transition correspondante
l'expression rgulire (a|b)*abb
tat a b
0 {0,1} {0} -
1 - {2} -
2 - {3} -
3 - - -
Prof. M. BENADDY Compilation 60
Les automates tats finis

Acceptationd'unechaneparunautomate:
Un AFN accepte une chane d'entre x ssi il existe un chemin dans le
graphe de transition entre l'tat de dpart et un tat d'acceptation
(final), tel que les tiquettes des arcs le long de ce chemin pellent
(enlever le poile) la chane x.
Exemples: La chane aabb est accepte par l'automate de
l'exemple (slide 58) , en se dplaant via les tats (0,0,1,2,3).
Soit l'automate suivant qui accepte les mots du langage engendrs par
l'expression rgulire aa*|bb*
La chane aaa est accepte en se dplaant via les tats (0,1,2,2,2).
les tiquettes de ces arcs sont aaa = aaa.

Prof. M. BENADDY Compilation 61


Les automates tats finis

Acceptationd'unechaneparunautomate:
Exemples(suite):soit l'expression rgulire a abb et la
+

chane x=abb, l'AFN correspondant cette expression est :

Cet automate n'accepte pas la chane x.


Si on considre a*abb, l'automate correspondant est :

Cet automate accepte la chane x=abb en parcourant le


chamin 1,2,3,4.
Prof. M. BENADDY Compilation 62
Les automates tats finis

Automatesfinisdterministes:
Un automate fini dterministe (AFD) est un cas particulier d'un automate fini non
dterministe (AFN) dans lequel :
Aucun tat n'a une -transition (une transition sur l'entre ).
Pour chaque tat e et chaque symbole a, il existe un et un seul arc tiquet a
qui quitte e.
Un AFD a au plus une transition partir de chaque tat sur n'importe quel
symbole, en consquence il est trs facile de dterminer si un AFD accepte une
chane d'entre, tant donn qu'il existe au plus un chemin depuis l'tat de dpart
tiquet par cette chane.
Si on utilise une table de transition pour reprsenter un AFD, chaque entre est un
tat singleton.
Un AFN est une reprsentation abstraite d'un algorithme de reconnaissance des
chanes d'un langage.
Un AFD est un algorithme concret de reconnaissance de chanes.
N'importe quel AFN ou expression rgulire peuvent tre transformes en un AFD.
Prof. M. BENADDY Compilation 63
Les automates tats finis

Simulationd'unAFD:
Soit x une chane d'entre qui se termine par un caractre de fin
de fichier (fdf ou eof), soit e un tat de dpart et F l'ensemble des
0

tats terminaux.
Soit la fonction transiter(e,c) qui donne l'tat vers lequel il y a une
transition depuis l'tat e sur le caractre d'entre c, la fonction
carsuiv(x) retourne le prochain caractre de la chane d'entre x.
La simulation d'un AFD est donne par l'algorithme suivant :
e=e0
c=carsuiv(x)
tantque(c!=fdf){
e=transiter(e,c)
c=carsuiv(x)
}
si(eF)alorsretrouner''oui''
sinonretourner''non''
Prof. M. BENADDY Compilation 64
Les automates tats finis

Simulationd'unAFD:
Exerciced'application:
dessiner l'AFD correspondant au langage L((a|b)*abb),
cette automate accepte-t-il la chane x=ababb.

Prof. M. BENADDY Compilation 65


Les automates tats finis

Simulationd'unAFD:
Exercice d'application : dessiner l'AFD correspondant
au langage L((a|b)*abb), cette automate accepte-t-il la
chane x=ababb.
Solution: l'automate correspondant au langage L((a|
b)*abb)) est :

Cet automate accepte la chane x en parcourant les tats


0,1,2,1,2,3

Prof. M. BENADDY Compilation 66


Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
Soit les automates suivants :
Aut1

Aut2 :

Prof. M. BENADDY Compilation 67


Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
L'automate 1 a deux transitions de l'tat 1 sur la chane
d'entre a qui signifie qu'on peut aller vers l'tat 0 ou 1.
De mme l'automate 2 a deux transitions sur partir de
l'tat 0.
Dans le cas o la fonction de transition est multivalue, il est
difficile de simuler un AFN l'aide d'un programme.
L'acceptation d'une chane d'entre suppose qu'il puisse
exister un chemin tiquet par cette chane qui mne depuis
l'tat de dpart jusqu' un tat d'acceptation.
Mais il existe dans un AFN plusieurs chemins qui pellent la
mme chane d'entre, on doit les prendre en considration
avant de dcider d'accepter ou non la chane d'entre.
Prof. M. BENADDY Compilation 68
Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
L'ide gnrale de la transformation d'un AFN en un AFD est
qu'un tat de l'AFD correspond un ensemble d'tats de
l'AFN.
L'AFD utilise un tat pour garder trace de tout les tats
possibles que l'AFN peut atteindre aprs avoir lu chaque
symbole d'entre.

Prof. M. BENADDY Compilation 69


Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
Algorithme :
Donne : un AFN
Rsultat : un AFD qui accepte le mme langage de l'AFN.
Mthode : l'algorithme construit une table de transition
Dtrans pour l'AFD.
Chaque tat de l'AFD est un ensemble d'tats de l'AFN.
On construit Dtrans de telle manire que l'AFD simulera
tous les dplacements possible que l'AFN peut effectuer
sur une chane d'entre donne.

Prof. M. BENADDY Compilation 70


Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
Algorithme :
Pour garder trace des ensemble des tats de l'AFN on
utilisera les oprations suivantes :
Soit e et T tels que e reprsente un tat de l'AFN et T
reprsente un ensemble d'tats de l'AFN.
Opration Description
-fermeture(e) Ensemble des tats de l'AFN accessibles depuis l'tat e
Not aussi -f(e) de l'AFN par des -transition uniquement.
-fermeture(T) Ensemble des tats de l'AFN accessibles depuis un tat
Not aussi -f(T) e T par des -transition uniquement.
transiter(T,a) Ensemble des tats de l'AFN vers lesquels il existe une
Not aussi tran(T,a) transition sur a
Prof. M. BENADDY Compilation 71
Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
Exemple d'application : soit l'AFN suivant qui accepte le
langage (a|b)*abb

Prof. M. BENADDY Compilation 72


Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
Exemple d'application :
L'tat de dpart de l'AFD A=-f(0)={0,1,2,3,4}
L'alphabet = {a, b}
B=-f(tran(A,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(A,a)=B.
C=-f(tran(A,b))=-f({5})={1,2,4,5,6,7} => Dtrans(A,b)=C.
-f(tran(B,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(B,a)=B.
-f(tran(B,b))=-f({5,9})={1,2,4,5,6,7,9} => Dtrans(B,b)=D.
-f(tran(C,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(C,a)=B.
-f(tran(C,b))=-f({5})={1,2,4,5,6,7} => Dtrans(C,b)=C.
-f(tran(D,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(D,a)=B.
-f(tran(D,b))=-f({5,10})={1,2,4,5,6,7,10} => Dtrans(D,b)=E.
-f(tran(E,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(E,a)=B.
-f(tran(E,b))=-f({5})={1,2,4,5,6,7} => Dtrans(E,b)=C.
Prof. M. BENADDY Compilation 73
Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
Exemple d'application :
L'tat E est l'tat de fin de l'AFD car E contient l'tat 10 qui
est l'tat d'acceptation de l'AFN.
Rgle: un tat de l'AFD est un tat d'acceptation si c'est un
ensemble d'tats de l'AFN qui contient au moins un tat
d'acceptation de l'AFN.
L'AFD quivalent l'AFN est :

Prof. M. BENADDY Compilation 74


Automates tats finis aux expressions rgulires

Transformationd'unAFNenunAFD:
Exemple d'application :
Table de transition de l'AFD :
tats de l'AFN tats de a b
l'AFD
{0,1,2,4,7} A B C
{1,2,3,4,6,7,8} B B D
{1,2,4,5,6,7} C B C
{1,2,4,5,6,7,9} D B E
{1,2,3,5,6,7,10} E B C

Prof. M. BENADDY Compilation 75