Académique Documents
Professionnel Documents
Culture Documents
compilation
Génie Informatique – S2
Prof. M. Oulhadj
2023/2024
Plan
• Introduction
• Expression régulière et automates finis
• Grammaires hors-contexte et automates à pile
• Analyse lexicale
• Analyse syntaxique
• Analyse sémantique
• Génération du code
Introduction
• Théorie de langage
• Etudier les caractéristiques des langages de programmation.
1- Connaître les propriétés des langages (Alphabet, Mot, Type).
Parties du module
• compilateur
• Construire un compilateur qui permet de traduire un programme
source en un programme objet:
• 1-Phases d’analyse: Dégage les constituants d’un programme source
(Lexical, syntaxique, sémantique).
• 2-Phases de synthèse: Construit le programme cible (Génération et
optimisation du code intermédiaire, génération du code final).
Introduction
❖ Théorie de langage
Définition
La théorie de langage est une matière qui permet de comprendre
le fonctionnement des langages par un modèle mathématique qui doit
être capable de:
1- Décrire un langage;
2- Reconnaître les mots qui appartiennent à un langage donné.
Introduction
❖ Théorie de langage
o 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
Propriété: 𝒎 = σ𝒙∊Ω 𝒎 𝒙
Introduction
❖ Théorie de langage
o Miroir: 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
• Exemple: (1010)R=0101. miroir(ε)= ε
o Facteur: u un mot facteur de m c-à-d il existe deux mots v et w tels que : m = vuw.
o 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.
Introduction
❖ Théorie de langage
Langage formel
• Un langage L sur Ω est une partie de Ω* , et Ω* est l'ensemble de mots sur un
alphabet Ω tel que: L * où L Ρ(*)
• Exemple: Soit Ω = {a , b} un alphabet.
• Φ est le langage vide, il ne contient aucun mot.
• {ε} est un langage.
• {a , ba , aab} est un langage.
• {w ∈ Ω* / w=an tel que n>0} = {a, aa, aaa, aaaa,….} est un langage.
• Remarque:
• Un langage sur un alphabet Ω peut être fini ou infini.
• Φ est un langage définie sur n’import quel alphabet.
Introduction
❖Théorie de langage
Opération sur les langages
• Soient L et L’ deux langages définis sur un alphabet Ω.
➢L∪L’ (ou L+L’ ) est un langage sur un Ω obtenu par la réunion de L et L’,
tel que: L∪L’= {m / m ∈ L ou m ∈ L’}.
Exemple: L={ab,cd,ef} et L′={cd,gh,ij} ➔ L∪L′={ab,cd,ef,gh,ij}
𝜀 𝑠𝑖 𝑛 = 0
𝐿𝑛 = ቐ𝐿 𝑠𝑖 𝑛 = 1
𝐿. 𝐿𝑛−1 = 𝐿𝑛−1 . 𝐿 𝑠𝑖 𝑛 > 1
Introduction
❖Théorie de langage
Opération sur les langages (suite)
∞
➢La fermeture positive de Kleene de L est notée par: 𝑳+ = ራ 𝑳𝒊 = 𝑳𝟏 ∪ 𝑳𝟐 ∪ 𝑳𝟑 ∪ ⋯
𝒊=𝟏
∞
➢Le langage miroir de L est donnée par: l'ensemble de tous les mots obtenus en inversant
l'ordre des lettres de chaque mot de L
𝑳𝑹 ={m/ ∃𝒖 ∈ 𝑳: 𝒎 = 𝒖𝑹 }
Remarque:
L*=L++ {ε} L+ = LL*=L*L (L*)*= L*
Introduction
❖Théorie de langage
Opération sur les langages (suite)
➢Exemple:
Soit Ω ={0,1}, L1= {00, 11, 01} et L2= {01, 10}.
• L1+ L2= {00, 11, 01, 10}
• L1∩ L2= {01}
• L1. L2={0001, 0010, 1101, 1110, 0101, 0110} ≠ L2. L1={0100,0111,0101,1000,1011,1001}
• L2* = {ε} + {L2} + {L2 L2}+ {L2 L2 L2}+…
Introduction
❖Théorie de langage
Opération sur les langages (suite)
➢Exercice 1:
soit l’alphabet Ω = {a, b}
1. Ecrire les mots uv, (uv)2 et u3V pour les mots u = aa, v =bab
2. Ecrire tous les mots de longueur 2 définis sur Ω. Pour les mots u = aa, v =bab
3. Préciser les ensemble suivant:
➢E1 = {u.v / u ∈ Ω+, v ∈ Ω+ }
➢E2 = {u.v / u ∈ Ω+, v ∈ Ω* }
➢E3 = {u.v / u ∈ Ω*, v ∈ Ω* }
Introduction
❖Théorie de langage
Opération sur les langages (suite)
➢Solution Exercice 1:
soit l’alphabet Ω = {a, b}, Etant données les mots u = aa, v =bab
1. uv = aabab; (uv)2 = (uv)(uv) = aababaabab; u3v = uuuv = aaaaaabab.
2. les mots de longueur 2 : {aa, bb, ab, ba}
3.
E1= {u.v / u ∈ Ω+, v ∈ Ω+ } est l'ensemble de toutes les concaténations
possibles de deux mots non vides sur l'alphabet Ω. . Les mots u et v peuvent
contenir un ou plusieurs symboles de l'alphabet Ω. E1 ={m /m ∈ Ω*/|m|≥2}
Introduction
❖Théorie de langage
Opération sur les langages (suite)
➢Exercice 1:
soit l’alphabet Ω = {a, b}
E2 = {u.v / u ∈ Ω+, v ∈ Ω* } est l'ensemble de toutes les combinaisons
possibles où le premier élément est un mot non vide et le deuxième élément
peut être n'importe quel mot (y compris le mot vide) sur l'alphabet Ω. E2 ={m
/m ∈ Ω*/|m|≥1} = Ω+
• E3 est l'ensemble de toutes les combinaisons possibles où les deux éléments peuvent
être n'importe quel mot (y compris le mot vide) sur l'alphabet Ω. E3 = Ω*.
Introduction
❖Théorie de langage
• Grammaire: Définition
Une grammaire est une notation utilisée pour la description de la
syntaxe d’un langage, c.à.d. la façon avec laquelle les mots de langage
seront organisées et utilisées.
Introduction
❖Théorie de langage
• Dans la règle A → a: A est appelé partie gauche de la règle. Et a est appelé partie droite de la
règle.
• Lorsque plusieurs règles partagent la même partie gauche: A → a1, A → a2,…, A → an
On les notées : A → a1 | a2 | a3 | … | an
• On appelle dérivation sur G, toute suite finie X1 , X2 , ….. Xk telle que k≥1 et X1→ X2 →
…..→ Xk. ➔On dit que Xk est dérivé à partir de X1 ou X1 se dérive en Xk
Remarque: Si l’arbre syntaxique a comme racine S, alors il est dit arbre de dérivation du
mot u tel que u est le mot obtenu en prenant les feuilles de l’arbre dans le sens
gauche→droite et bas→haut.
Introduction
❖Théorie de langage
• Grammaire: Classification de Chomsky
• Chomsky a propose une classification des grammaires selon le type
des règles de production:
• Grammaire générale (Type 0)
• Grammaire contextuelle (Type 1)
• Grammaire hors-contexte( algébrique) (Type 2)
• Grammaire régulière ( à droite ou à gauche) (Type 3)
Introduction
❖Théorie de langage
• Grammaire: Classification de Chomsky
• Grammaire générale (Type 0): dite aussi grammaire sans restriction,
si toutes ses règles sont de la forme :
X→Y où X ∈(VT∪VN)+-VT+ et Y∈(VT∪VN)*. (aucune restriction)
• Exemple :
G = {{a,b,c}, {S}, {S → aS|Sb|c, aSb → bS|a|b}, S}}
Introduction
❖Théorie de langage
• Grammaire: Classification de Chomsky
• Grammaire contextuelle (Type 1): si toutes ses règles sont de la
forme :
X→Y où X∈(VT∪VN)+-VT+ et Y∈(VT∪VN)* et |X|≤|Y|
• Exemple :
G = {{a,b,c}, {S,R}, {S → ε|aS|Rb, Ra → abR|aS}, S}}
Introduction
❖Théorie de langage
• Grammaire: Classification de Chomsky
• Grammaire hors-contexte (Type 2): si toutes ses règles sont de la
forme :
X→Y où X∈ VN Et Y∈(VT∪VN)*
• Exemple :
G = {{a,b}, {S}, {S → ε|aSb|}, S}}
Mots: ε, ab, aabb, aaabbb, …, anbn
Introduction
❖Théorie de langage
• Grammaire: Classification de Chomsky
• Grammaire régulière ( à droite ou à gauche) (Type 3): si toutes ses règles sont de la
forme :
➢ Une grammaire régulière à gauche:
X→Yc où X→ c avec X∈ VN Et Y∈ VN∪{ε} Et c ∈ VT*
➢ Une grammaire régulière à droite:
X→cY où X→ c avec X∈ VN Et Y∈ VN∪{ε} Et c ∈ VT*
Exemple:
𝐺1 = { 𝑎, 𝑏 , 𝑆, 𝐴 , 𝑆→𝑆𝑏|𝐴𝑏, 𝐴→𝐴𝑎|𝑎 , 𝑆} grammaire régulière à gauche.
𝐺2 = { 𝑎, 𝑏 , 𝑆, 𝐴 , 𝑆→𝑎𝑆|𝑎𝐴, 𝐴→𝑏𝐴|𝑏 , 𝑆} grammaire régulière à droite.
𝐺3 = { 𝑎, 𝑏 , 𝑆, 𝐴 , 𝑆→𝑎𝑆|𝑎𝐴, 𝐴→𝐴𝑏|𝑏 , 𝑆} grammaire n’est pas régulière; puisque n’est
régulière à gauche ni régulière à droite.
Introduction
❖Théorie de langage
• Grammaire: Classification de Chomsky
• Il y a une relation d’inclusion strict entre les 4 types des grammaires c’est-à-
dire: une grammaire de type i est aussi de type inferieur à i (1≤ i ≤ 3).
Type 3 ⊂ Type 2 ⊂ Type 1 ⊂ Type 0
• Le type retenu pour une grammaire est le type maximum de la grammaire
qui vérifie ses règles.
Introduction
❖Théorie de langage
• Grammaire: Langage engendrée
Soit G=(VT,VN,R,S) une grammaire . Le langage défini par la grammaire G appelé L(G)
est l'ensemble des mots dérivés du symbole de départ :
L(G) = { m ∈ VT* / S * m}
• Un langage de type i est un langage engendré par une grammaire de type i tel que:
• Langage de type 3 est un langage régulier ou rationnel (type 3 ).
• Langage de type 2 est un langage algébrique (type 2 ).
• Langage de type 1 est un langage contextuel (type 1 ).
• Langage de type 0 est un langage récursivement énumérable (type 0 ).
Remarque :
Une grammaire définit un seul langage. Par contre, un même langage peut être
engendré par plusieurs grammaires différentes.
Introduction
❖Théorie de langage
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. Définissez la fermeture de Kleene (L∗) pour chacun des langages suivants:
1. L = {ε},
2. L = {a, aa}.
3. Précisez le type de chacune des grammaires suivantes :
1. G = ({a, b}, {S, T}, {S → aabS|aT, T → bS|ε} , S);
2. G = ({a, b, c}, {S, T,U}, {S → bSTa|aTb, T → abS|cU,U → S|ε}, S) ;
3. G = ({0, 1, 2}, {S,C, Z, T}, {S → TZ, T → 0T1C|ε,C1 → 1C,CZ → Z2, 1Z → 1}, S).
Introduction
❖Théorie de langage
Correction Exercice 1:
1. Les langages correspondants aux définitions suivantes :
• Tous les mots sur {a,b,c} qui commencent par a et finissent par b:
L = {m/ m= a{a,b,c}*b}
• Tous les mots sur {a,b} qui contiennent plus de a que de b:
L = {m / |m|a > |m|b}
2. L(G) = {bncc / n ∊ N}
Introduction
❖Théorie de langage
Correction Ex3:
• Construire une grammaire pour le langage L = {abn a/ n ∊ N }
On considère la grammaire G = (VT,VN,R,S) où :
• VT, = {b, c}.
• VN = {S, T}.
• R = {S → aTa, T → bT | ε }
Introduction
❖Compilateur
• Exemple:
• Langage source : langage de haut niveau (C, C++, Java, Pascal, Fortran...)
• Langage cible : langage de bas niveau (assembleur, langage machine)
Introduction
❖Principe de compilateur
• Phases d’analyse : Permet d'identifier les composants d'un programme source dans une
représentation intermédiaire.
• Phases de synthèse : Permettent de construire le programme cible à partir de cette
représentation intermédiaire.
• Remarque : au cours de processus de traduction un rôle important du compilateur est de
signaler à l’utilisateur la présence des erreurs dans le programme source.
Introduction
❖Phases d’un compilateur
• Un compilateur typique se décompose en 6 phases élémentaires : 3 phases d’analyse et 3
phases de synthèse. Deux autres taches interagissent avec les six phases : La gestion
d’une table des symboles et la détection des erreurs.
Programme source Analyseur lexical
Analyseur syntaxique
Optimiseur de code
*
➢Outils théoriques: Grammaire 30
id2 id3
Introduction
❖Phases d’un compilateur
Analyseur sémantique:
• Utilise la structure hiérarchique déterminée par la phase d’analyse
syntaxique pour contrôler la cohérence sémantique du programme
source:
• Cette analyse effectuera quelques modifications de l’arbre syntaxique: :=
• Vérifie la cohérence des types des variables et des expressions
• Vérifie la visibilité des variables c-à-d vérifier qu’ils sont id1 +
déclarées et visibles aux endroits où ils sont utilisé. entier vers réel
*
• Par exemple on pourrait rajouter un nœud ‘’entier vers réel’’ qui
indique qu’une conversion doit être faite. id2 id3 30
Introduction
❖Phases d’un compilateur
Générateur de code intermédiaire:
• Permet de construire une représentation intermédiaire des programmes sources à
partir de l’arbre de analyses syntaxiques et sémantiques, indépendante de tous les
langages de programmations.
:=
• Exemple: Pour y:=a*b+30 on trouve:
id1 +
t1←EvR(30)
entier vers réel
t2←id2*id3 *
t3←t2+t1 id2 id3 30
id1←t3
Introduction
❖Phases d’un compilateur
Optimiseur de code
Permet d’améliorer le code intermédiaire par la réduction du nombre de variables et
d’instructions, de façon que le code machine résultant s’exécutant plus rapidement.
• Exemple: Pour y:=a*b+30 on trouve:
• Le compilateur peut déduire lui même que la conversion de l’entier 30 en réel peut être effectuée une fois
pour toute au moment de la compilation de sorte que l’on peut éliminer l’opération entier vers réel .
• t3 n’est utilisée qu’une seule fois pour transmettre sa valeur à id1, on peut donc en toute sécurité substituer
id1 à tmp3.
t1←EvR(30)
Optimisation de code
t2←id2*id3 t1← id2*id3
t3←t2+t1 id1←t1 + 30.0
id1←t3
Introduction
❖Phases d’un compilateur
Générateur de code final
• Cette phase produit le code objet (cible) équivalent au programme de départ à partir de
code intermédiaire (optimisé).
• Exemple: Pour id1:=id2*id3+30
• Généralement le code cible consiste en langage d’assemblage.
• On sélectionne les emplacements mémoire pour chacune des variables utilisées dans le programme,
ensuite les instructions intermédiaires sont traduites en une suite d’instructions machines qui effectuent
la même tâche.
• Permet de stocker toutes les informations nécessaires sur les lexèmes (mots) du
programmes source.
• Une table des symboles est une structure de données contenant un enregistrement pour
chaque identificateur, muni de champs pour ses attributs (emplacement mémoire, son type,
sa
protée..) Tables des symbols
id1:=id2*id3+nombre
Tables des
symboles
id1 y
id2 a
id3 b
Mov id2, R2
Mul id3; Générateur de code
Mov 30, R1 Générateur de code Optimiseur de code intermédiaire
Add R2, R1
Mov R1, id1 t1←ER(30)
t1←id2*id3
t2←id2*id3
id1←t1+30.0 t3←t2+t1
id1←t3
Introduction
❖Phases d’un compilateur
Analyseur lexical
Analyseur syntaxique
:=
id1 +
id2
*
id3 60
Analyseur sémantique
:=
id1 +
id2
*
Entier vers
reel
id3
60
temp1 = EVR(60)
temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3
Optimiseur de code
Générateur de code
MOV id3, R2
MUL #60.0, R2
MOV id2, R1
ADD R2, R1
MOV R1, id1
Plan
• Introduction
• Expression régulière et automates finis
• Grammaires hors-contexte et automates à pile
• Analyse lexicale
• Analyse syntaxique
• Analyse sémantique
• Génération du code
Expression régulière et automates finis
❖Expression régulière
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 :
• Définition
Un langage régulier est un ensemble de chaînes de caractères qui peut être décrit par une
expression régulière ou reconnu par un automate fini (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.
Expression régulière et automates finis
❖Langages réguliers
• Propriétés
Soient L et L’ deux langages réguliers désignés respectivement par les expressions
régulières r et s, nous avons :
Exercice 1
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}):
1. L’ensemble des mots composés d’un nombre arbitraire de 1, suivis de 01, suivis d’un
nombre arbitraire de 0.
2. L’ensemble des nombres binaires impairs.
Expression régulière et automates finis
❖Langages réguliers
Correction
1. Démontrons que l’ensemble des mots composés d’un nombre arbitraire de 1, suivis de 01, suivis d’un
nombre arbitraire de 0 est un langage régulier.
• On a : L= {1n010m / n,m≥0}
• 1 est une expression régulière donc 1* est aussi une expression régulière
• 01 est une expression régulière
• 0 est une expression régulière donc 0* est aussi une expression régulière
• D’où 1*010* est une expression régulière ce qui implique que L est un langage régulier
Expression régulière et automates finis
❖Langages réguliers
Correction
2. Démontrons que L’ensemble des nombres binaires impairs est un langage régulier.
• On a : L’={(0|1)n1 /n≥0}
• 0* est une expression régulière
• 1* est une expression régulière
• (0|1)*1 est une expression régulière car l’union est une expression régulière,
• Donc L’ est un langage régulier.
Expression régulière et automates finis
❖ 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.
• Un automate fini est défini par un quintuplet A=(Q, V, δ, q0, F) où:
• Q est un ensemble d’états.
• V est un ensemble de symboles d'entrée (alphabet).
• δ est une fonction de transition qui prend comme argument un état et un symbole d'entrée et
qui retourne un état: δ: Q×V→Q
• q0 est l’état initial de l’automate tel que q0∈Q
• F est un ensemble d’états finals ou états d'acceptation tel que F ⊂ Q
Expression régulière et automates finis
❖ Automates finis
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
Expression régulière et automates finis
❖ Automates finis
Représentation d’un AF par une table de transition
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.
Exemple: Soit l’AF de l’exemple précédent, la table de transition correspondante est:
a b
→ : désigne l’état initial
→ q0 q0 q1
q0 q1
* : désigne l’état final
* q1 - q1
Expression régulière et automates finis
❖ Automates finis
Langage accepté par un automate
• Définition
Soit l’automate d’état finis A=(Q, V, δ, q0, F) , on dit que:
• Tout mot fini W = x0x1x2… xn de V est accepte par un automate A si et seulement si il
existe une séquence q0.q1.q2 ….qn.qn+1 de Q telle que :
- Pour tout 0 ≤ i ≤ n : (qi, xi, qi+1) ∈ δ
- qn+1 appartient à l’ensemble F.
- Le langage accepte par un automate d’état fini est un langage régulier.
Expression régulière et automates finis
❖ Automates finis
Langage accepté par un automate
Exemple:
Le langage accepté par cet automate est:
L = {akbr/ k≥0 et r >0}. q0 q1
• bbab Non
• aaab Oui
• aba Non
• aaa
Expression régulière et automates finis
❖ Automates finis
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 a
q1
• Des transitions sur le symbole ε (mot vide): Changer d’état sans avancé dans le mot d’entrée.
ε
q > q1
q0 q1
Expression régulière et automates finis
❖ Automates finis
Automate Fini déterministe (AFD)
Exercice : Soit A = {a,b,c}. Pour chacun des langages suivants, donner un automate fini déterministe
(AFD) le reconnaissant :
• l’ensemble des mots dont la longueur est un multiple de 3 ;
• l’ensemble des mots se terminant par b ;
• l’ensemble des mots ne se terminant pas par b ;
• l’ensemble des mots contenant exactement un b ;
• l’ensemble des mots ne contenant aucun b ;
• l’ensemble des mots comportant au moins 3 lettres et dont la troisième lettre à partir de la fin est un a
ou un c ;
Expression régulière et automates finis
❖ Automates finis
Automate Fini déterministe complet (AFDC)
q0 q1 q0 q1
a
AFD non complet car
pas de a-transition AFD complet
sortant de q1
Expression régulière et automates finis
❖ Automates finis
Transformation de l’AFD en AFDC
Tout AFD peut être transformé en un AFDC reconnaissant le même langage par l’algorithme suivant:
1. Rajouter à l’AFD un nouvel état P non final (« P est appelé état poubelle ou état erreur »)
2. 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 .
a,b,c
q2
Expression régulière et automates finis
❖ Automates finis
Transformation de l’AFD en AFDC
a,b
• Exemple
q0 a q1 b
q3
b a
a,b
q2
Expression régulière et automates finis
❖ Automates finis
Transformation d’un AFND en AFD
ε
ε-fermeture(q0)={q2, q1, q0}
Expression régulière et automates finis
❖ Automates finis
Transformation d’un AFN avec ε-transition en AFD
1. A partir de l’ε-fermeture de l’état initial (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
1
Expression régulière et automates finis
❖ Automates finis
Transformation d’un AFN avec ε-transition en AFD
AFD État a b c
A B -- C
B D E --
C -- -- --
D -- E --
E D -- C
Expression régulière et automates finis
❖ Automates finis
Minimisation d’un AFD
a a États a b
a b ⇾ *1 ∎ 2 5
1 2 3
a b *2∎ 2 4
b 3∎ 3 2
b b
6 4∎ 5 3
b
a 5∎ 4 6
5 a 4
6∎ 6 1
a
7 5 7
7 b
Expression régulière et automates finis
❖ Automates finis
Minimisation d’un AFD
a b a b
1 2 3 1 2 3
a b a b
b b b
6 b b 6 b
b b
a a
5 a 4 5 a 4
a
7 b
Expression régulière et automates finis
❖ Automates finis
Minimisation d’un AFD
2. Regrouper les états appartenant à la même classe d’équivalence
Définition: Deux états qi et qj sont dits β-équivalents s’ils permettent d’atteindre les
états finaux en utilisant les mêmes mots. On écrit alors : qiβqj.
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).
Expression régulière et automates finis
❖ Automates finis
Minimisation d’un AFD
2. Regrouper les états appartenant à la même classe d’équivalence
a. Faire deux classes: A contenant les états finaux et B contenant les états non finaux;
b. 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.
c. Recommencer l’étape 2 jusqu’à ce qu’il n’y ait plus de classes à séparer;
Exemple: soit AFN suivant (initial = 0, finaux = {2,3})
Etat a b Etat a b
0 1 0 0 1 0
1 1 2 1 1 2
2 3 2 2 3 2
3 3 2
Expression régulière et automates finis
❖ Automates finis
Minimisation d’un AFD
Exemple:
Expression régulière et automates finis
❖ Automates finis
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).
Expression régulière et automates finis
❖ Automates finis
Opérations sur les automates
Produit de deux automates:
Soit A=(Q,V,δ,q0,F) et A’=(Q’,V’,δ’,q’0,F’) deux automates à états finis. On appelle produit des
deux automates A et A′ l’automate A"=(Q",V",δ",q"0,F") défini comme suit :
Q′′ = Q × Q′; V′′ = V ∪ V′; q′′0 = (q0, q′0); F′′ = F × F′; δ"((q,q’),a)=(δ(q,a),δ’(q’,a))
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 le langage A′ alors l’automate
A′′ reconnaît l’intersection des deux langages : L(A)∩L(A′).
Expression régulière et automates finis
❖ Automates finis
Opérations sur les automates
Produit de deux automates: Exemple
Produit de
Automate (1): reconnaît les mots 1 et 2
sur {a, b, c} contenant deux a
ER: a*|aba*|a*ba*ba*b(a|b)*
Expression régulière et automates finis
❖ Automates finis
Passage de l’AF (D ou N) vers l’ER
• L'algorithme des équations linéaires en utilisant le lemme d'Arden.
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.
L’automate permet d’établir un système d’équations aux langages de la manière suivante:
• Si δ(qi,a)=qj alors on écrit: Li= aLj
• Si qi∈F, alors on écrit: Li=ε.
• Si Li= α et Li=β alors on écrit Li= α| β
Il suffit ensuite de résoudre le système en précédant à des substitutions et en utilisant la règle
suivante: La solution de l’équation L= αL|β est le langage L=α*β.
Expression régulière et automates finis
❖ Automates finis
Passage de l’AF (D ou N) vers l’ER
• L'algorithme des équations linéaires en utilisant le lemme d'Arden.
Exemple: trouvons le langage accepte par cet automate.
Le système d’équations est le suivant:
1) L0= aL0 | bL1 | ε
2) L1= bL0 | aL2
3) L2= aL1 | bL2
✓Donc la grammaire qui génère le même langage que l’automate est définie par G=(VT,VN,R,S)
telle que: VT=V={a,b}, VN={A, B}, A est l’axiome et R={A→ aA | bB | ε, B→ bB | ε}.
Expression régulière et automates finis
❖ Automates finis
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
Normalisation d’une GR à droite:
1. Pour chaque règle de la forme A → wB (A, B ∈ VN et w ∈ VT* tel que |w|>1, créer un nouveau non-
terminal B′ et éclater la règle en deux : A → aB′ et B′ → uB tel que w = au et a∈VT ;
2. Pour chaque règle de la forme A → w (A ∈ VN et w ∈ VT*) tel que |w| > 1, créer un nouveau non-
terminal B′ et éclater la règle en deux : A→ aB′ et B′→u tel que w=au et a∈VT;
3. Recommencer 1 et 2 jusqu’à ce qu’il n’y ait plus de nouveaux non terminaux ;
4. Pour chaque règle A → B (A, B ∈ VN ) tel que B → β1| β2|...| βn
• Rajouter une règle A → β1| β2|...| βn
• Supprimer la règle A → B
5. Refaire l’étape 4 jusqu’à ce qu’il n’y ait plus de règles de la forme A → B.
Expression régulière et automates finis
❖ Automates finis
Passage de la GR vers l’AF (D ou N)
Soit G=(VT,VN,R,S) une grammaire régulière à droite normalisée, le passage de G vers l’AF
A=(Q,V,δ,q0,F) est trouvé par l’algorithme suivant:
1. V =VT
2. Associer un état à chaque non terminal de VN;
3. L’état initial est associé à l’axiome ;
4. Pour chaque règle de production de la forme A →ε, l’état qA est final ;
5. Pour chaque règle de production de la forme A→x (x∈VT), alors créer un nouvel état final qf
et une transition partant de qA vers qf avec l’entrée x
6. Pour chaque règle A→xB alors créer une transition partant de qA vers l’état qB en utilisant
l’entrée x ;
Remarques:
1. Si les règles de production A→B ne sont pas supprimées dans l’algorithme de normalisation,
il faut ajouter l’étape suivante:
Pour chaque règle A→B alors créer une ε-transition partant de qA vers l’état qB ;
Expression régulière et automates finis
❖ Automates finis
Passage de la GR vers l’AF (D ou N)
Exemple: G={{a,b},{A, B}, {A→ bB | a | ε, B→ bB | ε}, A}.
• Normalisation de G
• A→ a ➔ créer un nouvel état final qf et une transition partant de qA vers qf avec l’entrée a
• V = VT = {a,b};
• q0 A , q1 B donc Q={q0, q1, qf}. b
• F={q0, q1,qf} b q1
q0
• {δ(q0,b)= q1 , δ(q0,a)= qf ; δ(q1,b)= q1}
a
qf
Expression régulière et automates finis
❖ Automates finis
Exercice
Soit la grammaire régulière :
• Introduction
• Expression régulière et automates finis
• Grammaires hors-contexte et automates à pile
• Analyse lexicale
• Analyse syntaxique
• Analyse sémantique
• Génération du code
Grammaires hors-contexte et automates à pile
❖ Grammaires hors-contexte
Rappel
Soit G=(VT,VN,R,S) une grammaire quelconque. G est dite hors-contexte ou de type 2 si
toutes les règles de production sont de la forme:
X→Y tel que X∈ VN et Y∈(VT∪VN)*
Remarques
• Le langage généré par une GHC est appelé un langage hors-contexte (ou algébrique).
• La plus part des langages de programmation sont des langages hors-contextes
Exemple :
G = {{a,b}, {S}, {S → ε|aSb}, S}}
Grammaires hors-contexte et automates à pile
❖ Grammaires hors-contexte
Ambiguïté
Une grammaire HC est dite ambiguë si elle peut générer au moins un mot par plusieurs
manière.
En d’autres termes, si on peut trouver un mot généré par la grammaire et possédant au moins
deux arbres de dérivation, alors on dit que la grammaire est ambiguë.
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.
Grammaires hors-contexte et automates à pile
❖Grammaires hors-contextes propres (GHCP)
Définition
Une grammaire hors-contexte G=(VT,VN,R,S) est dite propre si elle vérifie:
• S→ε,
• A → w avec w ∈ VT+ ,
• A → w avec w∈((VN\{S})UVT)+
• Tous les non terminaux sont utiles, c’est-à-dire qu’ils vérifient :
• ∀ A∈ VN \{S}: A est atteignable depuis S: , (VT VN \ {S})* : S A
• ∀ A∈ VN : A est productif : ∃w ∈ VT+: A w
Propriété
Il est toujours possible de trouver une grammaire propre pour toute grammaire
hors-contexte.
Grammaires hors-contexte et automates à pile
❖Formes Normales de Chomsky (FNC) d’une GHC
Définition
Soit G=(VT,VN,R,S) une grammaire hors-contexte. On dit que G est sous forme
normale de Chomsky si les règles de G sont toutes de l’une des formes suivantes :
• A → BC, A ∈ VN , B,C ∈ VN\{S}
• A → a, A ∈ VN , a ∈ VT
• S→ε
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.
Grammaires hors-contexte et automates à pile
❖Formes Normales de Chomsky (FNC) d’une GHC
Transformation d’une GHCP vers sa FNC
on suppose que la grammaire HC a été rendue propre. Donc toutes les règles sont sous l’une des
formes suivantes :
S→ε, A → w avec w ∈ VT+ , A → w avec w∈((VN\{S})UVT)+
1.La deuxième forme peut être facilement transformée en A → BC. En effet, si w = au, u ∈ VT+ , alors il
suffit de remplacer la règle par les trois règles A → A1A2, A1 → a et A2 → u. Ensuite, il faudra
transformer la dernière règle de manière récursive tant que |u| > 1.
2. Il reste alors à transformer la troisième forme.
Supposons que : w = w1A1w2A2...wnAnwn+1 avec wi ∈ VT* et Ai∈(VN\{S})
• Si w1≠ ε, alors il suffit de transformer cette règle en : A → B1B2 , B1→w1, B2 → A1w2A2...wnAnwn+1
• Sinon, elle sera transformée en : A → A1B , B → w2A2...wnAnwn+1
• Cette transformation est appliquée de manière récursive jusqu’à ce que toutes les règles soient des
règles normalisées.
Grammaires hors-contexte et automates à pile
❖Formes Normales de Chomsky (FNC) d’une GHC
Transformation d’une GHC vers sa FNC
1.Rajouter une nouvelle règle S′ → S tel que S′ est le nouvel axiome ;
2.Éliminer les règles A → ε:
• Pour toute règle B → αAβ de R
• Rajouter la règle B → αβ
• Enlever les règles A → ε
3.Eliminer les règles A→B:
• Pour chaque règle B → u1|...|un , rajouter la règle A → u1|...|un
• Enlever toutes les règles A → B
4.Supprimer tous les non-terminaux non-atteignables:
5.Supprimer tous les non-terminaux non-productifs.
6.Appliquer les règles de transformation d’une GHCP vers sa FNC.
Grammaires hors-contexte et automates à pile
❖Formes Normales de Chomsky (FNC) d’une GHC
Exercice
Transformer G, à sa forme normale de Chomsky.
G=({S’,S},{a,b},{S’→aSbS|aSb|abS|bSaS|bSa|baS|ab|ba|ε,
S→aSbS|aSb|abS|bSaS|bSa|baS|ab|ba}, S’)
Grammaires hors-contexte et automates à pile
❖Formes Normales de Chomsky (FNC) d’une GHC
Exercice
G=({S’,S},{a,b},{S’→aSbS|aSb|abS|bSaS|bSa|baS|ab|ba|ε, S→aSbS|aSb|abS|bSaS|bSa|baS|ab|ba}, S’)
- Les règles S’→ab|ba et S→ab|ba seront remplacées par S’→AB|BA et S→AB|BA avec A→a et B→b
- Les règles S’→bSa|baS et S→bSa|baS seront remplacées par : S’→BA’|BA’’ et S→BA’|BA’’ avec A’→SA
et A’’→AS
- Les règles S’→ aSb|abS et S→ aSb|abS seront remplacées par : S’→AB’|AB’’ et S→ AB’|AB’’ avec
B’→SB et B’’→BS
- Les règles S’→aSbS|bSaS et S→aSbS|bSaS seront remplacées par : S’→A’’B’’|B’’A’’ et S→A’’B’’|B’’A’’
•Donc la FNC de G est :
• S’→AB|BA|BA’|BA’’|AB’|AB’’|A’’B’’|B’’A’’|ε S→AB|BA|BA’|BA’’|AB’|AB’’|A’’B’’|B’’A’’
• A→a A’→SA A’’→AS
• B→b B’→SB B’’→BS
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Définition
- Le langage L= {anbn/n∈IN} est non régulier donc n’est pas reconnu par un automate fini.
G = {{a,b}, {S}, {S → ε|aSb}, S}}
- Il existe une grammaire HC qui permet de générer L, donc L est reconnu par un automate de type 2 ou
automate à pile.
- Alors dans ce cas, on peut dire que la pile est une mémoire qui est ajoutée à l’automate pour compter
le nombre de a du début du mot puis de décompter exactement le même nombre de b.
Définition
Un automate à pile est défini par A=(Q,π,V,δ,Z0,q0,F) où:
- Q: l’ensemble d’états.
- V: l’ensemble d’alphabet
- q0: l’état initiale
- F : l’ensemble d’états finaux.
- π est l’ensemble des symboles utilisés pour écrire dans la pile (l’alphabet de la
pile).
- Z0∈ π : est le symbole initial de la pile.
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Définition
Un automate à pile est défini par A=(Q,π,V,δ,Z0,q0,F) où:
- δ est la fonction de transition: prend comme argument le triple (q, a, U) où:
• q est un état de Q.
• a est le symbole d’ entrée de V ou le mot vide ε.
• U est le sommet de la pile
- La fonction δ retourne une paire (p, α) où :
• α indique le nouveau contenu de la pile.
• P est le nouvel état.
- L’exécution d’une transition δ(q, a, U)= (p, α) modifie le contenu de la pile selon
le mot α comme suit :
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Si α = v1 ……vn alors δ(q, a, U)= (p, V1 ……Vn)
Dépiler le Empiler le
sommet de pile mot v1 ……vn
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Si α = U alors δ(q, a, U)= (p, U)
Dépiler le Empiler le
sommet de pile mot U La pile est inchangée
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Si α = ε alors δ(q, a, U)= (p, ε)
Le sommet de la pile
Dépiler le
sommet de pile
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Mode de reconnaissance
Il existe 2 modes de reconnaissance pour les automates à pile:
1- Reconnaissance par état final: Un mot m est accepté par un AP si après avoir lu
tout le mot m, l’automate se trouve dans un état final quelque soit le contenu de la
pile.
2- Reconnaissance sur pile vide: Un mot m est accepté par un AP si après avoir lu
tout le mot m, la pile est vide quelque soit l’état de l’automate.
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
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Mode de reconnaissance
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.
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Exemple
L’automate reconnaissant les mots anbn (avec n ≥ 0) est le suivant :
A=({q0,q1,q2,q3}, {Z0}, {a,b},δ,q0,{q3}) telle que δ est définie par:
1. δ(q0, a, Z0) = (q1, Z0a) || Lire et empiler le 1er ‘a’ .
2. δ(q1, a, a) = (q1, aa) || Lire et empiler les ‘a’ suivants.
3. δ(q1, b, a) = (q2, ε) || dépiler le ‘a’ et Lire ‘b’.
4. δ(q2, b, a) = (q2, ε) || dépiler le ‘a’ et Lire ‘b’.
5. δ(q2, ε, Z0) = (q3, Z0) ||le nombre de ‘a’ est égal au ‘b’ on change l’ état.
6. δ(q0, ε, Z0) = (q3, Z0)
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Exemple : L’automate reconnaissant les mots anbn (avec n ≥ 0) est le suivant :
a, a→aa b, a→ε
q0
a, z0→z0a q1 b, a→ε q2 ε, z0→ z0 q3
ε, z0 → z0
• Pour tout langage généré par une grammaire hors-contexte, il existe un automate
à pile qui le reconnaît.
• Réciproquement, pour tout langage reconnu par un automate à pile, il existe une
grammaire hors-contexte qui le génère.
Grammaires hors-contexte et automates à pile
❖ Automate à pile (AP)
Exercice :
Construire l’automate à pile du langage suivant L={mcmR tel que m∈ {a,b}*}.
Plan
• Introduction
• Expression régulière et automates finis
• Grammaires hors-contexte et automates à pile
• Analyse lexicale
• Analyse syntaxique
• Analyse sémantique
• Génération du code
Analyse lexicale
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.
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
l’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.
➔ associer à chaque erreur détecter le numéro de sa ligne.
Analyse lexicale
• 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:
Exemple: 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:
Lexèmes Unité lexicale
aire , base , hauteur identificateur
:= op-affectation
*,/ op-arithmétique
Analyse lexicale
❖Modèle
Modèle:
• Est une règle associée à une unité lexicale qui décrit l’ensemble des chaines
(Lexème) du programme qui peuvent appartenir à cette unité lexicale.
• Nous utilisons les expressions régulières ou les automates finis pour représenter
les modèles des unités lexicales.
- Modèle identificateur:
0 1
Lettre
Exemples:
1- Définition régulière d'un identificateur:
lettre A|B|…Z|a|b|…|z|_
chiffre 0|1|2|…………|9
id lettre(lettre|chiffre)*
2- Définition régulière des entiers signés et non signés:
chiffre 0|1|2|…………|9
entier [+|-]? (chiffre)+
Analyse lexicale
❖Définitions d’attribut
Définition
Un attribut est toute information supplémentaire inutile pour l’analyseur
syntaxique mais utile pour les autres phases de la compilation.
Exemple:
• Ce code en langage C doit être compilé par le compilateur du langage C pour produire
un exécutable qui est un analyseur lexical correspondant au langage défini par les
expressions régulières d'entrée.
Un programme source en langage Lex est constitué de 3 sections délimitées par %%:
Exemple
blancs [\t\n ]+
lettre [A-Za-z]
chiffre [0-9] /* base 10 */
mot-cle-if if
identificateur {lettre}(_|{lettre}|{chiffre})*
entier {chiffre}+
exposant [eE][+-]?{entier}
Analyse lexicale
❖ Construction de l’analyseur lexical (automate)
1. Implémenter tous les modèles (automates) représentant les unités lexicales du langage traité.
Exemples: Identificateurs, Mots clés, Nombres, Opérations relationnelles, Opérations logiques,
opérations arithmétiques, …….
2. Traiter le programme source caractère par caractère pour:
• Extraire les lexèmes reconnus par leur automates et les enregistrer dans une table des
symboles avec d’autre attributs.
• Gérer les erreurs pour les lexèmes non reconnus.
Exemples: Lexèmes Unités lexicales Attributs
x:=y+30 x,y identificateur Adresse de x et y: Pour le GC
Type de x et y: Pour l’AS
:= op-affectation
. + op-arithmétique
30 nombre Type: Pour l’AS
Analyse lexicale
❖ Construction de l’analyseur lexical (automate)
1. Implémenter tous les modèles:
Pour chaque automate représentant une unité lexicale du langage source,
implémenter en java (ou un autre langage) une fonction booléenne portant le
même nom que l’unité lexicale traitée.
Remarque:
Toutes les instructions du bloc (Répéter….jusqu’à la fin du tampon) peuvent être implémentées dans une
seule fonction getlex().
Analyse lexicale
❖Gestionnaire de la table de symbole (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 autres phases d’analyse.
Analyse lexicale
❖Erreurs lexicales
Exemples:
- Un caractère n’appartient pas à l’alphabet.
- Un commentaire non fermé.
- Un mot clé non terminé
Plan
• Introduction
• Expression régulière et automates finis
• Grammaires hors-contexte et automates à pile
• Analyse lexicale
• Analyse syntaxique
• Analyse sémantique
• Génération du code
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é lexical acceptée par la grammaire du
langage .
unité lexicale
Analyseur Analyseur Arbre Syntaxique Analyseur
Lexical Syntaxique Semantique
Lire prochaine unité lexicale
Message d’erreur pour aider à
corriger le fichier source
2. Analyse prédictive
Analyse syntaxique
❖ Construction d’analyseur syntaxique descendant
1. Analyse par descente récursive: est une méthode d’ASyD dans laquelle on
exécute un ensemble de procédure (ou fonction) récursive pour traiter l’entrée en
question. Cette analyse peut impliquer des retours arrière.
Exemple : Soit la grammaire définit par S → cAd , A → ab|a et soit la chaîne W = cad.
1. Un pointeur d’entrée repère c, le premier symbole de W. on utilise alors la
première règle de production de S, pour aboutir à l’arbre suivant :S ➔ cAd.
2. on avance le pointeur d’entrée sur a, seconde symbole de W. on utilise alors la
première règle de production de A, pour aboutir à l’arbre suivant :S ➔ cAd ➔
cabd.
3. comme b != d on signale un échec et on retourne à A pour voir s’il existe une autre
alternative non encore essayer.
4. En retournant à A on doit remettre le pointeur d’entrée en position 2. On essaie la
seconde alternative de A et on obtient l’arbre suivant : S ➔ cAd ➔ cad.
Analyse syntaxique
❖ Méthode de construction de l’Asy
Analyse par descente récursive:
Problème:
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
Analyse syntaxique
❖ Méthode de construction de l’Asy
❖Analyse prédictive
- Soit la grammaire :
• S → Ba
• B → cP| bP| P| ε
• P → dS
• First(S):
• On a S → Ba → εa = a donc a Є first(S)
• On a S → Ba →cPa donc c Є First(s)
• On a S → Ba → bPa donc b Є first(S)
• On a S → Ba → Pa → dSa donc d Є First(S)
First(S)= {a,c,b,d}
Analyse syntaxique
❖ l’ASyD prédictive:
❖ Notion : Table d'analyse LL, First et Follow
Définition: SUIVANT « Follow() »:
Pour chaque symbole non-terminal A, suivant(A) définit l'ensemble des terminaux à qui peuvent
apparaître immédiatement à droite de A dans toute chaînes de symboles constituant les règles de production.
• Exemple
S → Ba | Sc ; B → cP | bPb |P| ε ; P → dS
• Follow(S) = {c, Follow(P)} = {c, b, Follow(B)} = {c, b, a}= {$, a, b, c}
Analyse syntaxique
❖ l’ASyD prédictive:
❖ Notion : Table d'analyse LL, First et Follow
Exemple :
S→aSb|cd|SAe; A→aAdB|ε; B→bb
First Follow
S a c $b ae
A a ε e d
B b e d
Analyse syntaxique
❖ l’ASyD prédictive:
❖ Notion : Table d'analyse LL, First et Follow
Exercice:
Soit la grammaire G=(VT, VN, R,E) telle que: VT=(+,*,(,),nbr), VN=(E,T,F,E’,T’) et R :
• E→TE’
• E’→+TE’ | ε
• T→FT’
• T’→*FT’ |ε
• F→(E) | nbr
1- Calculer les deux ensembles First et Follow pour les éléments de VN .