Vous êtes sur la page 1sur 6

20/10/2021

1 2

Rappel des phases d’un compilateur


Programme source

Analyseur lexical

Analyseur
syntaxique
Cours de Compilation Gestionnaire de la
Analyseur
sémantique Gestionnaire
table des symboles Générateur de code d’erreurs
Cours : Analyse lexicale intermédiaire

Optimiseur de code
Responsable du cours : M. BESSAOUD
Générateur de code
Mail : bessaoud.univ.mosta@gmail.com

Programme exécutable

3 4

Rôle principal de l’analyseur lexical Unité lexicale

• Sa tache principale est de lire le programme source • Une unité lexicale représente une partie logique
et de produire une suite de mots appelés « unités du programme. Pour chaque unité lexicale, on a
lexicales » que l’analyseur syntaxique va utiliser. un ensemble de mots appelé « lexèmes ».
▫ Très souvent, l’analyseur lexical est un sous-programme • Exemple :
de l’analyseur syntaxique appeler pour obtenir la ▫ Pour l’unité lexicale « Mots clés », on peut avoir
prochaine unité lexical. les lexèmes : if, while, int, static…
▫ Pour l’unité lexicale « séparateur », on peut avoir
les lexèmes : ;, {, (…

5 6

Le lexème Le modèle

• Un lexème doit appartenir à une seule unité • Un modèle est une règle associée à une unité lexicale
lexicale. qui définit l’ensemble des mots du programme qui
• Si un lexème n’appartient à aucune unité peuvent appartenir à cette unité lexicale.
lexicale, alors le compilateur va détecter une • Un modèle doit définir d’une façon formelle une
erreur lexicale. unité lexicale.
• Pour savoir si un lexème appartient à une unité
lexicale donnée, on a besoin de définir • Exemple :
précisément quelles sont les mots qui ▫ Pour l’unité lexicale « identificateur » le modèle est
appartiennent à cette unité lexicale, cela est fait comme suit : Suite non vide de lettres, de chiffres et du
grâce aux « modèles ». symble _ qui ne commence pas par un chiffre.

1
20/10/2021

7 8

Langages des unités lexicales Langages réguliers

• Les unité lexicales appartiennent aux langages • Un langage est régulier si et seulement s’il existe une
grammaire régulière générant ce langage.
réguliers
• Etant donné un alphabet A, on appelle langage régulier
sur A un langage défini de la façon suivante :
• Les modèles sont spécifier formellement par des ▫  (l’ensemble vide) est un langage régulier sur A.
expressions régulières ou des grammaires ▫ {} est un langage régulier sur A.
▫ {a} est un langage régulier sur A pour tout a  A.
régulières ▫ Si P et Q sont des langages réguliers sur A, alors les langages
suivants sont des langages réguliers :
 PQ
• La reconnaissance se fait donc grâce aux  PQ
automates à états finis  P*

9 10

Expressions régulières Exemples de langages réguliers

• Une expression régulière est une chaîne de caractères, • Tout langage fini est régulier.
qui décrit, selon une syntaxe précise, un ensemble de
mots formant un langage régulier.
• Notation : soient r et s les expressions régulières des • L’ensemble de tous les mots A* est régulier.
langages L(r) et L(s).
▫ (r)|(s) est une expression régulière du langage L(r)  L(s) • Sur l’alphabet {a, b}, le langage a*b* est régulier.
▫ (r)(s) est une expression régulière du langage L(r)L(s)
▫ (r)* est une expression régulière du langage L(r)*
• Par convention, l’opérateur étoile (*) est prioritaire sur
la concaténation qui est lui-même prioritaire sur
l’union (|).

11 12

Automates à états finis Définition formelle d’un automate à états finis

• Les automates qui permettent de reconnaitre les • Un automate à états finis est défini par un
mots des expressions régulières sont les quintuplet AEF=(A,Q,I,F,) :
automates à états finis ▫ Un alphabet pour les mots en entrée noté A
• Un automate à états finis est composé de trois ▫ Un ensemble non vide d’états noté Q
parties : ▫ Un ensemble non vide d’état initiaux noté I  Q
1. une bande de lecture ▫ Un ensemble d’états finaux F  Q
2. une tête de lecture ▫ Une fonction de transition (permettant de changer
3. une unité de contrôle d’état) notée δ.

2
20/10/2021

13 14

Représentation d’un automate à états Représentation graphique d’un automate à


finis états finis
• Un automate à états finis est donc un graphe
dans lequel :
• Il existe trois façons de représenter un automate
▫ les nœuds sont les états ei
à états finis :
 Représentation graphique
▫ les arcs sont les transitions possibles avec la
fonction de transition
 Représentation formelle
▫ La pondération de chaque arc est le ou les a
 Représentation tabulaire ej
symboles lus lors du changement d’état ei
▫ Un ou plusieurs états initiaux e0
▫ Un ou plusieurs états finaux e n

15 16

Exemple de représentation graphique Exemple de représentation formelle

• L’expression régulière : abb • L’expression régulière er1= abb


• AEF(er1)=(A,Q,I,F,)
b b  A={a,b}
a
e1 e2 e3  Q = {e0, e1, e2,e3}
e0  I={e0}
 F={e3}
 ={(e0, a) e1, (e1,b,)e2, (e2, b) e3}
• L’expression régulière : a* • L’expression régulière er2= a*
a • AEF(er2)=(A,Q,I, F, )
 A={a}
 Q = {e0}
e0  I={e0}
 F={e0}
 ={(e0, a) e0}

17 18

Exemple de représentation tabulaire Le déterminisme des automates

• L’expression régulière : abb • Un automate est dit déterministe si :


a b ▫ il a un seul état initial,
e0 e1 - ▫ étant donné un état ei ∈ Q et un symbole a ∈ A, il
e1 - e2 n’existe pas plus d’une seule transitions possibles
e2 - e3
e3 - -
• Si un automate n’est pas déterministe, le temps
• L’expression régulière : a* d’exécution risque d’exploser assez rapidement
a
e0 e0

3
20/10/2021

19 20

Le déterminisme des automates à


Exemple d’un automate indéterministe
états finis
c
a c
e1
e0 a e2 • s’il existe un automate à états finis
indéterministe reconnaissant un langage donné,
b alors il existe un automate à états finis
e3 b
déterministe reconnaissant le même langage.

• Pour pouvoir appliquer la procédure de


On souhaite reconnaitre le mot : aac déterminisation d’un automate à états finis, il
faut que l’automate soit :
▫ Sans états inaccessibles

21 22
• procédure rendDéterministe
• entrée : un AEFI =(A,Q,I,F,) // L’automate à états finis indéterministe
Automate à états finis sans états inaccessibles • sortie : un AEFD =(A,Qd,e0d,Fd,d) // L’automate à états finis déterministe
• tel que L(AEFI) = L(AEFD) //Le langage reconnu par les deux automates est le même
• début
▫ e0d← I //ed est un état qui regroupe tous les états initiaux
▫ Qd ← {e0d} //Qd est un ensemble qui contient initialement l’état initial e0d
• Un automate à états finis est sans états ▫ vus ← ∅ //L’ensemble des états de Qd qui ont été traités. Initialement, aucun état n’est traité
▫ d ← ∅ // initialisation de l’ensemble des transitions de l’automate déterministe
inaccessibles si tous les états de l’automate sont ▫ tant que Qd  vus faire // tant que tous les états de Qd n’ont pas encore traités

accessibles à partir de l’ensemble des états  soit eid  Qd et eid  vus //prendre un état de Qd pas encore traité
 pour tout a ∈ A faire // pour chaque symbole de l’alphabet
initiaux.  ekd ← {ek/∃ei ∈ eid,(ei , a)  ek ) ∈ } // ekd est l’état formé par l’ensemble des états ek
qui sont les destinataires des transitions sortants avec le symbole « a » des états ei
formant eid
 Qd ← Qd ∪ {ekd} // ekd est ajouté à Qd s’il n’existe pas déjà
 d ← d ∪ {(eid,a) ekd)} // une nouvelle transition est ajoutée à AEFD
 fin pour
 vus ← vus ∪ {eid} // ajouter eid à l’ensemble des états traités
▫ fin tant que
• Fd ← {eid ∈ Qd/eid ∩ F  ∅} // l’ensemble des états finaux est composé des états qui contiennent
au moins un état final de AEFI
• fin

23 24

Exemple 1 : a+c+ | b+c+ Exemple 1 : a+c+ | b+c+


c
a c
e1 e2 a b c a b c
e0 a
e0 e0, e1 - - e0d = {e0, e3} e1d e2d -
e1 - - e1, e2 e1d = {e0, e1} e1d - e3d
b
e2 - - - e2d = {e1 , e3} - e2d e3d
e3 b
e3 - e1, e3 - e3d = {e1, e2} - - e3d
Il est préférable d’utiliser la représentation tabulaire car elle L’automate à états finis
L’automate à états finis
permet de mieux voir les étapes et surtout d’éviter les oublis indéterministe déterministe
des états non traités

4
20/10/2021

25 26

Exemple d’automate déterministe a+c+ | b+c+ Déterminisme : exemple à faire


• Soit l’automate suivant:
c c
a b b
e3d a
e1d a e1
e0 a e2
e0d
c
b • a+b+
e2d b

27 28

Automate à états finis complet Exemple d’automate à états finis complet

• Un automate est donc complet si sa fonction de • L’expression régulière : abb


transition  est définie pour tout état de a b b
l’automate et tout symbole de l’alphabet. e0
e1 e2 e3
a
a
• Pour rendre un automate à états finis complet, b
ep a, b
on peut rajouter un état supplémentaire appelé
• L’expression régulière : a* a, b
état puits, vers lequel vont toutes les transitions a
impossibles.
e0

29 30

• procédure rendMinimal
Minimiser un automate • entrée : AEFD un automate à états finis déterministe, complet et
sans états inaccessibles ;
• sortie : AEFM un automate à états finis minimal
• tel que L(AEFD) = L(AEFM)
• Tout langage régulier est reconnu par au moins un • début
automate à états finis déterministe et complet. ▫ Séparer les états en maximum deux groupes : G1 contenant les états
• Il en existe un ayant un nombre minimal d'états. finaux et éventuellement G2 contenant les états non finaux ;
Cet automate est unique : c'est l’automate ▫ Répéter
minimal du langage.  S’il existe un symbole a et deux états ei et ej d’un même groupe tel que
• La notion de minimalisme est lié au nombre d’états δ(ei, a) et δ(ej , a) n’appartiennent pas au même groupe, alors créer un
de l’automate. nouveau groupe et séparer ei et ej.
 On laisse dans le même groupe tous les états qui donnent un état
• L'intérêt d'un automate minimal est que le coût en d’arrivée dans le même groupe ;
espace mémoire est minimisé. ▫ jusqu’à ce qu’il n’y ait plus de groupe à séparer ;
• Afin de minimiser un automate à états finis, il faut • Fin
d’abord que celui-ci soit déterministe, complet et • L‘état initial est le groupe qui contient l‘état initial de l’AEFD
sans états inaccessibles ;
• Les états finaux sont tous les groupes qui dérivent de G1

5
20/10/2021

31 32

L’arrêt de l’algorithmes Déroulement de l’algorithme sur l’exemple


a+c+ | b+c+
• Pour la condition d'arrêt de la boucle de l'algorithme de • G1={e3d}, G2={e0d, e1d, e2d, ep} a b c
minimisation, on peut distinguer trois cas de figures : • G1={e3d}, G2_1={e0d, ep} , e0d = e{e
0d0, e3} e1d
1d e2d
2d e-p
▫ 1. La dernière itération n'a pas changé les groupes. G2_2={e1d, e2d}
▫ 2. Il existe un seul groupe. Ce groupe ne peut pas être divisé • G1={e3d}, G2_1_1={e0d}, e1d = e{e ,e}
1d0 1
e1d e-p e3d
parce que toutes les transitions vont vers des états de ce G2_1_2={ep}, G2_2_1={e1d}, e2d = e{e
même groupe. Il existe deux cas de figure : 2d1 , e3} e-p e2d e3d
 (a) Tous les états sont des états finaux : vu que l'automate est G2_2_1={e2d} e3d =e{e e-p e-p
3d1, e2} e3d
complet, cela revient a reconnaitre tous les mots définis sur • L’automate en entré est
l'alphabet A. Le langage est alors A*. ep ep ep ep
minimal car tous les groupes L’automate à états finis
 (b) Aucun état n'est un état final : vu que l'automate est sont constitué d’un seul état. déterministe
complet, cela revient a ne reconnaitre aucun mot défini sur L’automate à états finis
l'alphabet A. Le langage est alors . déterministe et complet
▫ 3. Tous les groupes sont constitues d'un seul état. Cela veut
dire que l'automate était minimal avant l'exécution de
l'algorithme.

33 34

Exemple 2 : Minimisation de l’automate

• Soit l’automate suivant : • G1={e0, e1}


a, b
a, b
• Fin de l’algorithme car il y a un seul état qui est
e1
initial et final, je ne peu pas réduire plus
e0
• Le langage reconnu par cet automate est (a*b*)*

a b
e0 e1 e1
e1 e1 e1

35 36

Autres taches de l’analyseur lexical Gestion des erreurs lexicales

• D’autre tache sont réaliser par l’analyseur lexical : • Peu d’erreurs sont détectables au niveau lexical.
• Il peut cependant arriver qu’un mot ne corresponde
▫ Suppression des commentaires. à aucune unité lexicale, l’analyse doit continuer pour
▫ Suppression des espace/ tabulation/ retour à la détecter éventuellement d’autres erreurs de
ligne. compilation.
▫ Générer la numérotation des ligne du code source • Plusieurs stratégies existent :
▫ Mode panique : suppression des caractères successifs
▫ Détection d’erreurs lexicales. jusqu’à obtenir une unité lexicale bien formée
▫ Remplir la table des symboles avec les ▫ Supprimer un caractère superflu
identificateurs. ▫ Insérer un caractère manquant
▫ Remplacer un caractère par un autre
▫ Échanger deux caractère successifs

Vous aimerez peut-être aussi