ANALYSE LL(1) Soit G0 la grammaire suivante pour les formules de

Transcription

ANALYSE LL(1) Soit G0 la grammaire suivante pour les formules de
ANALYSE LL(1)
Soit G0 la grammaire suivante pour les formules de logique propositionnelle :
G0 = h{E}, {a, b, (, ), ¬, ∧, ∨}, P, Ei, où P est composé des règles suivantes :
E → E ∧ E E → ¬E E → a
E → E ∨ E E → (E) E → b
(1) Ecrire une grammaire non ambiguë G1 telle que L(G1 ) = L(G0 ).
(2) Ecrire une grammaire non récursive à gauche G2 telle que L(G2 ) = L(G1 ).
(3) Ecrire une grammaire factorisée à gauche G3 telle que L(G3 ) = L(G2 ).
(4) Calculer les ensembles premier(A) et suivant(A) pour les symboles A non terminaux de
G3 , et premier(α) pour les α qui sont parties droites de règles de G3 .
(5) Construire la table LL(1) de G3 . Vérifier que G3 est bien LL(1).
(6) Simuler l’analyse LL(1) des mots ¬(a ∨ b) et a ∧ b ∨ a.
1. Construction des ensembles PREMIER
Si α est une proto-phrase de G, premier(α) est l’ensemble des terminaux qui commencent les
chaı̂nes se dérivant de α :
∗
premier(α) = {a ∈ Σ | α ⇒ au}
∗
Si α ⇒ ε alors ε appartient aussi à premier(α).
Pour calculer premier(X) avec X ∈ N ∪ Σ, on applique les règles suivantes jusqu’à ce qu’aucun
terminal ni ε ne puisse être ajouté aux ensembles premier.
(1) Si X ∈ Σ, premier(X) = {X}.
(2) Si X → ε ∈ P , on ajoute ε à premier(X).
(3) Si X ∈ N et X → Y1 . . . Yk ∈ P , mettre a dans premier(X) s’il existe i tel que a
est dans premier(Yi ) et que ε est dans tous les premier(Y1 ) . . . premier(Yi−1 ). Si ε ∈
premier(Yj )∀j , 1 ≤ j ≤ k, on ajoute ε à premier(X).
On calcule premier(X1 . . . Xn ) de la façon suivante :
(1) Ajouter à premier(X1 . . . Xn ) tous les symboles de premier(X1 ) différents de ε.
(2) Si ε ∈ premier(X1 ), ajouter également les symboles de premier(X2 ) différents de ε. Si
ε ∈ premier(X2 ), ajouter également les symboles de premier(X3 ) différents de ε, etc.
(3) Finalement, si ε appartient à premier(Xj ) pour tous les j = 1, 2, . . . n, on ajoute ε à
premier(X1 . . . Xn ).
2. Construction des ensembles SUIVANT
Si A ∈ N , suivant(A) est l’ensemble des symboles a ∈ Σ qui peuvent apparaı̂tre immédiatement
à droite de A dans une proto-phrase :
∗
suivant(A) = {a ∈ Σ | S ⇒ αAaβ}
Si A peut être le symbole le plus à droite d’une proto-phrase alors $ est dans suivant(A).
Pour calculer suivant(A) pour tous symbole non terminal A, on applique les règles suivantes
jusqu’à ce qu’aucun symbole non terminal ne puisse être ajouté aux ensembles suivant :
(1) Mettre $ dans suivant(S).
(2) si A → αBβ, le contenu de premier(β), excepté ε, est ajouté à suivant(B).
(3) s’il existe une règle A → αB ou une règle A → αBβ telle que ε ∈ premier(β) (c’est à
∗
dire β ⇒ ε), les éléments de suivant(A) sont ajoutés à suivant(B).
3. Construction de la table LL(1)
Entrée : G = hN, Σ, P, Si Une grammaire dont les règles sont numérotées.
Sortie : M Une table d’analyse LL(1) pour G.
Méthode :
(1) pour chaque regle i ∈ P de la forme A → α, procéder aux étapes 2 et 3.
(2) Pour chaque symbole terminal a ∈ premier(α), ajouter i à M (A, a).
(3) Si ε ∈ premier(α), ajouter i à M (A, b) pour chaque symbole terminal b ∈ suivant(A).
Si ε ∈ premier(α) et $ ∈ suivant(A), ajouter i à M (A, $).
(4) Mettre erreur dans toutes les entrées restées vides.