Département d’Informatique Master 1 ILC+ISI+RISE Mémo : analyse syntaxique descendante I. Calcul de FIRST Appliquer les règles suivantes tant qu’elles ont un effet : pour toute règle X → ε ajouter ε à FIRST(X) pour toute règle X → xβ où x est un symbole terminal ajouter x à FIRST(X) pour toute règle X → Y1 Y2 . . . Yn ajouter FIRST(Y1 Y2 . . . Yn ) à FIRST(X) Pour calculer F = FIRST(Y1 Y2 . . . Yn ), appliquer l’algorithme suivant : F = FIRST(Y1 ) − {ε} k=2 tant que k ≤ n et FIRST(Yk−1 ) contient ε ajouter FIRST(Yk ) − {ε} à F k =k+1 si k > n alors ajouter ε à F II. Calcul de FOLLOW Appliquer les règles suivantes tant qu’elles ont un effet : placer $ dans FOLLOW(S), où S est le symbole de départ pour toute règle B → αAβ telle que β 6= ε ajouter FIRST(β) − {ε} à FOLLOW(A) pour toute règle B → αA ou B → αAβ où ε ∈ FIRST(β) ajouter FOLLOW(B) à FOLLOW(A) III. Construction de la table d’analyse prédictive On note M [A, a] l’entrée à utiliser lorsque le sommet de pile contient le symbole non terminal A et le premier symbole terminal de l’entrée est a. L’algorithme est : pour toute règle A → α (où α est une suite de symboles) pour tout symbole terminal a ∈ FIRST(α) ajouter A → α dans M [A, a] si ε ∈ FIRST(α) alors pour tout b ∈ FOLLOW(A) (y compris $) ajouter A → α dans M [A, b] IV. Grammaire LL(1) Une grammaire LL(1) est une grammaire qui vérifie, pour toute règle A → α | β : 1. FIRST(α) ∩ FIRST(β) = ∅ 2. si ε ∈ FIRST(β) alors FOLLOW(A) ∩ FIRST(α) = ∅