Académique Documents
Professionnel Documents
Culture Documents
1 2
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
• 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
• 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 :
PQ
• La reconnaissance se fait donc grâce aux PQ
automates à états finis P*
9 10
• 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
• 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
15 16
17 18
3
20/10/2021
19 20
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
4
20/10/2021
25 26
27 28
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
33 34
a b
e0 e1 e1
e1 e1 e1
35 36
• 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