Академический Документы
Профессиональный Документы
Культура Документы
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Mirabelle Nebut
2010-2011
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 2/111
Analyse descendante
3/111
4/111
Analyse déterministe
5/111
Analyse prédictive
6/111
7/111
S → AB | Da
A → aAb |
abb# ?
B → bB |
D → dD | e
S ⇒?
4
a bb#
4
Choix entre S → AB et S → Da.
Prédiction : expansion par S → AB
8/111
S → AB | Da
A → aAb |
abb# ?
B → bB |
D → dD | e
S ⇒ AB ⇒ ?
4
a bb#
4
Choix entre A → aAb et A → .
Prédiction : expansion par A → aAb
9/111
S → AB | Da
A → aAb |
abb# ?
B → bB |
D → dD | e
S ⇒ AB ⇒ aAbB
4
a bb#
4
Lecture de a.
10/111
S → AB | Da
A → aAb |
abb# ?
B → bB |
D → dD | e
S ⇒ AB ⇒ a AbB ⇒ ?
4
a bb#
4
Choix entre A → aAb et A → .
Prédiction : expansion par A →
11/111
S → AB | Da
A → aAb |
abb# ?
B → bB |
D → dD | e
S ⇒ AB ⇒ aAbB ⇒ abB ⇒ abb B ⇒ ?
4
abb #
4
Choix entre B → bB et B → .
Prédiction : expansion par B → , acceptation.
12/111
Un analyseur LL :
I ne mémorise pas qu’il est en train de reconnaı̂tre X ;
I ne mémorise pas qu’il a reconnu α ;
I considère uniquement β.
13/111
A
b
S B
pile initiale une pile pile vide (acceptation)
14/111
S → AB | Da B → bB |
abb# ?
A → aAb | D → dD | e
a
A A
A b b b b
S B B B B B B B
abb# abb# abb# bb# bb# b# b# # #
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 16/111
S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur
18/111
19/111
Interprétation de Table[a, X ]
20/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 21/111
Principe :
I analyseur LL codé par un ensemble de fonctions ;
I ces fonctions s’appellent les unes les autres ;
I n’utilise pas de pile explicite : pile implicite des appels.
Exemple
S → AB | Da
A → aAb |
B → bB |
D → dD | e
À voir :
I écriture de S(), A(), B(), D() ;
I collaboration avec un analyseur lexical.
23/111
...
public class Parser {
// analyseur lexical
private Scanner anLex;
...
Mirabelle Nebut Analyse descendante LL(k)
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
// et uniquement l’axiome
if (this.teteLect.getType() != TS.EOF)
throw new ParserException();
} 26/111
Code de S()
La tête de lecture est déjà positionnée sur le symbole de prédiction.
private void S() throws ... {
if (this.teteLect.getType() == TS.a)
... // S -> AB
S else if (this.teteLect.getType() == TS.b)
a S → AB ... // S -> AB
b S → AB else if (this.teteLect.getType() == TS.d)
... // S -> Da
d S → Da else if (this.teteLect.getType() == TS.e)
e S → Da ... // S -> Da
# S → AB else if (this.teteLect.getType() == TS.EOF)
... // S -> AB
else throw new ParserException();
27/111
}
Mirabelle Nebut Analyse descendante LL(k)
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Code de S()
On factorise.
private void S() throws ... {
if (this.teteLect.getType() == TS.a
S || this.teteLect.getType() == TS.b
a S → AB || this.teteLect.getType() == TS.EOF)
b S → AB ... // S -> AB
d S → Da else if (this.teteLect.getType() == TS.d
e S → Da || this.teteLect.getType() == TS.e)
# S → AB ... // S -> Da
else throw new ParserException();
}
28/111
Code pour S → AB :
I je veux reconnaı̂tre A puis B ;
I ⇒ A() ; B() ;
Code pour S → Da :
I je veux reconnaı̂tre D. . .
I . . . puis vérifier que a est bien sous la tête de lecture ;
I et consommer a.
29/111
Code de A()
32/111
Code pour A → :
I le mot vide est immédiatement reconnu ;
I sans toucher à la tête de lecture ;
I on ne fait rien.
33/111
35/111
36/111
Exemple d’exécution
Reconnaı̂tre abb# ?
37/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 38/111
Principes - 1
40/111
(am, z1 . . . zn a) ` (m, z1 . . . zn )
41/111
(m, z1 . . . zn X ) ` (m, z1 . . . zn Xn . . . X1 )
sinon erreur.
42/111
Expansion par X → X1 . . . Xn :
(m, z1 . . . zn X ) ` (m, z1 . . . zn Xn . . . X1 )
43/111
Transition de a-lecture :
I a est le prochain nœud à traiter dans l’arbre (pour l’ordre
préfixe) ;
I on vérifie que a concorde bien avec la tête de lecture ;
I et on passe au nœud suivant. 44/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 45/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 46/111
X ∈ VN α ∈ (VT ∪ VN )∗
49/111
Soit α ∈ (VN ∪ VT )∗ :
cas
α=:∅
α = a, a ∈ VT : {a}
α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}
α = X , X ∈ VN : ?
α = X β, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?
fcas
50/111
γ1 γn
...
X → | aX | YZ
alors on a :
52/111
Soit α ∈ (VN ∪ VT )∗ :
cas
α=:∅
α = a, a ∈ VT : {a}
α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}
S
α = X , X ∈ VN : {Premier (γi ) | X → γi ∈ P}
α = X β, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?
fcas
53/111
X β
X β
55/111
56/111
58/111
Exemple
α=:∅
S → AB | Da
A → aAb | α = a, a ∈ VT : {a}
B → bB | α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}
D → dD | e
α = X , X ∈ VN :
-Prod = {A, B, S}
S
{Premier (γi ) | X → γi ∈ P}
Premier (S) = ? α = X β, X ∈ VN \ -Prod, β ∈ (VN ∪ VT )∗ :
Premier (A) = ? Premier (X )
Premier (B) = ? α = X β, X ∈ VN ∩-Prod, β ∈ (VN ∪VT )∗ :
Premier (D) = ? Premier (X ) ∪ Premier (β)
59/111
Exemple
S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur
61/111
S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur
62/111
63/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 65/111
Definition
Un non terminal X ∈ VN est dit -productif si X ⇒∗ .
Exemple
S → AB | Da
A → aAb |
B → bB |
D → dD | e
-Prod ?
67/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 68/111
69/111
Quand appliquer A → ?
Quand la tête de lect. correspond à un terminal qui peut suivre A.
A S
A
A B
a b
71/111
Definition
Soit une grammaire algébrique d’axiome S. On définit :
Suivant : (VT ∪ VN )∗ → P(VT )
α 7→ {a ∈ VT | S ⇒∗ βαaγ,
pour β, γ ∈ (VN ∪ VT )∗ }
Definition
Suivant : (VT ∪ VN )∗ → P(VT )
α 7→ {a ∈ Premier (γ) | S ⇒∗ βαγ,
pour β, γ ∈ (VN ∪ VT )∗ }
72/111
A
A B
a b
73/111
Ex : PA = {S → AB, A → aAb}
Suivant(A) = Suivant(A)S→AB ∪ Suivant(A)A→aAb
74/111
Ex : pour X → aXb |
PX = {X → aX b}
Suivant(X ) = {#} ∪ Suivant(X )X →aX b
75/111
76/111
Definition
α ∈ (VN ∪ VT )∗ est -productif si α ⇒∗ . On définit la fonction :
X β
Suivant p (X ) = Premier (β)
p = Y → αX
α X
Suivant p (X ) = Suivant(Y )
79/111
X β Suivant p (X ) =
Premier (β) ∪ Suivant(Y )
Remarque - 1
81/111
Remarque - 2
82/111
# ∈ Suivant(axiome)
Soit PX ⊆ P l’ensemble des productions p dans lesquelles X
apparaı̂t en partie droite :
S
Suivant(X ) = p∈PX Suivant p (X )
avec : Suivant p (X ) =
cas
p = Y → αX : Suivant(Y )
p = Y → αX β et Eps(β) = faux : Premier (β)
p = Y → αX β et Eps(β) = vrai : Premier (β) ∪ Suivant(Y )
fincas
83/111
84/111
Exemple
S → AB | Da # ∈ Suivant(axiome)
A → aAb | S
Suivant(X ) = p∈PX Suivant p (X )
B → bB |
D → dD | e
avec : Suivant p (X ) =
Eps(B) = vrai cas
Suivant ? p= Y → αX : Suivant(Y )
p= Y → αX β et Eps(β) = faux : Premier (β)
p= Y → αX β et Eps(β) = vrai : Premier (β)
∪Suivant(Y )
fincas
85/111
A → et Suivant(A) = {b, #}
S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur
86/111
S → AB et Suivant(S) = {#}
S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur
87/111
Exemple
89/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 90/111
On calcule :
I les -productifs ;
I les ensembles Premier ;
I les ensembles Suivant.
91/111
Remplissage de la table
Exemple
S → AB :
I Premier (AB) = {a, b} ;
S
I Eps(AB) = vrai ; a S → AB
I Suivant(S) = {#}. b S → AB
S → Da : d S → Da
I Premier (Da) = {d, e} ; e S → Da
# S → AB
I Eps(Da) = faux.
Rien à compléter par erreur.
93/111
Exemple
A → aAb :
I Premier (aAb) = {a} ;
A
I Eps(aAb) = faux. a A → aAb
A→: b A→
I Premier () = ∅ ; d erreur
I Eps() = vrai ; e erreur
# A→
I Suivant(A) = {b, #}.
On complète par erreur.
94/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 95/111
Analyseur LL(1)
LL(1) et ambiguı̈té
98/111
99/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 100/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 101/111
102/111
X → ab | abbX | abbbX
Factorisation de ab : on prend le plus grand préfixe commun.
X → abY
Y → | bX | bbX
Puis à nouveau factorisation de b.
103/111
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 105/111
Récursivité gauche :
I immédiate : production A→Aα, α ∈ (VT ∪ VN )+ ;
I générale : il existe une dérivation A⇒∗ Aα, α ∈ (VT ∪ VN )+ .
106/111
X → X α1 | . . . | X αn | β1 | . . . | βm
où
I αi ∈ (VT ∪ VN )+ et βj ∈ (VT ∪ VN )∗ ;
I les βj ne commencent pas par X .
par les règles :
X → β1 X 0 | . . . | βm X 0
X 0 → α1 X 0 | . . . | αn X 0 |
P = {S → aSb | A, A → aA | }
109/111
P = {A → abB | , B → Aaa | b}
A → abB |
B → Aaa | b
aa ab b #
A A→ A → abB erreur A→
B B → Aaa B → Aaa B→b erreur
111/111