Développement : construction d`un analyseur
Transcription
Développement : construction d`un analyseur
Développement : construction d’un analyseur syntaxique Pierron Théo – Lacoste Cyril 18 avril 2014 On s’intéresse à la grammaire suivante : E → E + T |T, T → T × F |F, F → (E)|id d’axiome E. Cette grammaire a des transitions linéaires à gauche, ce qui est incompatible avec une analyse descendante. On va donc la modifier pour ne plus avoir de transition de la forme X → Xα (forme de Greibach ?). On va travailler avec la grammaire : E → T E′, E ′ → +T E ′ |ε, T → F T ′, T ′ → ×F T ′ |ε, F → (E)|id d’axiome E. On va calculer les ensembles Premier et Suivant : • Premier(α) est l’ensemble des premières lettres des mots w tels que α →∗ w (et ε s’il est dérivable à partir de α • Suivant(A) est l’ensemble des terminaux a telles que E →∗ αAaβ. (Par convention Suivant(E) contient le symbole $ symbolisant la fin du mot) On a les propriétés suivantes : Proposition 1 • Si a est un terminal, Premier(a) = {a} • Si X → ε, ε ∈ Premier(X) • Si X → Y1 . . . Yk , Premier(Y1 ) ⊂ Premier(X) et si pour tout i < j, ε ∈ Premier(Yi ), Premier(Yj ) ⊂ Premier(X) Proposition 2 • $ ∈ Suivant(E) • Si A → αBβ, Premier(β) \ {ε} ∈ Suivant(B) • Si A → αB ou A → αBβ avec ε ∈ Premier(β), Suivant(A) ⊂ Suivant(B). Calcul des Premier : • Premier(F ) = {(, id} • Premier(T ′ ) = {×, ε} • Premier(T ) = Premier(F ) = {(, id} • Premier(E ′ ) = {+, ε} • Premier(E) = Premier(T ) = {(, id} Calcul des Suivant : • Suivant(E) = {$, )} car on a la transition F → (E) • Suivant(E ′ ) = Suivant(E) = {$, )} par E → T E ′ • Suivant(T ) = (Premier(E ′ )\{ε})∪Suivant(E) = {+, $, )} par E → T E ′ et ε ∈ Premier(E ′ ) • Suivant(T ′ ) = Suivant(T ) = {+, $, )} par T → F T ′ • Suivant(F ) = (Premier(T ′ ) \ {ε}) ∪ Suivant(T ′ ) = {), ×, +, $} par T → F T ′ On construit donc la table d’analyse syntaxique via l’algorithme 1. On obtient la table suivante : 1 Algorithme 1: Construction d’une table d’analyse syntaxique Entrées : G une grammaire Sorties : M la table d’analyse 6 pour A → α ∈ G faire pour a ∈ Premier(α) faire M [A, α] ← M [A, α] ∪ {A → α} si ε ∈ Premier(α) alors pour b ∈ Suivant(A) faire M [A, b] ← M [A, b] ∪ {A → α} 7 retourner M 1 2 3 4 5 id E E′ T T′ F E → T E′ Échec T → FT′ Échec F → id + E′ Échec → +T E ′ Échec T′ → ε Échec × ( ) $ Échec Échec Échec ′ T → ×F T ′ Échec E → T E′ E′ → ε T → FT′ Échec F → (E) Échec Échec Échec T′ → ε Échec Échec E′ → ε Échec T′ → ε Échec 2