0% ont trouvé ce document utile (0 vote)
59 vues120 pages

Compilation

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1/ 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