Vous êtes sur la page 1sur 45

Chapitre II

Analyse Lexicale

06/11/2016 Mme Kerada Ramdane Ouidad 1


•Introduction

L'analyse lexicale consiste à :


 transformer un flot de caractères en un flot
de mots (lexèmes, unités lexicales,
ou jetons traduction de token ).

 identifier le type (catégorie ) de token


(identificateur, mot réservé, constante
numérique, opérateur, etc.).

06/11/2016 Mme Kerada Ramdane Ouidad 2


Lire un caractère
Fournir un lexème et ses
attributs
Analyseur Analyseur
Entrée
Lexical Syntaxique

Retourner un
caractère Demande le lexème
suivant

Table des
symboles

Interaction entre analyse lexicale et analyse syntaxique


06/11/2016 Mme Kerada Ramdane Ouidad 3
Exemple
a1:= b2+ 10 * a1;
a1 identif
:= affectation
b2 identif
+ Oper-arit
10 Const_num
* Oper-arit
a1 identif
; séparateur

06/11/2016 Mme Kerada Ramdane Ouidad 4


Principe de l’analyseur lexical
• Lire une suite de caractères de l'entrée et
produire une suite de jetons (adéquats pour
l'analyse syntaxique).
• Débarrasser le programme des commentaires
et des espacements.
• Tenir à jour les coordonnées (ligne, colonne)
des mots dans le programme source pour
produire des éventuels messages d'erreur et les
liés au texte source.

06/11/2016 Mme Kerada Ramdane Ouidad 5


Pour pouvoir donner une description formelle aux
différentes catégories de lexèmes, ils sont
regroupés en un ensemble de classes de jetons tel
que :
 Les Identificateurs
 Les mots réservés
 Les Opérateurs ( Arithmétiques, Logiques, …)
 Les opérateurs de comparaison
 Les Constantes numériques
 Les symboles de ponctuation
 Les Séparateur
………..
06/11/2016 Mme Kerada Ramdane Ouidad 6
Pour décrire le modèle d'une unité lexicale, on
utilisera des expressions régulières

06/11/2016 Mme Kerada Ramdane Ouidad 7


Rappels théoriques de théorie des langages
Définition1

• On appelle alphabet un ensemble fini non vide ∑ de symboles


(constitués de 1 ou plusieurs caractères).

• On appelle mot toute séquence finie d'éléments de ∑.

• On note ε le mot vide.

• On note ∑* l'ensemble infini contenant tous les mots possibles


sur ∑.

• On note ∑+ l'ensemble des mots non vides que l'on peut former
sur ∑, c'est à dire ∑+ = ∑* -{ε}
Exemple

06/11/2016 Mme Kerada Ramdane Ouidad 8


• Propriétés
|u.v|=|u|+|v|
(u.v).w=u.(v.w) (associativité)
ε est l'élément neutre pour . : u.ε = ε.u = u

• Définition2
On appelle langage sur un alphabet ∑ tout sous-
ensemble de ∑*.
Exemples.

06/11/2016 Mme Kerada Ramdane Ouidad 9


Opérations sur les langages :
• union : L1 ∪ L2 = { w tq w ∈ L1 ou w ∈ L2 }
• intersection : L1 ∩ L2 = { w tq w ∈ L1 et w ∈
L2 }
• concaténation :L1L2 = { w = w1w2 tq w1 ∈ L1
et w2 ∈ L2 } ;
• Ln = {w tq w= w1w2 …wn et wi ∈ L pour tout i
de 1 à n}
étoile : L* = ∑ Ln n ≥ 0

06/11/2016 Mme Kerada Ramdane Ouidad 10


Définition3
• Un langage régulier L sur un alphabet ∑ est
défini récursivement de la manière suivante:
• Si a est une lettre de ∑, { a} est un langage
régulier sur ∑
• Si R est un langage régulier sur ∑, alors Rn et R*
sont des langages réguliers sur ∑
• ε est un langage régulier .
• Si R1 et R2 sont des langages réguliers sur ∑ ,
alors R1 ∪ R2 et R1R2 sont des langages réguliers
• il n'y a pas d'autres langages réguliers sur ∑
06/11/2016 Mme Kerada Ramdane Ouidad 11
Les langages réguliers se décrivent très facilement par une
expression régulière.

Définition4
Les expressions régulières (E.R.) sur un alphabet ∑ et les
langages qu'elles décrivent sont définis récursivement
de la manière suivante :
• ε est une E.R. qui décrit le langage ε
• Si a ∈ ∑ , alors a est une E.R. qui décrit { a}
• Si r est une E.R. qui décrit le langage R, alors (r)* est
une E.R. décrivant R*
• Si r est une E.R. qui décrit le langage R, alors (r)+ est
une E.R. décrivant R+

06/11/2016 Mme Kerada Ramdane Ouidad 12


• Si r et s sont des E.R. qui décrivent respectivement
les langages R et S, alors (r)|(s) est une E.R.
décrivant R∪ S
• Si r et s sont des E.R. qui décrivent respectivement
les langages R et S, alors (r)(s) est une E.R.
dénotant RS
• Il n'y a pas d'autres expressions régulières
Remarque:
pour économiser des parenthèses, on conviendra des
priorités décroissantes suivantes : *, concaténation,
|
Exemple ((a)((b)*))|(c) = ab*|c
06/11/2016 Mme Kerada Ramdane Ouidad 13
• une ER décrivant les identificateurs pourrait être :

ident = (a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v
|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|
U |V|W|X|Y|Z) (a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q
|r|s|t|u|v|w|x|y|z|A|B |C|D|E|F|G|H|I|J|K|L|M |N|O
|P|Q| R|S|T|U|V|W|X|Y|Z|0|1|2|3|4|5|6|7|8|9| _ )*

ce qui est compliqué et illisible !!!!

06/11/2016 Mme Kerada Ramdane Ouidad 14


Notations importantes:
• [abc] pour (a | b | c).
• Pour les éléments ordonnés, on utilise [ a-z]
pour l’alphabet en minuscule, [ A-Z] exprime
l’alphabet en majuscule et [0-9 ] pour
représenter les chiffres de 0 à 9. Ainsi, identif
= [a-z] ( [a-z] |[A-Z] | _)*
• M? pour M | ε ( ? symbole d’optionnel)
• M+ pour M M*.
Exemple:
06/11/2016 Mme Kerada Ramdane Ouidad 15
Les définitions régulières

Une définition régulière est une suite de


définitions de la forme :
• d1 = r1
• d2 = r2
• …………………
• dn = rn
où chaque ri est une expression régulière sur
l'alphabet ∑∪{d1, d2,…..dn-1}, et chaque di est
un nom différent.

06/11/2016 Mme Kerada Ramdane Ouidad 16


Exemple : l'unité lexicale IDENT
(identificateurs) devient
lettre = [ a-z A-Z]
chiffre = [0 – 9]
sep = -
IDENT = lettre ( lettre | chiffre |sep )*

Exemple 2

06/11/2016 Mme Kerada Ramdane Ouidad 17


• Remarque Importante :
toutes les unités lexicales ne peuvent pas être
exprimées par des définitions régulières.
Par exemple
"toute suite de a et de b de la forme anbn avec n >0
ne peut pas être exprimée par des définitions
régulières,
Autre exemple : il n'est pas possible d'exprimer
sous forme d'ER les systèmes de parenthèses bien
formés, les mots (), (())(), ()(()()(())) .... Ce n'est
pas non plus un langage régulier, ainsi les
commentaires en Pascal ne forment pas un
langage régulier ????.

06/11/2016 Mme Kerada Ramdane Ouidad 18


Rappels sur les automates
• Théorème : Un langage régulier est reconnu
par un automate à états fini

06/11/2016 Mme Kerada Ramdane Ouidad 19


Définition 1

• Un automate fini est une structure A=(∑,Q,I,T,∆) à cinq


ensembles finis
- ∑ est un ensemble non vide, appelé alphabet d'entrée;
- Q est un ensemble non vide, appelé ensemble d'états
internes de A.
- I est un sous ensemble non vide de Q, appelé ensemble
d'états initiaux.
- T est un sous ensemble non vide de Q, appelé ensemble
d'états acceptants (ou finaux) ou de reconnaissance
- ∆ est un sous ensemble non vide de Q× ∑ ×Q, appelé
ensemble de transitions de A. L'ensemble ∆ est le
graphe d'une fonction défini de Q× ∑ dans Q, cette
fonction s'appelle fonction de transition
06/11/2016 Mme Kerada Ramdane Ouidad 20
Représentation d'un automate
 la représentation graphique
 Représentation par des tableau

Définitions 2 Automate Complet


Un automate A=(∑ ,Q,I,T,∆) est dit Complet si,
∀(p,a)∈Q× ∑ ;∃q∈Q tel que (p,a,q)∈∆.

Exemple
06/11/2016 Mme Kerada Ramdane Ouidad 21
Automates déterministes
Définition 3
Soit A un automate fini. A est dit à
comportement non déterministe (ou encore
AFND, NDFA) si
il existe un état p, il existe un x∈ ∑ . tel que
(p,x,q) et (p, x, q’)∈∆, q≠q’.

Exemple
06/11/2016 Mme Kerada Ramdane Ouidad 22
• Exemple
L'automate fini représenté par le graphe suivant
est un AFND

a,b
a
2
1

c
c
a,b
a,b,c
c
a
4 3

06/11/2016 Mme Kerada Ramdane Ouidad 23


Définition 4
Soit A=(∑ ,Q,I,T,∆) un automate fini, A est dit
déterministe s'il vérifie les deux conditions
suivantes :
i) si (p,x,q)∈∆ et (p,x,r)∈∆ alors q=r,
∀(p,q,r)∈Q³, ∀x∈ ∑ .
ii) l'ensemble I est constitué d'un seul état {i}.
Exemple

06/11/2016 Mme Kerada Ramdane Ouidad 24


Définition des ε-successeurs
Soit A=(∑ ,Q,I,T,∆) un AFND q∈Q ,
l’ensemble des ε-successeurs de q est l’ensemble
des états p ( q compris) pour lesquels il existe un
ε-chemin de q à p dans le graphe de transition ∆

ε-successeur (q) =
{ p / p=q ou ∃ ε-chemin de q à p}

Si S est une partie de Q alors


ε-successeur (S) = ∪ ε-successeur (q) pour q∈ S.
06/11/2016 Mme Kerada Ramdane Ouidad 25
a
a
1 a 2 3
ε

b b

06/11/2016 Mme Kerada Ramdane Ouidad 26


Déterminisation d’un AFND
Soit A=(∑ ,Q,I,T,∆) un AFND ,
l’AFD (l’automate à états fini déterministe )A’
équivalent à A est déterminé comme suit :
A’ =(∑ ,Q’,I’,T’,∆’) tel que:
• Q’ ⊆P (Q) ensemble des parties de Q ;
• I’ = ε-successeur (I).
• T’ ={ S ⊆Q’/ S ∩ T ≠φ }
• ∆’ ={ (S,x,S’) tel que S’ = ε-successeur ({ p /
(q,x,p)∈∆ pour q∈S, ∀ x ∈ ∑})

06/11/2016 Mme Kerada Ramdane Ouidad 27


La minimisation d’un AFD
Soit A=(∑ ,Q,I,T,∆) un AFD, Minimiser A consiste à trouver un automate équivalent à A
, Amin Avec un minimum d’états.
Algorithme
Debut
Initialement Q est partitionné en deux parties : π = { Q/T ; T}
/* Cette partition est progressivement raffinée jusqu’à stabilité de π.*/
etiq : ∀ ki ∈ π faire
∀ p,q ∈ ki , faire
∀ a ∈ ∑ tel que (p,a, r1) et (q,a,r2) ∈ ∆ faire
Si r1 et r2 ∈ kj ( i=j ou i≠j) alors p et q reste dans ki dans la nouvelle partition π
Sinon /* r1 ∈ kj et r2 ∈ kj’ (j≠j’) */ p et q ne seront plus dans la même partie dans π’
fsi
fpour
Si π =π’ alors arrêt de l’algorithme
Sinon π  π’ ; aller à etiq
Fin

06/11/2016 Mme Kerada Ramdane Ouidad 28


Qmin  π’ / ({ états morts (non productifs)}
∪{ états inaccessibles})
I  ki ∈π’ / I ∈ki
Tmin  ki∈π’/ ki ∩ T ≠ φ
∆min = { (ki,a,kj) /
(q,a,p)∈∆ avec q∈ki et p∈kj, pour ∀ a∈ ∑}

Exemple

06/11/2016 Mme Kerada Ramdane Ouidad 29


Diagramme de transition

Un diagramme de transition décrit les actions


à réaliser quand l’analyseur syntaxique
demande à l’analyseur lexical l’unité lexicale
suivante.

Un DT est défini par le (N, E, V, v0, Nf), c’est un


graphe orienté où

06/11/2016 Mme Kerada Ramdane Ouidad 30


• N ensemble fini de nœuds (états de transition) ;

• E ensemble fini d’arcs orientés étiquetés par les


éléments de V

• V est l’alphabet du langage

• n0 nœud ou état initial

• Nf ensemble des nœuds de N qui sont des états


finaux ou états de reconnaissance de lexèmes.

06/11/2016 Mme Kerada Ramdane Ouidad 31


L(DT) = { w €V* / il existe dans DT un
w_chemin de n0 à un nœud de Nf }

un w_chemin dans le DT est un chemin d’un


nœud p à un nœud q tel que la concaténation
des étiquettes des arcs constituant le chemin de
p à q forme le mot w

06/11/2016 Mme Kerada Ramdane Ouidad 32


Analyse
L’analyse d’un mot consiste à :
 se déplacer dans le DT d’un nœud à un autre
en commençant à partir du nœud de départ
(état start)

 la lecture des caractères du texte source


se fait par l’ appel à la fonction
caractère_suivant() qui retourne des
caractères qui coïncident avec les
étiquettes des arcs du DT.
06/11/2016 Mme Kerada Ramdane Ouidad 33
• Une étiquette « autre » est utilisée pour désigner
un caractère différent de ceux des arcs du DT.

• Un état est spécifié comme état de départ (état


start) si le contrôle se situe au niveau de cet état
au début de la reconnaissance d’un lexème.

• On utilise « * » devant un état pour signaler


l’obligation de faire un recul afin de redémarrer
l’analyse pour une autre unité lexicale.

• Les nœuds dans les différents DTs doivent se


nommés différemment

06/11/2016 Mme Kerada Ramdane Ouidad 34


Exemple
On considère les définitions régulières qui génèrent les
terminaux suivants { <, >, <=, >=, <> ; = ,
const_num, id}

• letter = [a-z A-Z]


• digit = [0-9]
• relop = <| <= | = | <>| > | >=
• id = letter ( letter | digit |sep)*
• const-num = digit+ ( . digit+ )? ( E ( + | - )? digit+ )?

06/11/2016 Mme Kerada Ramdane Ouidad 35


< = Retourner (oprel , INE)
0 1 2

Retourner (oprel , DIF)


3

autre
*
Retourner (oprel , INF)
4
Recul()

=
Retourner ( oprel, EGA)
5

> =
6 7 Retourner ( oprel, SUE)

autre
*
Retourner (oprel, SUP)
8

06/11/2016 Mme Kerada Ramdane Ouidad 36


Reconnaissance des lexèmes:

Les diagrammes de transitions peuvent être convertis


en code de manière relativement systématique.
• A chaque état, on associe un code. Ce code est rendu
accessible en tant qu'alternative (`case') (`switch').

• Si l'état indique un succès


– si l'état comporte une étoile, renvoyer le dernier
caractère lu au flot d’entrée (recul());
– déterminer l’unité lexicale et ses attributs, qui se
trouve entre debut_token et caractère_suivant (CS)
– faire avancer le pointeur debut_token jusqu’à la
position du caractère CS
06/11/2016 Mme Kerada Ramdane Ouidad 37
• Sinon:
–lire le prochain caractère, ce qui fait
avancer le pointeur CS;
–si le caractère lu correspond à
l’étiquette d'un des arcs, effectuer
une transition à l'état qui est à l'autre
bout de l'arc (modifier etat);
–sinon, appeler la fonction fail pour
déterminer le prochain état.
06/11/2016 Mme Kerada Ramdane Ouidad 38
Analyseur lexical et automate

• L’analyseur lexical est donc un (gros) automate


fini déterministe qui reconnaît l’union des
langages des catégories lexicales qui compose le
langage avec :
• Un ou plusieurs états terminaux correspond
chacun à la reconnaissance d’un mot d’un des
langages.
• Le processus n’est pas totalement déterministe,
car certains des langages sont préfixes d’un autre,
par exemple +, += , ++.

06/11/2016 Mme Kerada Ramdane Ouidad 39


alpha ou
numer

Start alpha 1

numer
numer
2

oparith-{/}
3
<

> 4 = 5

6 = 7

9 = 10
/

11

!= *

12 * 13 * 14 / 15

!= /

06/11/2016 Mme Kerada Ramdane Ouidad 40


Il faut attacher des actions à chacun des états de
l'automate et implémenter l’ automate.

06/11/2016 Mme Kerada Ramdane Ouidad 41


Erreurs lexicales

Peu d'erreurs sont détectables au seul


niveau lexical les erreurs se produisent
lorsque l'analyseur est confronté à une
suite de caractères qui ne correspond à
aucun des modèles d'unité lexicale qu'il
a à sa disposition.

06/11/2016 Mme Kerada Ramdane Ouidad 42


plusieurs stratégies sont possibles :
- mode panique : on ignore les caractères qui
posent problème et on continue

- transformations du texte source : insérer un


caractère, remplacer, échanger, ...

La correction d'erreur par transformations du


texte source se fait en calculant le nombre
minimum de transformations à apporter au mot
qui pose problème.
06/11/2016 Mme Kerada Ramdane Ouidad 43
Générateur d’analyseurs lexicaux

Un générateur d’analyseurs lexicaux est un programme


qui accepte en entrée des spécifications d'unités
lexicales et il produit un programme écrit dans un
langage de haut niveau (C, Pascal, Ada, ...) qui
reconnaît ces unités lexicales (analyseur lexical).
• L'utilisateur spécifie les unités lexicales à l'aide d'un
formalisme permettant de décrire des expressions
régulières.
• Il a aussi la possibilité de compléter les spécifications
par du code source qui sera repris dans le programme
généré.

06/11/2016 Mme Kerada Ramdane Ouidad 44


spécifications lex.yy.c
Flex flex compilateur C

caractères
(code source) lexèmes ...
a.out

06/11/2016 Mme Kerada Ramdane Ouidad 45

Vous aimerez peut-être aussi