Вы находитесь на странице: 1из 111

Principes

Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse descendante LL(k)

Mirabelle Nebut

Bureau 223 - extension M3


mirabelle.nebut at lifl.fr

2010-2011

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 2/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse descendante

L’automate à pile sous-jacent :


I effectue uniquement des lectures et des expansions ;
I construit un arbre en ordre préfixe (idem aut. items) ;
I  part  de l’axiome (idem aut. items) ;
I construit une dérivation gauche (idem aut. items).

3/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Différence avec l’automate des items

Deux différences fondamentales :


I analyse déterministe dite prédictive ;
I plus d’items ni de réductions explicites.

4/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse déterministe

À chaque expansion l’analyseur sait choisir une production.


Il ne revient jamais sur ce choix :
I en cas de succès le mot appartient au langage ;
I en cas d’échec on est sûr que mot n’appartient pas au langage.

5/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse prédictive

L’analyseur ”prédit” quelle production utiliser. . .


. . . en analysant les k prochains symboles sous la tête de lecture.
Conséquences :
I ne fonctionne qu’avec certaines grammaires, dites LL(k) ;
I tête de lecture toujours définie : marqueur de fin de mot #.

NB : dans ce cours k=1, on regarde la tête de lecture et c’est tout.

6/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple à suivre dans le cours

Soit la grammaire G = {VT , VN , S, P} avec :


I VT = {a, b, d, e} ;
I VN = {S, A, B, D} ;
I P contient les productions :
S → AB | Da
A → aAb | 
B → bB | 
D → dD | e

7/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse prédictive LL(1), exemple - 1

S → AB | Da
A → aAb | 
abb# ?
B → bB | 
D → dD | e
S ⇒?
4
a bb#
4
Choix entre S → AB et S → Da.
Prédiction : expansion par S → AB
8/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse prédictive LL(1), exemple - 2

S → AB | Da
A → aAb | 
abb# ?
B → bB | 
D → dD | e
S ⇒ AB ⇒ ?
4
a bb#
4
Choix entre A → aAb et A → .
Prédiction : expansion par A → aAb
9/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse prédictive LL(1), exemple - 3

S → AB | Da
A → aAb | 
abb# ?
B → bB | 
D → dD | e
S ⇒ AB ⇒ aAbB
4
a bb#
4
Lecture de a.
10/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse prédictive LL(1), exemple - 4

S → AB | Da
A → aAb | 
abb# ?
B → bB | 
D → dD | e
S ⇒ AB ⇒ a AbB ⇒ ?
4
a bb#
4
Choix entre A → aAb et A → .
Prédiction : expansion par A → 
11/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyse prédictive LL(1), exemple - 5

S → AB | Da
A → aAb | 
abb# ?
B → bB | 
D → dD | e
S ⇒ AB ⇒ aAbB ⇒ abB ⇒ abb B ⇒ ?
4
abb #
4
Choix entre B → bB et B → .
Prédiction : expansion par B → , acceptation.
12/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Se passer des items

Rappel : item de la forme [X → α • β] :


I X est en cours de reconnaissance ;
I α a déjà été reconnu ;
I il reste à reconnaı̂tre β, le futur de l’item

Un analyseur LL :
I ne mémorise pas qu’il est en train de reconnaı̂tre X ;
I ne mémorise pas qu’il a reconnu α ;
I considère uniquement β.
13/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Se passer des items : conséquences

Plus besoin d’axiome supplémentaire.


Dans la pile :
I plus d’items mais des mots étendus : mots de (VN ∪ VT )∗ ;
I l’alphabet est VN ∪ VT ;
I le symbole de pile initiale est l’axiome.

A
b
S B
pile initiale une pile pile vide (acceptation)
14/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple - les piles pour abb#

S → AB | Da B → bB | 
abb# ?
A → aAb |  D → dD | e

a
A A
A b b b b
S B B B B B B B
abb# abb# abb# bb# bb# b# b# # #
(1) (2) (3) (4) (5) (6) (7) (8) (9)

Comparer avec l’automates des items !


Dérivation gauche, arbre en ordre préfixe.
15/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 16/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Deux types de mise en œuvre possibles

Avec pile explicite :


I analyseur dit non-récursif ;
I encodage d’un automate à pile.

Avec pile implicite :


I analyseur = ensemble de fonctions récursives ;
I pile implicite résultant des appels récursifs ;
I on parle d’analyseur récursif : cf TP3.

Dans les deux cas : une table d’analyse indique la production à


utiliser.
17/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Table d’analyse - exemple

S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur

18/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Table d’analyse LL(1)

Contient toute l’intelligence de l’analyseur syntaxique.


Definition
La table d’analyse Table est un tableau à deux dimensions tel que :
I chaque colonne est indicée par un non-terminal ∈ VN ;
I chaque ligne est indicée par un terminal ∈ VT ou # ;
I chaque case contient une production ∈ P ou erreur.

On verra plus tard comment remplir cette table.

19/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Interprétation de Table[a, X ]

I si le terminal a ∈ VT est sous la tête de lecture ;


I et si le non-terminal en cours de traitement est X ∈ VN ;
alors on consulte Table[a, X ].
Si Table[X , a] contient
I X → γ alors on choisit une expansion par cette production ;
I erreur alors erreur de syntaxe : X et a ne s’accordent pas.

20/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 21/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyseur descendant récursif

Principe :
I analyseur LL codé par un ensemble de fonctions ;
I ces fonctions s’appellent les unes les autres ;
I n’utilise pas de pile explicite : pile implicite des appels.

Codage des fonctions :


I une fonction X() par non-terminal X ∈ VN de la grammaire ;
I X() reconnaı̂t un mot engendré par X ;
I la fonction X() code les productions Table[X , y ] de la table
d’analyse, pour tout y ∈ VT ∪ #.
22/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

Écrire un analyseur syntaxique récursif LL(1) Parser pour G :

S → AB | Da
A → aAb | 
B → bB | 
D → dD | e

À voir :
I écriture de S(), A(), B(), D() ;
I collaboration avec un analyseur lexical.
23/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Collaboration avec un analyseur lexical

On reprend les conventions utilisées en TP :


I un an. lexical anLex de type Scanner (supposé donné) ;
I symboles de type Symbole ;
I codage entier du type des symboles dans TypeSymboles
(noté TS dans les transparents) ;
I méthode int getType() de Symbole pour obtenir ce type ;
I méthode Symbole next token() de Scanner :
I avance la tête de lecture teteLect ;
I retourne le symbole lu, de type Symbole.
I on remplace le marqueur # par TS.EOF.
24/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Construction de l’analyseur syntaxique

...
public class Parser {

// analyseur lexical
private Scanner anLex;

// symbole courant reçu de l’analyseur lexical


private Symbole teteLect;

public Parser (Scanner anLex) {


this.anLex = anLex;
} 25/111

...
Mirabelle Nebut Analyse descendante LL(k)
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Lancement de l’analyseur syntaxique


Dans la classe Parser :
public void analyser() throws ScannerException, ParserExcep

// positionnement tete de lecture


this.teteLect = (Symbole) this.anLex.next_token();

this.S(); // je veux reconna^


ıtre l’axiome

// et uniquement l’axiome
if (this.teteLect.getType() != TS.EOF)
throw new ParserException();
} 26/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code de S()
La tête de lecture est déjà positionnée sur le symbole de prédiction.
private void S() throws ... {
if (this.teteLect.getType() == TS.a)
... // S -> AB
S else if (this.teteLect.getType() == TS.b)
a S → AB ... // S -> AB
b S → AB else if (this.teteLect.getType() == TS.d)
... // S -> Da
d S → Da else if (this.teteLect.getType() == TS.e)
e S → Da ... // S -> Da
# S → AB else if (this.teteLect.getType() == TS.EOF)
... // S -> AB
else throw new ParserException();
27/111
}
Mirabelle Nebut Analyse descendante LL(k)
Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code de S()

On factorise.
private void S() throws ... {
if (this.teteLect.getType() == TS.a
S || this.teteLect.getType() == TS.b
a S → AB || this.teteLect.getType() == TS.EOF)
b S → AB ... // S -> AB
d S → Da else if (this.teteLect.getType() == TS.d
e S → Da || this.teteLect.getType() == TS.e)
# S → AB ... // S -> Da
else throw new ParserException();
}
28/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code des productions de S()

Code pour S → AB :
I je veux reconnaı̂tre A puis B ;
I ⇒ A() ; B() ;

Code pour S → Da :
I je veux reconnaı̂tre D. . .
I . . . puis vérifier que a est bien sous la tête de lecture ;
I et consommer a.

29/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Terminaux : vérification et consommation

Méthode consommer dédiée à la gestion des terminaux :

private void consommer(int type)


throws ScannerException, ParserException {
if (this.teteLect.getType() == type)
this.teteLect = (Symbole) this.anLex.next_token();
else throw new ParserException();
}

Code pour S → Da : D(); this.consommer(TS.a);.


30/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code final de S()

private void S() throws ... {


if (this.teteLect.getType() == TS.a
S || this.teteLect.getType() == TS.b
a S → AB || this.teteLect.getType() == TS.EOF) {
b S → AB A(); B(); // S -> AB
d S → Da } else if (this.teteLect.getType() == TS.d
e S → Da || this.teteLect.getType() == TS.e) {
# S → AB D(); this.consommer(TS.a); // S -> Da
} else throw new ParserException();
}
Quand S() termine, pour un mot accepté, la tête de lecture est sur
TS.EOF.
31/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code de A()

La tête de lecture est déjà positionnée sur le symbole de prédiction.


private void A() throws ... {
A if (this.teteLect.getType() == TS.a)
a A → aAb ... // A -> aAb
b A→ else if (this.teteLect.getType() == TS.b
|| this.teteLect.getType() == TS.EOF)
d erreur ... // A ->
e erreur else // erreur
# A→ throw new ParserException();
}

32/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code des productions de A()

Code pour A → aAb :

this.consommer(TS.a); A(); this.consommer(TS.b);

Code pour A →  :
I le mot vide est immédiatement reconnu ;
I sans toucher à la tête de lecture ;
I on ne fait rien.

33/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code final de A()

private void A() throws ... {


if (this.teteLect.getType() == TS.a) {
A // A -> aAb
a A → aAb this.consommer(TS.a); A();
b A→ this.consommer(TS.b);
} else if (this.teteLect.getType() == TS.b
d erreur || this.teteLect.getType() == TS.EOF)
e erreur // rien, A ->
# A→ } else // erreur
throw new ParserException();
}
Quand A() termine, pour un mot accepté, la tête de lecture est
positionnée pour reconnaı̂tre un B ou lire un b. 34/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code final de B()

private void B() throws ... {


B if (this.teteLect.getType() == TS.b) {
a erreur // B -> bB
b B → bB this.consommer(TS.b); B();
} else if (this.teteLect.getType() == TS.EOF)
d erreur // rien, B ->
e erreur } else // erreur
# B→ throw new ParserException();
}

35/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Code final de D()

private void D() throws ... {


if (this.teteLect.getType() == TS.d) {
D // D -> dD
a erreur this.consommer(TS.d); D();
b erreur } else if (this.teteLect.getType() == TS.e)
d D → dD // D -> e
e D→e this.consommer(TS.e);
# erreur else // erreur
throw new ParserException();
}

36/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple d’exécution

Reconnaı̂tre abb# ?

Mise en pratique : TP3 (Init)

37/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 38/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple - les piles pour abb#


S → AB | Da
A → aAb | 
abb# ?
B → bB | 
D → dD | e
a
A A
A b b b b
S B B B B B B B
abb# abb# abb# bb# bb# b# b# # #
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Comment ça se généralise ? 39/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes - 1

I La configuration initiale est (m#, S) ;


I La configuration finale est (#, ) : acceptation par pile vide.

On traite systématiquement le sommet de pile.

40/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes - transition de lecture

Si le sommet de pile est un terminal a ∈ VT :


I on contrôle que a est bien sous la tête de lecture (sinon
échec) ;
I on le consomme ;
I on le dépile.
Lecture de a :

(am, z1 . . . zn a) ` (m, z1 . . . zn )

41/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes - transition d’expansion

Si le sommet de pile est un non terminal X ∈ VN . . .


. . . et que la tête de lecture est y ∈ VT ∪ {#}. . .
si Table[X , y ] contient X → X1 . . . Xn :
I on dépile X ;
I on empile à sa place X1 . . . Xn , avec X1 au sommet.

(m, z1 . . . zn X ) ` (m, z1 . . . zn Xn . . . X1 )

sinon erreur.
42/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Transition d’expansion : remarque

Expansion par X → X1 . . . Xn :

(m, z1 . . . zn X ) ` (m, z1 . . . zn Xn . . . X1 )

I X1 sera traité en premier.


I on assure ainsi la construction d’une dérivation gauche ;

43/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Construction de l’arbre syntaxique : ordre préfixe

Transition d’expansion par X → X1 . . . Xn :


I X est le  prochain  nœud à traiter dans l’arbre (pour
l’ordre préfixe) ;
I on lui rajoute les fils X1 . . . Xn de la gauche vers la droite ;
I le prochain nœud à traiter devient X1 .

Transition de a-lecture :
I a est le  prochain  nœud à traiter dans l’arbre (pour l’ordre
préfixe) ;
I on vérifie que a concorde bien avec la tête de lecture ;
I et on passe au nœud suivant. 44/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 45/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 46/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Outils pour l’analyse prédictive, intuition - 1

Comment choisir entre S → AB et S → Da ?


Supposons que je sache que :
I AB ne permet de dériver que des mots préfixés par a ou par b ;
I AB ⇒∗ au et AB ⇒∗ bu, pour u ∈ VT ∗ ;
I Da ne permet de dériver que des mots préfixés par d ou par e ;
I Da ⇒∗ du et Da ⇒∗ eu, pour u ∈ VT ∗ .

Alors je sais (partiellement) choisir :


I si tête lecture ∈ {a, b} : choisir S → AB ;
I si tête lecture ∈ {d, e} : choisir S → Da.
47/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Ensemble Premier - définition


On dit que Premier (AB) = {a, b} et Premier (Da) = {d, e}.
Pour α ∈ (VT ∪ VN )+ , Premier (α) contient l’ensemble des
terminaux de VT susceptibles de commencer un mot de VT +
dérivé de α.
Si α = , cet ensemble est vide.
Definition
Soit une grammaire algébrique. On définit :

Premier : (VT ∪ VN )∗ → P(VT )


α 7→ {a ∈ VT | α ⇒∗ au, u ∈ VT ∗ }
48/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Ensemble Premier - intuition

X ∈ VN α ∈ (VT ∪ VN )∗

∈ Premier (X ) ∈ Premier (α)

49/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Premier - 1

Soit α ∈ (VN ∪ VT )∗ :
cas
α=:∅
α = a, a ∈ VT : {a}
α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}
α = X , X ∈ VN : ?
α = X β, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?
fcas
50/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul de Premier (X ), X ∈ VN - intuition


Si la grammaire contient les productions de membre gauche X :
X → γ1 | . . . | γn
X X

γ1 γn
...

∈ Premier (γ1 ) ∈ Premier (γn )


∈ Premier (X ) ∈ Premier (X )
S 51/111
Premier (X ) = {Premier (γi ) | X → γi ∈ P}
Mirabelle Nebut Analyse descendante LL(k)
Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul de Premier (X ), X ∈ VN - exemple

Si l’ensemble des productions de membre gauche X est :

X →  | aX | YZ

alors on a :

Premier (X ) = Premier () ∪ Premier (aX ) ∪ Premier (YZ )

52/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Premier - 2

Soit α ∈ (VN ∪ VT )∗ :
cas
α=:∅
α = a, a ∈ VT : {a}
α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}
S
α = X , X ∈ VN : {Premier (γi ) | X → γi ∈ P}
α = X β, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?
fcas
53/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Premier , α = X β, X ∈ VN

Deux cas selon que X peut  s’effacer  ou non :


X ⇒∗ 
X 6 ∗
⇒ 

X β
X β

Premier (X ) Premier (β)


Premier (X )
Premier (α) =
Premier (α) = Premier (X )
Premier (X ) ∪ Premier (β)
Si X ⇒∗  on dit que X est -productif : X ∈ -Prod.
54/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Premier , α = X β, X 6∈ -Prod - exemple

Si X 6∈ -Prod, par exemple X → a | aX


Premier (X Ya) = Premier (X )

55/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Premier , α = X β, X ∈ -Prod - exemple

Si X ∈ -Prod, par exemple X →  | aX


Premier (X Ya) = Premier (X ) ∪ Premier (Ya)

56/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Premier


Soit α ∈ (VN ∪ VT )∗ :
cas
α=:∅
α = a, a ∈ VT : {a}
α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}
S
α = X , X ∈ VN : {Premier (γi ) | X → γi ∈ P}
α = X β, X ∈ VN \ -Prod, β ∈ (VN ∪ VT )∗ : Premier (X )
α = X β, X ∈ VN ∩ -Prod, β ∈ (VN ∪ VT )∗ :
Premier (X ) ∪ Premier (β)
fcas 57/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul effectif des ensembles Premier

On procède en deux étapes :


1. on pose un système d’équations pour Premier ;
2. on calcule par itération de point fixe les plus petits ensembles
qui satisfont ces équations.

Pour le moment on suppose donné -Prod, l’ensemble des


-productifs.

58/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

α=:∅
S → AB | Da
A → aAb |  α = a, a ∈ VT : {a}
B → bB |  α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}
D → dD | e
α = X , X ∈ VN :
-Prod = {A, B, S}
S
{Premier (γi ) | X → γi ∈ P}
Premier (S) = ? α = X β, X ∈ VN \ -Prod, β ∈ (VN ∪ VT )∗ :
Premier (A) = ? Premier (X )
Premier (B) = ? α = X β, X ∈ VN ∩-Prod, β ∈ (VN ∪VT )∗ :
Premier (D) = ? Premier (X ) ∪ Premier (β)
59/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

Premier (S) = Premier (A) ∪ Premier (B) ∪ Premier (D)


Premier (A) = {a}
Premier (B) = {b}
Premier (D) = {d, e}
D’où
Premier (S) = {a, b, d, e} Premier (aAb) = {a}
Premier (A) = {a} Premier (bB) = {b}
Premier (B) = {b} Premier (dD) = {d}
Premier (D) = {d, e} Premier (e) = {e}
Premier (AB) = {a, b} Premier () = ∅
Premier (Da) = {d, e}
60/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple : remplissage de la table

A → aAb et Premier (aAb) = {a}


A →  et Premier () = ∅

S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur

61/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple : remplissage de la table

S → AB et Premier (AB) = {a, b}


S → Da et Premier (Da) = {d, e}

S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur

62/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Remarque : résolution du système

Premier (S) = Premier (A) ∪ Premier (B) ∪ Premier (D)


Premier (A) = {a}
Premier (B) = {b}
Premier (D) = {d, e}
Se résoud sans itération de point fixe : système d’équations non
récursif.
Ce n’est pas toujours le cas.

63/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Résolution du système : autre exemple

S → S1 S2 | a Premier (S) = Premier (S1 ) ∪ {a}


S1 → S | b Premier (S1 ) = Premier (S) ∪ {b}
S2 → c Premier (S2 ) = {c}

iter Premier (S) Premier (S1 ) Premier (S2 )


0 ∅ ∅ ∅
1 {a} {b} {c}
2 {a, b} {b, a} {c}
3 {a, b} {b, a} {c}
stabilisation
64/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 65/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Définition des -prod

Definition
Un non terminal X ∈ VN est dit -productif si X ⇒∗ .

L’ensemble des -productif est -Prod.


X est -productif si la grammaire contient la production :
I X → ;
I ou X → Y1 Y2 . . . Yn telle que l’ensemble des non-terminaux
{Y1 , Y2 , . . . , Yn } ⊆ VN ne contient que des non-terminaux
-productifs.

Algorithme de calcul similaire à celui qui calcule les productifs. 66/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

S → AB | Da
A → aAb | 
B → bB | 
D → dD | e
-Prod ?

67/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 68/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Outils pour l’analyse prédictive, intuition - 2

Pour choisir entre S → AB et S → Da :

I si tête lecture ∈ {a, b} : choisir S → AB ;


I si tête lecture ∈ {d, e} : choisir S → Da.

Et si la tête de lecture est # ? # 6∈ Premier (AB) ∪ Premier (Da).


Comment choisir entre A → aAb et A →  ? Premier () = ∅
⇒ les ensembles Premier ne suffisent pas.

69/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Ensembles Suivant, intuition

Quand appliquer A →  ?
Quand la tête de lect. correspond à un terminal qui peut suivre A.
A S

A
A B

a b

b ∈ Suivant(A) Suivant(A) ⊇ Premier (B)


70/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Ensembles Suivant, intuition

Pour α ∈ (VT ∪ VN )+ , Suivant(α) contient l’ensemble des


terminaux de VT susceptibles de suivre α dans un mot de VT +
dérivé de l’axiome S.
Si α = , cet ensemble est vide.
Par convention, Suivant(S) ⊇ {#}.

71/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Ensembles Suivant, définitions équivalentes

Definition
Soit une grammaire algébrique d’axiome S. On définit :
Suivant : (VT ∪ VN )∗ → P(VT )
α 7→ {a ∈ VT | S ⇒∗ βαaγ,
pour β, γ ∈ (VN ∪ VT )∗ }

Definition
Suivant : (VT ∪ VN )∗ → P(VT )
α 7→ {a ∈ Premier (γ) | S ⇒∗ βαγ,
pour β, γ ∈ (VN ∪ VT )∗ }
72/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant - 1


Pour calculer Suivant(X ), on regarde les productions dans
lesquelles X apparaı̂t en partie droite (différent du calcul des
Premier ).
Pour Suivant(A) :
A → aAb S → AB
A S

A
A B

a b
73/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant - 2

Soit PX ⊆ P l’ensemble des productions p dans lesquelles X


apparaı̂t en partie droite :
S
Suivant(X ) = p∈PX Suivant p (X )

Ex : PA = {S → AB, A → aAb}
Suivant(A) = Suivant(A)S→AB ∪ Suivant(A)A→aAb

74/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant, cas de l’axiome

Pour l’axiome, on ajoute le marqueur de fin de mot :


S
Suivant(S) = {#} ∪ p∈PS Suivant p (S)

Ex : pour X → aXb | 
PX = {X → aX b}
Suivant(X ) = {#} ∪ Suivant(X )X →aX b

75/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant - 3

Suivant(A)S→AB ? (exemple précédent)


S

Suivant(A) ⊇ Premier (B) A B

mais B est -Prod !


il peut  s’effacer .
Suivant(A) ⊇ Premier (B)
Suivant(A) ⊇ Suivant(S)

76/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant - 4

Quand une production est de la forme . . .→ X α :


I pour calculer Suivant(X ) ;
I Il faut pouvoir dire si α ∈ (VN ∪ VT )∗ est -productif ou pas.

Definition
α ∈ (VN ∪ VT )∗ est -productif si α ⇒∗ . On définit la fonction :

Eps : (VN ∪ VT )∗ → {vrai, faux}


α 7→ α est -productif

On verra après comment calculer Eps. 77/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant - 5

Pour calculer Suivant p (X ) avec :

p = Y → αX β et Eps(β) = faux, α, β ∈ (VN ∪ VT )∗


Y

X β
Suivant p (X ) = Premier (β)

Ex : pour Y → Xb, Suivant(X )Y →Xb = {b}.


78/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant - 6


Pour calculer Suivant p (X ) avec :

p = Y → αX

α X

Suivant p (X ) = Suivant(Y )
79/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant - 7

Pour calculer Suivant p (X ) avec :

p = Y → αX β et Eps(β) = vrai, α, β ∈ (VN ∪ VT )∗


Y

X β Suivant p (X ) =
Premier (β) ∪ Suivant(Y )

Ex : pour S → AB, Suivant(A)S→AB = Premier (B) ∪ Suivant(S).


80/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Remarque - 1

Si X apparaı̂t plusieurs fois en partie droite d’une production, il


faut prendre en compte toutes ses occurrences dans le calcul de
Suivant(X ).
Ex : Y → X aX aX c
Suivant Y →X aX aX c (X ) = {a, c}

81/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Remarque - 2

Pourquoi pas Suivant(X )Y →X β = Premier (β) ∪ Suivant(β) ?


Parce que Suivant(Y ) ⊆ Suivant(β).
Ex :
S → Y |Z Suivant(S) = {#}
Y → X1 X2 Suivant(Y ) = Suivant(S) = {#}
X1 → a Suivant(Z ) = Suivant(S) = {#}
X2 →  | b Suivant(X2 ) = {c} ∪ Suivant(Y ) = {c, #}
Z → X2 c Suivant(X1 ) = Premier (X2 ) ∪ Suivant(Y )

82/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des Suivant, récapitulons !

# ∈ Suivant(axiome)
Soit PX ⊆ P l’ensemble des productions p dans lesquelles X
apparaı̂t en partie droite :
S
Suivant(X ) = p∈PX Suivant p (X )

avec : Suivant p (X ) =
cas
p = Y → αX : Suivant(Y )
p = Y → αX β et Eps(β) = faux : Premier (β)
p = Y → αX β et Eps(β) = vrai : Premier (β) ∪ Suivant(Y )
fincas
83/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul effectif des ensembles Suivant

On procède en deux étapes :


I on pose un système d’équations pour Suivant ;
I on calcule par itération de point fixe les plus petits ensembles
qui satisfont ces équations.
I avec initialement Suivant(S) = {#}, et pour les autres
non-terminaux Suivant(X ) = ∅.

84/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

S → AB | Da # ∈ Suivant(axiome)
A → aAb |  S
Suivant(X ) = p∈PX Suivant p (X )
B → bB | 
D → dD | e
avec : Suivant p (X ) =
Eps(B) = vrai cas
Suivant ? p= Y → αX : Suivant(Y )
p= Y → αX β et Eps(β) = faux : Premier (β)
p= Y → αX β et Eps(β) = vrai : Premier (β)
∪Suivant(Y )
fincas
85/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple de remplissage de table

A →  et Suivant(A) = {b, #}

S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur

86/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple de remplissage de table

S → AB et Suivant(S) = {#}

S A B D
a S → AB A → aAb erreur erreur
b S → AB A→ B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D→e
# S → AB A→ B→ erreur

87/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Calcul des -productifs

On connaı̂t déjà -Prod, ens. des non-terminaux -productifs.


Pour calculer Eps(α) :
Eps(α) =
cas
α =  : vrai
α = X1 . . . Xn , n ≥ 1 avec {X1 , . . . , Xn } ⊆ VN et
{X1 , . . . , Xn } ⊆ -Prod : vrai
autre : faux // α contient un terminal
fincas
88/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

Sachant que -Prod = {A, B, S} :


Eps(Da) ?
Eps(AB) ?
Eps() ?
Eps(B) ?

89/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 90/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Table d’analyse : au préalable

On calcule :
I les -productifs ;
I les ensembles Premier ;
I les ensembles Suivant.

91/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Remplissage de la table

Entrée : une gram. alg. G , ses ensembles Premier et Suivant


Sortie : la table d’analyse Table
pour toute production X → γ ∈ P
faire pour tout a ∈ Premier (γ)
faire ajouter X → γ à Table[X , a] fait
si Eps(γ) = vrai alors pour tout b ∈ Suivant(X )
faire Table[X , b] = X → γ
fait
finsi
fait
Ajouter erreur dans les entrées de Table restées vides
92/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

S → AB :
I Premier (AB) = {a, b} ;
S
I Eps(AB) = vrai ; a S → AB
I Suivant(S) = {#}. b S → AB
S → Da : d S → Da
I Premier (Da) = {d, e} ; e S → Da
# S → AB
I Eps(Da) = faux.
Rien à compléter par erreur.

93/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Ensembles Premier
Analyseur récursif
Ensemble des -prod
Analyseur non-récursif
Ensembles Suivant
Construction de la table d’analyse
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Exemple

A → aAb :
I Premier (aAb) = {a} ;
A
I Eps(aAb) = faux. a A → aAb
A→: b A→
I Premier () = ∅ ; d erreur
I Eps() = vrai ; e erreur
# A→
I Suivant(A) = {b, #}.
On complète par erreur.

94/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 95/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Analyseur LL(1)

Un analyseur LL(1) est déterministe et piloté par le sommet de


pile :
I si terminal a : lecture de a (ou erreur) ;
I si non terminal X avec a sous la tête de lecture : expansion
selon Table[X , a].

Et si Table[X , a] contient plus d’une production ?


Non-déterminisme :
I la grammaire n’est pas LL(1) ;
I on ne peut pas appliquer une analyse LL(1).
96/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Caractérisation d’une grammaire LL(1)


Caractérisation par table d’analyse : une grammaire est LL(1) si
chaque case contient exactement une production ou erreur.
Caractérisation  par contre-exemple  : une grammaire n’est pas
LL(1) s’il existe 2 productions X → α et X → β telles que :
1. soit Premier (α) ∩ Premier (β) 6= ∅ ;
Ex : S → aS | A, A → a
2. soit Eps(α) = vrai et Premier (β) ∩ Suivant(X ) 6= ∅ ;
Ex : S → aS | Ab, A →  | b
3. soit Eps(α) = vrai et Eps(β) = vrai (la grammaire est
ambiguë)
Ex : S → A | B, A → , B →  97/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

LL(1) et ambiguı̈té

Une grammaire LL(1) n’est pas ambiguë.


Une grammaire ambiguë n’est pas LL(1).

98/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Cas classiques non LL(1)

Dans les cas suivants, la grammaire n’est pas LL(1) :


I ambiguı̈té ;
I récursivité gauche : A → Aa |  ;
I intuitivement récursivité infinie de A().
I non factorisation gauche : S → aA | aB

On peut parfois arranger ça :


I factorisation à gauche ;
I suppression de la récursivité gauche.

99/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 100/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 101/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Factorisation à gauche : exemple - 1

Les listes d’identificateur de Init :

listeIdent → IDENT | IDENT SEPVAR listeIdent

On factorise IDENT et on obtient :


listeIdent → IDENT suiteListeIdent
suiteListeIdent →  | SEPVAR listeIdent

102/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Factorisation à gauche : exemple - 2

X → ab | abbX | abbbX
Factorisation de ab : on prend le plus grand préfixe commun.
X → abY
Y →  | bX | bbX
Puis à nouveau factorisation de b.

103/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Factorisation à gauche - algorithme


On remplace les règles de la forme :
X → αβ1 | . . . | αβn | γ1 | . . . | γm
où
I α ∈ (VT ∪ VN )+ et βi , γj ∈ (VT ∪ VN )∗ ;
I le préfixe commun α est choisi le plus grand possible ;
I α n’est pas préfixe de γj .

par les règles :


X → αX 0 | γ1 | . . . | γm
X 0 → β1 | . . . | βn
où X 0 est un nouveau non-terminal.
104/111
On réitère ce processus tant que nécessaire.
Mirabelle Nebut Analyse descendante LL(k)
Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Principes
Table d’analyse LL
Analyseur récursif
Analyseur non-récursif
Construction de la table d’analyse
Ensembles Premier
Ensemble des -prod
Ensembles Suivant
Remplissage de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)
Factorisation à gauche
Suppression de la récursivité à gauche 105/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Suppression de la récursivité à gauche

Récursivité gauche :
I immédiate : production A→Aα, α ∈ (VT ∪ VN )+ ;
I générale : il existe une dérivation A⇒∗ Aα, α ∈ (VT ∪ VN )+ .

Il est possible de supprimer les deux cas.


On ne verra que la récursivité immédiate.

106/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Suppression de la récursivité gauche immédiate

On remplace les règles de la forme

X → X α1 | . . . | X αn | β1 | . . . | βm

où
I αi ∈ (VT ∪ VN )+ et βj ∈ (VT ∪ VN )∗ ;
I les βj ne commencent pas par X .
par les règles :

X → β1 X 0 | . . . | βm X 0
X 0 → α1 X 0 | . . . | αn X 0 | 

où X 0 est un nouveau non-terminal. 107/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Suppression de la récursivité gauche : exemple

Après suppression de la rec


Grammaire non ambiguë gauche :
des expressions arithmétiques :
E → TE 0
E → E + T |T E 0 → +TE 0 | 
T → T ∗ F |F T → FT 0
F → i | (E ) T 0 → ∗FT 0 | 
F → i | (E )
X → X α1 | . . . | X αn
| β1 | . . . | βm X → β1 X 0 | . . . | βm X 0
X 0 → α1 X 0 | . . . | αn X 0 | 
108/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Parfois ça ne suffit pas

La grammaire ({a, b}, {S, A}, S, P) avec

P = {S → aSb | A, A → aA | }

I n’est pas ambiguë ;


I n’est pas récursive gauche ;
I est factorisée à gauche ;
mais elle n’est pas LL(1).

109/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Au delà des grammaires LL(1) - 1

La grammaire ({a, b}, {A, B}, A, P) avec

P = {A → abB | , B → Aaa | b}

n’est pas LL(1).


En effet Eps(A) = vrai et a ∈ Premier (A) ∩ Suivant(A).
Mais cette grammaire est LL(2) :
Premier 2 (A) = {ab}
Premier 2 (B) = {ab, aa, b}
Suivant 2 (A) = {aa, #}
110/111

Mirabelle Nebut Analyse descendante LL(k)


Principes
Table d’analyse LL
Analyseur récursif
Factorisation à gauche
Analyseur non-récursif
Suppression de la récursivité à gauche
Construction de la table d’analyse
Caractérisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)

Au delà des grammaires LL(1) - 2

A → abB | 
B → Aaa | b

aa ab b #
A A→ A → abB erreur A→
B B → Aaa B → Aaa B→b erreur

Table d’analyse LL(2)

111/111

Mirabelle Nebut Analyse descendante LL(k)

Вам также может понравиться