Você está na página 1de 8

Algorithmes pour l’analyse syntaxique

Tony Bourdier
Version 1.2 − 8 juillet 2008
Analyse syntaxique 2

Réduction inférieure (suppression des non-terminaux improductifs)

Rappel : Soit G = (N, T, →, X) une grammaire. Un non-terminal A ∈ N est dit


improductif s’il n’existe pas de mot α ∈ T ∗ tel que

A֌α

Dans le cas contraire, A est dit productif.

Algorithme 1 Calcul des non-terminaux productifs


Entrée : Grammaire algébrique : G = (N, T, →, X)
Sortie : Ensemble des non-terminaux de G productifs : P rod
Initialisation : P rod ← ∅
pour tout A → α où α ∈ T ∗ faire
P rod ← P rod ∪ {A}
fin pour
tantque N ew 6= ∅ faire
N ew ← ∅
pour tout A → α tel que A ∈ / P rod faire
si α ∈ (T ∪ P rod)∗ alors
N ew ← N ew ∪ {A}
fin si
fin pour
P rod ← P rod ∪ N ew
fin tantque

Exemple : Soit G = (N = {A, B, C}, T = {a, b}, →, A) avec → définie par :


 
 A → bB | aC 
B → b
 
C → aC

• Initialisation : P rod ← {B} car B → b et b ∈ T ∗


• Itération 1 : P rod ← P rod ∪ {A} car A → b B et b ∈ T ∗ , B ∈ P rod
• Itération 2 : P rod ← P rod ∪ ∅
• fin
Donc P rod = {A, B} donc le non-terminal C est improductif. On peut donc réduire la
relation de production de G à l’ensemble suivant :
 
A → bB
B → b

ESIAL − Mathématiques Discrètes 2007 - 2008 − Tony Bourdier


Analyse syntaxique 3

Réduction supérieure (suppression des son-terminaux inaccessibles)

Rappel : Soit G = (N, T, →, X) une grammaire. Un non-terminal A ∈ N est dit


inaccessible s’il n’existe pas α, β ∈ (N ∪ T )∗ tel que

X ֌ αAβ

Sinon, A est dit accessible.

Algorithme 2 Calcul des non-terminaux accessibles


Entrée : Grammaire algébrique : G = (N, T, →, X)
Sortie : Ensemble des non-terminaux de G accessibles : Acc
Initialisation : Acc ← {X}
tantque N ew 6= ∅ faire
N ew ← ∅
pour tout A → α1 B1 α2 . . . αn Bn αn+1 tel que A ∈ Acc et αi ∈ T ∗ , Bi ∈ N faire
pour tout Bi ∈/ Acc faire
N ew ← N ew ∪ Bi
fin pour
fin pour
Acc ← Acc ∪ N ew
fin tantque

Exemple : Soit G = (N = {X, Y, A, B, C, D}, T = {a, b, c, d}, →, X) avec → définie par :


 

 X → Y 

 


 Y → Y D | Y a | b 


 
A → B

 B → Bd | d 

 


 C → c 


 
D → DC

On a :
• Initialisation : Acc ← {X}
• Itération 1 : N ew ← {Y }
• Itération 2 : N ew ← {D}
• Itération 3 : N ew ← {C}
• Itération 4 : N ew ← ∅
• fin
On peut donc supprimer les non-terminaux A et B ainsi que toutes les règles les contenant.

ESIAL − Mathématiques Discrètes 2007 - 2008 − Tony Bourdier


Analyse syntaxique 4

Réduction
Rappel : Une grammaire est dite réduite si tous ses non-terminaux sont productifs
et accessibles.

Algorithme 3 Réduction
Entrée : Grammaire algébrique : G = (N, T, →, X)
Sortie : Réduite de G
Effectuer la réduite inférieure de G
Effectuer la réduite supérieure de la grammaire résultante de l’étape précédente

Récursivité à gauche

Rappel : Une grammaire est dite récursive gauche immédiate si elle contient
des règles de la forme
A → Aα
où A ∈ N et α ∈ (N ∪ T )∗

Algorithme 4 Dérécursivation gauche


Entrée : Grammaire algébrique : G = (N, T, →, X)
pour toute règlede la forme A → Aα1 | . . . | Aαn | β1 | . . . | βp faire
A → β1 A′ | . . . | βp A′
remplacer par
A′ → α1 A′ | . . . | αn A′ | ǫ
fin pour

Exemple : Soit G = ({E, T, F }, {i}, →, E) avec → définie par :


 
 E → E+T | T 
T → T ∗F | F
 
F → (E) | i

α1 β1 
z}|{ z}|{ E → T E′
• Itération 1 : E → E +T | T est remplacé par
E ′ → +T E ′ | ǫ
α1 β1 
z}|{ z}|{ T → FT′
• Itération 2 : T → T ∗F | F est remplacé par
T ′ → ∗F T ′ | ǫ
• fin

Remarque : On ne traitera pas cette année la récursivité indirecte (i.e. les règles de la forme
+
A ֌ Aα).

ESIAL − Mathématiques Discrètes 2007 - 2008 − Tony Bourdier


Analyse syntaxique 5

Factorisation à gauche
Algorithme 5 Factorisation à gauche
Entrée : Grammaire algébrique : G = (N, T, →, X)
pour toute règlede la forme A → αβ1 | . . . | αβn | γ1 | . . . | γp faire
A → αA′ | γ1 | . . . | γp
remplacer par
A′ → β1 | . . . | βn
fin pour

Exemple : Soit G = ({E, T }, {i}, →, E) avec → définie par :


 
E → E+T | E+E | F
T → T ∗ (E) | T ∗ i | T ∗ | i

E → E + E′ | F
• Itération 1 : E → E + T | E + E | F est remplacé par ′
E → T |E
T → T ∗ T′ | i
• Itération 2 : T → T ∗ (E) | T ∗ i | T ∗ | i est remplacé par
T ′ → (E) | i | ǫ
• fin

Production vide
Rappel : On note V ide l’ensemble composé de tous les non-terminaux pouvant
produire le vide :

V ide = { A ∈ N | A ֌ ǫ }
On étend cette définition aux mots de N ∗ :

A = A1 . . . An ∈ V ide ⇔ A1 ∈ V ide, . . . , An ∈ V ide ou A = ǫ

Algorithme 6 Calcul de l’ensemble V ide


Entrée : Grammaire algébrique : G = (N, T, →, X)
Sortie : Ensemble des non-terminaux pouvant produire le vide : V ide
pour tout A → ǫ faire
V ide ← V ide ∪ {A}
fin pour
tantque N ew 6= ∅ faire
N ew ← ∅
pour tout A → A1 . . . An tel que A1 , . . . , An ∈ V ide faire
N ew ← N ew ∪ {A}
fin pour
V ide ← V ide ∪ N ew
fin tantque

Exemple : Soit G = ({A, B, C, D}, {a, b, c}, →, A) avec → définie par :


 
A → bB | CD | Bc C → a|ǫ
B → ab | cC D → ǫ

V ide = {C, D, A}

ESIAL − Mathématiques Discrètes 2007 - 2008 − Tony Bourdier


Analyse syntaxique 6

Calcul des premiers

Rappel : Pour tout mot ω ∈ (N ∪ T )∗ , on appelle premiers de ω et on note


P remier(ω) l’ensemble :

P remier(ω) = {a ∈ T | A ֌ aβ }

Algorithme 7 Calcul des premiers d’un mot


Entrée : Mot ω = α1 α2 . . . αn ∈ (N ∪ T )∗
Sortie : P remier(ω)
si α1 ∈ T alors
P remier(ω) = {α1 }
sinon
P remier(ω) = ∅
pour tout α1 → β faire
P remier(ω) ← P remier(ω) ∪ P remier(β)
fin pour
pour i de 1 à n − 1 faire
si α1 , . . . , αi ∈ V ide alors
P remier(ω) ← P remier(ω) ∪ P remier(αi+1 )
fin si
fin pour
fin si

Exemple : Soit G = ({S, A, B, D}, {a, b, c, d}, →, S) avec → définie par :


 

 S → DA | B 

 
A → aA | Dc | ǫ

 B → bB | ǫ 

 
D → dD | ǫ

• P remier(D) = {d}
• P remier(B) = {b}
• P remier(A) = {a, c, d} :

P remier(A) = P remier(aA) ∪ P remier(Dc)


= P remier(a) ∪ P remier(D) ∪ P remier(c)
| {z }
car D∈V ide
= {a} ∪ {d} ∪ {c} = {a, c, d}

• P remier(S) = {a, b, c, d} :

P remier(S) = P remier(DA) ∪ P remier(B)


= P remier(D) ∪ P remier(A) ∪P remier(B)
| {z }
car D∈V ide
= {a, b, c, d}

ESIAL − Mathématiques Discrètes 2007 - 2008 − Tony Bourdier


Analyse syntaxique 7

Calcul des suivants


Rappel : Soit G = (N, T, →, X) une grammaire algébrique. Pour tout non-terminal
E ∈ N , on appelle suivants de E et on note Suivant(E) l’ensemble :

Suivant(E) = {a ∈ T | S → αEaβ } ∪ { $ | X ֌ αE }

Algorithme 8 Calcul des suivants d’un non-terminal


Entrée : Non-terminal E
Sortie : Suivant(E)
pour tout A → αEβ (cas direct) faire
Suivant(E) ← Suivant(E) ∪ P remier(β)
fin pour
pour tout A → αE ou A → αEβ tel que β ∈ V ide (cas final) faire
Suivant(E) ← Suivant(E) ∪ Suivant(A)
fin pour
si E est l’axiome alors
Suivant(E) ← Suivant(E) ∪ {$}
fin si

Exemple : Soit G = (N = {E, E ′ , T, T ′ , F }, T = {(, i, ), +, ∗}, →, E) une grammaire


algébrique dont la relation de production est définie par :


 E → T E′

 E ′ → +T E ′ | ǫ

T → FT′



 T ′ → ∗F T ′ | ǫ

F → (E) | i

On a V ide = {E ′ , T ′ }
• Suivant(E) = {$, )}
• Suivant(E ′ ) = Suivant(E) = {$, )}
• Suivant(T ) = P remier(E ′ ) ∪ Suivant(E) ∪ Suivant(E ′ ) = {+, $, )}
• Suivant(T ′ ) = Suivant(T ) = {+, $, )}
• Suivant(F ) = P remier(T ′ ) ∪ Suivant(T ) ∪ Suivant(T ′ ) = {∗, +, $, )}

ESIAL − Mathématiques Discrètes 2007 - 2008 − Tony Bourdier


Analyse syntaxique 8

Calcul des symboles directeurs


Algorithme 9 Calcul des symboles directeurs d’une règle
Entrée : Règle A → α
Sortie : SD(A → α)
SD(A → α) ← P remier(α)
si α ∈ V ide alors
SD(A → α) ← SD(A → α) ∪ Suivant(A)
fin si

Exemple : Soit G = (N = {E, E ′ , T, T ′ , F }, T = {(, i, ), +, ∗}, →, E) une grammaire


algébrique dont la relation de production est définie par :


 E → T E′

 E ′ → +T E ′ | ǫ

T → FT′



 T ′ → ∗F T ′ | ǫ

F → (E) | i

On a V ide = {E ′ , T ′ }
• SD(E → T E ′ ) = P remier(T E ′ ) = {(, i}
• SD(E ′ → +T E ′ ) = P remier(+T E ′ ) = {+}
• SD(T → F T ′ ) = P remier(F T ′ ) = {(, i}
• SD(T ′ → ∗F T ′ ) = {∗}
• SD(F → i) = P remier(i) = {i}
• SD(F → (E)) = P remier((E)) = {(}
• SD(E ′ → ǫ) = Suivant(E ′ ) = {$, )}
• SD(T ′ → ǫ) = Suivant(T ′ ) = {+, $, )}

Construction de la table d’analyse LL(1)


Algorithme 10 Construction de la table d’analyse LL(1)
Entrée : Grammaire algébrique : G = (N, T, →, X)
Sortie : Table d’analyse : T ab
/* Chaque ligne correpond à un non-terminal */
/* Chaque colonne correspond à un terminal */
pour tout A → α faire
pour tout d ∈ SD(A → α) faire
T ab(A, d) ← ”A → α”
fin pour
fin pour

ESIAL − Mathématiques Discrètes 2007 - 2008 − Tony Bourdier

Você também pode gostar