Chapitre 4
Chapitre 4
Chapitre 4
Cours compilation
Chapitre 4 : Analyse LL
1
Licence 3 Cours compilation Chapitre 4
4.1. Introduction
L’analyse LL est une analyse descendante pour un sous-ensemble de grammaires non
contextuelles, elle analyse l’entré de gauche à droite (Left to right) et en construit une dérivation
à gauche (Leftmost derivation) les grammaires analysables de cette façon sont nommées
grammaire LL.
Exemple 1 :
Soit la grammaire 𝐺1 suivante
2
Licence 3 Cours compilation Chapitre 4
𝑆 → 𝐴𝐵𝑐|𝑎𝑆𝑐
𝐴 → 𝜀| 𝑎𝐴𝐵
{
𝐵 → 𝑏𝐶|𝜀
𝐶 → 𝐵𝑐|𝑎𝐶|𝜀
Ensemble des débuts :
𝑑𝑒𝑏(𝑆) = 𝑑𝑒𝑏(𝐴𝐵𝑐) ∪ 𝑑𝑒𝑏(𝑎𝑆𝑐) = 𝑑𝑒𝑏(𝐴) − {𝜀} ∪ 𝑑𝑒𝑏(𝐵) ∪ {𝑐} ∪ {𝑎}
𝑑𝑒𝑏(𝐴) = 𝑑𝑒𝑏(𝜀) ∪ 𝑑𝑒𝑏(𝑎𝐴𝐵) = {𝜀} ∪ {𝑎}
𝑑𝑒𝑏(𝐵) = 𝑑𝑒𝑏(𝑏𝐶) ∪ 𝑑𝑒𝑏(𝜀) = {𝑏} ∪ {𝜀}
𝑑𝑒𝑏(𝐶) = 𝑑𝑒𝑏(𝐵𝑐) ∪ 𝑑𝑒𝑏(𝑎𝑐) ∪ 𝑑𝑒𝑏(𝜀) = 𝑑𝑒𝑏(𝐵) − {𝜀} ∪ {𝑐} ∪ {𝑎} ∪ {𝜀}
Ensemble des suivants :
𝑠𝑢𝑖𝑣(𝑆) = {#} ∪ {𝑐}
𝑠𝑢𝑖𝑣(𝐴) = 𝑑𝑒𝑏(𝐵𝑐) ∪ 𝑑𝑒𝑏(𝐵)
𝑠𝑢𝑖𝑣(𝐵) = 𝑑𝑒𝑏(𝑐) ∪ 𝑠𝑢𝑖𝑣(𝐴)
𝑑𝑒𝑏(𝐶) = 𝑠𝑢𝑖𝑣(𝐵)
Tableau des débuts et des suivants :
Début suivant
𝑺 𝑎 𝑏 𝑐 # 𝑐
𝑨 𝜀 𝑎 𝑏 𝑐
𝑩 𝑏 𝜀 𝑏 𝑐
𝑪 𝑎 𝑏 𝑐 𝜀 𝑏 𝑐
Remarques
Une grammaire est LL(1), si on arrive à décider de l’appartenance d’une chaine à
un langage au vu d’un seul caractère ;
Une grammaire récursive à gauche n’est pas LL(1) ;
Une grammaire non factorisée n’est pas LL(1).
3
Licence 3 Cours compilation Chapitre 4
Exemple 2 :
Soit la grammaire 𝐺1 de l’exemple 1
𝑆 → 𝐴𝐵𝑐|𝑎𝑆𝑐
𝐴 → 𝜀| 𝑎𝐴𝐵
{
𝐵 → 𝑏𝐶|𝜀
𝐶 → 𝐵𝑐|𝑎𝐶|𝜀
𝐺1 est-elle LL(1)
𝐺1 n’est pas récursive à gauche et elle est factorisé, alors elle peut être LL(1) ;
Règle N° 1 (S)
Cond 1 : 𝑑𝑒𝑏(𝐴𝐵𝑐) ∩ 𝑑𝑒𝑏(𝑎𝑆𝑐) = {𝑎} Alors S n’est pas LL(1)
Règle N° 2 (A)
Cond 1 : 𝑑𝑒𝑏(𝜀) ∩ 𝑑𝑒𝑏(𝑎𝐵𝐴) = ∅
Cond 2 : 𝑠𝑖 𝜀 →∗ 𝜀 𝑎𝑙𝑜𝑟𝑠 𝑎𝐵𝐴 ↛∗ 𝜀
Cond 3 : 𝑠𝑖 𝜀 →∗ 𝜀 𝑎𝑙𝑜𝑟𝑠 𝑑𝑒𝑏(𝑎𝐵𝐴) ∩ 𝑠𝑢𝑖𝑣(𝐴) = ∅ Alors la règle A est LL(1)
Règle N° 3 (B)
Cond 1 : 𝑑𝑒𝑏(𝑏𝐶) ∩ 𝑑𝑒𝑏(𝜀) = ∅
Cond 2 : 𝜀 →∗ 𝜀 𝑎𝑙𝑜𝑟𝑠 𝑏𝐶 ↛∗ 𝜀
Cond 3 : 𝑑𝑒𝑏(𝑏𝐶) ∩ 𝑠𝑢𝑖𝑣(𝐵) = {𝑏} Alors la règle B n’est LL(1)
Règle N° 4 (C)
Cond 1 : 𝑑𝑒𝑏(𝐵𝑐) ∩ 𝑑𝑒𝑏(𝑎𝐶) ∩ 𝑑𝑒𝑏(𝜀) = ∅
Cond 2 : 𝜀 →∗ 𝜀 𝑎𝑙𝑜𝑟𝑠 𝐵𝑐 ↛∗ 𝜀 𝑒𝑡 𝑎𝐶 ↛∗ 𝜀
Cond 3 : 𝑑𝑒𝑏(𝐵𝑐) ∩ 𝑠𝑢𝑖𝑣(𝐶) = {𝑐} Alors la règle C n’est LL(1)
Les règles S, B, C ne sont pas LL(1), alors la grammaire 𝐺1 n’est pas LL(1).
Table d’analyse ;
Pile d’analyse ;
4
Licence 3 Cours compilation Chapitre 4
Chaine d’entrée ;
Algorithme d’analyse.
4.4.1 Règles de construction de la table d’analyse
Soit la grammaire G LL(1) et soit Table [A, a] la table d’analyse LL(1). La table d’analyse
LL(1) est un tableau ou les lignes représentent les non-terminaux de la grammaire (𝐴 ∈ 𝑁) et les
colonnes représentent les terminaux de la grammaire (𝑎 ∈ 𝑇 ∪ {#}).
La table d’analyse est construite comme suit :
1- Pour chaque règle de la forme 𝐴 → 𝛼 de la grammaire G :
a. ∀𝑎 ∈ 𝑑𝑒𝑏𝑢𝑡(𝛼), 𝑎𝑗𝑜𝑢𝑡𝑒𝑟 𝑙𝑎 𝑟è𝑔𝑙𝑒 𝐴 → 𝛼 à 𝑙𝑎 𝑡𝑎𝑏𝑙𝑒 𝑇𝑎𝑏𝑙𝑒[𝐴, 𝑎];
b. 𝑠𝑖 𝜀 ∈ 𝑑é𝑏𝑢𝑡 (𝐴), 𝑎𝑙𝑜𝑟𝑠 ∀ 𝑏 ∈ 𝑠𝑢𝑖𝑣𝑎𝑛𝑡 (𝐴), 𝑎𝑗𝑜𝑢𝑡𝑒𝑟 𝑙𝑎 𝑟è𝑔𝑙𝑒 𝐴 →
𝛼 à 𝑙𝑎 𝑐𝑎𝑠𝑒 𝑡𝑎𝑏𝑙[𝐴, 𝑏];
2- Toutes les autres cases sont des erreurs.
Exemple : Soit la grammaire suivante
𝐸 → 𝑇𝐸 ′
𝐸 ′ → +𝑇𝐸 ′ | 𝜀
G = 𝑇 → 𝐹𝑇′
𝑇 ′ →∗ 𝐹𝑇 ′ | 𝜀
{ 𝐹 → 𝑖 | (𝐸 )
G est-elle LL(1) ? Construire la table d’analyse LL(1).
Ensemble des débuts et des suivants
Début Suivant
E 𝑖, ( #, )
E’ +, 𝜀 #, )
T 𝑖, ( +, #, )
T’ ∗, 𝜀 +, #, )
F 𝑖, ( ∗, #, )
5
Licence 3 Cours compilation Chapitre 4
𝒊 + ∗ ( ) #
𝑬 𝑇𝐸 ′ 𝑇𝐸′
𝑬′ +𝑇𝐸 ′ 𝜀 𝜀
𝑻 𝐹𝑇′ 𝐹𝑇′
𝑻′ 𝜀 ∗ 𝐹𝑇 𝜀 𝜀
𝑭 𝑖 (𝐸)
6
Licence 3 Cours compilation Chapitre 4
7
Licence 3 Cours compilation Chapitre 4
Une grammaire est LL(k) cela implique que pour chaque couple de règle 𝐴 → 𝛼|𝛽
𝐷𝑒𝑏𝑘 (𝑑𝑒𝑏𝑘 (𝛼). 𝑠𝑢𝑖𝑣𝑘 (𝐴)) ∩ 𝐷𝑒𝑏𝑘 (𝑑𝑒𝑏𝑘 (𝛽). 𝑠𝑢𝑖𝑣𝑘 (𝐴)) = ∅
Exemple : La grammaire G suivante est-elle LL(k) ?
𝑍→𝑆
{𝑆 → 𝑎𝐴𝑎𝑎| 𝑏𝐴𝑏𝑎
𝐴 → 𝑏|𝜀
a. G est-elle LL(1) ?
G n’est pas récursive à gauche ;
G est factorisée ;
On vérifie les trois conditions.
𝑃𝑜𝑢𝑟 𝑆 → 𝑎𝐴𝑎𝑎|𝑏𝐴𝑏𝑎
𝐶1 − 𝐷𝑒𝑏(𝑎𝐴𝑎𝑎) ∩ 𝑑𝑒𝑏(𝑏𝐴𝑏𝑎) = {𝑎} ∪ {𝑏} = ∅
La règle S est LL(1)
𝑃𝑜𝑢𝑟 𝐴 → 𝑏|𝜀
𝐶1 − 𝐷𝑒𝑏(𝑏) ∩ 𝑑𝑒𝑏(𝜀) = ∅
𝐶2 − 𝑏 ≠ 𝜀
𝐶3 − 𝐷𝑒𝑏(𝑏) ∩ 𝑠𝑢𝑖𝑣(𝐴) = {𝑏} ∪ {𝑎, 𝑏} = {𝑏}
A n’est pas LL(1) dont la grammaire n’est pas LL(1)
b. G est-elle LL(2)
𝑆𝑢𝑖𝑣2 (𝐴) = 𝐷𝑒𝑏2 (𝑎𝑎. 𝑠𝑢𝑖𝑣2 (𝑆)) ∪ 𝐷𝑒𝑏2 (𝑏𝑎. 𝑆𝑢𝑖𝑣2 (𝑆))={aa, ba}
8
Licence 3 Cours compilation Chapitre 4
𝑫𝒆𝒃𝟐 𝑺𝒖𝒊𝒗𝟐
𝑺 𝑎𝑎, 𝑎𝑏, 𝑏𝑏 ###
𝑨 𝑏, 𝜀 𝑎𝑎, 𝑏𝑎
𝑃𝑜𝑢𝑟 𝐴 → 𝑏|𝜀
𝐷𝑒𝑏2 (𝑏. 𝑠𝑢𝑖𝑣2 (𝐴)) ∩ 𝑠𝑢𝑖𝑣2 (𝐴) = {𝑏𝑎, 𝑏𝑏} ∩ {𝑎𝑎, 𝑏𝑎} = {𝑏𝑎}
A n’est pas LL(2) alors G n’est pas LL(2).
c. G est-elle LL(3)
𝑆𝑢𝑖𝑣3 (𝐴) = 𝐷𝑒𝑏3 (𝑎𝑎. 𝑠𝑢𝑖𝑣3 (𝑆)) ∪ 𝐷𝑒𝑏3 (𝑏𝑎. 𝑆𝑢𝑖𝑣3 (𝑆)) = {𝑎𝑎#, 𝑏𝑎#}
𝑫𝒆𝒃𝟑 𝑺𝒖𝒊𝟑
𝑺 𝑎𝑎𝑎, 𝑎𝑏𝑎, 𝑏𝑏𝑏, 𝑏𝑏𝑎 ###
𝑨 𝑏, 𝜀 𝑎𝑎#, 𝑏𝑎#
𝑃𝑜𝑢𝑟 𝐴 → 𝑏|𝜀
𝐷𝑒𝑏3 (𝑏. 𝑠𝑢𝑖𝑣3 (𝐴)) ∩ 𝑠𝑢𝑖𝑣3 (𝐴) = {𝑏𝑎𝑎, 𝑏𝑏𝑎} ∩ {𝑎𝑎#, 𝑏𝑎#} = ∅
A est LL(3) alors G est LL(3)
9
Licence 3 Cours compilation Chapitre 4
10