Académique Documents
Professionnel Documents
Culture Documents
Wadoud Bousdira1
wadoud.bousdira@univ-orleans.fr
1 LIFO,
University of Orléans
Orléans, France
Orléans, 2022
Analyse syntaxique LL(k)
1 Définition
2 Ensembles Premier et Suivant
3 Récursivité gauche
4 Factorisation
5 Grammaire LL(1)
6 Table d’analyse LL(1)
Dérivation gauche :
∗
S ⇒ a1 . . . aj |{z}
A α
| {z }
∈Σ ∈N
Grammaire LL(k)
où k est un entier fixé.
Si on sait quelle règle choisir à condition de regarder les k caractères qui
suivent (k caractères de prévision).
Exemple 1 :
S → aAS | b
A → a | bSA
mot : a3 b 2 ab
S ⇒g aAS ⇒g aaS ⇒g aaaAS ⇒g a3 bSAS ⇒g a3 bbAS ⇒g a3 b 2 aS ⇒g
a3 b 2 ab
Dans cette dérivation, on a besoin de connaı̂tre le prochain caractère et
seulement celui-ci (grammaire LL(1)).
Exemple 2 :
S → A|B
L = {an 1b n , n ≥ 0} ∪ {an 2b 2n , n ≥ 0}, P(L) = A → aAb | 1
B → aBbb | 2
L n’est pas LL(k), ∀k. Il suffit d’avoir n > k de a pour ne pas pouvoir
choisir entre S → A et S → B.
Premier(α)
soit un mot α ∈ (Σ ∪ N)∗
∗ ∗
Premier(α) = {x ∈ Σ / α ⇒ xβ} ∪ {, si α ⇒ }
Suivant(A)
soit A ∈ N ,
∗ ∗
Suivant(A) = {x ∈ Σ / S ⇒ αAxβ, α ∈ Σ∗ } ∪ {$, si S ⇒ αA, α ∈
Σ∗ }
ou encore
∗ ∗
[
Suivant(A) = Premier(γ) / S ⇒ αAγ ∪{$, si S ⇒ αA, α ∈ Σ∗ }
γ6=
A → γ1 | γ2 | . . . | γn
Ça marchera si on sait distinguer les γi en fonction des 1ers symboles qu’ils
produisent . . . Premier(γi ) d’où la notion de Premier.
Exemple 3 : E → E + T | T , T → T ∗ F | F , F → n | x | (E )
Premier(E + T ) = Premier(E )
Premier(E ) = Premier(T ) = Premier(F ) = {n, x, (}
Exemple : S → aSa |
Premier(aSa) = {a}, Premier() = {}
Les ensembles sont disjoints et pourtant on ne sait pas choisir
lors de la reconnaissance de aaaa par ex :
S ⇒ aSa ⇒ aaSaa ⇒
Si on choisit S → aSa, on produit des ’a’ de trop !
si on choisit S → , on fait aussi apparaı̂tre un a qui était derrière S
d’où la notion de Suivant.
Quel est le problème ? a commence l’alternative aSa de S et
a ∈ Suivant(S) !
Si S → aSb | , et m = aabb,
S ⇒ aSb ⇒ aaSbb ⇒ aabb : dérivation déterministe.
Algorithmes de calcul
Pour calculer Premier :
∀ X ∈ (Σ ∪ N), appliquer les règles suivantes jusqu’à ce qu’aucun terminal
ni ne puisse être ajouté aux ensembles Premier
1 si X ∈ Σ, Premier(X ) = {X }
2 si X → ∈ P, ajouter à Premier(X )
3 si X ∈ N, et X → Y1 Y2 . . . Yk ∈ P,
I ajouter Premier(Y1 ) à Premier(X ),
I si ∈ Premier(Y1 ), ajouter Premier(Y2 ) à Premier(X ),
I ...
∗
I si ∈ Premier(Yj ), ∀j = 1, . . . , k (i.e. Y1 . . . Yk ⇒ ) alors ajouter
à Premier(X ).
Conséquence :
On étend la notion de Premier(X ), X ∈ (Σ ∪ N) à celle de
Premier(α), α ∈ (Σ ∪ N)∗
∀ la chaı̂ne X1 X2 . . . Xn ∈ (Σ ∪ N)∗ , Premier(X1 X2 . . . Xn ) se calcule
en ajoutant tous les symboles de Premier(X1 ) 6= .
Si ∈ Premier(X1 ), ajouter aussi les symboles de Premier(X2 ) 6= .
Si ∈ Premier(X1 ) et à Premier(X2 ), ajouter aussi les symboles de
Premier(X3 ) 6= .
etc . . .
Finalement, si ∀i, ∈ Premier(Xi ), ajouter à
Premier(X1 X2 . . . Xn ).
Premier Suivant
AaAb {a} S {$}
BbBa {b} A {a, b}
S {a, b} B {b, a}
Exemple 3 : S → aSbS | bSaS |
Premier Suivant
aSbS {a} S {$, a, b}
bSaS {b}
S {a, b, }
∃ A → Aα ∈ P
Pb de la récursivité gauche :
les méthodes d’analyse descendante ne peuvent pas fonctionner :
Si ∃ A → A α | β ∈ P et si on doit dériver A en une de ses
alternatives, Aα peut être choisie de façon répétitive sans aucun
moyen d’arrêt.
De +, dans ce cas, 1 caractère de prévision ne suffit pas à choisir
l’alternative à appliquer.
On prouvera + tard qu’une grammaire récursive à gauche ne peut pas être
LL(1).
A → βA0
A0 → αA0 |
générale : se ramener à une récursivité simple (par expansion de
non-terminaux) puis la supprimer.
A A
A’
A
A
A’
A’
A
A’
β α α α α α β α α α α α ε
E → T E0
E → E + T | T ⇐⇒
E 0 → +T E 0 |
Exemple 2 :
E → id E 0 | id (E ) E 0
E → id | id(E ) | E + id ⇐⇒
E 0 → +id E 0 |
A → α β1 | α β2 tq α ∈ (Σ ∪ N)+ .
A → α A0 | γ
A → α β1 | α β2 | . . . | α βn | γ ⇔
A0 → β1 | β2 | . . . | βn
équivalente à
E → id A | (E B
A → E |
B → , E) | )
Proposition :
une grammaire ambiguë n’est pas LL(1)
une grammaire récursive à gauche n’est pas LL(1)
une grammaire non factorisée n’est pas LL(1)
Proposition :
une grammaire est LL(1) ssi ∀A → α | β ∈ P tq α 6= β,
1 Premier(α) ∩ Premier(β) = ∅
∗
2 si β ⇒ , Premier(α) ∩ Suivant(A) = ∅
∗ ∗
Conséquence : si β ⇒ , alors α ⇒
6 .
(1) E → T E 0
(2) E 0 → +T E 0 |
(3) T → F T 0
(4) T 0 → ∗F T 0 |
(5) F → x | n | (E )
On vérifie LL(1)
1 Premier() ∩ Premier(B) = {} ∩ (Premier(L) ∪
Premier(C ) ∪ {}) 6= ∅ !
On expanse B dans les productions de I 0 , i.e.
I 0 → | B ⇐⇒ I 0 → | LB | CB
On arrive à :
I → L I0
I 0 → | LB | CB
L → a | b | ... | z
C → 0 | 1 | ... | 9
B → LB | CB |
I → L I0
0
I →LB
I → | LB | CB
B → | LB | CB
L → a | b | . . . | z ⇐⇒
L → a | b | ... | z
C → 0 | 1 | ... | 9
C → 0 | 1 | ... | 9
B → LB | CB |
On vérifie LL(1)
1 Premier() ∩ Premier(LB) = {} ∩ Premier(L) = ∅
2 Premier() ∩ Premier(CB) = {} ∩ Premier(C ) = ∅
3 Premier(LB) ∩ Premier(CB) = ∅
4 Suivant(B) ∩ Premier(LB) = {$} ∩ {a, . . . , z} = ∅
5 Suivant(B) ∩ Premier(CB) = {$} ∩ {0, . . . , 9} = ∅
6 Premier(a) ∩ Premier(b) = ∅, Premier(a) ∩ Premier(c) = ∅ . . .
Premier(y ) ∩ Premier(z) = ∅
7 Premier(0) ∩ Premier(1) = ∅, Premier(0) ∩ Premier(2) = ∅ . . .
Premier(8) ∩ Premier(9) = ∅
Donc grammaire LL(1).
Symbole ∈ Σ ∪ {$}
Symbole
∈N
4 actions possibles :
1 remplacer le sommet de pile par autre chose sans consommer de
symbole dans le mot (correspond à une action de dérivation gauche)
2 dépiler et avancer dans le mot d’un caractère si le sommet de pile et
le caractère de prévision sont identiques
3 échec : entrée de M vide
4 succès : fin de l’analyse.
Exemple 1 :
E → TE 0 , E 0 → +TE 0 | , T → FT 0 , T 0 → ∗FT 0 | , F → x | n | (E )
x n + ∗ ( ) $
E TE 0 TE 0 TE 0
E0 +TE 0
T FT 0 FT 0 FT 0
T0 ∗FT 0
F x n (E )
S → aaSbb | a |
LL(1) ?
Premier(aaSbb) ∩ Premier(a) = {a} =
6 ∅
On factorise :
S → aA |
A → aSbb |
Premier(aA) ∩ Premier() = ∅
Suivant(S) ∩ Premier(aA) = {$, b} ∩ {a} = ∅
Premier(aSbb) ∩ Premier() = ∅
Suivant(A) ∩ Premier(aSbb) = {$, b} ∩ {a} = ∅
=⇒ LL(1).
S → aA | , A → aSbb |
a b $
S aA
A aSbb
S → aA | , A → aSbb |
Un exemple d’application
On considère la grammaire G suivante :
G est-elle réduite ?
Prod = {D, G , F , S}
S → bF
F → aF | aG
G → Gc | d
D → ab
Acc = {S, F , G }
S → bF
F → aF | aG
G → Gc | d
G 0 est-elle LL(1) ?
G0 :
S → bF
aF 0
F →
F0 → F |G
G → dG 0
0
G → cG 0 |
a b c d $
S bF
F aF 0
F0 F G
G dG 0
G0 cG 0
S$ baadc$ S → bF
bF $ baadc$ dépiler et avancer
F$ aadc$ F → aF 0
aF 0 $ aadc$ dépiler et avancer
F 0$ adc$ F0 → F
F$ adc$ F → aF 0
aF 0 $ adc$ dépiler et avancer
F 0$ dc$ F0 → G
G$ dc$ G → dG 0
dG 0 $ dc$ dépiler et avancer
G 0$ c$ G 0 → cG 0
cG 0 $ c$ dépiler et avancer
G 0$ $ G0 →
$ $ succès
dérivation gauche : 3ème colonne avec ⇒ au lieu de →.
W. Bousdira (LIFO) Théorie des langages algébriques Orléans 2020 49 / 49