Compilation

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 120

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest 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)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
2/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Objectif du cours

Comprendre le fonctionnement des gnrateurs de parser e e descendants : LL(1), ex antLR V1 LL(k), ex javaCC LL(*), ex antLR V3

3/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Analyse descendante

Lautomate ` pile sous-jacent : a eectue uniquement des lectures et des expansions ; construit un arbre en ordre prxe (idem aut. items) ; e part de laxiome (idem aut. items) ; construit une drivation gauche (idem aut. items). e

4/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Dirence avec lautomate des items e

Deux dirences fondamentales : e analyse dterministe dite prdictive ; e e plus ditems ni de rductions explicites. e

5/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Analyse dterministe e

` A chaque expansion lanalyseur sait choisir une production. Il ne revient jamais sur ce choix : en cas de succ`s le mot appartient au langage ; e en cas dchec on est sr que mot nappartient pas au langage. e u

6/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Analyse prdictive e

Lanalyseur prdit quelle production utiliser. . . e . . . en analysant les k prochains symboles sous la tte de lecture. e Consquences : e ne fonctionne quavec certaines grammaires, dites LL(k) ; tte de lecture toujours dnie : marqueur de n de mot #. e e NB : dans ce cours techniques pour k=1, on regarde uniquement la tte de lecture. e
7/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Se passer des items


Rappel : item de la forme [X ] : X est en cours de reconnaissance ; a dj` t reconnu ; eae e il reste ` reconna , le futur de litem a tre Un analyseur LL : ne mmorise pas quil est en train de reconna X ; e tre ne mmorise pas quil a reconnu ; e consid`re uniquement . e
8/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Se passer des items : consquences e


Plus besoin daxiome supplmentaire. e Dans la pile : plus ditems mais des mots tendus : mots de (VN VT ) ; e lalphabet est VN VT ; le symbole de pile initiale est laxiome. A b B une pile

S pile initiale

pile vide (acceptation)


9/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Exemple ` suivre dans le cours a

Soit la grammaire G = {VT , VN , S, P} avec : VT = {a, b, d, e} ; VN = {S, A, B, D} ; P contient les productions : S AB | Da A aAb | B bB | D dD | e

10/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Exemple - les piles pour abb#


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

a A A A b b b S B B B B abb# abb# abb# bb# bb# (1) (2) (3) (4) (5)

B b# (6)

b B b# (7)

B # (8)

# (9)

Comparer avec lautomates des items ! Drivation gauche, arbre en ordre prxe. e e
11/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Gnralisation e e

La conguration initiale est (m#, S) ; La conguration nale est (#, ) : acceptation par pile vide. On traite systmatiquement le sommet de pile. e

12/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Transition de lecture

Si le sommet de pile est un terminal a VT : on contrle que a est bien sous la tte de lecture (sinon o e chec) ; e on le consomme ; on le dpile. e Lecture de a : (am, z1 . . . zn a) (m, z1 . . . zn )

13/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Transition dexpansion
Si le sommet de pile est un non terminal X VN . . . . . . et que la tte de lecture est y VT {#}. . . e si Table[X , y ] contient X X1 . . . Xn : on dpile X ; e on empile ` sa place X1 . . . Xn , avec X1 au sommet. a (m, z1 . . . zn X ) sinon erreur.
14/119

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

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Transition dexpansion : remarque

Expansion par X X1 . . . Xn : (m, z1 . . . zn X ) X1 sera trait en premier. e on assure ainsi la construction dune drivation gauche ; e (m, z1 . . . zn Xn . . . X1 )

15/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Construction de larbre syntaxique : ordre prxe e


Transition dexpansion par X X1 . . . Xn : X est le prochain lordre prxe) ; e nud ` traiter dans larbre (pour a

on lui rajoute les ls X1 . . . Xn de la gauche vers la droite ; le prochain nud ` traiter devient X1 . a Transition de a-lecture : a est le prochain prxe) ; e nud ` traiter dans larbre (pour lordre a

on vrie que a concorde bien avec la tte de lecture ; e e et on passe au nud suivant.
16/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Mise en uvre

Les outils nimplantent pas un automate ` pile. a Ils utilisent une implmentation rcursive. e e Dans tous les cas, le choix de lexpansion est indiqu par une table e danalyse.

17/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Table danalyse - exemple

a b d e #

S S AB S AB S Da S Da S AB

A A aAb A erreur erreur A

B erreur B bB erreur erreur B

D erreur erreur D dD De erreur

18/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Table danalyse LL(1)

Contient toute lintelligence de lanalyseur syntaxique.

Denition
La table danalyse Table est un tableau ` deux dimensions tel que : a chaque colonne est indice par un non-terminal VN ; e chaque ligne est indice par un terminal VT ou # ; e chaque case contient une production P ou erreur. On verra plus tard comment remplir cette table.
19/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Interprtation de Table[a, X ] e

si le terminal a VT est sous la tte de lecture ; e et si le non-terminal en cours de traitement est X VN ; alors on consulte Table[a, X ]. Si Table[X , a] contient X alors on choisit une expansion par cette production ; erreur alors erreur de syntaxe : X et a ne saccordent pas.

20/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
21/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Analyseur descendant rcursif e


Principe : analyseur LL cod par un ensemble de fonctions ; e ces fonctions sappellent les unes les autres ; nutilise pas de pile explicite : pile implicite des appels. Codage des fonctions : une fonction X() par non-terminal X VN de la grammaire ; X() reconna un mot engendr par X ; t e la fonction X() code les productions Table[X , y ] de la table danalyse, pour tout y VT #.
22/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Exemple
Ecrire un analyseur syntaxique rcursif LL(1) Parser pour G : e S AB | Da A aAb | B bB | D dD | e ` A voir : criture de S(), A(), B(), D() ; e collaboration avec un analyseur lexical.
23/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Collaboration avec un analyseur lexical


On reprend les conventions utilises en TP : e un an. lexical anLex de type Scanner (suppos donn) ; e e symboles de type Symbole ; codage entier du type des symboles dans TypeSymboles (not TS dans les transparents) ; e mthode int getType() de Symbole pour obtenir ce type ; e mthode Symbole next token() de Scanner : e
avance la tte de lecture teteLect ; e retourne le symbole lu, de type Symbole.

on remplace le marqueur # par TS.EOF.


24/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Construction de lanalyseur syntaxique


... public class Parser { // analyseur lexical private Scanner anLex; // symbole courant reu de lanalyseur lexical c private Symbole teteLect; public Parser (Scanner anLex) { this.anLex = anLex; } ...
Mirabelle Nebut Analyse descendante LL(k)
25/119

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Lancement de lanalyseur 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 laxiome // et uniquement laxiome if (this.teteLect.getType() != TS.EOF) throw new ParserException(); }
Mirabelle Nebut Analyse descendante LL(k)
26/119

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code de S()
La tte de lecture est dj` positionne sur le symbole de prdiction. e ea e e
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(); 27/119 }
Mirabelle Nebut Analyse descendante LL(k)

a b d e #

S S AB S AB S Da S Da S AB

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code de S()
On factorise. 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(); }
28/119

a b d e #

S S AB S AB S Da S Da S AB

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code des productions de S()

Code pour S AB : je veux reconna A puis B ; tre A() ; B() ; Code pour S Da : je veux reconna D. . . tre . . . puis vrier que a est bien sous la tte de lecture ; e e et consommer a.

29/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Terminaux : vrication et consommation e


Mthode consommer ddie ` la gestion des terminaux : e e e a 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/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code nal de S()


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

a b d e #

S S AB S AB S Da S Da S AB

Quand S() termine, pour un mot accept, la tte de lecture est sur e e TS.EOF.
31/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code de A()

La tte de lecture est dj` positionne sur le symbole de prdiction. e ea e e A A aAb A erreur 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(); }
32/119

a b d e #

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest 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 :

le mot vide est immdiatement reconnu ; e sans toucher ` la tte de lecture ; a e on ne fait rien.

33/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code nal de A()

a b d e #

A A aAb A erreur 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 accept, la tte de lecture est e e positionne pour reconna un B ou lire un b. e tre
34/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code nal de B()

a b d e #

B erreur B bB erreur 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(); }

35/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Code nal de D()

a b d e #

D erreur erreur D dD De 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(); }

36/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Exemple dexcution e

Reconna abb# ? tre

37/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
38/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
39/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Outils pour lanalyse prdictive, intuition - 1 e

Comment choisir entre S AB et S Da ? Supposons que je sache que : AB ne permet de driver que des mots prxs par a ou par b ; e e e AB au et AB bu, pour u VT ; Da ne permet de driver que des mots prxs par d ou par e ; e e e Da du et Da eu, pour u VT .

40/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Outils pour lanalyse prdictive, intuition - 1 e


Maintenant je sais (partiellement) choisir entre S AB et S Da : si tte lecture {a, b} : choisir S AB ; e si tte lecture {d, e} : choisir S Da. e S S AB S AB S Da S Da ?
41/119

a b d e #
Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Ensemble Premier - dnition e


On dit que Premier (AB) = {a, b} et Premier (Da) = {d, e}. Pour (VT VN )+ , Premier () contient lensemble des terminaux de VT susceptibles de commencer un mot de VT + driv de . e e Si = , cet ensemble est vide.

Denition
Soit une grammaire algbrique. On dnit : e e Premier : (VT VN ) P(VT ) {a VT | au, u VT }
42/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Les Premier sur les arbres syntaxiques


S A A a S D D d a e
Mirabelle Nebut

S B A B B A

S B

b S D a

(VT VN )

Premier ()
Analyse descendante LL(k)

43/119

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Premier - 0


Soit (VN VT ) : cas = :? = a, a VT : ? = a, a VT , (VN VT ) : ? = X , X VN : fcas
44/119

? ?

= X , X VN , (VN VT ) :

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Premier - 1


Soit (VN VT ) : cas = : = a, a VT : {a} = a, a VT , (VN VT ) : {a} = X , X VN : fcas
45/119

? ?

= X , X VN , (VN VT ) :

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul de Premier (X ), X VN
Si lensemble des productions de membre gauche S est : S AB | Da alors on a : Premier (S) = Premier (AB) Premier (Da) Cas gnral : Si la grammaire contient les productions de membre e e gauche X : X 1 | . . . | n alorsPremier (X ) = {Premier (i ) | X i P}
Analyse descendante LL(k)
46/119

Mirabelle Nebut

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Premier - 2


Soit (VN VT ) : cas = : = a, a VT : {a} = a, a VT , (VN VT ) : {a} = X , X VN : fcas
47/119

{Premier (i ) | X i P} ?

= X , X VN , (VN VT ) :

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Premier , = X , X VN

Deux cas selon que X peut

seacer X ?

ou non :

Si X

on dit que X est -productif : X -Prod

48/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Premier , = X , X -Prod - exemple

Par exemple D -productif : D dD | e alors Premier (Da) = Premier (D)

S D D d a e D

Donc, si X -Prod, Premier (X ) = Premier (X )

49/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Premier , = X , X -Prod - exemple


Par exemple A -productif : A | aAb
A S B A S B B b b

Premier (AB) = Premier (A) Premier (B) Premier (ABS) = Premier (A) Premier (BS) Donc, si X

A a

alors Premier (X ) = Premier (X ) Premier ()


50/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

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)
51/119

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul eectif des ensembles Premier

On proc`de en deux tapes : e e 1. on pose un syst`me dquations pour Premier ; e e 2. on calcule par itration de point xe les plus petits ensembles e qui satisfont ces quations. e Pour le moment on suppose donn -Prod, lensemble des e -productifs.

52/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple
S AB | Da A 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 ()
53/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple
Premier (S) = Premier (A) Premier (B) Premier (D) Premier (A) = {a} Premier (B) = {b} Premier (D) = {d, e} Do` u Premier (S) = {a, b, d, e} Premier (A) = {a} Premier (B) = {b} Premier (D) = {d, e} Premier (AB) = {a, b} Premier (Da) = {d, e} Premier (aAb) = {a} Premier (bB) = {b} Premier (dD) = {d} Premier (e) = {e} Premier ( ) =
54/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple : remplissage de la table


A aAb et Premier (aAb) = {a} A et Premier ( ) = S S AB S AB S Da S Da S AB A A aAb A erreur erreur A B erreur B bB erreur erreur B D erreur erreur D dD De erreur
55/119

a b d e #

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple : remplissage de la table


S AB et Premier (AB) = {a, b} S Da et Premier (Da) = {d, e} S S AB S AB S Da S Da S AB A A aAb A erreur erreur A B erreur B bB erreur erreur B D erreur erreur D dD De erreur
56/119

a b d e #

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Remarque : rsolution du syst`me e e

Premier (S) = Premier (A) Premier (B) Premier (D) Premier (A) = {a} Premier (B) = {b} Premier (D) = {d, e} Se rsoud sans itration de point xe : syst`me dquations non e e e e rcursif. e Ce nest pas toujours le cas.

57/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Rsolution du syst`me : autre exemple e e


S S1 S2 | a S1 S | b S2 c iter 0 1 2 3 Premier (S) {a} {a, b} {a, b} Premier (S1 ) {b} {b, a} {b, a} Premier (S) = Premier (S1 ) {a} Premier (S1 ) = Premier (S) {b} Premier (S2 ) = {c} Premier (S2 ) {c} {c} {c}

stabilisation
58/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
59/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Dnition des -prod e


Denition
Un non terminal X VN est dit -productif si X . Lensemble des -productif est -Prod. X est -productif si la grammaire contient la production : X ; ou X Y1 Y2 . . . Yn telle que lensemble des non-terminaux {Y1 , Y2 , . . . , Yn } VN ne contient que des non-terminaux -productifs. Algorithme de calcul similaire ` celui qui calcule les productifs. a
60/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple

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

61/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
62/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Outils pour lanalyse prdictive, intuition - 2 e

Pour choisir entre S AB et S Da : si tte lecture {a, b} : choisir S AB ; e si tte lecture {d, e} : choisir S Da. e Et si la tte de lecture est # ? # Premier (AB) Premier (Da). e Comment choisir entre A aAb et A ? Premier ( ) = les ensembles Premier ne susent pas.
63/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Ensembles Suivant, intuition


Quand appliquer A ? Quand la tte de lect. correspond ` un terminal qui peut suivre A. e a
A A A S B

b Suivant(A)

Suivant(A) Premier (B)


64/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Ensembles Suivant, intuition


On a donc b Suivant(A) A A aAb A ? ? ?

a b d e #

65/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Ensembles Suivant, intuition

Pour (VT VN )+ , Suivant() contient lensemble des terminaux de VT susceptibles de suivre dans un mot de VT + driv de laxiome S. e e Si = , cet ensemble est vide. Par convention, Suivant(S) {#}.

66/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Ensembles Suivant, dnitions quivalentes e e


Denition
Soit une grammaire algbrique daxiome S. On dnit : e e Suivant : (VT VN ) P(VT ) {a VT | S a, pour , (VN VT ) }

Denition
Suivant : (VT VN ) P(VT ) {a Premier () | S , pour , (VN VT ) }
67/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant - 1


Pour calculer Suivant(X ), on regarde les productions dans lesquelles X appara en partie droite (dirent du calcul des t e Premier ). Pour Suivant(A) : A aAb
A A A

S AB
S B

b
68/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant - 2

Soit PX P lensemble des productions p dans lesquelles X appara en partie droite : t Suivant(X ) =
pPX

Suivant p (X )

Ex : PA = {S AB, A aAb} Suivant(A) = Suivant(A)SAB Suivant(A)AaAb

69/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant, cas de laxiome

Pour laxiome, on ajoute le marqueur de n de mot : Suivant(S) = {#} Ex : pour X aXb | PX = {X aX b} Suivant(X ) = {#} Suivant(X )X aX b
pPS

Suivant p (S)

70/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant - 3 - exemple


Suivant(A)SAB ? (exemple prcdent) e e Cas dj` vu : ea
S A B

Suivant(A) Premier (B)


71/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant - 3 - exemple


Suivant(A)SAB ? (exemple prcdent) e e mais B est -Prod !
S A B

Suivant(A) Suivant(S)
72/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant - 3 - exemple

Puisque B est -Prod : Suivant(A)SAB = Premier (B) Suivant(S)

73/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant - 4


Quand une production est de la forme . . . X : pour calculer Suivant(X ) ; Il faut pouvoir dire si (VN VT ) est -productif ou pas.

Denition
(VN VT ) est -productif si . On dnit la fonction : e Eps : (VN VT ) {vrai, faux} est -productif On verra apr`s comment calculer Eps. e
74/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

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}.


75/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant - 6


Pour calculer Suivant p (X ) avec : p = Y X
Y

Suivant p (X ) = Suivant(Y )
76/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

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)SAB = Premier (B) Suivant(S).


77/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Remarque - 1

Si X appara plusieurs fois en partie droite dune production, il t 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}

78/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Remarque - 2

Pourquoi pas Suivant(X )Y X = Premier () Suivant() ? Parce que Suivant(Y ) Suivant(). Ex : S Y |Z Y X1 X2 X1 a X2 | b Z X2 c Suivant(S) = {#} Suivant(Y ) = Suivant(S) = {#} Suivant(Z ) = Suivant(S) = {#} Suivant(X2 ) = {c} Suivant(Y ) = {c, #} Suivant(X1 ) = Premier (X2 ) Suivant(Y )
79/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des Suivant, rcapitulons ! e


# Suivant(axiome) Soit PX P lensemble des productions p dans lesquelles X appara en partie droite : t Suivant(X ) =
pPX

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 ) ncas
80/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul eectif des ensembles Suivant

On proc`de en deux tapes : e e on pose un syst`me dquations pour Suivant ; e e on calcule par itration de point xe les plus petits ensembles e qui satisfont ces quations. e avec initialement Suivant(S) = {#}, et pour les autres non-terminaux Suivant(X ) = .

81/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple
S AB | Da A aAb | B bB | D dD | e Eps(B) = vrai Suivant ? # Suivant(axiome) Suivant(X ) = avec : cas p= p= p= ncas
82/119

pPX

Suivant p (X )

Suivant p (X ) = Y X : Suivant(Y ) Y X et Eps() = faux : Premier () Y X et Eps() = vrai : Premier () Suivant(Y )

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple de remplissage de table


A et Suivant(A) = {b, #} S S AB S AB S Da S Da S AB A A aAb A erreur erreur A B erreur B bB erreur erreur B D erreur erreur D dD De erreur

a b d e #

83/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple de remplissage de table


S AB et Suivant(S) = {#} S S AB S AB S Da S Da S AB A A aAb A erreur erreur A B erreur B bB erreur erreur B D erreur erreur D dD De erreur

a b d e #

84/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Calcul des -productifs


On conna dj` -Prod, ens. des non-terminaux -productifs. t e a Pour calculer Eps() : Eps() = cas = : vrai = X1 . . . Xn , n 1 avec {X1 , . . . , Xn } VN et {X1 , . . . , Xn } -Prod : vrai autre : faux // contient un terminal ncas
85/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple

Sachant que -Prod = {A, B, S} : Eps(Da) ? Eps(AB) ? Eps( ) ? Eps(B) ?

86/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
87/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Table danalyse : au pralable e

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

88/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Remplissage de la table
Entre : une gram. alg. G , ses ensembles Premier et Suivant e Sortie : la table danalyse Table pour toute production X P faire pour tout a Premier () faire ajouter X ` Table[X , a] fait a si Eps() = vrai alors pour tout b Suivant(X ) faire Table[X , b] = X fait finsi fait Ajouter erreur dans les entres de Table restes vides e e
89/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple
S AB : Premier (AB) = {a, b} ; Eps(AB) = vrai ; Suivant(S) = {#}. S Da : Premier (Da) = {d, e} ; Eps(Da) = faux. Rien ` complter par erreur. a e
90/119

a b d e #

S S AB S AB S Da S Da S AB

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse

Exemple
A aAb : Premier (aAb) = {a} ; Eps(aAb) = faux. A : Premier ( ) = ; Eps( ) = vrai ; Suivant(A) = {b, #}. On compl`te par erreur. e
91/119

a b d e #

A A aAb A erreur erreur A

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
92/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Analyseur LL(1)
Un analyseur LL(1) est dterministe et pilot par le sommet de e e pile : si terminal a : lecture de a (ou erreur) ; si non terminal X avec a sous la tte de lecture : expansion e selon Table[X , a]. Et si Table[X , a] contient plus dune production ? Non-dterminisme : e la grammaire nest pas LL(1) ; on ne peut pas appliquer une analyse LL(1).
93/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Caractrisation dune grammaire LL(1) e


Caractrisation par table danalyse : une grammaire est LL(1) si e chaque case contient exactement une production ou erreur. Caractrisation par contre-exemple : une grammaire nest pas e LL(1) sil existe 2 productions X et X telles que : 1. soit Premier () Premier () = ; Ex : S aS | A, A a 2. soit Eps() = vrai et Premier () Suivant(X ) = ; Ex : S aS | Ab, A | b 3. soit Eps() = vrai et Eps() = vrai (la grammaire est ambigu) e Ex : S A | B, A , B
94/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

LL(1) et ambigu e t

Une grammaire LL(1) nest pas ambigu. e Une grammaire ambigu nest pas LL(1). e

95/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Cas classiques non LL(1)


Dans les cas suivants, la grammaire nest pas LL(1) : ambigu e ; t rcursivit gauche : A Aa | ; e e
intuitivement rcursivit innie de A(). e e

non factorisation gauche : S aA | aB Solutions : : factorisation ` gauche (parfois) ; a suppression de la rcursivit gauche (parfois) ; e e utiliser un gnrateur de parser plus puissant ! e e
96/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
97/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
98/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Factorisation ` gauche : exemple - 1 a

Les listes didenticateur de Init : listeIdent IDENT | IDENT SEPVAR listeIdent On factorise IDENT et on obtient : listeIdent IDENT suiteListeIdent suiteListeIdent | SEPVAR listeIdent

99/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Factorisation ` gauche : exemple - 2 a

X ab | abbX | abbbX Factorisation de ab : on prend le plus grand prxe commun. e X abY Y | bX | bbX Puis ` nouveau factorisation de b. a

100/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Factorisation ` gauche - algorithme a


On remplace les r`gles de la forme : e X 1 | . . . | n | 1 | . . . | m o` u (VT VN )+ et i , j (VT VN ) ; le prxe commun est choisi le plus grand possible ; e nest pas prxe de j . e par les r`gles : e X X | 1 | . . . | m X 1 | . . . | n o` X est un nouveau non-terminal. u On rit`re ce processus tant que ncessaire. e e e
Mirabelle Nebut Analyse descendante LL(k)
101/119

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
102/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Suppression de la rcursivit ` gauche e ea

Rcursivit gauche : e e immdiate : production AA, (VT VN )+ ; e gnrale : il existe une drivation A A, (VT VN )+ . e e e Il est possible de supprimer les deux cas. On ne verra que la rcursivit immdiate. e e e

103/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Suppression de la rcursivit gauche immdiate e e e


On remplace les r`gles de la forme e X X 1 | . . . | X n | 1 | . . . | m o` u i (VT VN )+ et j (VT VN ) ; les j ne commencent pas par X . par les r`gles : e X 1 X | . . . | m X X 1 X | . . . | n X | o` X est un nouveau non-terminal. u
Mirabelle Nebut Analyse descendante LL(k)
104/119

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Suppression de la rcursivit gauche : exemple e e


Apr`s suppression e gauche : E E T T F TE +TE | FT FT | i | (E ) de la rec

Grammaire non ambigu e des expressions arithmtiques : e E E + T |T T T F |F F i | (E ) X X 1 | . . . | X n | 1 | . . . | m

X 1 X | . . . | m X X 1 X | . . . | n X |
105/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Parfois a ne sut pas c

La grammaire ({a, b}, {S, A}, S, P) avec P = {S aSb | A, A aA | } nest pas ambigu ; e nest pas rcursive gauche ; e est factorise ` gauche ; e a mais elle nest pas LL(1).

106/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea

Au del` des grammaires LL(1) - 1 a

La grammaire ({a, b}, {A, B}, A, P) avec P = {A abB | , B Aaa | b} nest pas LL(1). En eet Eps(A) = vrai et a Premier (A) Suivant(A).

107/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Principes Analyseur rcursif e Construction de la table danalyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Factorisation ` gauche a Suppression de la rcursivit ` gauche e ea Analyseurs LL(k), LL(*)
108/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Grammaires LL(k), exemple


La grammaire : declaration DECLINT listeIdent FININSTR listeIdent IDENT | IDENT SEPVAR listeIdent nest pas LL(1). Elle est LL(2), et accepte par un analyseur LL(k). e En regardant 2 symboles sous la tte de lecture : e si IDENT FININSTR : choisir listeIdent IDENT si IDENT SEPVAR : choisir listeIdent IDENT SEPVAR listeIdent
109/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Grammaire LL(k), autre exemple

P = {A abB | , B Aaa | b} Cette grammaire est LL(2) : Premier 2 (A) = {ab} Premier 2 (B) = {ab, aa, b} Suivant 2 (A) = {aa, #}

110/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Table danalyse LL(2)

A abB | B Aaa | b aa A B Aaa ab A abB B Aaa b erreur Bb # A erreur

A B

111/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Analyseurs LL(k), principe

Eectuent une prdiction base sur k symboles. e e k born. e Ex : javaCC

112/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Insusance de lapproche LL(k), [antLR]

method type ID [ args ] ; | type ID [ args ] { body } args unarg | unarg , args unarg INT ID ... Cette grammaire nest pas LL(k), mais est accepte par antLR. e

113/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Analyseurs LL(*)

Ne xent pas une taille de look-ahead a priori. Reprsentent par un AFD le langage de look-ahead, pourvu quil e soit rgulier. e

114/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Vers les formes eBNF

Mme un analyseur LL(*) refuse la rcursivit gauche. e e e Fcheux pour les grammaires ` oprateurs ! a a e Solution : grammaires dites en forme eBNF. E T ( + T) * T F ( * T) * F ( E ) | id E E +T | T T F *T | F F ( E ) | id

115/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Grammaires sous forme eBNF

Grammaires algbriques avec facilits dcriture. e e e En partie droite de production : oprateurs ` la expression rguli`re e a e e Refus par Cup et tout gnrateur de parseur nacceptant pas les e e e eBNF Accept par la majorit des analyeurs LL(k). e e Semble plus simple, attention ` lattribution. a Ne pas utiliser en DS sauf si explicitement demand. e
116/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Grammaires non LL(*) [antLR]


s : label ID = expr | label return expr ; label : ID : label | ; nest 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)
117/119

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Gnration de code ` la eBNF e e a


E T ( + T) * E() { T(); tant que tetelect est + { consommer(+); T(); } } Clture de Kleene itration dans le code o e
118/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

Gnration de code ` la eBNF e e a


listeA a* listeA() { tant que tetelect est a { consommer(a); } } plus ecace que le code rcursif gnr par : e e ee listeA a listeA |
119/119

Mirabelle Nebut

Analyse descendante LL(k)

Principes Analyseur rcursif e Construction de la table danalyse Caractrisation dune grammaire LL(1) e Quand une grammaire nest pas LL(1) Analyseurs LL(k), LL(*)

AntLR

Outil tr`s riche. e Dcrit dans le mme formalisme eBNF les entits lexicales et la e e e syntaxe. Lit toute lentre avant de lancer lanalyse lexicale. e

120/119

Mirabelle Nebut

Analyse descendante LL(k)

Vous aimerez peut-être aussi