H. Kassel 2 langages/compilation (2010/2011)
Remarques :
- L’analyseur ne peut fonctionner que s’il y a au plus une règle par entrée de M. Les
grammaires qui satisfont cette condition sont dites LL(1). Les grammaires ambigües
ou récursives à gauche ne sont pas LL(1)
- S’agissant de la récursion à gauche, on peut l’éliminer de façon automatique
A->Aα|β
A-> βA’ A’-> αA’|ε
Construire l’analyseur = construire la matrice M en fonction de la grammaire G
La construction de M s’appuie sur les fonctions First() et Follow()
Définition :
α chaine de symboles de G(terminaux ou non)
First(α) = {terminaux a tel que α=> aβ, plus ε si α=>ε}
A non terminal de G
Follow(A)= { terminaux a tel que S=>αAaβ, plus $ si S=>αA}
Construction de la matrice M :
Pour chaque règle A->α de G :
1. Ajouter A->α pour tous les M[A,a] où a appartient à First(α)-{ε}
2. Si ε appartient à First(α), ajouter A->α dans tous les M[A,a] où a appartient à
Follow(A)
Calcul pratique de First() et Follow()
First(X), X symbole de G (on ne peut jamais avoir $ dans First(…) )
1. Si X est terminal : First(X)={X}
2. Si X->ε : ajouter εà First(X)
3. Si X-> X1X2…Xn: ajouter tous les non-ε (non nul) de First(X1)à First(X) ; si ε
appartient à First(X1), ajouter tous les non-ε de First(X2) à First(X) ; etc etc ; si ε
appartient à First(X) 1≤1≤n, ajouter ε à First(X)
Follow(X) est non terminal de G (on ne peut jamais avoir ε dans Follow(…) )
1. Si X=S, initialiser Follow(X=S) à {$}
2. Si A->αXβ : ajouter les non-ε de First(β) à Follow(X)
3. Si A->αX ou A->αXβ et ε appartient à First(β) : ajouter Follow(A) à Follow(X)
Exercise 1
a) Eliminate the left recursion from the following grammar :
S (L) | a
L L, S | S
L->L… récursion à gauche
,S est α et S est β