Cours de Compilation F
Cours de Compilation F
Cours de Compilation F
2023/2024
Plan
Introduction
Analyse lexicale
Analyse syntaxique
Analyse sémantique
Génération du code
Optimisation de code 2
Introduction
Objectif de la
matière
1- Décrire un langage;
2- Reconnaître les mots qui appartiennent à un langage donné.
Applications pratiques
- Définition formelle (lexical, syntaxique et sémantique) de langages de
programmation,
- Construction de compilateurs,
- …..
4
Introduction
Théorie de langage (suite)
Symbole
Un symbole est une entité abstraite.
Exemples: Lettres, Chiffres, Symboles graphiques.
Alphabet
Un alphabet (ou vocabulaire) noté Ω est un ensemble de symboles.
Exemples: Ω = {0 ,1} , Ω = {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; .} , Ω = {a,b,…..z}.
Mot
Un mot (ou bien une chaîne ou lexème) défini sur un alphabet Ω est
une suite finie de symboles juxtaposés (ou concaténés) de Ω.
Exemples: Le mot 1011 est défini sur l’alphabet {0, 1} ; le mot 1.23 est
défini sur l’alphabet {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, .}.
5
Remarque: Le mot vide est une suite vide de symboles et noté ε.
Introduction
Théorie de langage (suite)
Longueur d’un mot
La longueur d’un mot m est le nombre de symboles qui le composent.
Elle est notée par |m|.
Exemples: |ababb|=5 , | ε|=0
Nombre d’occurrence
La cardinalité d’un mot m par rapport à un symbole a Ω est Le
nombre d’occurrence de la lettre a dans m. Elle est notée par |m|a
Exemples: |ababb|a=2 , |abbaaba|b=3
Propriété: m m x
xΩ
6
Introduction
Théorie de langage (suite)
Concaténation
Soient m, m’ et m’’ trois mots sur l’alphabet Ω.
- La concatenation de m et m’ est obtenue en écrivant m suivi de m’,
elle est notée par mm’ ou m.m’.
- εm = mε = m, avec ε est le mot vide
- Soit x une lettre (x Ω), xn (n ΙN) est la concaténation de n lettres
identiques, avec x0 = ε et x1= x
- mn (n ΙN) est la concaténation de n mots identiques.
- La concaténation est associativité: m(m’m’’) = (mm’)m’’
- |mm’|= |m|+ |m’| , |mn|=n |m| , avec n ΙN
- La concaténation n'est pas commutative: mm’ ≠ m’m
Exemples: (aabac).(dab) vaut aabacdab , b2 = bb , (ab)3 = ababab 7
Introduction
Théorie de langage (suite)
Préfixe, suffixe et miroir
Soient m, m’ et m’’ trois mots tels que: m=m’m’’. On dit que:
- m’ est un mot préfixe de m.
- m’’ est un mot suffixe de m.
- Le miroir du mot m (notée par miroir(m) ou mR) est le mot formé par la
suite des symboles composant m mais pris dans l'ordre inverse.
Propriétés: (mR )R = m , (mm’)R = m’R mR
Exemples: aabbba=(aab)(bba). Donc aab et bba sont, respectivement,
le préfixe et le suffixe de aabbba. (1010)R=0101. miroir(ε)= ε
Mots conjugués
Deux mots m et m’ sont dits conjugués s’il existe deux mots u et v tels
que : m = uv et m’ = vu. 8
Introduction
Théorie de langage (suite)
Langage formel
L'ensemble de mots sur un alphabet Ω est noté Ω* (fermeture transitive). Un
langage L sur Ω est une partie de Ω* tel que:
L * où L Ρ ( *)
Exemple:
Soit Ω = {a , b} un alphabet.
- Φ est un langage
- {ε} est un langage
- {a , ba , aab} est un langage
9
Introduction
Théorie de langage (suite)
Langage formel
Un langage formel, noté L, est un ensemble (fini ou infini) de mots définis sur un
alphabet Ω donné. En général, un langage peut être défini par:
Extension: Tous les éléments du L sont donnés (L fini).
Compréhension: Tous les éléments du L sont définis à partir d’une propriété (L fini ou
infini). L= {n ΙN | n est paire}
Induction: Le langage L est défini par certains éléments triviaux (c’est-à-dire des
éléments dont on sait, sans démonstration, qu’ils appartiennent à L) et des règles
d’induction (m L f(m) L) permettant de retrouver d’autres éléments de L en
fonction de ceux connus (L fini ou infini).
Exemples:
L’ensemble des lexèmes définis dans le langage JAVA.
L’ensemble des programmes en langage JAVA.
Soit L * (avec Ω ={0,1}).
L peut être défini par induction comme suit:
ε L, si x L alors 0x1 L, si x L alors 1x0 L et si x, y L alors xy L 10
Introduction
Théorie de langage (suite)
Opération sur les langages
Soient L et L’ deux langages définis sur un alphabet Ω.
- L L’ (ou L+ L’ ou L | L’) est un langage sur Ω obtenu par la réunion de L et L’,
tel que: L L’= {m / m L ou m L’}.
- L∩L’ est un langage sur Ω obtenu par l’intersection de L et L’, tel que
L∩L’= {m / m L et m L’}.
- Le complément du langage L , noté par L ,est obtenu par: L = {m / m L}
- LL’ est un langage sur Ω obtenu par la concaténation de L et L’, tel que:
L.L’ = {m / u L, v L’ : m = uv}.
- Le langage exposant d’un langage L, noté Ln, est obtenu par:
Ln=L.L...L= {m / u1, u2, ...un L : m = u1u2 ...un }.
n
11
Introduction
Théorie de langage (suite)
Opération sur les langages (suite)
- La fermeture itérative de Kleene de L est notée par:
* i
L i 0 L
Remarque:
L*=L+ + {ε} 12
Introduction
Théorie de langage (suite)
Grammaire: Définition
Une grammaire est une notation utilisée pour la description de la syntaxe
d’un langage, c.à.d. de la façon avec laquelle les mots de langage seront
organisées et utilisées.
Exemple: Pour analyser une classe de phrases simples en français, on
peut supposer qu’une phrase est construite de la manière suivante :
PHRASE → ARTICLE SUJET VERBE COMPLEMENT
SUJET → "garçon" ou "fille"
VERBE → "voit" ou "mange" ou "porte"
COMPLEMENT → ARTICLE NOM ADJECTIF
ARTICLE → "un" ou "le" ou "une" ou "la"
NOM → "livre" ou "plat"
ADJECTIF → "bleu" ou "rouge" ou "vert" 13
Introduction
Théorie de langage (suite)
Grammaire: Définition formelle
On appelle grammaire le quadruplet G (VT, VN, R, S) telle que:
VT: Ensemble fini de symboles (ou des mots) dits terminaux, on l’appelle
également vocabulaire terminal. Exemple: VT ={garçon, fille, voit, mange,
porte, un, le, une, la, livre, plat, bleu, rouge, vert}.
VN: Ensemble fini de symboles (ou des mots) non terminaux qui représente les
noms attribués aux productions constituant la grammaire du langage.
Exemple: VN = {PHRASE, ARTICLE, SUJET, VERBE, NOM,
COMPLEMENT}
R: Ensemble de règles de productions de la forme g → d tel que g (VTỤVN)+ et
d (VTỤ VN)* . (Voir l’exemple précédent)
S: Symbole (ou Mot) non-terminal particulier appelé axiome (mot de départ de la
grammaire). Dans l’exemple précédent, l’axiome est: PHRASE.
Remarque importante :
Une grammaire définit un seul langage. Par contre, un même langage
peut être engendré par plusieurs grammaires différentes. 18
Introduction
Théorie de langage (suite)
Automate: Définition
Un automate est un modèle mathématique (ou une machine abstraite) qui
permet de lire un mot et de répondre à la question : "un mot m
appartient-il à un langage L ?" par oui ou non.
En général, un automate est composé de :
- Une bande en entrée sur laquelle sera inscrit le mot à lire;
- Une tête de lecture qui permet de lire le mot en entrée.
- Un organe de commande qui permet de gérer un ensemble fini de pas
d’exécution ;
- Une mémoire auxiliaire de stockage.
19
Introduction
Théorie de langage
Automate: Définition (suite)
Une bande de lecture
Elle est constitue d’une succession de cases;
Chaque case contient un seul symbole d’un alphabet d’entrée;
Le mot à reconnaître est écrit dans les cases de cette bande de lecture.
Une tête te de lecture
Elle peut lire une case à un moment donné;
Dans la case où se trouve la tête de lecture à un instant donné est
appelée la case courante;
La tête peut être déplacée par le reconnaisseur pour se positionner sur
la case immédiatement à gauche ou à droite de la case courante.
Une mémoire
Elle peut avoir des formes différentes.
La mémoire stocke des éléments d’un alphabet de mémoire. 20
Introduction
Automate: Définition (suite)
Une unité de contrôle
Elle constitue le cœur d’un reconnaisseur;
Elle est vue comme un pg qui dicte au reconnaisseur son comportement.
Elle est définie par un ensemble fini d’états et une fonction de transition
définissant le passage d’un état à un autre en fonction du contenu de la
case courante de la bande de lecture et du contenu de la mémoire.
L’unité de contrôle détermine le sens de déplacement de la tête de
lecture et choisit les symboles qui seront sauvegarder dans la mémoire.
Parmi les états d’un reconnaisseur, on trouve:
o Des états initiaux: les états dans lesquels doit se trouver le
reconnaisseur avant de commencer la reconnaissance d’un mot;
o Des états d’acceptation: les états dans lesquels doit se trouver le
reconnaisseur après la reconnaissance d’un mot. 21
Introduction
Théorie de langage
Automate: Définition (suite)
Formellement, un automate contient au minimum :
– Un alphabet pour les mots en entrée;
– Un ensemble non vide d’états;
– Un état initial;
– Un ensemble non vide d’états finaux;
– Une fonction de transition (permettant de changer d’état).
Exemple: L’automate des mots contenant le facteur ab est le suivant:
Remarque: On dit qu’un mot est reconnu par un automate si, à partir d’un état
initiale, on arrive à un état final à travers une succession d’état intermédiaires . On
dit aussi qu’un langage est reconnu par un automate lorsque tous les mots de ce
langage sont reconnus par l’automate. 22
Introduction
23
Correction de l’exercice 1
Série N°1
Exercice 1
1-Trouvez les langages correspondants aux définitions suivantes:
- Tous les mots sur {a, b, c} qui commencent par un a et finissent par un b.
- Tous les mots sur {a, b} qui contiennent plus de a que de b.
2- On note par Pref(L) l’ensemble suivant : {u| m L : u est préfixe de m} et par Suf(L) l’ensemble
suivant : {v| m L : v est suffixe de m}. Calculez Pref(L) et Suf(L) dans chacun des cas suivants
: L = {ab, ac,ε}, L= {anbm|n,m ≥ 0}
3- On note par Conj(m) l’ensemble des conjugués de m. Trouvez Conj(m) pour m =ε et m = anbn.
4- Définissez la fermeture de Kleene (L∗) pour chacun des langages suivants: L = {ε}, L = {a, aa}.
5- Précisez le type de chacune des grammaires suivantes ainsi que les types des langages qui en
dérivent :
- G = ({a, b}, {S, T}, {S → aabS|aT, T → bS|ε} , S);
- G = ({a, b, c}, {S, T,U}, {S → bSTa|aTb, T → abS|cU,U → S|ε}, S) ;
- G = ({0, 1, 2}, {S,C, Z, T}, {S → TZ, T → 0T1C|ε,C1 → 1C,CZ → Z2, 1Z → 1}, S).
6- Donnez, sans démonstration, les langages générés par les grammaires suivantes. Dites, à
chaque fois, de quel type s’agit-il ? :
- G = ({a,b}, {S}, {S → abS|b}, S).
- G = ({a, b}, {S}, {S → aSa|bSb|ε}, S) 24
Introduction
Définition d’un compilateur
Un compilateur est un outil qui lit un programme source écrit dans un
langage donné et le traduit en un programme correspondant écrit dans
un autre langage tout en signalant les erreurs du programme source.
Programme Programme
Source Compilateur Cible
Phases Phases
Analyse Synthèse
Messages d’erreurs
Programme
Analyseur lexical
source
Analyseur syntaxique
Optimiseur de code
Programme
Générateur de code final
Cible 26
Introduction
Phases d’un compilateur (suite)
Phase Description Exemple
Permet de reconnaître les unités identificateurs
a b
(entier vers réel).
-…….. 30
27
Introduction
Phases d’un compilateur (suite)
Phase Description Exemple
Permet de construire une Pour y:=a*b+30 on trouve:
représentation intermédiaire, des t1←ER(30) //ER: Entier vers réel
Générateur de code programmes sources, indépendante t2←id2*id3
intermédiaire de tous les langages de t3←t2+t1
programmation. id1←t3
28
Introduction
Phases d’un compilateur (suite)
Phase Description Exemple
Permet de stocker toutes les informations Table des
nécessaires sur les lexèmes (mots) du symboles
programmes source id1 y
Gestion de table
des symboles id2 a
id3 b
29
Introduction
Phases d’un compilateur (suite)
Analyseur lexical Analyseur syntaxique Analyseur sémantique
y:=a*b+30 id1:=id2*id3+nombre
Tables des
symboles
id1 y Mov R2, id2
Mul id3; (R2= Al, Ax ou Eax)
id2 a
Mov R1, 30
id3 b Add R1, R2
Mov id1, R1
Générateur de code
Générateur de code Optimiseur de code intermédiaire
t1←id2*id3 t1←ER(30)
id1←t1+30.0 t2←id2*id3
t3←t2+t1
id1←t3 30
Introduction (suite)
Environnement d’un compilateur
La création d’un programme cible exécutable requiert en fait plusieurs
programmes, en plus du strict compilateur.
Programme source Eventuellement dispersé dans différents fichiers
Contient des définition de symboles, macros…….
En C++ , macros: #define MIN(a,b) ((a) < (b)) ? (a) : (b)
Editeur de texte
Erreurs de Résultat
Compilateur Données Interpréteur
compilation Erreurs
Fichier
de Librairies
code
35
Plan
Introduction
Analyse lexicale
Analyse syntaxique
Analyse sémantique
Génération de code
36
Expression régulière et automates finis
Expression régulière
Définition
Soit Ω un alphabet quelconque ne contenant pas les symboles { ,+,|,.,(,)}.
Une expression régulière (ou rationnelles) est un mot défini sur l’alphabet
Ω { ,+, |, ., (, )} permettant de représenter un langage régulier de la
façon suivante :
2- L’expression 110*1 décrit tous les mots contenant deux fois le symbole
1 suivis d’un nombre quelconque de symboles 0 ou vide et du symbole 1.
(1100001, 110000001,……).
38
Expression régulière et automates finis
Expression régulière (suite)
Remarques:
Exemples:
aa*|b+ est interprétée comme (a(a)*)|(b)+
a|b*c est interprétée comme (a)|((b)*c)
39
Expression régulière et automates finis
Expression régulière (suite)
Ambiguïté
Une expression régulière est dite ambiguë s’il existe au moins un mot
pouvant être mis en correspondance avec l’expression régulière de
plusieurs façons.
Exemple:
Considérons l’expression (a|b) a(a|b) décrivant tous les mots sur {a, b}
contenant le facteur a. Soit à faire correspondre le mot abaab, on a :
Exemple:
41
Expression régulière et automates finis
Langages réguliers
Définition
Les langages réguliers (ou rationnels) sont les langages générés par des
grammaires de type 3 (ou encore grammaires régulières). Ils sont
reconnus grâce aux automates à états finis (voir la partie suivante).
Exemples:
a∗ : dénote le langage régulier an (n ≥ 0) ;
(a|b)∗ : dénote les mots dans lesquels le symbole a ou b se répètent un
nombre quelconque de fois. Elle dénote donc le langage de tous les mots
sur {a, b} ;
(a|b)∗ab(a|b)∗ : dénote tous les mots sur {a, b} contenant le facteur ab.
42
Expression régulière et automates finis
Langages réguliers (suite)
Propriétés
Soient L et L’ deux langages réguliers désignés respectivement par les
expressions régulières r et s, on a:
1- L+L’ , L∩L’, L , LR, L.L’, L∗ (resp. L+) sont des langages réguliers.
43
Correction de l’exercice 2
Série N°1
Exercice 2
Démontrez, à l’aide de la définition inductive des langages réguliers, que les deux
langages suivants sont réguliers (l’alphabet considéré est Ω= {0; 1}):
44
Correction de l’exercice 3
Série N°1
Exercice 3
1. Démontrez que tout langage fini est régulier.
2. Donnez une expression régulière qui accepte chacun des langages suivants
(définis sur l’alphabet Ω={0; 1}):
45
Expression régulière et automates finis
Langages réguliers (suite)
Lemme de pompe (ou de l’étoile, d’itération ou de gonflement): a
été formulé en 1961 par Bar-Hillel, Micha Perles, Eli Shamir
– m = xyz ;
– |xy| ≤ n ;
46
Correction de l’exercice 4
Série N°1
Exercice 4 (à faire)
47
Expression régulière et automates finis (suite)
Automates finis
Définition
Un automate fini (AF) est un diagramme de transition qui peut reconnaitre avec
précision ce que les expressions régulières peuvent dénoter.
Modélisation de l’AF
Un AF est une machine modélisée par:
- Un ruban d’entrée (Input Tape): Sur lequel on place le mot à traiter (Input Word).
Le ruban est divisé en case (caractères).
- Une tête de lecture (Read Head): Indiquant la position du caractère suivant à lire.
- Un ensemble d’états (Set of states), parmi lesquels:
- L’état initial: Etat de l’automate au départ de l’exécution.
- Des états accepteurs: états dans lesquels doit se trouver le reconnaisseur
après avoir reconnu un mot.
- Une relation de transition: Indiquant pour chaque état et symbole lu qu’il est
l’état suivant de l’automate.
48
Expression régulière et automates finis
Automates finis (suite)
Formalisation d’un AF
Un automate fini est un modèle mathématique qui est défini par un
quintuplet A=(Q, V, δ, q0, F) où:
49
Expression régulière et automates finis
Automates finis (suite)
Représentation d’un AF par un graphe de transition
Un AF est représenté par un graphe (ou diagramme) orienté étiqueté, appelé
graphe de transition tel que :
- L’état initial est désigné par une flèche entrante au sommet correspondant
- Pour chaque état q, q Q, il existe un nœud étiqueté q.
- Pour chaque état q et chaque symbole a de V tel que δ(q; a) = p, il existe un arc
du nœud q vers le nœud p étiqueté a.
- Les nœuds correspondant aux états de satisfaction (états appartenant à F) sont
représentés par un cercle double.
q0 q1
50
Expression régulière et automates finis
Automates finis
Représentation d’un AF par une table de transition (suite)
La table de transition est un tableau qui permet de représenter la fonction
de transition δ(q; a) = p entre les deux états q et p par le symbole a.
Soit l’AF de l’exemple précédent, la table de transition correspondante
est:
a b Exemple: δ(q0; a) = q0
51
Expression régulière et automates finis
Automates finis (suite)
Automate Fini non déterministe (AFN)
Un AFN est un AF caractérisé par:
- Plusieurs transitions correspondantes au même symbole sortant d’un même
état. a q2
q
q1
a
- Des transitions sur le symbole ε (mot vide): Changer d’état sans avancé dans le
mot d’entrée. ε
q > q1
q0 q1 q2
52
Expression régulière et automates finis
Automates finis (suite)
Automate Fini déterministe (AFD)
Un AFD est un cas particulier des AFN tel que:
- Aucun état n’a de ε transition.
- Pour chaque état q et chaque symbole a, il existe au plus un arc
d’étiquette a partant de q.
q0 q1
53
Expression régulière et automates finis
Automates finis (suite)
Automate Fini déterministe complet (AFDC)
Un automate fini déterministe complet (AFDC) est un automate déterministe pour
lequel chaque état q et chaque symbole a, il existe un et un seul arc d’étiquette a
partant de q.
54
Expression régulière et automates finis
Automates finis (suite)
Transformation de l’AFD en AFDC
Tout AFD peut être transformé en un AFDC reconnaissant le même langage par
l’algorithme suivant:
- Rajouter à l’AFD un nouvel état P non final (« P est appelé état poubelle ou état
erreur »);
- Rajouter les transitions d’étiquettes manquantes en les dirigeant toutes vers cet
état poubelle P ; ne pas oublier les transitions de P vers lui-même .
Exemple
a,b,c
Proposition
Tout AFN (avec ou sans ε-transition) peut être transformé en un AFD.
56
Expression régulière et automates finis
Automates finis (suite)
Transformation d’un AFN sans ε-transition en AFD
1- Etat initial de l’AFD E(0)={q0} est l’état initial du l’AFN;
2- Construire E(1) l’ensemble des états obtenus à partir de E(0) par la transition x:
E(1)=Uq’E(0)δ(q’, x)
3-Recommencer l’étape 2 pour toutes les transitions possibles et pour chaque nouvel
ensemble E(k);
E(k)= Uq’E(k-1)δ(q’,x)
4- Tous les ensembles contenant au moins un état final du premier automate
deviennent finaux;
5- Renuméroter les états en tant qu’états simples.
Correction de l’exercice 5
Série N°1
Exercice 5
Transformer en AFD l’automates suivant :
58
Expression régulière et automates finis
Automates finis (suite)
Transformation d’un AFN avec ε-transition en AFD
Soit A=(Q, V, δ, q0, F) un AFN et s V, q Q et T Q. On note par:
- ε-fermeture(q): L’ensemble des états de l’AFN accessible depuis q par
des ε-transition (q appartient aussi à cet ensemble).
- ε-transition: la transition sur le symbole ε.
- ε-fermeture(T)= ε-fermeture(q)
q T
Exemple ε
a b c
q0 q1 q2 q3
ε 59
ε-fermeture(q0)={q2, q1, q0}
Expression régulière et automates finis
Automates finis
Transformation d’un AFN avec ε-transition en AFD (suite)
1- A partir de l’ε-fermeture de l’état initial (on représente le nouvel état initial)
2- Rajouter dans la table de transition toutes les ε-fermetures des nouveaux états produits avec
leurs transitions;
3- Recommencer l’étape 2 jusqu’à ce qu’il n’y ait plus de nouvel état;
4- Tous les ε-fermetures contenant au moins un état final du premier automate deviennent
finaux;
5- Renuméroter les états en tant qu’états simples.
2
3
Expression régulière et automates finis
Automates finis
Transformation d’un AFN avec ε-transition en AFD (suite)
Exemple:
Algorithme
AFN
État a b c
A={0, 1, 3} B={1,2} ---- C={4}
B={1,2} D={2} E={1,3} ----
C={4} ---- ---- ----
D={2} ---- E={1,3} ----
E={1,3} D={2} ---- C={4}
AFD
61
Expression régulière et automates finis
Automates finis (suite)
Minimisation d’un AFD
Remarques:
1-La relation R (R= β-équivalence) est une relation d’équivalence, car elle est:
-Réflexive (pRp), p Q
-Symétrique (pRq qRp), p,q Q
-Transitive (pRq et qRq’ pRq’). p,q,q’ Q
2- Le nombre de classes d’équivalence de la relation β-équivalence est égal au
nombre des états de l’automate minimal, car les états de chaque classe
d’équivalence reconnaissent le même langage (ils seront fusionnés). 63
Expression régulière et automates finis
Automates finis
Minimisation d’un AFD (suite)
Pour minimiser un AFD, il faut suivre la méthode suivante:
1- Nettoyer l’automate en éliminant les états inaccessibles ;
2- Regrouper les états appartenant à la même classe d’équivalence.
Remarque: L’automate de départ et l’automate minimisé doivent reconnaitre les
mêmes mots.
Exemple: Etat a b
Minimiser l’AFD suivant: *1 2 5
*2 2 4
3 3 2
4 5 3
5 4 6
6 6 1
7 5 7 64
Expression régulière et automates finis
Automates finis
Minimisation d’un AFD (suite)
1- Nettoyer l’automate en éliminant les états inaccessibles :
Etat a b Etat a b
*1 2 5 L’état 7 est inaccessibles *1 2 5
*2 2 4 *2 2 4
3 3 2 3 3 2
4 5 3 4 5 3
5 4 6 5 4 6
6 6 1 6 6 1
7 5 7
65
Expression régulière et automates finis
Automates finis
Minimisation d’un AFD (suite)
2- Regrouper les états appartenant à la même classe d’équivalence:
1- Créer deux classes: A contenant les états finaux et B contenant les états non finaux;
2- S’il existe un symbole x et deux états qi et qj d’une même classe tel que δ(qi, x) et
δ(qj, x) n’appartiennent pas à la même classe, alors créer une nouvelle classe et
séparer qi et qj. 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 classes à séparer;
67
Expression régulière et automates finis
Automates finis (suite)
Opérations sur les automates
Complément d’un automate:
Soit A=(Q,V,δ,q0,F) un AFDC reconnaissant le langage L. L’automate
reconnaissant le langage inverse (c’est-à-dire L ou V∗−L) est défini par le
quintuplet AC=(Q,V,δ,q0,Q-F) (en d’autres termes, les états finaux
deviennent non finaux et vice-versa).
Exemple:
68
Expression régulière et automates finis
Automates finis
Opérations sur les automates (suite)
Miroir d’un automate:
Soit A=(Q, V, δ, q0, F) un automate reconnaissant le langage L(A). L’automate qui
reconnaît le langage (L(A))R est définit comme suit: AR=(Q, V, δR, F, {q0}) tel que :
δR(q’,a)=q si δ (q, a)=q’
Remarques
1- Pour définir l’automate AR, il suffit d’inverser les sens des arcs de l’automate
et le statut initial/final des états initiaux et finaux.
2- L’automate AR peut contenir plusieurs états initiaux (ce qui signifie qu’il est le
plus souvent non déterministe). Pour éliminer le problème des multiples états
initiaux, il suffit de rajouter un nouvel état initial et de le raccorder aux anciens
états finaux par des ε-transitions.
69
Expression régulière et automates finis
Automates finis
Opérations sur les automates (suite)
Miroir d’un automate: Exemple
Remarques:
1- Si m est un mot reconnu par A′′ alors il l’est par A et A’.
2- Si L(A) est le langage reconnu par A et L(A′) est le langage reconnu par A′
alors l’automate A′′ reconnaît l’intersection des deux langages : L(A)∩L(A′).
71
Expression régulière et automates finis
Automates finis
Opérations sur les automates (suite)
Produit de deux automates: Exemple
73
Expression régulière et automates finis
Automates finis (suite)
Passage de l’AF (D ou N) vers l’ER
Soit A=(Q,V,δ,q0,F) un automate à états fini quelconque.
On note par Li le langage reconnu par l’automate si son état initial était qi.
Par conséquent, trouver le langage reconnu par l’automate revient à
trouver L0 , étant donné que la reconnaissance commence à partir de q0.
75
Expression régulière et automates finis
q1
ε q2
q1
a
q2
AFN((E2)*)
AFN(E2)
AFN(E1.E2) 76
AFN(E1|E2)
Expression régulière et automates finis
77
Correction de l’exercice 7
Série N°1
Exercice 7
2- Convertissez les expressions régulières suivantes en AFN puis en AFD
- 01*
- 00(0|1)*
78
Expression régulière et automates finis
Automates finis (suite)
Passage de l’AF (D ou N) vers la GR
Soit A=(Q,V,δ,q0,F) un AF, la grammaire qui génère le langage reconnu
par A est G=(VT,VN,R,S), telle que:
– VT = V ;
– Associer à chaque état de Q un non terminal;
– L’axiome S est le non-terminal associé à l’état initial;
– Soit B le non terminal associé à qi et C le non-terminal associé à qj, si
δ(qi,a)=qj alors la grammaire possède la règle de production: B → aC ;
– Si qi est final et B est le non-terminal associé à qi alors la grammaire
possède la règle de production : B → ε.
79
Correction de l’exercice 8
Série N°1
Exercice 8
1- Trouvez la grammaire régulière générant le langage reconnu par l’automate
suivant:
80
Expression régulière et automates finis
Automates finis (suite)
Passage de la GR vers l’AF (D ou N)
GR Normalisée:
soit G=(VT,VN,R,S) une grammaire régulière à droite, elle est dite normalisée si toutes les règles de
production sont de l’une des formes suivantes :
- A → a, A∈ VN, a∈ VT ;
- A → aB, A, B∈ VN, a∈ VT ;
- A → ε, A ∈ VN
83
Plan
Introduction
Analyse lexicale
Analyse syntaxique
Analyse sémantique
Génération de code
84
Grammaires hors-contexte et automates à pile
Grammaires hors-contexte
Rappel
Remarques
Exercice 1
1- Trouver la GHC générant le langage anbn (n≥0).
86
Grammaires hors-contexte et automates à pile
Exemple:
Soit la grammaire G = ({0, 1,+, ,( ,)}, E, {E → E+E|E E|(E)|0|1}, {E}).
Cette grammaire est ambiguë, car le mot 1+1*0 possède deux arbres de
dérivation.
87
Grammaires hors-contexte et automates à pile
Exemple
La grammaire G′ = ({0, 1,+, ,( ,)}, {E, T, F}, {E→T+E|T,T→F T|F,
F→(E)|0|1}, {E}) génère le même langage que G (de l’exemple précédent)
mais a l’avantage de ne pas être ambiguë.
88
Grammaires hors-contexte et automates à pile
Propriété
Il est toujours possible de trouver une grammaire propre pour toute
grammaire hors-contexte.
89
Grammaires hors-contexte et automates à pile
Exercice 2
Soit G une grammaire HC dont les règles de production sont :
S → aSbS|bSaS|ε.
1- Transformer G en GHCP.
91
Grammaires hors-contexte et automates à pile
Propriété
Il est toujours possible de transformer n’importe quelle grammaire hors-
contexte pour qu’elle soit sous la forme normale de Chomsky.
Remarque
Si la grammaire est propre, alors la procédure de transformation sera très
facile. 92
Grammaires hors-contexte et automates à pile
Exercice 2 (suite)
2- Transformer G, définie dans la question 1, à sa forme normale de
Chomsky.
94
Grammaires hors-contexte et automates à pile
Propriété
Il est toujours possible de transformer n’importe quelle grammaire hors-
contexte pour qu’elle soit sous la forme normale de Greibach.
95
Grammaires hors-contexte et automates à pile
Formes Normales de Greibach (FNG) d’une GHC
Transformation d’une GHC vers sa FNG
Lemme1:
Soient Y→β1|…|βr les règles de Y . Le langage (engendré par la
grammaire) n’est pas changé si la règle X→ αYα’ est remplacée par les
règles X→αβ1α’|…|αβrα’.
S→SSa|b.
97
Grammaires hors-contexte et automates à pile
Automate à pile
Interprétation des transitions
Transition Graphe de transition Signification
Remarques:
Ces deux modes sont équivalents, donc, dans ce qui suit, on accepte un mot si le
ruban vide (après avoir lu tout le mot), on est sur l‘état final et la pile vide
Un mot m est rejeté par un AP si:
- Aucune transition n’est possible (l’automate n’a pas pu lire tout le mot)
- L’automate se trouve dans un état non final.
- La pile est non vide.
- Une opération incorrecte est menée sur la pile : Dépiler alors que la pile est vide.
101
Grammaires hors-contexte et automates à pile
Automate à pile
Exemple
L’automate reconnaissant les mots anbn (avec n ≥ 0) est le suivant : A=({q0,q1,q2,q3}, {A, },
{a,b},δ,q0,{q3}) telle que δ est définie par:
– δ(q0, a, ) = (q1, A )
a, A → AA b, A →ε
– δ(q1, a, A) = (q1, AA)
– δ(q1, b, A) = (q2, ε) q
a, → A q b, A → ε q2 ε, → q
0 1 3
– δ(q2, b, A) = (q2, ε)
ε, →
– δ(q2, ε, ) = (q3, )
– δ(q0, ε, ) = (q3, )
Remarque:
103
Grammaires hors-contexte et automates à pile
104
Correction de l’exercice 4
Série N°2
Exercice 4
1- Construire l’automate à pile du langage suivant: mcmR tel que m (a|b)*
105
Plan
Introduction
Analyse lexicale
Analyse syntaxique
Analyse sémantique
Génération de code
106
Analyse lexical
Définition
À partir du programme source, qui se présente comme un flot de caractères,
l'analyse lexicale permet de reconnaitre des unités lexicales, qui sont les mots
que l'analyseur syntaxique va ensuite les utiliser.
Unité lexicale
Programme Analyseur Analyseur
source lexical syntaxique
Prochaine unité
lexicale?
Remarques:
1-Les unités lexicales seront stockées au fur et à mesure dans la table de symboles.
2-L’opération du lecture du texte source doit s’accompagner avec des tâches
supplémentaires: Eliminer les blancs, les commentaires, fin de lignes, gérer les
numéros des lignes pour les utiliser dans le cas d’une erreur rencontrée, …..
3-L’analyseur lexical doit signaler chaque présence d’erreur dans le texte d’entrée. 107
Analyse lexical
Lexème, unité lexicale
Lexème (ou Token): est une chaîne de caractères qui constitue une seule entité
tirée à partir du texte source. Par exemple dans l’instruction suivante:
aire:=base * hauteur / 2, l’analyseur lexical reconnaît les lexèmes suivants
Unité lexicale: est un type de lexème qui est un symbole terminal qui rentre dans
la construction du langage source. Pour l’exemple précédent, on trouve:
108
Analyse lexical
Modèle
Modèle: Est une règle décrivant les lexèmes qui correspondent à une unité
lexicale particulière. Nous utilisons les expressions régulières ou les automates
finis pour représenter les modèles des unités lexicales.
Exemple:
- Modèle identificateur:
lettre | _ | chiffre
0 1
lettre
109
Correction de l’exercice 1
Série N°3
Exercice 1
1- Ecrire une grammaire pour générer les identificateurs d’un langage comme
Pascal ou C. On considérera qu’un identificateur est valide s’il commence par une
lettre (majuscule ou minuscule) suivi d'un nombre quelconque (éventuellement
aucun) de symboles. Ces symboles sont constitués par des lettres, des chiffres,
et du caractère '_'.
2- Une constante de type chaîne de caractères est délimitée par des apostrophes
et constituée d'un nombre quelconque de caractères. Pour permettre à une
apostrophe de faire partie d'une chaîne de caractères, on double celle-ci.
2-1- Ecrire la grammaire qui permet de générer cette unité lexicale.
2-2- Construire l’automate qui permet de reconnaitre cette unité lexicale.
2-3- Donner quelques lexèmes qui sont définis par cette unité lexicale.
2-4- Trouver des constantes qui ne sont pas reconnues par cette unité
lexicale.
110
Analyse lexical
Construction de l’analyseur lexical
I- Implémenter tous les modèles (automates) représentants les unités lexicales
du langage traité.
Exemples:
Identificateurs, Mots clés, Nombres, Opérations relationnelles, Opérations
logiques, opérations arithmétiques, …….
int identificateur()
{
Remplir sa table de transition Tran[ ][ ] à partir de l’automate correspondant.
Remplir sa table F[ ] des états finaux.
if (AFD (Tran, F)) // Fonction d’automate fini déterministe
{
nom:= lexeme;
unlex:= "iden";
return 1
}
else return 0;
} 112
Analyse lexical
Construction de l’analyseur lexical
I- Implémentation des automates : Fonction AFD
Variables Algorithme
tampon: Un tableau qui contient les Typedef int fonction[100][256];
caractères en provenance du fichier Typedef int ens[100];
source. int AFD (fonction Tran, ens F)
ltampon: C’est la longueur du tampon. {
lexème: Un tableau qui contient les int e=e0; //e0 est l’état initial de l’automate
alphabets d’un lexème à reconnaître. int i= ptrdeb;
ptrdeb et ptrfin: Pointeur de début et de s=tampon[i];
fin d’un lexème (ptrfin ne doit pas while (Tran[e][s]!=-1 && i<ltampon)
dépasser ltampon). {
e=Tran[e][s]; //e est un état de l’automate
lexeme[i-ptrdeb]=s;
i++;
s=tampon[i];
}
If (e F) // si e est un état final
{ ptrfin=ptrdeb=i; return 1};
else return 0; 113
}
Analyse lexical
Construction de l’analyseur lexical
II- Traitement du programme source
Pour Traiter un programme source, il faut suivre les étapes suivantes:
1- Utiliser le tampon mémoire pour lire le programme source et les deux pointeurs
ptrdeb et ptrfin pour repérer respectivement le début et la fin d’un lexème sur le
tampon.
2- Lire le tampon par une fonction getlex() pour extraire et enregistrer les lexèmes du
langage dans la table des symboles et afficher les erreurs à la fin du traitement de
tous le programme source.
Tampon
Programme getlex()
source
Unité
ptrdeb ptrfin Analyseur lexical Analyseur
lexical Syntaxique
Table des
Afficher les erreurs à symboles 114
la fin du traitement
Analyse lexical
Construction de l’analyseur lexical
II- Traitement du programme source : Algorithme
Répéter
Copier une partie du programme source dans le tampon.
Répéter
Positionner les pointeurs ptrdeb et ptrfin sur le 1er caractère du prochain lexème.
getlex
Remarque:
Toutes les instructions du bloc (Répéter….jusqu’à la fin du tampon) peuvent être
implémentées dans une seule fonction getlex().
115
Analyse lexical
Construction de l’analyseur lexical
II- Traitement du programme source : Fonction getlex()
# define maxtmp 256
char unilex[20] // Un tableau qui va contenir l’identité de l’unité lexicale
// correspondante au prochain lexème lu.
int getlex()
{
if (ptrfin > maxtmp/2)
{ if (liretamp()==0) return -1;} //Pour tester la fin du tampon
if (identificateur())
{ if (motcle(lexeme)) strcpy (unilex, "mot clé");
else strcpy (unilex, "ident"); return 1}
if (oprel())
{strcpy (unilex, "op-rel"); return 1}
……….
printf ("Erreur: symbole incorrect, % c\n", tampon[ptrfin]);
ptrfin++; ptrdeb++ ; return 0;
} 116
Analyse lexical
Gestionnaire de la table des symboles (GTS)
C’est une structure de données contenant des informations sur chaque lexème
utilisé dans le code source en cours d’analyse. La table de symboles est
considérée comme un intermédiaire entre toutes les phases d’un compilateur
pour échanger les informations sur les lexèmes enregistrés.
Structure de la TS:
typedef struct ptrTS { char nom[20]; // Attribut: Lexème
char unilex[20]; // Attribut: Unité lexicale
int * adr //Attribut: Adresse mémoire sur la valeur du lexème
int taille //Attribut: Taille de la valeur du lexème
……………
type attribut // TS peut contenir d’autres attributs (par exemple: type de lexème, ..)
ptrTS *suc //pointeur sur un autre symbole
} STTS
Remarque:
A chaque fois que l’analyseur lexical rencontre une unité lexicale pour la première
fois, le GTS doit enregistrer les informations (attributs) actuellement disponibles
(nom , unilex). Les autres informations seront enregistrées lors du traitement des
117
autres phases d’analyse.
Analyse lexical
Erreurs lexicales
Un analyseur lexical doit détecter la présence d’une erreur et la signaler, un bon
analyseur lexical ne doit pas s’arrêter devant la 1ère occurrence d’une erreur
rencontrée.
Exemples:
- Un caractère n’appartient pas à l’alphabet.
- Un commentaire non fermé.
- Un mot clé non terminé
118
Plan
Introduction
Analyse lexicale
Analyse syntaxique
Analyse sémantique
Génération de code
119
Analyse Syntaxique
Définition
L'analyse syntaxique (ASy) est un processus qui permet de vérifier si les
éléments proviennent de l’analyseur lexical (par getlex()) forment une chaine
d’unité lexicale acceptée par la grammaire du langage .
Exemple
121
Analyse Syntaxique
Méthode de construction de l’ASy
2- Analyse ascendante (bottom-up):
Construction d’un arbre d’analyse à partir des feuilles (chaine d’entrée) vers
l’axiome par des dérivation à droite: On prend la phrase à analyser (constituée
au départ uniquement de symboles terminaux) et on identifie des parties droites
de règles pour transformer la phrase en chaines de plus en plus constituées par
de non-terminaux jusqu’à arriver à l’axiome.
Exemple
122
Analyse Syntaxique
Construction d’analyseur syntaxique descendant
Il existe deux algorithmes pour construire l’ASyD:
123
Analyse Syntaxique
Analyse par descente récursive
Pour construire cet analyseur, on peut suivre les étapes suivantes:
124
Analyse Syntaxique
Analyse par descente récursive
Exemple:
S →ABC int A( ) if(!strcmp (unilex, ‘c’);
A → ab|a { getlex( ); return 1;
B → bc|ac if(!strcmp (unilex, ‘a’) else return 0;
C→d { getlex( ); }
//Construction de l’ASyD if(!strcmp (unilex, ‘b’); if(!strcmp (unilex, ‘a’)
int S( ) { getlex( ); { getlex( );
{ if A( ) if(!strcmp (unilex, ‘c’); if(!strcmp (unilex, ‘c’);
{ if B( ) {ingetlex(); ingetlex();} return 1;
{ if C( ) return 1; else ingetlex(); else return 0;
else return 0; } }
} else ingetlex( ); return 0;
else return 0; return 1; }
} } return 0; int C( )
else return 0; } { getlex( );
} int B( ) if(!strcmp (unilex, ‘d’)
{ getlex( ); return 1;
if(!strcmp (unilex, ‘b’) return 0; 125
{ getlex( ); }
Analyse Syntaxique
Analyse par descente récursive
Problèmes:
1- L’analyse par descente récursive nécessite un rebroussement (retour
en arrière. Comme par exemple: A→ab|a) ce qui n’est pas toujours facile
à implanter.
Solution:
Analyseur prédictif sans rebroussement.
126
Analyse Syntaxique
Analyse prédictive
L’analyseur prédictif est un analyseur par descente récursive ou non sans
rebroussement (déterministe) qui permet de déterminer laquelle des
alternatives à prendre à partir des productions de la forme:
A → β1|β2| ……|βn .
Principe: Pour chaque symbole d’entrée t donné, l’alternative βi (1≤i≤n) à prendre
est celle qui dérive une chaine commençant par t (appelé symbole de prévision).
L’analyseur prédictif s’appui donc sur la connaissance des premiers symboles qui
peuvent être engendrés par les parties droites des productions.
Remarque:
Les deux ensembles First et Follow peuvent être calculés pour tous les symboles
X avec X (VT VN)+
Exemple
S →ABC ; A → ab|a ; B → bc|ac ; C → d.
First(S)={a} ; First(A)={a} ; First(B)={a,b} ; First(C)= {d}.
Follow(A)={a,b} ; Follow(B)={d} .
Comment calculer Follow(S) et Follow(C)? (Voir l’algorithme qui calcule le Follow) 128
Analyse Syntaxique
Analyse prédictive: Calcul de First
Soit un symbole X (VT VN)* , pour calculer les firsts de X on applique la fonction
First(X) suivante:
Debut
EnFirst={Ø} // EnFirst est un ensemble qui va contenir les firsts de X
Si X VT alors EnFirst={X}.
Sinon Si X VN alors
{ Si X→ε est une production alors
EnFirst= EnFirst+{ε}
Finsi
Pour toute production X →α tel que α ≠ ε faire
EnFirst= EnFirst+First(α)
Fin pour
}
Sinon Si X=Y1Y2…..Yn alors
{ i=1;
Tant que (ε First(Yi) et i<n) faire
{ EnFirst=EnFirst+(First(Yi)\ {ε}); i++;}
EnFirst=EnFirst+FirstYi;
}
129
Fin
Analyse Syntaxique
Analyse prédictive: Calcul de Follow
Soit un symbole X (VT VN)* , pour calculer les follows de X on applique la fonction
Follow(X) suivante:
Debut
EnFollow={Ø} // EnFollow est un ensemble qui va contenir les follows de X
Si X=S (avec S est l’axiome) alors
EnFollow=EnFollow+{$}
{ Si A→αXβ est une production alors
131
Analyse Syntaxique
Analyse prédictive: Grammaire LL(1)
Définition
Soit G=(VT,VN,R,S) une grammaire hors-contexte
La grammaire G est de type LL(1) si et seulement si pour toutes les productions
de la forme A → β1|β2| ……|βn :
Remarque
Le mot LL(k) est l’abréviation de:
L: Left to Right Scaning
L: Left Most Derivation
k: Le nombre des symboles de prévision
132
Analyse Syntaxique
Analyse prédictive: Grammaire LL(1)
Exemples des grammaires LL(1)
133
Analyse Syntaxique
Analyse prédictive: Suppression de la récursivité à gauche
Grammaire récursive à gauche (GRG):
Une grammaire est récursive à gauche si elle contient un non-terminal A telle qu‘il
existe une dérivation A Aα, ou α est une chaîne quelconque.
Une grammaire récursive qui contient les deux règles suivantes: A→Aα|β est non
LL(1) (Démontrer cette propriété)
134
Analyse Syntaxique
Analyse prédictive: Factorisation
Grammaire nécessite une factorisation
On dit qu’une grammaire G nécessite une factorisation à gauche si G
comporte les productions suivantes : A→ αβ1|αβ2 . G est non LL(1)
(Démontrer cette propriété).
Factorisatin de G
- La grammaire G qui comporte les productions A→ αβ1|αβ2 peut être transformée
en LL(1) par factorisation à gauche: A→ α A’ , A’ → β1|β2.
135
Analyse Syntaxique
Analyse prédictive: Factorisation
Grammaire nécessite une Substitution
On dit qu’une grammaire G nécessite une substitution à gauche si G
comporte les productions suivantes : A→B|C, B→wX|α1, C→wY|α2 . G est
non LL(1) (Démontrer cette propriété).
Substitution de G
- La grammaire G comportant les productions A→B|C, B→wX|α1, C→wY|α2 peut
être transformée en LL(1) par la substitution à gauche: A→wA’|α1|α2 ,A’ →X|Y .
136
Correction de l’exercice 3
Série N°3
Exercice 3
Soit la grammaire G0 définie par les productions suivantes:
S →aE|bF ; E→bE|ε ; F→aF|aG ; G→Gc|d
1. Montrer que G0 est non LL(1).
2. Ecrire une grammaire G1 non récursive a gauche telle que L(G1) = L(G0).
3. Ecrire une grammaire G2 factorisée a gauche telle que L(G2) = L(G1).
4. Calculer les ensembles First(A) et Follow(A) pour les symboles A non terminaux
de G2, et First() pour les parties droites de règles de G2.
5. Montrer que G2 est de type LL(1).
137