120
Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Analyse descendante LL(k) Mirabelle Nebut Bureau 203 - M3 extension mirabelle.nebut at lifl.fr 2012-2013 Mirabelle Nebut Analyse descendante LL(k)

Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyse descendante LL(k)

Mirabelle Nebut

Bureau 203 - M3 extensionmirabelle.nebut at lifl.fr

2012-2013

Mirabelle Nebut Analyse descendante LL(k)

Page 2: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

2/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 3: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

3/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Objectif du cours

Comprendre le fonctionnement des generateurs de parserdescendants :

I LL(1), ex antLR V1

I LL(k), ex javaCC

I LL(*), ex antLR V3

Mirabelle Nebut Analyse descendante LL(k)

Page 4: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

4/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyse descendante

L’automate a pile sous-jacent :

I effectue uniquement des lectures et des expansions ;

I construit un arbre en ordre prefixe (idem aut. items) ;

I � part � de l’axiome (idem aut. items) ;

I construit une derivation gauche (idem aut. items).

Mirabelle Nebut Analyse descendante LL(k)

Page 5: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

5/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Difference avec l’automate des items

Deux differences fondamentales :

I analyse deterministe dite predictive ;

I plus d’items ni de reductions explicites.

Mirabelle Nebut Analyse descendante LL(k)

Page 6: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

6/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyse deterministe

A chaque expansion l’analyseur sait choisir une production.

Il ne revient jamais sur ce choix :

I en cas de succes le mot appartient au langage ;

I en cas d’echec on est sur que mot n’appartient pas au langage.

Mirabelle Nebut Analyse descendante LL(k)

Page 7: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

7/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyse predictive

L’analyseur ”predit” quelle production utiliser. . .

. . . en analysant les k prochains symboles sous la tete de lecture.

Consequences :

I ne fonctionne qu’avec certaines grammaires, dites LL(k) ;

I tete de lecture toujours definie : marqueur de fin de mot #.

NB : dans ce cours techniques pour k=1, on regarde uniquement latete de lecture.

Mirabelle Nebut Analyse descendante LL(k)

Page 8: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

8/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Se passer des items

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

I X est en cours de reconnaissance ;

I α a deja ete reconnu ;

I il reste a reconnaıtre β, le futur de l’item

Un analyseur LL :

I ne memorise pas qu’il est en train de reconnaıtre X ;

I ne memorise pas qu’il a reconnu α ;

I considere uniquement β.

Mirabelle Nebut Analyse descendante LL(k)

Page 9: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

9/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Se passer des items : consequences

Plus besoin d’axiome supplementaire.

Dans la pile :

I plus d’items mais des mots etendus : mots de (VN ∪ VT )∗ ;

I l’alphabet est VN ∪ VT ;

I le symbole de pile initiale est l’axiome.

Spile initiale

AbB

une pile pile vide (acceptation)

Mirabelle Nebut Analyse descendante LL(k)

Page 10: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

10/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Exemple a 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 | DaA → aAb | εB → bB | εD → dD | e

Mirabelle Nebut Analyse descendante LL(k)

Page 11: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

11/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Exemple - les piles pour abb#

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

S

abb#(1)

AB

abb#(2)

aAbB

abb#(3)

AbB

bb#(4)

bB

bb#(5)

B

b#(6)

bB

b#(7)

B

#(8)

#(9)

Comparer avec l’automates des items !Derivation gauche, arbre en ordre prefixe.

Mirabelle Nebut Analyse descendante LL(k)

Page 12: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

12/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Generalisation

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

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

On traite systematiquement le sommet de pile.

Mirabelle Nebut Analyse descendante LL(k)

Page 13: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

13/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Transition de lecture

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

I on controle que a est bien sous la tete de lecture (sinonechec) ;

I on le consomme ;

I on le depile.

Lecture de a :

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

Mirabelle Nebut Analyse descendante LL(k)

Page 14: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

14/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Transition d’expansion

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

. . . et que la tete de lecture est y ∈ VT ∪ {#}. . .

si Table[X , y ] contient X → X1 . . .Xn :

I on depile X ;

I on empile a sa place X1 . . .Xn, avec X1 au sommet.

(m, z1 . . . znX ) ` (m, z1 . . . znXn . . .X1)

sinon erreur.

Mirabelle Nebut Analyse descendante LL(k)

Page 15: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

15/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Transition d’expansion : remarque

Expansion par X → X1 . . .Xn :

(m, z1 . . . znX ) ` (m, z1 . . . znXn . . .X1)

I X1 sera traite en premier.

I on assure ainsi la construction d’une derivation gauche ;

Mirabelle Nebut Analyse descendante LL(k)

Page 16: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

16/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Construction de l’arbre syntaxique : ordre prefixe

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

I X est le � prochain � nœud a traiter dans l’arbre (pourl’ordre prefixe) ;

I on lui rajoute les fils X1 . . .Xn de la gauche vers la droite ;

I le prochain nœud a traiter devient X1.

Transition de a-lecture :

I a est le � prochain � nœud a traiter dans l’arbre (pour l’ordreprefixe) ;

I on verifie que a concorde bien avec la tete de lecture ;

I et on passe au nœud suivant.

Mirabelle Nebut Analyse descendante LL(k)

Page 17: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

17/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Mise en œuvre

Les outils n’implantent pas un automate a pile.

Ils utilisent une implementation recursive.

Dans tous les cas, le choix de l’expansion est indique par une tabled’analyse.

Mirabelle Nebut Analyse descendante LL(k)

Page 18: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

18/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

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

Mirabelle Nebut Analyse descendante LL(k)

Page 19: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

19/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Table d’analyse LL(1)

Contient toute l’intelligence de l’analyseur syntaxique.

DefinitionLa table d’analyse Table est un tableau a deux dimensions tel que :

I chaque colonne est indicee par un non-terminal ∈ VN ;

I chaque ligne est indicee par un terminal ∈ VT ou # ;

I chaque case contient une production ∈ P ou erreur.

On verra plus tard comment remplir cette table.

Mirabelle Nebut Analyse descendante LL(k)

Page 20: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

20/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Interpretation de Table[a,X ]

I si le terminal a ∈ VT est sous la tete 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.

Mirabelle Nebut Analyse descendante LL(k)

Page 21: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

21/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 22: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

22/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyseur descendant recursif

Principe :

I analyseur LL code 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 engendre par X ;

I la fonction X() code les productions Table[X , y ] de la tabled’analyse, pour tout y ∈ VT ∪#.

Mirabelle Nebut Analyse descendante LL(k)

Page 23: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

23/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Exemple

Ecrire un analyseur syntaxique recursif LL(1) Parser pour G :

S → AB | DaA → aAb | εB → bB | εD → dD | e

A voir :

I ecriture de S(), A(), B(), D() ;

I collaboration avec un analyseur lexical.

Mirabelle Nebut Analyse descendante LL(k)

Page 24: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

24/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Collaboration avec un analyseur lexical

On reprend les conventions utilisees en TP :

I un an. lexical anLex de type Scanner (suppose donne) ;

I symboles de type Symbole ;

I codage entier du type des symboles dans TypeSymboles

(note TS dans les transparents) ;

I methode int getType() de Symbole pour obtenir ce type ;I methode Symbole next token() de Scanner :

I avance la tete de lecture teteLect ;I retourne le symbole lu, de type Symbole.

I on remplace le marqueur # par TS.EOF.

Mirabelle Nebut Analyse descendante LL(k)

Page 25: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

25/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Construction de l’analyseur syntaxique

...

public class Parser {

// analyseur lexical

private Scanner anLex;

// symbole courant recu de l’analyseur lexical

private Symbole teteLect;

public Parser (Scanner anLex) {

this.anLex = anLex;

}

...

Mirabelle Nebut Analyse descendante LL(k)

Page 26: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

26/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Lancement de l’analyseur syntaxique

Dans la classe Parser :

public void analyser() throws ScannerException, ParserException {

// 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();

}

Mirabelle Nebut Analyse descendante LL(k)

Page 27: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

27/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Code de S()

La tete de lecture est deja positionnee sur le symbole de prediction.

S

a S → AB

b S → AB

d S → Da

e S → Da

# S → AB

private void S() throws ... {

if (this.teteLect.getType() == TS.a)

... // S -> AB

else if (this.teteLect.getType() == TS.b)

... // S -> AB

else if (this.teteLect.getType() == TS.d)

... // S -> Da

else if (this.teteLect.getType() == TS.e)

... // S -> Da

else if (this.teteLect.getType() == TS.EOF)

... // S -> AB

else throw new ParserException();

}

Mirabelle Nebut Analyse descendante LL(k)

Page 28: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

28/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Code de S()

On factorise.

S

a S → AB

b S → AB

d S → Da

e S → Da

# S → AB

private void S() throws ... {

if (this.teteLect.getType() == TS.a

|| this.teteLect.getType() == TS.b

|| this.teteLect.getType() == TS.EOF)

... // S -> AB

else if (this.teteLect.getType() == TS.d

|| this.teteLect.getType() == TS.e)

... // S -> Da

else throw new ParserException();

}

Mirabelle Nebut Analyse descendante LL(k)

Page 29: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

29/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

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 verifier que a est bien sous la tete de lecture ;

I et consommer a.

Mirabelle Nebut Analyse descendante LL(k)

Page 30: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

30/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Terminaux : verification et consommation

Methode consommer dediee a 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);.

Mirabelle Nebut Analyse descendante LL(k)

Page 31: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

31/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Code final de S()

S

a S → AB

b S → AB

d S → Da

e S → Da

# S → AB

private void S() throws ... {

if (this.teteLect.getType() == TS.a

|| this.teteLect.getType() == TS.b

|| this.teteLect.getType() == TS.EOF) {

A(); B(); // S -> AB

} else if (this.teteLect.getType() == TS.d

|| this.teteLect.getType() == TS.e) {

D(); this.consommer(TS.a); // S -> Da

} else throw new ParserException();

}

Quand S() termine, pour un mot accepte, la tete de lecture est surTS.EOF.

Mirabelle Nebut Analyse descendante LL(k)

Page 32: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

32/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Code de A()

La tete de lecture est deja positionnee sur le symbole de prediction.

A

a A→ aAb

b A→ ε

d erreur

e erreur

# A→ ε

private void A() throws ... {

if (this.teteLect.getType() == TS.a)

... // A -> aAb

else if (this.teteLect.getType() == TS.b

|| this.teteLect.getType() == TS.EOF)

... // A ->

else // erreur

throw new ParserException();

}

Mirabelle Nebut Analyse descendante LL(k)

Page 33: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

33/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

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 immediatement reconnu ;

I sans toucher a la tete de lecture ;

I on ne fait rien.

Mirabelle Nebut Analyse descendante LL(k)

Page 34: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

34/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Code final de A()

A

a A→ aAb

b A→ ε

d erreur

e erreur

# A→ ε

private void A() throws ... {

if (this.teteLect.getType() == TS.a) {

// A -> aAb

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

this.consommer(TS.b);

} else if (this.teteLect.getType() == TS.b

|| this.teteLect.getType() == TS.EOF) {

// rien, A ->

} else // erreur

throw new ParserException();

}

Quand A() termine, pour un mot accepte, la tete de lecture estpositionnee pour reconnaıtre un B ou lire un b.

Mirabelle Nebut Analyse descendante LL(k)

Page 35: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

35/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Code final de B()

B

a erreur

b B → bB

d erreur

e erreur

# B → ε

private void B() throws ... {

if (this.teteLect.getType() == TS.b) {

// B -> bB

this.consommer(TS.b); B();

} else if (this.teteLect.getType() == TS.EOF) {

// rien, B ->

} else // erreur

throw new ParserException();

}

Mirabelle Nebut Analyse descendante LL(k)

Page 36: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

36/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Code final de D()

D

a erreur

b erreur

d D → dD

e D → e

# erreur

private void D() throws ... {

if (this.teteLect.getType() == TS.d) {

// D -> dD

this.consommer(TS.d); D();

} else if (this.teteLect.getType() == TS.e)

// D -> e

this.consommer(TS.e);

else // erreur

throw new ParserException();

}

Mirabelle Nebut Analyse descendante LL(k)

Page 37: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

37/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Exemple d’execution

Reconnaıtre abb# ?

Mirabelle Nebut Analyse descendante LL(k)

Page 38: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

38/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 39: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

39/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 40: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

40/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Outils pour l’analyse predictive, intuition - 1

Comment choisir entre S → AB et S → Da ?

Supposons que je sache que :

I AB ne permet de deriver que des mots prefixes par a ou par b ;

I AB ⇒∗ au et AB ⇒∗ bu, pour u ∈ VT∗ ;

I Da ne permet de deriver que des mots prefixes par d ou par e ;

I Da⇒∗ du et Da⇒∗ eu, pour u ∈ VT∗.

Mirabelle Nebut Analyse descendante LL(k)

Page 41: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

41/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Outils pour l’analyse predictive, intuition - 1

Maintenant je sais (partiellement) choisir entre S → AB etS → Da :

I si tete lecture ∈ {a, b} : choisir S → AB ;

I si tete lecture ∈ {d , e} : choisir S → Da.

S

a S → AB

b S → AB

d S → Da

e S → Da

# ?

Mirabelle Nebut Analyse descendante LL(k)

Page 42: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

42/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Ensemble Premier - definition

On dit que Premier(AB) = {a, b} et Premier(Da) = {d , e}.

Pour α ∈ (VT ∪ VN)+, Premier(α) contient l’ensemble desterminaux de VT susceptibles de commencer un mot de VT

+

derive de α.

Si α = ε, cet ensemble est vide.

DefinitionSoit une grammaire algebrique. On definit :

Premier : (VT ∪ VN)∗ → P(VT )α 7→ {a ∈ VT |α⇒∗ au, u ∈ VT

∗}

Mirabelle Nebut Analyse descendante LL(k)

Page 43: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

43/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Les Premier sur les arbres syntaxiques

a

A

a b

A

B A B

B

b

S S S

A B

S

D

dD

a

S

D

e ∈ Premier(α)

α ∈ (VT ∪ VN)∗

Mirabelle Nebut Analyse descendante LL(k)

Page 44: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

44/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Premier - 0

Soit α ∈ (VN ∪ VT )∗ :

casα = ε : ?

α = a, a ∈ VT : ?

α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : ?

α = X , X ∈ VN : ?

α = Xβ, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?

fcas

Mirabelle Nebut Analyse descendante LL(k)

Page 45: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

45/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

Mirabelle Nebut Analyse descendante LL(k)

Page 46: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

46/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul de Premier(X ), X ∈ VN

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

S → AB | Da

alors on a :

Premier(S) = Premier(AB) ∪ Premier(Da)

Cas general : Si la grammaire contient les productions de membregauche X :

X → γ1 | . . . | γn

alorsPremier(X ) =⋃{Premier(γi ) |X → γi ∈ P}

Mirabelle Nebut Analyse descendante LL(k)

Page 47: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

47/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Premier - 2

Soit α ∈ (VN ∪ VT )∗ :

casα = ε : ∅α = a, a ∈ VT : {a}α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}α = X , X ∈ VN :

⋃{Premier(γi ) |X → γi ∈ P}

α = Xβ, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?

fcas

Mirabelle Nebut Analyse descendante LL(k)

Page 48: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

48/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

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

X ⇒∗ ε ?

Si X ⇒∗ ε on dit que X est ε-productif : X ∈ ε-Prod

Mirabelle Nebut Analyse descendante LL(k)

Page 49: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

49/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

Par exemple D 6∈ ε-productif :

D → dD | e

alors Premier(Da) = Premier(D)a

S

D

dD

a

S

D

e

Donc, si X 6∈ ε-Prod, Premier(Xβ) = Premier(X )

Mirabelle Nebut Analyse descendante LL(k)

Page 50: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

50/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

Par exemple A ∈ ε-productif :

A→ ε | aAb

Premier(AB) = Premier(A) ∪Premier(B)Premier(ABS) = Premier(A) ∪Premier(BS)

S

A

a b

A

B A B

B

b

S

Donc, si X ⇒∗ ε alors Premier(Xβ) = Premier(X ) ∪ Premier(β)

Mirabelle Nebut Analyse descendante LL(k)

Page 51: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

51/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Premier

Soit α ∈ (VN ∪ VT )∗ :

casα = ε : ∅α = a, a ∈ VT : {a}α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}α = 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

Mirabelle Nebut Analyse descendante LL(k)

Page 52: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

52/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul effectif des ensembles Premier

On procede en deux etapes :

1. on pose un systeme d’equations pour Premier ;

2. on calcule par iteration de point fixe les plus petits ensemblesqui satisfont ces equations.

Pour le moment on suppose donne ε-Prod, l’ensemble desε-productifs.

Mirabelle Nebut Analyse descendante LL(k)

Page 53: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

53/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Exemple

S → AB | DaA → aAb | εB → bB | εD → dD | e

ε-Prod = {A, B, S}

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

α = ε : ∅

α = a, a ∈ VT : {a}

α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}

α = 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(β)

Mirabelle Nebut Analyse descendante LL(k)

Page 54: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

54/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Exemple

Premier(S) = Premier(A) ∪ Premier(B) ∪ Premier(D)Premier(A) = {a}Premier(B) = {b}Premier(D) = {d , e}

D’ou

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}

Mirabelle Nebut Analyse descendante LL(k)

Page 55: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

55/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

Mirabelle Nebut Analyse descendante LL(k)

Page 56: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

56/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

Mirabelle Nebut Analyse descendante LL(k)

Page 57: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

57/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Remarque : resolution du systeme

Premier(S) = Premier(A) ∪ Premier(B) ∪ Premier(D)Premier(A) = {a}Premier(B) = {b}Premier(D) = {d , e}

Se resoud sans iteration de point fixe : systeme d’equations nonrecursif.

Ce n’est pas toujours le cas.

Mirabelle Nebut Analyse descendante LL(k)

Page 58: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

58/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Resolution du systeme : autre exemple

S → S1S2 | aS1 → S | bS2 → c

Premier(S) = Premier(S1) ∪ {a}Premier(S1) = Premier(S) ∪ {b}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

Mirabelle Nebut Analyse descendante LL(k)

Page 59: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

59/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 60: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

60/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Definition des ε-prod

DefinitionUn 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 → Y1Y2 . . .Yn telle que l’ensemble des non-terminaux{Y1,Y2, . . . ,Yn} ⊆ VN ne contient que des non-terminauxε-productifs.

Algorithme de calcul similaire a celui qui calcule les productifs.

Mirabelle Nebut Analyse descendante LL(k)

Page 61: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

61/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Exemple

S → AB | DaA → aAb | εB → bB | εD → dD | eε-Prod ?

Mirabelle Nebut Analyse descendante LL(k)

Page 62: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

62/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 63: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

63/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Outils pour l’analyse predictive, intuition - 2

Pour choisir entre S → AB et S → Da :

I si tete lecture ∈ {a, b} : choisir S → AB ;

I si tete lecture ∈ {d , e} : choisir S → Da.

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

Comment choisir entre A → aAb et A → ε ? Premier(ε) = ∅

⇒ les ensembles Premier ne suffisent pas.

Mirabelle Nebut Analyse descendante LL(k)

Page 64: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

64/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Ensembles Suivant, intuition

Quand appliquer A → ε ?

Quand la tete de lect. correspond a un terminal qui peut suivre A.

a b

A

A

b ∈ Suivant(A)

A

S

B

Suivant(A) ⊇ Premier(B)

Mirabelle Nebut Analyse descendante LL(k)

Page 65: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

65/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Ensembles Suivant, intuition

On a donc b ∈ Suivant(A)

A

a A→ aAb

b A→ ε

d ?

e ?

# ?

Mirabelle Nebut Analyse descendante LL(k)

Page 66: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

66/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Ensembles Suivant, intuition

Pour α ∈ (VT ∪ VN)+, Suivant(α) contient l’ensemble desterminaux de VT susceptibles de suivre α dans un mot de VT

+

derive de l’axiome S .

Si α = ε, cet ensemble est vide.

Par convention, Suivant(S) ⊇ {#}.

Mirabelle Nebut Analyse descendante LL(k)

Page 67: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

67/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Ensembles Suivant, definitions equivalentes

DefinitionSoit une grammaire algebrique d’axiome S . On definit :

Suivant : (VT ∪ VN)∗ → P(VT )α 7→ {a ∈ VT | S ⇒∗ βαaγ,

pour β, γ ∈ (VN ∪ VT )∗}

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

α 7→ {a ∈ Premier(γ) |S ⇒∗ βαγ,pour β, γ ∈ (VN ∪ VT )∗}

Mirabelle Nebut Analyse descendante LL(k)

Page 68: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

68/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 1

Pour calculer Suivant(X ), on regarde les productions danslesquelles X apparaıt en partie droite (different du calcul desPremier).

Pour Suivant(A) :

A → aAb

a b

A

A

S → AB

A

S

B

Mirabelle Nebut Analyse descendante LL(k)

Page 69: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

69/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 2

Soit PX ⊆ P l’ensemble des productions p dans lesquelles Xapparaıt en partie droite :

Suivant(X ) =⋃

p∈PXSuivantp(X )

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

Mirabelle Nebut Analyse descendante LL(k)

Page 70: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

70/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant, cas de l’axiome

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

Suivant(S) = {#} ∪⋃

p∈PSSuivantp(S)

Ex : pour X → aXb | ε

PX = {X → aXb}Suivant(X ) = {#} ∪ Suivant(X )X→aXb

Mirabelle Nebut Analyse descendante LL(k)

Page 71: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

71/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 3 - exemple

Suivant(A)S→AB ? (exemple precedent)

Cas deja vu :

A

S

B

Suivant(A) ⊇ Premier(B)

Mirabelle Nebut Analyse descendante LL(k)

Page 72: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

72/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 3 - exemple

Suivant(A)S→AB ? (exemple precedent)

mais B est ε-Prod !

A

S

B

Suivant(A) ⊇ Suivant(S)

Mirabelle Nebut Analyse descendante LL(k)

Page 73: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

73/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 3 - exemple

Puisque B est ε-Prod :

Suivant(A)S→AB = Premier(B) ∪ Suivant(S)

Mirabelle Nebut Analyse descendante LL(k)

Page 74: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

74/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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 definit la fonction :

Eps : (VN ∪ VT )∗ → {vrai , faux}α 7→ α est ε-productif

On verra apres comment calculer Eps.

Mirabelle Nebut Analyse descendante LL(k)

Page 75: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

75/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 5

Pour calculer Suivantp(X ) avec :

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

X β

Y

Suivantp(X ) = Premier(β)

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

Mirabelle Nebut Analyse descendante LL(k)

Page 76: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

76/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 6

Pour calculer Suivantp(X ) avec :

p = Y → αX

Y

Suivantp(X ) = Suivant(Y )

Mirabelle Nebut Analyse descendante LL(k)

Page 77: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

77/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant - 7

Pour calculer Suivantp(X ) avec :

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

X

Y

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

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

Mirabelle Nebut Analyse descendante LL(k)

Page 78: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

78/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Remarque - 1

Si X apparaıt plusieurs fois en partie droite d’une production, ilfaut prendre en compte toutes ses occurrences dans le calcul deSuivant(X ).

Ex : Y → XaXaXc

SuivantY→XaXaXc(X ) = {a, c}

Mirabelle Nebut Analyse descendante LL(k)

Page 79: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

79/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Remarque - 2

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

Parce que Suivant(Y ) ⊆ Suivant(β).

Ex :

S → Y |ZY → X1X2

X1 → aX2 → ε | bZ → X2c

Suivant(S) = {#}Suivant(Y ) = Suivant(S) = {#}Suivant(Z ) = Suivant(S) = {#}Suivant(X2) = {c} ∪ Suivant(Y ) = {c,#}Suivant(X1) = Premier(X2) ∪ Suivant(Y )

Mirabelle Nebut Analyse descendante LL(k)

Page 80: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

80/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des Suivant, recapitulons !

# ∈ Suivant(axiome)

Soit PX ⊆ P l’ensemble des productions p dans lesquelles Xapparaıt en partie droite :

Suivant(X ) =⋃

p∈PXSuivantp(X )

avec : Suivantp(X ) =cas

p = Y → αX : Suivant(Y )p = Y → αXβ et Eps(β) = faux : Premier(β)p = Y → αXβ et Eps(β) = vrai : Premier(β) ∪ Suivant(Y )

fincas

Mirabelle Nebut Analyse descendante LL(k)

Page 81: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

81/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul effectif des ensembles Suivant

On procede en deux etapes :

I on pose un systeme d’equations pour Suivant ;

I on calcule par iteration de point fixe les plus petits ensemblesqui satisfont ces equations.

I avec initialement Suivant(S) = {#}, et pour les autresnon-terminaux Suivant(X ) = ∅.

Mirabelle Nebut Analyse descendante LL(k)

Page 82: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

82/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Exemple

S → AB | DaA → aAb | εB → bB | εD → dD | e

Eps(B) = vrai

Suivant ?

# ∈ Suivant(axiome)

Suivant(X ) =⋃

p∈PXSuivantp(X )

avec : Suivantp(X ) =casp = Y → αX : Suivant(Y )p = Y → αXβ et Eps(β) = faux : Premier(β)p = Y → αXβ et Eps(β) = vrai : Premier(β)

∪Suivant(Y )fincas

Mirabelle Nebut Analyse descendante LL(k)

Page 83: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

83/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

Mirabelle Nebut Analyse descendante LL(k)

Page 84: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

84/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

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

Mirabelle Nebut Analyse descendante LL(k)

Page 85: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

85/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Calcul des ε-productifs

On connaıt deja ε-Prod, ens. des non-terminaux ε-productifs.

Pour calculer Eps(α) :

Eps(α) =casα = ε : vraiα = X1 . . .Xn, n ≥ 1 avec {X1, . . . ,Xn} ⊆ VN et

{X1, . . . ,Xn} ⊆ ε-Prod : vraiautre : faux // α contient un terminal

fincas

Mirabelle Nebut Analyse descendante LL(k)

Page 86: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

86/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Exemple

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

Eps(Da) ?

Eps(AB) ?

Eps(ε) ?

Eps(B) ?

Mirabelle Nebut Analyse descendante LL(k)

Page 87: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

87/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 88: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

88/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Table d’analyse : au prealable

On calcule :

I les ε-productifs ;

I les ensembles Premier ;

I les ensembles Suivant.

Mirabelle Nebut Analyse descendante LL(k)

Page 89: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

89/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Remplissage de la table

Entree : une gram. alg. G , ses ensembles Premier et SuivantSortie : la table d’analyse Tablepour toute production X → γ ∈ Pfaire pour tout a ∈ Premier(γ)

faire ajouter X → γ a Table[X , a] faitsi Eps(γ) = vrai alors pour tout b ∈ Suivant(X )

faire Table[X , b] = X → γfait

finsifait

Ajouter erreur dans les entrees de Table restees vides

Mirabelle Nebut Analyse descendante LL(k)

Page 90: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

90/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Exemple

S → AB :

I Premier(AB) = {a, b} ;

I Eps(AB) = vrai ;

I Suivant(S) = {#}.S → Da :

I Premier(Da) = {d , e} ;

I Eps(Da) = faux.

Rien a completer par erreur.

S

a S → AB

b S → AB

d S → Da

e S → Da

# S → AB

Mirabelle Nebut Analyse descendante LL(k)

Page 91: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

91/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Exemple

A→ aAb :

I Premier(aAb) = {a} ;

I Eps(aAb) = faux.

A→ ε :

I Premier(ε) = ∅ ;

I Eps(ε) = vrai ;

I Suivant(A) = {b,#}.On complete par erreur.

A

a A→ aAb

b A→ ε

d erreur

e erreur

# A→ ε

Mirabelle Nebut Analyse descendante LL(k)

Page 92: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

92/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 93: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

93/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyseur LL(1)

Un analyseur LL(1) est deterministe et pilote par le sommet depile :

I si terminal a : lecture de a (ou erreur) ;

I si non terminal X avec a sous la tete de lecture : expansionselon Table[X , a].

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

Non-determinisme :

I la grammaire n’est pas LL(1) ;

I on ne peut pas appliquer une analyse LL(1).

Mirabelle Nebut Analyse descendante LL(k)

Page 94: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

94/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Caracterisation d’une grammaire LL(1)

Caracterisation par table d’analyse : une grammaire est LL(1) sichaque case contient exactement une production ou erreur.

Caracterisation � par contre-exemple � : une grammaire n’est pasLL(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 estambigue)Ex : S → A |B, A→ ε, B → ε

Mirabelle Nebut Analyse descendante LL(k)

Page 95: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

95/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

LL(1) et ambiguıte

Une grammaire LL(1) n’est pas ambigue.

Une grammaire ambigue n’est pas LL(1).

Mirabelle Nebut Analyse descendante LL(k)

Page 96: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

96/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Cas classiques non LL(1)

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

I ambiguıte ;I recursivite gauche : A→ Aa | ε ;

I intuitivement recursivite infinie de A().

I non factorisation gauche : S → aA | aB

Solutions : :

I factorisation a gauche (parfois) ;

I suppression de la recursivite gauche (parfois) ;

I utiliser un generateur de parser plus puissant !

Mirabelle Nebut Analyse descendante LL(k)

Page 97: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

97/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 98: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

98/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 99: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

99/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Factorisation a gauche : exemple - 1

Les listes d’identificateur de Init :

listeIdent → IDENT | IDENT SEPVAR listeIdent

On factorise IDENT et on obtient :

listeIdent → IDENT suiteListeIdentsuiteListeIdent → ε | SEPVAR listeIdent

Mirabelle Nebut Analyse descendante LL(k)

Page 100: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

100/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Factorisation a gauche : exemple - 2

X → ab | abbX | abbbX

Factorisation de ab : on prend le plus grand prefixe commun.X → abYY → ε | bX | bbX

Puis a nouveau factorisation de b.

Mirabelle Nebut Analyse descendante LL(k)

Page 101: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

101/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Factorisation a gauche - algorithme

On remplace les regles de la forme :

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

ou

I α ∈ (VT ∪ VN)+ et βi , γj ∈ (VT ∪ VN)∗ ;

I le prefixe commun α est choisi le plus grand possible ;

I α n’est pas prefixe de γj .

par les regles :

X → αX ′ | γ1 | . . . | γmX ′ → β1 | . . . |βn

ou X ′ est un nouveau non-terminal.On reitere ce processus tant que necessaire.

Mirabelle Nebut Analyse descendante LL(k)

Page 102: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

102/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 103: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

103/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Suppression de la recursivite a gauche

Recursivite gauche :

I immediate : production A→Aα, α ∈ (VT ∪ VN)+ ;

I generale : il existe une derivation A⇒∗Aα, α ∈ (VT ∪ VN)+.

Il est possible de supprimer les deux cas.

On ne verra que la recursivite immediate.

Mirabelle Nebut Analyse descendante LL(k)

Page 104: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

104/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Suppression de la recursivite gauche immediate

On remplace les regles de la forme

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

ou

I αi ∈ (VT ∪ VN)+ et βj ∈ (VT ∪ VN)∗ ;

I les βj ne commencent pas par X .

par les regles :

X → β1X′ | . . . |βmX ′

X ′ → α1X′ | . . . |αnX

′ | ε

ou X ′ est un nouveau non-terminal.

Mirabelle Nebut Analyse descendante LL(k)

Page 105: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

105/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Suppression de la recursivite gauche : exemple

Grammaire non ambiguedes expressions arithmetiques :

E → E + T |TT → T ∗ F |FF → i | (E )

X → Xα1 | . . . |Xαn

|β1 | . . . |βm

Apres suppression de la recgauche :

E → TE ′

E ′ → +TE ′ | εT → FT ′

T ′ → ∗FT ′ | εF → i | (E )

X → β1X′ | . . . |βmX ′

X ′ → α1X′ | . . . |αnX

′ | ε

Mirabelle Nebut Analyse descendante LL(k)

Page 106: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

106/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Parfois ca ne suffit pas

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

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

I n’est pas ambigue ;

I n’est pas recursive gauche ;

I est factorisee a gauche ;

mais elle n’est pas LL(1).

Mirabelle Nebut Analyse descendante LL(k)

Page 107: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

107/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Factorisation a gaucheSuppression de la recursivite a gauche

Au dela 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).

Mirabelle Nebut Analyse descendante LL(k)

Page 108: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

108/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Principes

Analyseur recursif

Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse

Caracterisation d’une grammaire LL(1)

Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche

Analyseurs LL(k), LL(*)

Mirabelle Nebut Analyse descendante LL(k)

Page 109: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

109/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Grammaires LL(k), exemple

La grammaire :

declaration → DECLINT listeIdent FININSTRlisteIdent → IDENT | IDENT SEPVAR listeIdent

n’est pas LL(1).

Elle est LL(2), et acceptee par un analyseur LL(k).

En regardant 2 symboles sous la tete de lecture :

I si IDENT FININSTR : choisir listeIdent → IDENT

I si IDENT SEPVAR : choisir listeIdent → IDENT SEPVARlisteIdent

Mirabelle Nebut Analyse descendante LL(k)

Page 110: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

110/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Grammaire LL(k), autre exemple

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

Cette grammaire est LL(2) :Premier2(A) = {ab}Premier2(B) = {ab, aa, b}Suivant2(A) = {aa,#}

Mirabelle Nebut Analyse descendante LL(k)

Page 111: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

111/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Table d’analyse LL(2)

A→ abB | εB → Aaa | b

aa ab b #

A A→ ε A→ abB erreur A→ ε

B B → Aaa B → Aaa B → b erreur

Mirabelle Nebut Analyse descendante LL(k)

Page 112: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

112/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyseurs LL(k), principe

Effectuent une prediction basee sur k symboles.

k borne.

Ex : javaCC

Mirabelle Nebut Analyse descendante LL(k)

Page 113: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

113/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Insuffisance de l’approche LL(k), [antLR]

method → type ID [ args ] ;

| type ID [ args ] { body }args → unarg | unarg , argsunarg → INT ID

. . .

Cette grammaire n’est pas LL(k), mais est acceptee par antLR.

Mirabelle Nebut Analyse descendante LL(k)

Page 114: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

114/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Analyseurs LL(*)

Ne fixent pas une taille de look-ahead a priori.

Representent par un AFD le langage de look-ahead, pourvu qu’ilsoit regulier.

Mirabelle Nebut Analyse descendante LL(k)

Page 115: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

115/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Vers les formes eBNF

Meme un analyseur LL(*) refuse la recursivite gauche.

Facheux pour les grammaires a operateurs !

Solution : grammaires dites en forme eBNF.

E → T ( + T ) *T → F ( * T ) *F → ( E ) | id

E → E + T | TT → F * T | FF → ( E ) | id

Mirabelle Nebut Analyse descendante LL(k)

Page 116: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

116/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Grammaires sous forme eBNF

Grammaires algebriques avec facilites d’ecriture.

En partie droite de production : operateurs a la expression reguliere

Refuse par Cup et tout generateur de parseur n’acceptant pas leseBNF

Accepte par la majorite des analyeurs LL(k).

Semble plus simple, attention a l’attribution.

Ne pas utiliser en DS sauf si explicitement demande.

Mirabelle Nebut Analyse descendante LL(k)

Page 117: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

117/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Grammaires non LL(*) [antLR]

s : label ID ’=’ expr

| label ’return’ expr

;

label : ID ’:’ label

|

;

n’est pas LL(*) : [fatal] rule s has non-LL(*) decision

due to recursive rule invocations from alts 1,2.

[...]

Version LL(*) :

label : ( ID ’:’)*

Mirabelle Nebut Analyse descendante LL(k)

Page 118: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

118/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Generation de code a la eBNF

E → T ( + T ) *

E() {

T();

tant que tetelect est ’+’ {

consommer(+);

T();

}

}

Cloture de Kleene ⇒ iteration dans le code

Mirabelle Nebut Analyse descendante LL(k)

Page 119: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

119/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

Generation de code a la eBNF

listeA → a*

listeA() {

tant que tetelect est ’a’ {

consommer(a);

}

}

plus efficace que le code recursif genere par :listeA → a listeA | ε

Mirabelle Nebut Analyse descendante LL(k)

Page 120: Analyse descendante LL(k) - FIL Lille 1nebut/portail/compilS5/fichiers/cours/anDesc/...Construction de la table d’analyse Caract erisation d’une grammaire LL(1) Quand une grammaire

120/119

PrincipesAnalyseur recursif

Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)

Analyseurs LL(k), LL(*)

AntLR

Outil tres riche.

Decrit dans le meme formalisme eBNF les entites lexicales et lasyntaxe.

Lit toute l’entree avant de lancer l’analyse lexicale.

Mirabelle Nebut Analyse descendante LL(k)