Vous êtes sur la page 1sur 49

Université d’Alger 1

Benyoucef benkhedda

Compilation

Analyse Lexicale

L3 Informatique : SI
Année universitaire
2023/2024
1
Qu’est-ce que la compilation ?

L'ordinateur execute un programme écrit en langage machine

Aujourdhui, les programmes sont écrits en utilisant les langages de haut niveau

Un traducteur est donc necessaire pour passer d'un langage source au langage cible

Compilateur Assembleur

Compilation Assemblage
28/10/2023 2
Interpréteur versus Compilateur
Interpréteur Compilateur
• Analyse les instructions du • Effectue un pré-calcul sur un
programme source, les unes après programme P pour le transformer en
les autres, et exécute chacune d'elles une suite d’instructions P’.
immédiatement.
• Pas de création d'un programme • Création d’un code objet (fichier
objet équivalent. .obj)

• ne connait pas à priori la structure • La structure du programme est


du programme qu’il aura à exécuter connue à priori
et ne peut donc effectuer
d’optimisations.
• Doit être présent sur le système à • Ne doit pas etre présent dans le
chaque fois que le programme est système à chaque exécution
exécuté,
• Exécution plus lente (Perl, Mapple, • Exécution rapide après compilation.
28/10/2023 3
…)
Les différentes phases de compilation

28/10/2023 4
Analyse
• Vérifier si le programme source est correct
• Doit être la plus rapide possible, c’est pourquoi on la structure en trois parties.

Analyse

Analyse Lexicale Analyse Syntaxique Analyse Sémantique

Code source Analyse Lexicale


va l = 10 * va l + i

Lexèmes Analyse Syntaxique

1 3 2 4 1 5 1 Code de l‘unité
Arbre syntaxique
(ident) (assign) (number) (opr) (ident) (opr) (ident)
"val" - 10 - "val" - "i" Valeur de l‘unité

28/10/2023 5
Analyse

Analyse Syntaxique

Arbre syntaxique Analyse sémantique

Statement
Arbre syntaxique
Expression MAJ

Term Statement

Expression
ident = number * ident + ident
Term

inttofloat
28/10/2023 ident = number * ident + ident 6
Synthèse (production)
• Phase de reconstruction de l’expression du langage cible à partir de l’arbre syntaxique

Sythèse

Allocation Mémoire Génération de code Optimisation de code

Génération d’un code


objet (.obj) qui correspond à
l’arbre syntaxique.

Réservation de l’espace en
mémoire pour des calculs intermédiaires ou Il s’agie de détecter
le passage des arguments d’une procédure des séquences de code cible qui
(Ramasse miettes ou Garbage Collector) peuvent etre optimisées.

28/10/2023 7
Phase parallèle

Phase parallèle

Gestion de la table des symboles (TS) Gestion des erreurs

Il s'agit de les détecter


TS associe à chaque identificateur déclaré et d'informer l'utilisateur le plus
dans le programme des divers attributs précisément possible
calculées au moment de l’analyse. Ces
attributs fournissent des informations :
• Adresse de chaque identificateur.
• Type.
• Portée,
• Mode de passage de paramètres d'une
fonction,…).
28/10/2023 8
Analyse Lexicale
Quelques définitions
Une unité lexicale
Une unité lexicale est une suite de caractères qui a une signification collective.
Exemple :
OPREL des opérateurs relationnel : <, >,=
IDENT des identificateurs.

Un modèle
Un modèle est une règle associée à une unité lexicale qui décrit l’ensemble des chaines
du programme qui peuvent correspondre à cette unité lexicale
Exemple : L’unité lexicale IDENT a pour modèle toute suite non vide de caractères et
composée de chiffres, de lettres, ou de symboles, et qui commence par une lettre.

Un lexème (Token)
On appelle lexème toute suite de caractère du programme source qui concorde avec le
modèle d’une unité lexicale.
Exemple de lexèmes pour unité lexicale IDENT : a ; b ; tot1 ; x_1
28/10/2023 Cours Compilation - Analyse Lexicale 9
Analyse Lexicale
Introduction
• La première phase de compilation ;
• Segmenter le texte du programme source en un ensembles de lexèmes (classifiés) que
l’analyseur syntaxique va utiliser.
• Cette interaction est implantée en faisant de l’analyseur lexical un sous programme de
l’analyseur syntaxique, à la réception d’une commande « prochaine unité lexicale »
émanant de l’analyseur syntaxique, l’analyseur lexical lit les caractères d’entrées
jusqu’à ce qu’il puisse identifier la prochaine unité lexicale.

• Débarrasser le programme des commentaires, espacements et tabulations.


• Tenir à jour les coordonnées (ligne et colonne) dans le programme pour fin de
production des éventuels messages d’erreur- Analyse Lexicale
Cours Compilation 10
Fonctionnement d‘un compilateur
"Programme principal"
Analyse Syntaxique Dirige toute la compilation
Sémantique

scanner Génération de code

Fournit les unités lexicales à partir génère le code machine


du code source Table des symboles

Maintient des informations sur


les variables et types déclarés

Utilise

Flots de données
Analyse Lexicale
Rappels
Alphabet
Un ensemble fini dont les éléments seront appelés lettres.
Exemple : 0,1 sont les lettres de l’alphabet binaire.
Mot sur un alphabet A
Une suite finie d’éléments de A.
Longueur d’un mot
Un mot de longueur n composé des lettres a1, a2……., an sera noté a1a2 …an,
Mot vide
Le mot vide est noté ε
Concaténation
La concaténation de deux mots m1 et m2 est notée m1m2
Ensemble des mots sur alphabet
Ensemble des mots sur un alphabet A est noté A*
Langage
Un langage sur un alphabet A est un ensemble de mots de A*
28/10/2023 Cours Compilation - Analyse Lexicale 12
Analyse Lexicale
Réalisation

Analyse lexicale

Expressions régulières Automates d’états finis

• Description d’un langage Reconnaissance d’un langage

28/10/2023 Cours Compilation - Analyse Lexicale 13


Analyse Lexicale
Description (1)

Définition
• Une expression régulière est une formule close permettant de désigner un ensemble de
chaines de caractères (Langage) construites à partir d’un alphabet Σ .
• Une expression régulière est une notation pour décrire un langage régulier.
Soit Σ un alphabet (un ensemble de lettres) :
1. Les éléments de Σ, ε (mot vide) et Ø (langage vide) sont des expressions régulières.
2. Si α et β sont des expressions régulières alors
• (α|β), (αβ) et α* sont des expressions régulières.
• (α|β) représente l’union,
• (αβ) la concaténation
• α * la répétition (Concaténations de α avec lui-même ou la chaîne vide).
• ε est l’élément neutre par rapport à la concaténation
• Ø (ensemble vide de caractère) neutre par rapport à l’union.

Exemple : L’expressions régulière a|b*c dénote l’ensemble des chaînes qui ont soit un
seul a ou un nombre quelconque; ou nul ; de b suivi par un c.
28/10/2023 Cours Compilation - Analyse Lexicale 14
Analyse Lexicale
Description (2)

Propriétés algébriques
Soit r,s et t des expressions régulières.
• r|s = s|r : l'opérateur | (ou) est commutatif.
• r|(s|t) = (r|s)|t : l'opérateur | est associatif.
• (rs)t = r(st) : la concaténation est associative.
• r(s|t)=rs|rt :la concaténation est distributive par rapport au |
• ε r = r ε = r : e est l'élément neutre de la concaténation.

• r* =(r|ε)* : e est inclus dans une fermeture.


• r** = r* : * est idempotent

Cours Compilation - Analyse Lexicale 15


Analyse Lexicale
Description (3)

Définition régulière
Une définition régulière est une suite de définitions de la forme:
d1 → r1
d2 → r2
. .
. .
dn → rn
Chaque di est un nom distinct et chaque ri est une expression régulière
sur l’alphabet :

Exemple
La définition régulière d'un identificateur :
Lettre → A|B|...|Z|a|b|...|z
Chiffre → 0|1|2...|9
Id → Lettre(Lettre|Chiffre)*

28/10/2023 Cours Compilation - Analyse Lexicale 16


Analyse Lexicale
Reconnaissance
Automate d’état finis
• On reconnait un langage par un programme qui prend en entrée une chaine x et
répond oui si x est un mot du langage et non autrement.
• On compile une expression régulière en un reconnaisseur en construisant un
diagramme de transition généralisé appelé automate d’état fini.

Théorème
Un langage régulier est reconnu par un automate fini.
• Un langage régulier (et donc une ER) peut être reconnu par un automate d’états finis.
• Donc, pour écrire un analyseur lexical de notre programme source, il suffit de d’écrire
un programme simulant l'automate.
• Lorsqu'une unité lexicale est reconnue, elle est envoyée à l'analyseur syntaxique qui la
traite puis repasse la main à l'analyseur lexical qui lit l'unité lexicale suivante dans le
programme source.
• Et ainsi de suite, jusqu'à tomber sur une erreur ou jusqu'à ce que le programme source
soit traité en entier (et alors on est content….).
28/10/2023 Cours Compilation - Analyse Lexicale 17
Analyse Lexicale
Reconnaissance
Exemple
Reconnaissance des unités lexicales INFEG, DIFF, INF, EGAL, SUPEG, SUP, IDENTIF,
respectivement définies par les expressions régulières <=, <>, <, =, >=, > et
lettre(lettre|chiffre)*.

28/10/2023 Cours Compilation - Analyse Lexicale 18


Automates Finis Déterministe (AFD)
un quintuple A=(Q , Σ,δ,q0, F), où
- Q est un ensemble fini d’états
- Σ est un alphabet
- δ : Q x Σ → Q est la fonction de transition
- q0 est l’état initial
- F est l’ensemble des états terminaux ou finaux
L’analyse lexicale nécessite la construction d’un automate d’états finis déterministe
Un automate A est déterministe ssi:
Les transitions sont simples: Ei →Ej, a ∈a Σ
 Pas de transitions spontanées: Ei →Ej ε
 L’état initial est unique
 Si Ei →Ej
a et Ei a→Ek ⇒ Ej=Ek

Un AFD reconnaît une unité lexicale:


 S‘il est dans un état final
 Et il n‘y a plus de symboles d‘entrée
28/10/2023 Cours Compilation - Analyse Lexicale 19
Les automates finis non déterministe
Un automate non-déterministe est un automate qui présente la particularité suivante :
 Plusieurs arcs reconnaissant le même caractère peuvent « sortir » du même état.
 Il peut y avoir des transitions, notées ε, qui ne correspondent à une aucune reconnaissance

Exemple:

28/10/2023 Cours Compilation - Analyse Lexicale 20


Représentation d'un automate en mémoire:
On représente un AEF par une matrice de transition T.
➢ Une ligne pour chaque état de l'AEF, une colonne pour chaque lettre (terminal de l'automate).
➢ Une constante pour l'état initial.
➢ Un vecteur des états finaux.

Exemple:
• L’entrée pour la ligne i et le symbole a, donne l’ensemble des états qui peuvent être atteints à
partir de l’état i avec le symbole a.

28/10/2023 Cours Compilation - Analyse Lexicale 21


Démarche Générale de construction d’un analyseur
lexical
En se basant sur les propositions démontrables suivantes :

 L’ensemble des unités lexicales d’un langage donné constituent un langage


régulier L.

 Pour toute expression régulière r, il existe un automate fini non déterministe


(AFN) qui accepte l’ensemble régulier décrit par r .

 Si un langage L est accepté par un automate fini non déterministe (AFN), alors il
existe un automate fini déterministe (AFD) acceptant L.

On peut définir une approche rigoureuse pour la construction d’un analyseur


lexical en utilisant les automates d’états finis. Cette approche est constituée
de six étapes……

28/10/2023 Cours Compilation - Analyse Lexicale 22


Démarche Générale de construction d’un analyseur
lexical

28/10/2023 Cours Compilation - Analyse Lexicale 23


Construction d’un AFN à partir d’une
expression régulière (étape 2)
Donnée : une expression régulière r sur un alphabet Σ
Résultat : Un AFN qui connait L(r)
• Il existe plusieurs algorithmes pour effectuer cette construction. Parmi les plus
simples et les plus faciles à implémenter on cite l’algorithme de construction de
Thompson.
• Dans la suite, nous utiliserons les notations suivantes :
r : désigne une expression régulière
N(r) : l’AFN correspondant à r (qui reconnait r)

1. Pour r = ε N(ε) est représenté par :

2. Pour r = a N(a) est représenté par :

28/10/2023 Cours Compilation - Analyse Lexicale 24


Construction d’un AFN à partir d’une expression
régulière
3. Pour N(rs) on a :

4. Pour N(r|s) on a :

5. Pour r* , N(r*) sera donnée par la représentation suivante :

28/10/2023 Cours Compilation - Analyse Lexicale 25


Détermination d’un AFN (étape 4)
o Pour tout AFN il existe un AFD:
Algorithme de détermination d’un AFN ne contenant pas de ε-transitions

1- A Partir de l’état initial E0 = {e0}


2- Construire E1 qui est l’ensemble des états obtenus à partir de E0 par la
transition étiquetée a, E1 = Transiter(E0,a).
3- Recommencer l’étape 2 pour toutes les transitions possibles et pour chaque
nouvel ensemble d’états Ei.
4- Tous les ensembles d’états Ei contenant au moins un état final deviennent
finaux.
5- Renuméroter les ensembles d’états obtenus en tant que simples états.

28/10/2023 Cours Compilation - Analyse Lexicale 26


Détermination d’un AFN
• principe
b
e3
a e1

e0
b e4
a e2

c
e5

28/10/2023 Cours Compilation - Analyse Lexicale 27


Détermination d’un AFN
• principe
b
e3
a e1

e0
b e4
a e2

c
e5

28/10/2023 Cours Compilation - Analyse Lexicale 28


Détermination d’un AFN
• principe {e3,e4}
b
e3 b
a e1 a
e0 {e0} {e1,e2}
b e4
a e2
c
c {e5}
e5

δ({e1,e2},b)= δ(e1,b) ⋃ δ(e2,b)={e3,e4}

28/10/2023 Cours Compilation - Analyse Lexicale 29


Détermination d’un AFN
Exemple:

δ({0,2},a)= δ(0,a) ⋃ δ(2,a)


δ({3,4},b)= δ(3,b) ⋃ δ(4,b)
……
Après l’application de l’algorithme
nous obtenons la table de
transition de l’AFD suivante :

28/10/2023 Cours Compilation - Analyse Lexicale 30


Détermination d’un AFN
Après renumérotation, la table de l’AFD
devient :

28/10/2023 Cours Compilation - Analyse Lexicale 31


Détermination d’un AFN
Un autre exemple..

L’automate non déterministe de la figure ci-après, reconnait l’ensemble des


chaines {a, aa, ab, aba, abb}.

L’AFD correspondant est donné par la figure ci-après, on constate que les états
ne sont pas disjoints (234, 34, 4).

28/10/2023 Cours Compilation - Analyse Lexicale 32


Détermination d’un AFN
Principe de l’élimination des ε-transitions:

1) Si on peut passer d’un état 1 à l’état 2 avec une transition étiquetée ε, on alimine
cette transition et on ajoute aux transitions de 1 toutes les transition de 2

a 4

ε c
1 2
5

b
3

28/10/2023 Cours Compilation - Analyse Lexicale 33


Détermination d’un AFN
Principe de l’élimination des ε-transitions:

1) Si on peut passer d’un état 1 à l’état 2 avec une transition étiquetée ε, on alimine
cette transition et on ajoute aux transitions de 1 toutes les transition de 2

a
c 4
a
ε c
1 2
5

b b
3

28/10/2023 Cours Conpilation - Analyse Lexicale 34


Détermination d’un AFN
Méthode de construction de sous-ensembles pour la transformation des AFN en AFD (cas
général)
L’algorithme de construction de sous-ensembles permet de construire une
table de transitions de l’AFD en se basant sur celle de l’AFN équivalent.

a- Notation et opérations utilisées


Soit un AFN noté N et D son AFD équivalent
 DTrans est la table des transitions de D
 Détats est l’ensemble des états de D
 e est un état de N
 e0 est l’état initial de N
 T est un ensemble d’états de N
 L’opération ε-fermeture(e) est l’ensemble des états de N accessibles à partir de l’état
e par des ε-transitions uniquement(l’état e inclus).

28/10/2023 Cours Compilation - Analyse Lexicale 35


Détermination d’un AFN
 L’opération ε-fermeture(T) donne l’ensemble des états de N accessibles à
partir des états e (e∈ T) par des ε-transitions uniquement.

 L’opération Transiter(T,a) donne l’ensemble des états de N vers lesquels il existe


une transition avec le symbole d’entrée a à partir des états e ∈ T.

Exemlple

ε-fermeture(1) = {1, 2, 3, 4, 8},


ε-fermeture({2,5}) = {2, 3, 4, 5, 6, 7},
ε-fermeture({3,6}) = {3, 4, 6, 7}

Transiter({1, 5},a) = {3, 8, 6},


Transiter({1},b) = {7},
Transiter({2},b) = {}

28/10/2023 Cours Compilation - Analyse Lexicale 36


Détermination d’un AFN
On ajoute des états et des transitions à D en utilisant l’algorithme de construction
de sous-ensembles qui se présente comme suit :

28/10/2023 Cours Conpilation - Analyse Lexicale 37


Détermination d’un AFN
 Chaque état de D correspond à un sous ensemble d’états de N de
sorte que D simule en parallèle tous les déplacements possibles que
N peut effectuer pour une chaine d’entrée donnée.

 L’état de départ de D est ε-fermeture d’e0.

 Un état de D est final s’il correspond à un ensemble d’états de N


contenant, au moins, un état final.

28/10/2023 Cours Compilation - Analyse Lexicale 38


Algorithme de construction de sous-ensembles

Exemple: Application de l’algorithme de construction de sous-ensembles sur


l’AFN

ε-fermeture(0) = {0 ,1 ,2 ,4 ,7} = A

28/10/2023 Cours Compilation - Analyse Lexicale 39


Algorithme de construction de sous-ensembles

28/10/2023 Cours Conmilation - Analyse Lexicale 40


Algorithme de construction de sous-ensembles

28/10/2023 Cours Conpilation - Analyse Lexicale 41


Algorithme de construction de sous-ensembles

DTran [E, a] ← B
ε-fermeture(Transiter(E, b)) = ε-fermeture({5}) = C
DTran [E, b] ← C

Après plusieurs itérations, on arrive ainsi à un point où tous les sous-ensembles d’états de
l’AFD sont marqués. A la fin les cinq ensembles d’états construits sont :
A = {0, 1, 2, 4, 7}
B = {1, 2, 3, 4, 6, 7, 8}
C = {1, 2, 4, 5, 6, 7}
D = {1, 2, 4, 5, 6, 7, 9}
E = {1, 2, 4, 5, 6, 7, 10}
• A est l’état initial de l’automate et E son état final.

28/10/2023 Cours Compilation - Analyse Lexicale 42


Algorithme de construction de sous-ensembles

Résultat

28/10/2023 Cours Compilation - Analyse Lexicale 43


Minimisation d’un AFD (étape 5)
La minimisation d’un AFD consiste en deux opérations principales :

 Elimination de tous les états inaccessibles de l’AFD

 Elimination des états puits

 Regroupement des états équivalents en les remplaçant par des classes


d’équivalence

• Un état e est accessible s’il existe une chaine menant à e à partir de l’état initial.


q est un état puits s’il n’existe aucun chemin menant de l’état q vers un état final.

28/10/2023 Cours Compilation - Analyse Lexicale 44


Minimisation d’un AFD (étape 5)
• On dit que deux états sont équivalents si ces états permettent d’atteindre un
état final reconnaissant la même chaine. En d’autres termes, tous les suffixes
reconnus à partir de ses états sont exactement les mêmes.

• Les états 3 et 4 sont dits équivalents.

28/10/2023 Cours Compilation - Analyse Lexicale 45


Minimisation d’un AFD (étape 5)
Algorithme de moore
1. Définir deux classes, C1 contenant les états finaux et C2 les états non finaux.

2. S’il existe un symbole a et deux états e1 et e2 d’une même classe tels que
Transiter(e1,a) et Transiter(e2,a) n’appartiennent pas à la même classe
(d’arrivée), alors créer une nouvelle classe et séparer e1 et e2. On laisse dans la
même classe tous les états qui donnent un état d’arrivée dans la même classe.

3. Recommencer l’étape 2 jusqu’à ce qu’il n’y ait plus de classe à séparer.

4. Chaque classe forme un état du nouvel automate minimal.

• Edward F. Moore, ‘’Gedenken Experiments on sequential machines’’, Automata studies,Annals of mathematic studies,no.34,
Princeton,N.J.,Princeton University Press,1956,pp.129-153,
28/10/2023 Cours Compilation - Analyse Lexicale 46
Algorithme de reconnaissance d'une entité lexicale:
• A partir d’une chaine d’entrée S terminée par un caractère spécial #, l’algorithme parcoure la
table de transition T pour vérifier si elle appartient au langage ou pas

Algorithme SimulationAFD ;
Debut
Lire (entité) ;
Tc := 1er caractère de l'entité ;
Ec:= état initial;
Tant que ( Ec≠∅ ) et ( ¬Fin entité )
Faire
Ec := T[Ec, Tc] ;
Tc := Tc +1 ;
Fait;
Si Ec=∅ Alors Erreur : entité incorrecte ;
Sinon Si Ec∉F Alors Erreur : entité incorrecte;
Sinon '' entité correcte '' ;
codifier l'entité ;
Insérer l'entité dans la table des symboles;
Fsi;
Fsi;
Fin.
28/10/2023 Cours Compilation - Analyse Lexicale 47
Algorithme de reconnaissance d'une entité lexicale:

28/10/2023 Cours Compilation - Analyse Lexicale 48

Vous aimerez peut-être aussi