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 Sortie : Ensemble des non-terminaux de G productifs : Prod Initialisation : P rod pour tout A α où α T faire Prod Prod A} tantque New faire New pour tout A α tel que A / Prod faire si α (T Prod) alors New New A} Prod Prod New 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 : Prod B} car B b et b T Itération 1 : Prod Prod A} car A bb et b T, B Prod Itération 2 : Prod Prod fin Donc Prod = 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
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 Sinon, A est dit accessible. X αaβ Algorithme 2 Calcul des non-terminaux accessibles Sortie : Ensemble des non-terminaux de G accessibles : Acc Initialisation : Acc X} tantque New faire New pour tout A α 1 B 1 α 2... α n B n α n+1 tel que A Acc et α i T, B i N faire pour tout B i / Acc faire New New B i Acc Acc New 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 B d d C c D D C On a : Initialisation : Acc X} Itération 1 : New Y } Itération 2 : New D} Itération 3 : New C} Itération 4 : New fin On peut donc supprimer les non-terminaux A et B ainsi que toutes les règles les contenant.
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 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 pour toute règle de la forme A Aα 1... Aα n β 1... β p faire A β1 A remplacer par... β p A A α 1 A... α n A ǫ Exemple : Soit G = (E,T,F }, i},,e) avec définie par : E E + T T T T F F F (E) i Itération 1 : E E Itération 2 : T T fin α 1 }} +T α 1 }} F β 1 }} E TE T est remplacé par E +TE ǫ β 1 }} T FT F est remplacé par T FT ǫ Remarque : On ne traitera pas cette année la récursivité indirecte (i.e. les règles de la forme A + Aα).
Analyse syntaxique 5 Factorisation à gauche Algorithme 5 Factorisation à gauche pour toute règle de la forme A αβ 1... αβ n γ 1... γ p faire A αa remplacer par γ 1... γ p A β 1... β n 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 Itération 1 : E E + T E + E F est remplacé par F E T E T T T Itération 2 : T T (E) T i T i est remplacé par i 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 = A 1...A n V ide A 1 V ide,...,a n V ide ou A = ǫ Algorithme 6 Calcul de l ensemble V ide Sortie : Ensemble des non-terminaux pouvant produire le vide : V ide pour tout A ǫ faire V ide V ide A} tantque New faire New pour tout A A 1... A n tel que A 1,...,A n V ide faire New New A} V ide V ide New 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}
Analyse syntaxique 6 Calcul des premiers Rappel : Pour tout mot ω (N T), on appelle premiers de ω et on note Premier(ω) l ensemble : Premier(ω) = a T A aβ } Algorithme 7 Calcul des premiers d un mot Entrée : Mot ω = α 1 α 2... α n (N T) Sortie : Premier(ω) si α 1 T alors Premier(ω) = α 1 } sinon Premier(ω) = pour tout α 1 β faire Premier(ω) Premier(ω) Premier(β) pour i de 1 à n 1 faire si α 1,...,α i V ide alors Premier(ω) Premier(ω) Premier(α i+1 ) Exemple : Soit G = (S,A,B,D}, a,b,c,d},,s) avec définie par : Premier(D) = d} Premier(B) = b} Premier(A) = a,c,d} : Premier(S) = a,b,c,d} : S DA B A aa Dc ǫ B bb ǫ D dd ǫ P remier(a) = P remier(aa) P remier(dc) = Premier(a) Premier(D) Premier(c) }} car D V ide = a} d} c} = a,c,d} P remier(s) = P remier(da) P remier(b) = P remier(d) P remier(a) P remier(b) }} car D V ide = a,b,c,d}
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(β) pour tout A αe ou A αeβ tel que β V ide (cas final) faire Suivant(E) Suivant(E) Suivant(A) si E est l axiome alors Suivant(E) Suivant(E) $} 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 TE E +TE ǫ T FT T FT ǫ F (E) i On a V ide = E,T } Suivant(E) = $,)} Suivant(E ) = Suivant(E) = $,)} Suivant(T) = Premier(E ) Suivant(E) Suivant(E ) = +,$,)} Suivant(T ) = Suivant(T) = +,$,)} Suivant(F) = Premier(T ) Suivant(T) Suivant(T ) =,+,$,)}
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 α) Premier(α) si α V ide alors SD(A α) SD(A α) Suivant(A) 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 TE E +TE ǫ T FT T FT ǫ F (E) i On a V ide = E,T } SD(E TE ) = Premier(TE ) = (,i} SD(E +TE ) = Premier(+TE ) = +} SD(T FT ) = Premier(FT ) = (,i} SD(T FT ) = } SD(F i) = Premier(i) = i} SD(F (E)) = Premier((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) Sortie : Table d analyse : Tab /* Chaque ligne correpond à un non-terminal */ /* Chaque colonne correspond à un terminal */ pour tout A α faire pour tout d SD(A α) faire Tab(A, d) A α