Escolar Documentos
Profissional Documentos
Cultura Documentos
Grammaires hors-contexte
N × ( N ∪ Σ)∗
un élément (α, β) de P, que l’on note α → β est appelé une règle
de production ou règle de réécriture.
α est appelé partie gauche de la règle
β est appelé partie droite de la règle
S est un élément de N appelé l’axiome de la grammaire.
Automate à pile
δ : Q × (Σ ∪ {ε}) × Γ → P ( Q × Γ∗ )
q0 ∈ Q est l’état initial
F ⊆ Q est l’ensemble des états d’acceptation
Grammaires hors-contexte ⇔ Automate à pile
1 Empiler l’axiome S
2 Remplacer S par la partie droite d’une règle de la forme S → α
de telle sorte que le premier symbole x de α se trouve en sommet
de pile.
Si x est un terminal alors on le compare avec le caractère se
trouvant sous la tête de lecture. S’ils sont égaux alors on dépile.
Si x est un non terminal alors on le remplace par la partie droite
d’une règle de P de la forme x → β.
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
E
⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T
+
E E
⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F
+ +
E E E
⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a
+ + +
E E E E
⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a
+ + + +
E E E E E
⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a
+ + + +
E E E E E E
⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a
+ + + +
E E E E E E T
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a F
+ + + + ∗
E E E E E E T T
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a F a
+ + + + ∗ ∗
E E E E E E T T T
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a F a
+ + + + ∗ ∗ ∗
E E E E E E T T T T
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a F a
+ + + + ∗ ∗ ∗
E E E E E E T T T T T
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a F a
+ + + + ∗ ∗ ∗
E E E E E E T T T T T F
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a F a
+ + + + ∗ ∗ ∗
E E E E E E T T T T T F a
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Exemple
Reconnaissance du mot :
a+a∗a
avec la grammaire :
E→ T+E| T
T → F∗T | F
F → ( E) | a
T F a F a
+ + + + ∗ ∗ ∗
E E E E E E T T T T T F a
⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥
Non déterminisme
ε, ⊥ → S⊥ ε, ⊥ → ⊥
0 1 2
x, x → ε
pour tout x ∈ Σ
Construction de l’automate
Automate :
avec :
a F
a
Sens d’analyse
Analyse descendante
L’arbre de dérivation est construit depuis la racine vers les
feuilles
Séquence de dérivations gauches à partir de l’axiome
E ⇒ T+E ⇒ F+E ⇒ a+E ⇒ a+T ⇒ a+F∗T ⇒
a+a∗T ⇒ a+a∗F ⇒ a+a∗a
Analyse ascendante
L’arbre de dérivation est construit des feuilles vers la racine
Séquence de dérivation telle que la séquence inverse soit une
dérivation droite de m.
a+a∗a ⇐ F+a∗a ⇐ T+a∗a ⇐ T+F∗a ⇐ T+F∗F ⇐
T+F∗T ⇐ T+E ⇐ E
Transducteur à pile
BANDE D’ENTREE
TETE DE LECTURE
UNITE DE CONTROLE
PILE
BANDE DE SORTIE
δ : Q × (Σ ∪ {ε}) × Γ → P ( Q × Γ∗ × ∆∗ )
1: E → T+E 2: E → T
3: T → F∗T 4: T → F
5: F → ( E) 6: F → a
Dérivation gauche de a + a ∗ a :
1 4 6 2 ∗
E ⇒ T+E ⇒ F+E ⇒ a+E ⇒ a+T ⇒ a+a∗a
Analyse gauche : 14623646
Analyseur gauche
(0, a + a ∗ a, ⊥)
` (1, a + a ∗ a, E⊥)
` (1, a + a ∗ a, T + E⊥, 1)
ε, E → T + E, 1
` (1, a + a ∗ a, F + E⊥, 14)
ε, E → T, 2
ε, T → F ∗ T, 3 ` (1, a + a ∗ a, a + E⊥, 146)
ε, T → F, 4
` (1, + a ∗ a, + E⊥, 146)
ε, F → ( E ), 5
ε, F → a, 6 ` (1, a ∗ a, E⊥, 146)
` (1, a ∗ a, T ⊥, 1462)
ε, ⊥ → E⊥ ε, ⊥ → ⊥ ` (1, a ∗ a, F ∗ T ⊥, 14623)
0 1 2
` (1, a ∗ a, a ∗ T ⊥, 146236)
` (1, ∗ a, ∗ T ⊥, 146236)
x, x → ε
pour tout x ∈ { a, +, ∗, (, )} ` (1, a, T ⊥, 1462364)
` (1, a, F ⊥, 14623646)
` (1, a, a⊥, 14623646)
` (1, ε, ⊥, 14623646)
` (2, ε, ε, 14623646)
Analyse descendante prédictive : idée générale
A
A α
⇒ ⇒ A ⇒ α ⇒ α
A α α α
A α α α α
Récursivité à gauche
∗
Un symbole non terminal A est dit récursif si A ⇒ αAβ avec
α, β ∈ ( N ∪ Σ)∗ .
Si α = ε, A est dit récursif à gauche.
Si β = ε, A est dit récursif à droite.
Une grammaire comportant au moins un symbole récursif à
gauche est dite grammaire récursive à gauche.
Une grammaire comportant au moins un symbole récursif à
droite est dite grammaire récursive à droite.
Récursivité à gauche
A ⇒ AB
Idée générale :
→ a | aA0
A
A → Ab | a ⇔
A0 → bA0 | ε
Elimination de la récursivité à gauche directe
G 0 = h N ∪ { A0 }, Σ, P0 , Si
où P0 est égale à P avec les règles ayant A pour partie gauche
remplacées par :
A → β 1 | β 2 | . . . | β n | β 1 A0 | β 2 A0 | . . . | β n A0
A 0 → α1 | α2 | . . . | α m | α1 A 0 | α2 A 0 | . . . | α m A 0
Exemple
E → T | TE0
E → E+T |T E0 → +T | + TE0
T → T∗F |F ⇒ T → F | FT 0
F → ( E) |a T0 → ∗F | ∗ FT 0
F → ( E) |a
Elimination de la récursivité à gauche
A → BC | a
B → CA | Ab
C → AB | CC | a
On pose ordonne dans l’ordre A, B, C.
On commence par éliminer la récursivité directe sur A puis on
remplace, dans B → Ab, A par BC | a puis on élimine la
récursivité directe sur B.
On remplace alors, dans C → AB, A par BC | a, ce qui donne
C → BCB | aB | CC | a.
Puis on remplace B par CA | ab | CAB0 | abB0 et on termine en
éliminant la récursivité directe sur C.
Exemple
A → BC | a
B → CA | Ab
C → AB | CC | a
On pose A1 = A, A2 = B et A3 = C.
i=1 pas de changements
i=2 j=1 B → CA | BCb | ab
i=2 B → CA | ab | CAB0 | abB0
B0 → CbB0 | Cb
i=3 j=1 C → BCB | aB | CC | a
i=3 j=2 C → CACB | abCB | CAB0 CB | abB0 B | aB | CC | a
i=3 C → abCB | abB0 CB | aB | a | abCBC 0 | abB0 BC 0
C → | aBC 0 | aC 0
C 0 → ACBC 0 | AB0 CBC 0 | CC 0 | ACB | AB0 B | C
Grammaire factorisée à gauche
A → αβ 1 | αβ 2 | . . . | αβ n | γ
où γ représente toutes les parties droites qui ne commencent pas par
α, par :
A → αA0 | γ
A0 → β 1 | β 2 | . . . | β n
Exemple
S → iEtS | iEtSeS | a,
G = h{ E, S}, {i, t, e, a, b}, , Si
E→b
S → iEtSS0 | a,
G = h{ E, S, E0 }, {i, t, e, a, b}, S0 → eS | ε, , Si
E→b
Exemples
BANDE D’ENTREE
TETE DE LECTURE
TABLE D’ANALYSE
PILE
BANDE DE SORTIE
TETE D’ECRITURE
Configuration
Grammaire : Exécution :
1 : E → TE0 ( a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × ×
E0 × × 3 2 × 3
T 4 4 × × × ×
T0 × × 6 6 5 6 E
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ( a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × ×
E0 × × 3 2 × 3
T 4 4 × × × × T
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ( a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × ×
E0 × × 3 2 × 3 F
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ( a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
(
a ( ) + ∗ ⊥
E 1 1 × × × × E
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × × E
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
T
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a F
T0
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 a ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a a
T0
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
T0
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ∗ a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε ∗
7 : F → ( E) 8:F→a F
T0
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a F
T0
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 a)⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a a
T0
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 )⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
T0
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 )⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × × E0
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 )⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × ×
E0 × × 3 2 × 3 )
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × ×
E0 × × 3 2 × 3
T 4 4 × × × × T0
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × ×
E0 × × 3 2 × 3
T 4 4 × × × ×
T0 × × 6 6 5 6 E0
F 8 7 × × × × ⊥
Exemple
Grammaire : Exécution :
1 : E → TE0 ⊥
2 : E0 → + TE0 3 : E0 → ε
4 : T → FT 0
5 : T 0 → ∗ FT 0 6 : T0 → ε
7 : F → ( E) 8:F→a
a ( ) + ∗ ⊥
E 1 1 × × × ×
E0 × × 3 2 × 3
T 4 4 × × × ×
T0 × × 6 6 5 6
F 8 7 × × × × ⊥
Construction d’une table LL(1) à partir d’une
grammaire
1 E → TE0 2 E0 → + TE0
3 E0 → ε 4 T → FT 0
5 T 0 → ∗ FT 0 6 T0 → ε
7 F → ( E) 8F→a
Alors :
PREMIER ( E ) = PREMIER ( T ) = PREMIER ( F ) = {(, a }
PREMIER ( E0 ) = {+, ε }
PREMIER ( T 0 ) = {∗, ε }
SUIVANT ( E ) = {), ⊥}
SUIVANT ( E0 ) = SUIVANT ( E ) = {), ⊥}
SUIVANT ( T ) = { PREMIER ( E0 ) − { ε }} ∪ SUIVANT ( E ) = {+, ), ⊥}
SUIVANT ( T 0 ) = SUIVANT ( T ) = {+, ), ⊥}
SUIVANT ( F ) = { PREMIER ( T 0 ) − {ε}} ∪ SUIVANT ( T ) = {+, ∗, ), ⊥}
Construction de la table LL(1)
Principes généraux :
G est une grammaire LL(1).
Une fonction en langage C est associée à tout symbole non
terminal de G.
Le graphe des appels de fonctions représente l’arbre de
dérivation.
Cas de base
void B(void){
if(cc == ’b’){ /* deuxieme fois */
cc = yylex();
return;}
erreur();}
Symboles ambigüs
void A(void){
if(cc == ’b’){
B();
if(cc == ’c’){
C();
return;}
if(cc == ’d’){
D();
return;}
}
erreur();}
Règles vides
void A(void){
fprintf(sortie_xml, "<A>\n");
if(cc == ’b’){
B();
fprintf(sortie_xml, "</A>\n");
return;}
if(cc == ’c’){
fprintf(sortie_xml, "</A>\n");
return;}
erreur();}
Un peu plus joli
void A(void){
char *fonction = "A";
balise_ouvrante(fonction);
if(cc == ’b’){
B();
balise_fermante(fonction);
return;}
if(cc == ’c’){
balise_fermante(fonction);
return;}
erreur();}