Analyse descendante LL(k) Objectif du cours Analyse ...
Transcript of Analyse descendante LL(k) Objectif du cours Analyse ...
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyse descendante LL(k)
Mirabelle Nebut
Bureau 203 - M3 extensionmirabelle.nebut at lifl.fr
2012-2013
Mirabelle Nebut Analyse descendante LL(k)
2/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
3/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Objectif du cours
Comprendre le fonctionnement des generateurs de parserdescendants :
I LL(1), ex antLR V1
I LL(k), ex javaCC
I LL(*), ex antLR V3
Mirabelle Nebut Analyse descendante LL(k)
4/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyse descendante
L’automate a pile sous-jacent :
I effectue uniquement des lectures et des expansions ;
I construit un arbre en ordre prefixe (idem aut. items) ;
I � part � de l’axiome (idem aut. items) ;
I construit une derivation gauche (idem aut. items).
Mirabelle Nebut Analyse descendante LL(k)
5/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Difference avec l’automate des items
Deux differences fondamentales :
I analyse deterministe dite predictive ;
I plus d’items ni de reductions explicites.
Mirabelle Nebut Analyse descendante LL(k)
6/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyse deterministe
A chaque expansion l’analyseur sait choisir une production.
Il ne revient jamais sur ce choix :
I en cas de succes le mot appartient au langage ;
I en cas d’echec on est sur que mot n’appartient pas au langage.
Mirabelle Nebut Analyse descendante LL(k)
7/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyse predictive
L’analyseur ”predit” quelle production utiliser. . .
. . . en analysant les k prochains symboles sous la tete de lecture.
Consequences :
I ne fonctionne qu’avec certaines grammaires, dites LL(k) ;
I tete de lecture toujours definie : marqueur de fin de mot #.
NB : dans ce cours techniques pour k=1, on regarde uniquement latete de lecture.
Mirabelle Nebut Analyse descendante LL(k)
8/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Se passer des items
Rappel : item de la forme [X → α • β] :
I X est en cours de reconnaissance ;
I α a deja ete reconnu ;
I il reste a reconnaıtre β, le futur de l’item
Un analyseur LL :
I ne memorise pas qu’il est en train de reconnaıtre X ;
I ne memorise pas qu’il a reconnu α ;
I considere uniquement β.
Mirabelle Nebut Analyse descendante LL(k)
9/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Se passer des items : consequences
Plus besoin d’axiome supplementaire.
Dans la pile :
I plus d’items mais des mots etendus : mots de (VN ∪ VT )∗ ;
I l’alphabet est VN ∪ VT ;
I le symbole de pile initiale est l’axiome.
Spile initiale
AbB
une pile pile vide (acceptation)
Mirabelle Nebut Analyse descendante LL(k)
10/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Exemple a suivre dans le cours
Soit la grammaire G = {VT ,VN ,S ,P} avec :
I VT = {a, b, d , e} ;
I VN = {S ,A,B,D} ;
I P contient les productions :
S → AB | DaA → aAb | εB → bB | εD → dD | e
Mirabelle Nebut Analyse descendante LL(k)
11/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Exemple - les piles pour abb#
S → AB | Da B → bB | εA → aAb | ε D → dD | e abb# ?
S
abb#(1)
AB
abb#(2)
aAbB
abb#(3)
AbB
bb#(4)
bB
bb#(5)
B
b#(6)
bB
b#(7)
B
#(8)
#(9)
Comparer avec l’automates des items !Derivation gauche, arbre en ordre prefixe.
Mirabelle Nebut Analyse descendante LL(k)
12/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Generalisation
I La configuration initiale est (m#, S) ;
I La configuration finale est (#, ) : acceptation par pile vide.
On traite systematiquement le sommet de pile.
Mirabelle Nebut Analyse descendante LL(k)
13/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Transition de lecture
Si le sommet de pile est un terminal a ∈ VT :
I on controle que a est bien sous la tete de lecture (sinonechec) ;
I on le consomme ;
I on le depile.
Lecture de a :
(am, z1 . . . zna) ` (m, z1 . . . zn)
Mirabelle Nebut Analyse descendante LL(k)
14/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Transition d’expansion
Si le sommet de pile est un non terminal X ∈ VN . . .
. . . et que la tete de lecture est y ∈ VT ∪ {#}. . .
si Table[X , y ] contient X → X1 . . .Xn :
I on depile X ;
I on empile a sa place X1 . . .Xn, avec X1 au sommet.
(m, z1 . . . znX ) ` (m, z1 . . . znXn . . .X1)
sinon erreur.
Mirabelle Nebut Analyse descendante LL(k)
15/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Transition d’expansion : remarque
Expansion par X → X1 . . .Xn :
(m, z1 . . . znX ) ` (m, z1 . . . znXn . . .X1)
I X1 sera traite en premier.
I on assure ainsi la construction d’une derivation gauche ;
Mirabelle Nebut Analyse descendante LL(k)
16/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Construction de l’arbre syntaxique : ordre prefixe
Transition d’expansion par X → X1 . . .Xn :
I X est le � prochain � nœud a traiter dans l’arbre (pourl’ordre prefixe) ;
I on lui rajoute les fils X1 . . .Xn de la gauche vers la droite ;
I le prochain nœud a traiter devient X1.
Transition de a-lecture :
I a est le � prochain � nœud a traiter dans l’arbre (pour l’ordreprefixe) ;
I on verifie que a concorde bien avec la tete de lecture ;
I et on passe au nœud suivant.
Mirabelle Nebut Analyse descendante LL(k)
17/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Mise en œuvre
Les outils n’implantent pas un automate a pile.
Ils utilisent une implementation recursive.
Dans tous les cas, le choix de l’expansion est indique par une tabled’analyse.
Mirabelle Nebut Analyse descendante LL(k)
18/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Table d’analyse - exemple
S A B D
a S → AB A→ aAb erreur erreur
b S → AB A→ ε B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D → e
# S → AB A→ ε B → ε erreur
Mirabelle Nebut Analyse descendante LL(k)
19/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Table d’analyse LL(1)
Contient toute l’intelligence de l’analyseur syntaxique.
DefinitionLa table d’analyse Table est un tableau a deux dimensions tel que :
I chaque colonne est indicee par un non-terminal ∈ VN ;
I chaque ligne est indicee par un terminal ∈ VT ou # ;
I chaque case contient une production ∈ P ou erreur.
On verra plus tard comment remplir cette table.
Mirabelle Nebut Analyse descendante LL(k)
20/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Interpretation de Table[a,X ]
I si le terminal a ∈ VT est sous la tete de lecture ;
I et si le non-terminal en cours de traitement est X ∈ VN ;
alors on consulte Table[a,X ].
Si Table[X , a] contient
I X → γ alors on choisit une expansion par cette production ;
I erreur alors erreur de syntaxe : X et a ne s’accordent pas.
Mirabelle Nebut Analyse descendante LL(k)
21/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
22/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyseur descendant recursif
Principe :
I analyseur LL code par un ensemble de fonctions ;
I ces fonctions s’appellent les unes les autres ;
I n’utilise pas de pile explicite : pile implicite des appels.
Codage des fonctions :
I une fonction X() par non-terminal X ∈ VN de la grammaire ;
I X() reconnaıt un mot engendre par X ;
I la fonction X() code les productions Table[X , y ] de la tabled’analyse, pour tout y ∈ VT ∪#.
Mirabelle Nebut Analyse descendante LL(k)
23/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Exemple
Ecrire un analyseur syntaxique recursif LL(1) Parser pour G :
S → AB | DaA → aAb | εB → bB | εD → dD | e
A voir :
I ecriture de S(), A(), B(), D() ;
I collaboration avec un analyseur lexical.
Mirabelle Nebut Analyse descendante LL(k)
24/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Collaboration avec un analyseur lexical
On reprend les conventions utilisees en TP :
I un an. lexical anLex de type Scanner (suppose donne) ;
I symboles de type Symbole ;
I codage entier du type des symboles dans TypeSymboles
(note TS dans les transparents) ;
I methode int getType() de Symbole pour obtenir ce type ;I methode Symbole next token() de Scanner :
I avance la tete de lecture teteLect ;I retourne le symbole lu, de type Symbole.
I on remplace le marqueur # par TS.EOF.
Mirabelle Nebut Analyse descendante LL(k)
25/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Construction de l’analyseur syntaxique
...
public class Parser {
// analyseur lexical
private Scanner anLex;
// symbole courant recu de l’analyseur lexical
private Symbole teteLect;
public Parser (Scanner anLex) {
this.anLex = anLex;
}
...
Mirabelle Nebut Analyse descendante LL(k)
26/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Lancement de l’analyseur syntaxique
Dans la classe Parser :
public void analyser() throws ScannerException, ParserException {
// positionnement tete de lecture
this.teteLect = (Symbole) this.anLex.next_token();
this.S(); // je veux reconnaıtre l’axiome
// et uniquement l’axiome
if (this.teteLect.getType() != TS.EOF)
throw new ParserException();
}
Mirabelle Nebut Analyse descendante LL(k)
27/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code de S()
La tete de lecture est deja positionnee sur le symbole de prediction.
S
a S → AB
b S → AB
d S → Da
e S → Da
# S → AB
private void S() throws ... {
if (this.teteLect.getType() == TS.a)
... // S -> AB
else if (this.teteLect.getType() == TS.b)
... // S -> AB
else if (this.teteLect.getType() == TS.d)
... // S -> Da
else if (this.teteLect.getType() == TS.e)
... // S -> Da
else if (this.teteLect.getType() == TS.EOF)
... // S -> AB
else throw new ParserException();
}
Mirabelle Nebut Analyse descendante LL(k)
28/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code de S()
On factorise.
S
a S → AB
b S → AB
d S → Da
e S → Da
# S → AB
private void S() throws ... {
if (this.teteLect.getType() == TS.a
|| this.teteLect.getType() == TS.b
|| this.teteLect.getType() == TS.EOF)
... // S -> AB
else if (this.teteLect.getType() == TS.d
|| this.teteLect.getType() == TS.e)
... // S -> Da
else throw new ParserException();
}
Mirabelle Nebut Analyse descendante LL(k)
29/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code des productions de S()
Code pour S → AB :
I je veux reconnaıtre A puis B ;
I ⇒ A() ; B() ;
Code pour S → Da :
I je veux reconnaıtre D. . .
I . . . puis verifier que a est bien sous la tete de lecture ;
I et consommer a.
Mirabelle Nebut Analyse descendante LL(k)
30/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Terminaux : verification et consommation
Methode consommer dediee a la gestion des terminaux :
private void consommer(int type)
throws ScannerException, ParserException {
if (this.teteLect.getType() == type)
this.teteLect = (Symbole) this.anLex.next_token();
else throw new ParserException();
}
Code pour S → Da : D(); this.consommer(TS.a);.
Mirabelle Nebut Analyse descendante LL(k)
31/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code final de S()
S
a S → AB
b S → AB
d S → Da
e S → Da
# S → AB
private void S() throws ... {
if (this.teteLect.getType() == TS.a
|| this.teteLect.getType() == TS.b
|| this.teteLect.getType() == TS.EOF) {
A(); B(); // S -> AB
} else if (this.teteLect.getType() == TS.d
|| this.teteLect.getType() == TS.e) {
D(); this.consommer(TS.a); // S -> Da
} else throw new ParserException();
}
Quand S() termine, pour un mot accepte, la tete de lecture est surTS.EOF.
Mirabelle Nebut Analyse descendante LL(k)
32/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code de A()
La tete de lecture est deja positionnee sur le symbole de prediction.
A
a A→ aAb
b A→ ε
d erreur
e erreur
# A→ ε
private void A() throws ... {
if (this.teteLect.getType() == TS.a)
... // A -> aAb
else if (this.teteLect.getType() == TS.b
|| this.teteLect.getType() == TS.EOF)
... // A ->
else // erreur
throw new ParserException();
}
Mirabelle Nebut Analyse descendante LL(k)
33/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code des productions de A()
Code pour A → aAb :
this.consommer(TS.a); A(); this.consommer(TS.b);
Code pour A → ε :
I le mot vide est immediatement reconnu ;
I sans toucher a la tete de lecture ;
I on ne fait rien.
Mirabelle Nebut Analyse descendante LL(k)
34/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code final de A()
A
a A→ aAb
b A→ ε
d erreur
e erreur
# A→ ε
private void A() throws ... {
if (this.teteLect.getType() == TS.a) {
// A -> aAb
this.consommer(TS.a); A();
this.consommer(TS.b);
} else if (this.teteLect.getType() == TS.b
|| this.teteLect.getType() == TS.EOF) {
// rien, A ->
} else // erreur
throw new ParserException();
}
Quand A() termine, pour un mot accepte, la tete de lecture estpositionnee pour reconnaıtre un B ou lire un b.
Mirabelle Nebut Analyse descendante LL(k)
35/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code final de B()
B
a erreur
b B → bB
d erreur
e erreur
# B → ε
private void B() throws ... {
if (this.teteLect.getType() == TS.b) {
// B -> bB
this.consommer(TS.b); B();
} else if (this.teteLect.getType() == TS.EOF) {
// rien, B ->
} else // erreur
throw new ParserException();
}
Mirabelle Nebut Analyse descendante LL(k)
36/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Code final de D()
D
a erreur
b erreur
d D → dD
e D → e
# erreur
private void D() throws ... {
if (this.teteLect.getType() == TS.d) {
// D -> dD
this.consommer(TS.d); D();
} else if (this.teteLect.getType() == TS.e)
// D -> e
this.consommer(TS.e);
else // erreur
throw new ParserException();
}
Mirabelle Nebut Analyse descendante LL(k)
37/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Exemple d’execution
Reconnaıtre abb# ?
Mirabelle Nebut Analyse descendante LL(k)
38/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
39/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
40/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Outils pour l’analyse predictive, intuition - 1
Comment choisir entre S → AB et S → Da ?
Supposons que je sache que :
I AB ne permet de deriver que des mots prefixes par a ou par b ;
I AB ⇒∗ au et AB ⇒∗ bu, pour u ∈ VT∗ ;
I Da ne permet de deriver que des mots prefixes par d ou par e ;
I Da⇒∗ du et Da⇒∗ eu, pour u ∈ VT∗.
Mirabelle Nebut Analyse descendante LL(k)
41/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Outils pour l’analyse predictive, intuition - 1
Maintenant je sais (partiellement) choisir entre S → AB etS → Da :
I si tete lecture ∈ {a, b} : choisir S → AB ;
I si tete lecture ∈ {d , e} : choisir S → Da.
S
a S → AB
b S → AB
d S → Da
e S → Da
# ?
Mirabelle Nebut Analyse descendante LL(k)
42/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Ensemble Premier - definition
On dit que Premier(AB) = {a, b} et Premier(Da) = {d , e}.Pour α ∈ (VT ∪ VN)+, Premier(α) contient l’ensemble desterminaux de VT susceptibles de commencer un mot de VT
+
derive de α.
Si α = ε, cet ensemble est vide.
DefinitionSoit une grammaire algebrique. On definit :
Premier : (VT ∪ VN)∗ → P(VT )α 7→ {a ∈ VT |α⇒∗ au, u ∈ VT
∗}
Mirabelle Nebut Analyse descendante LL(k)
43/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Les Premier sur les arbres syntaxiques
a
A
a b
A
B A B
B
b
S S S
A B
S
D
dD
a
S
D
e ∈ Premier(α)
α ∈ (VT ∪ VN)∗
Mirabelle Nebut Analyse descendante LL(k)
44/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Premier - 0
Soit α ∈ (VN ∪ VT )∗ :
casα = ε : ?
α = a, a ∈ VT : ?
α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : ?
α = X , X ∈ VN : ?
α = Xβ, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?
fcas
Mirabelle Nebut Analyse descendante LL(k)
45/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Premier - 1
Soit α ∈ (VN ∪ VT )∗ :
casα = ε : ∅α = a, a ∈ VT : {a}α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}α = X , X ∈ VN : ?
α = Xβ, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?
fcas
Mirabelle Nebut Analyse descendante LL(k)
46/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul de Premier(X ), X ∈ VN
Si l’ensemble des productions de membre gauche S est :
S → AB | Da
alors on a :
Premier(S) = Premier(AB) ∪ Premier(Da)
Cas general : Si la grammaire contient les productions de membregauche X :
X → γ1 | . . . | γn
alorsPremier(X ) =⋃{Premier(γi ) |X → γi ∈ P}
Mirabelle Nebut Analyse descendante LL(k)
47/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Premier - 2
Soit α ∈ (VN ∪ VT )∗ :
casα = ε : ∅α = a, a ∈ VT : {a}α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}α = X , X ∈ VN :
⋃{Premier(γi ) |X → γi ∈ P}α = Xβ, X ∈ VN , β ∈ (VN ∪ VT )∗ : ?
fcas
Mirabelle Nebut Analyse descendante LL(k)
48/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Premier , α = Xβ, X ∈ VN
Deux cas selon que X peut � s’effacer � ou non :
X ⇒∗ ε ?
Si X ⇒∗ ε on dit que X est ε-productif : X ∈ ε-Prod
Mirabelle Nebut Analyse descendante LL(k)
49/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Premier , α = Xβ, X 6∈ ε-Prod - exemple
Par exemple D 6∈ ε-productif :
D → dD | e
alors Premier(Da) = Premier(D)a
S
D
dD
a
S
D
e
Donc, si X 6∈ ε-Prod, Premier(Xβ) = Premier(X )
Mirabelle Nebut Analyse descendante LL(k)
50/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Premier , α = Xβ, X ∈ ε-Prod - exemple
Par exemple A ∈ ε-productif :
A→ ε | aAb
Premier(AB) = Premier(A) ∪Premier(B)Premier(ABS) = Premier(A) ∪Premier(BS)
S
A
a b
A
B A B
B
b
S
Donc, si X ⇒∗ ε alors Premier(Xβ) = Premier(X ) ∪ Premier(β)
Mirabelle Nebut Analyse descendante LL(k)
51/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Premier
Soit α ∈ (VN ∪ VT )∗ :
casα = ε : ∅α = a, a ∈ VT : {a}α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}α = X , X ∈ VN :
⋃{Premier(γi ) |X → γi ∈ P}α = Xβ, X ∈ VN \ ε-Prod, β ∈ (VN ∪ VT )∗ : Premier(X )
α = Xβ, X ∈ VN ∩ ε-Prod, β ∈ (VN ∪ VT )∗ :Premier(X ) ∪ Premier(β)
fcas
Mirabelle Nebut Analyse descendante LL(k)
52/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul effectif des ensembles Premier
On procede en deux etapes :
1. on pose un systeme d’equations pour Premier ;
2. on calcule par iteration de point fixe les plus petits ensemblesqui satisfont ces equations.
Pour le moment on suppose donne ε-Prod, l’ensemble desε-productifs.
Mirabelle Nebut Analyse descendante LL(k)
53/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple
S → AB | DaA → aAb | εB → bB | εD → dD | eε-Prod = {A, B, S}Premier(S) = ?Premier(A) = ?Premier(B) = ?Premier(D) = ?
α = ε : ∅α = a, a ∈ VT : {a}α = aβ, a ∈ VT , β ∈ (VN ∪ VT )∗ : {a}α = X , X ∈ VN :⋃{Premier(γi ) |X → γi ∈ P}α = Xβ, X ∈ VN \ε-Prod, β ∈ (VN ∪VT )∗ :
Premier(X )
α = Xβ, X ∈ VN∩ε-Prod, β ∈ (VN∪VT )∗ :
Premier(X ) ∪ Premier(β)
Mirabelle Nebut Analyse descendante LL(k)
54/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple
Premier(S) = Premier(A) ∪ Premier(B) ∪ Premier(D)Premier(A) = {a}Premier(B) = {b}Premier(D) = {d , e}D’ou
Premier(S) = {a, b, d , e} Premier(aAb) = {a}Premier(A) = {a} Premier(bB) = {b}Premier(B) = {b} Premier(dD) = {d}Premier(D) = {d , e} Premier(e) = {e}Premier(AB) = {a, b} Premier(ε) = ∅Premier(Da) = {d , e}
Mirabelle Nebut Analyse descendante LL(k)
55/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple : remplissage de la table
A→ aAb et Premier(aAb) = {a}A→ ε et Premier(ε) = ∅
S A B D
a S → AB A→ aAb erreur erreur
b S → AB A→ ε B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D → e
# S → AB A→ ε B → ε erreur
Mirabelle Nebut Analyse descendante LL(k)
56/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple : remplissage de la table
S → AB et Premier(AB) = {a, b}S → Da et Premier(Da) = {d , e}
S A B D
a S → AB A→ aAb erreur erreur
b S → AB A→ ε B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D → e
# S → AB A→ ε B → ε erreur
Mirabelle Nebut Analyse descendante LL(k)
57/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Remarque : resolution du systeme
Premier(S) = Premier(A) ∪ Premier(B) ∪ Premier(D)Premier(A) = {a}Premier(B) = {b}Premier(D) = {d , e}Se resoud sans iteration de point fixe : systeme d’equations nonrecursif.
Ce n’est pas toujours le cas.
Mirabelle Nebut Analyse descendante LL(k)
58/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Resolution du systeme : autre exemple
S → S1S2 | aS1 → S | bS2 → c
Premier(S) = Premier(S1) ∪ {a}Premier(S1) = Premier(S) ∪ {b}Premier(S2) = {c}
iter Premier(S) Premier(S1) Premier(S2)
0 ∅ ∅ ∅1 {a} {b} {c}2 {a, b} {b, a} {c}3 {a, b} {b, a} {c}
stabilisation
Mirabelle Nebut Analyse descendante LL(k)
59/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
60/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Definition des ε-prod
DefinitionUn non terminal X ∈ VN est dit ε-productif si X ⇒∗ ε.
L’ensemble des ε-productif est ε-Prod.
X est ε-productif si la grammaire contient la production :
I X → ε ;
I ou X → Y1Y2 . . .Yn telle que l’ensemble des non-terminaux{Y1,Y2, . . . ,Yn} ⊆ VN ne contient que des non-terminauxε-productifs.
Algorithme de calcul similaire a celui qui calcule les productifs.
Mirabelle Nebut Analyse descendante LL(k)
61/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple
S → AB | DaA → aAb | εB → bB | εD → dD | eε-Prod ?
Mirabelle Nebut Analyse descendante LL(k)
62/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
63/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Outils pour l’analyse predictive, intuition - 2
Pour choisir entre S → AB et S → Da :
I si tete lecture ∈ {a, b} : choisir S → AB ;
I si tete lecture ∈ {d , e} : choisir S → Da.
Et si la tete de lecture est # ? # 6∈ Premier(AB) ∪ Premier(Da).
Comment choisir entre A → aAb et A → ε ? Premier(ε) = ∅⇒ les ensembles Premier ne suffisent pas.
Mirabelle Nebut Analyse descendante LL(k)
64/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Ensembles Suivant, intuition
Quand appliquer A → ε ?
Quand la tete de lect. correspond a un terminal qui peut suivre A.
a b
A
A
b ∈ Suivant(A)
A
S
B
Suivant(A) ⊇ Premier(B)
Mirabelle Nebut Analyse descendante LL(k)
65/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Ensembles Suivant, intuition
On a donc b ∈ Suivant(A)
A
a A→ aAb
b A→ ε
d ?
e ?
# ?
Mirabelle Nebut Analyse descendante LL(k)
66/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Ensembles Suivant, intuition
Pour α ∈ (VT ∪ VN)+, Suivant(α) contient l’ensemble desterminaux de VT susceptibles de suivre α dans un mot de VT
+
derive de l’axiome S .
Si α = ε, cet ensemble est vide.
Par convention, Suivant(S) ⊇ {#}.
Mirabelle Nebut Analyse descendante LL(k)
67/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Ensembles Suivant, definitions equivalentes
DefinitionSoit une grammaire algebrique d’axiome S . On definit :
Suivant : (VT ∪ VN)∗ → P(VT )α 7→ {a ∈ VT | S ⇒∗ βαaγ,
pour β, γ ∈ (VN ∪ VT )∗}
DefinitionSuivant : (VT ∪ VN)∗ → P(VT )
α 7→ {a ∈ Premier(γ) |S ⇒∗ βαγ,pour β, γ ∈ (VN ∪ VT )∗}
Mirabelle Nebut Analyse descendante LL(k)
68/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 1
Pour calculer Suivant(X ), on regarde les productions danslesquelles X apparaıt en partie droite (different du calcul desPremier).
Pour Suivant(A) :
A → aAb
a b
A
A
S → AB
A
S
B
Mirabelle Nebut Analyse descendante LL(k)
69/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 2
Soit PX ⊆ P l’ensemble des productions p dans lesquelles Xapparaıt en partie droite :
Suivant(X ) =⋃
p∈PXSuivantp(X )
Ex : PA = {S → AB,A→ aAb}Suivant(A) = Suivant(A)S→AB ∪ Suivant(A)A→aAb
Mirabelle Nebut Analyse descendante LL(k)
70/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant, cas de l’axiome
Pour l’axiome, on ajoute le marqueur de fin de mot :
Suivant(S) = {#} ∪⋃p∈PS
Suivantp(S)
Ex : pour X → aXb | εPX = {X → aXb}Suivant(X ) = {#} ∪ Suivant(X )X→aXb
Mirabelle Nebut Analyse descendante LL(k)
71/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 3 - exemple
Suivant(A)S→AB ? (exemple precedent)
Cas deja vu :
A
S
B
Suivant(A) ⊇ Premier(B)
Mirabelle Nebut Analyse descendante LL(k)
72/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 3 - exemple
Suivant(A)S→AB ? (exemple precedent)
mais B est ε-Prod !
A
S
B
Suivant(A) ⊇ Suivant(S)
Mirabelle Nebut Analyse descendante LL(k)
73/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 3 - exemple
Puisque B est ε-Prod :
Suivant(A)S→AB = Premier(B) ∪ Suivant(S)
Mirabelle Nebut Analyse descendante LL(k)
74/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 4
Quand une production est de la forme . . .→ Xα :
I pour calculer Suivant(X ) ;
I Il faut pouvoir dire si α ∈ (VN ∪ VT )∗ est ε-productif ou pas.
Definitionα ∈ (VN ∪ VT )∗ est ε-productif si α⇒∗ ε. On definit la fonction :
Eps : (VN ∪ VT )∗ → {vrai , faux}α 7→ α est ε-productif
On verra apres comment calculer Eps.
Mirabelle Nebut Analyse descendante LL(k)
75/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 5
Pour calculer Suivantp(X ) avec :
p = Y → αXβ et Eps(β) = faux , α, β ∈ (VN ∪ VT )∗
X β
Y
Suivantp(X ) = Premier(β)
Ex : pour Y → Xb, Suivant(X )Y→Xb = {b}.
Mirabelle Nebut Analyse descendante LL(k)
76/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 6
Pour calculer Suivantp(X ) avec :
p = Y → αX
Xα
Y
Suivantp(X ) = Suivant(Y )
Mirabelle Nebut Analyse descendante LL(k)
77/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant - 7
Pour calculer Suivantp(X ) avec :
p = Y → αXβ et Eps(β) = vrai , α, β ∈ (VN ∪ VT )∗
X
Y
β Suivantp(X ) =Premier(β) ∪ Suivant(Y )
Ex : pour S → AB, Suivant(A)S→AB = Premier(B) ∪ Suivant(S).
Mirabelle Nebut Analyse descendante LL(k)
78/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Remarque - 1
Si X apparaıt plusieurs fois en partie droite d’une production, ilfaut prendre en compte toutes ses occurrences dans le calcul deSuivant(X ).
Ex : Y → XaXaXc
SuivantY→XaXaXc(X ) = {a, c}
Mirabelle Nebut Analyse descendante LL(k)
79/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Remarque - 2
Pourquoi pas Suivant(X )Y→Xβ = Premier(β) ∪ Suivant(β) ?
Parce que Suivant(Y ) ⊆ Suivant(β).
Ex :
S → Y |ZY → X1X2
X1 → aX2 → ε | bZ → X2c
Suivant(S) = {#}Suivant(Y ) = Suivant(S) = {#}Suivant(Z ) = Suivant(S) = {#}Suivant(X2) = {c} ∪ Suivant(Y ) = {c,#}Suivant(X1) = Premier(X2) ∪ Suivant(Y )
Mirabelle Nebut Analyse descendante LL(k)
80/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des Suivant, recapitulons !
# ∈ Suivant(axiome)
Soit PX ⊆ P l’ensemble des productions p dans lesquelles Xapparaıt en partie droite :
Suivant(X ) =⋃
p∈PXSuivantp(X )
avec : Suivantp(X ) =cas
p = Y → αX : Suivant(Y )p = Y → αXβ et Eps(β) = faux : Premier(β)p = Y → αXβ et Eps(β) = vrai : Premier(β) ∪ Suivant(Y )
fincas
Mirabelle Nebut Analyse descendante LL(k)
81/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul effectif des ensembles Suivant
On procede en deux etapes :
I on pose un systeme d’equations pour Suivant ;
I on calcule par iteration de point fixe les plus petits ensemblesqui satisfont ces equations.
I avec initialement Suivant(S) = {#}, et pour les autresnon-terminaux Suivant(X ) = ∅.
Mirabelle Nebut Analyse descendante LL(k)
82/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple
S → AB | DaA → aAb | εB → bB | εD → dD | e
Eps(B) = vrai
Suivant ?
# ∈ Suivant(axiome)
Suivant(X ) =⋃
p∈PXSuivantp(X )
avec : Suivantp(X ) =casp = Y → αX : Suivant(Y )p = Y → αXβ et Eps(β) = faux : Premier(β)p = Y → αXβ et Eps(β) = vrai : Premier(β)
∪Suivant(Y )fincas
Mirabelle Nebut Analyse descendante LL(k)
83/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple de remplissage de table
A→ ε et Suivant(A) = {b,#}
S A B D
a S → AB A→ aAb erreur erreur
b S → AB A→ ε B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D → e
# S → AB A→ ε B → ε erreur
Mirabelle Nebut Analyse descendante LL(k)
84/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple de remplissage de table
S → AB et Suivant(S) = {#}
S A B D
a S → AB A→ aAb erreur erreur
b S → AB A→ ε B → bB erreur
d S → Da erreur erreur D → dD
e S → Da erreur erreur D → e
# S → AB A→ ε B → ε erreur
Mirabelle Nebut Analyse descendante LL(k)
85/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Calcul des ε-productifs
On connaıt deja ε-Prod, ens. des non-terminaux ε-productifs.
Pour calculer Eps(α) :
Eps(α) =casα = ε : vraiα = X1 . . .Xn, n ≥ 1 avec {X1, . . . ,Xn} ⊆ VN et
{X1, . . . ,Xn} ⊆ ε-Prod : vraiautre : faux // α contient un terminal
fincas
Mirabelle Nebut Analyse descendante LL(k)
86/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple
Sachant que ε-Prod = {A,B,S} :
Eps(Da) ?
Eps(AB) ?
Eps(ε) ?
Eps(B) ?
Mirabelle Nebut Analyse descendante LL(k)
87/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
88/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Table d’analyse : au prealable
On calcule :
I les ε-productifs ;
I les ensembles Premier ;
I les ensembles Suivant.
Mirabelle Nebut Analyse descendante LL(k)
89/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Remplissage de la table
Entree : une gram. alg. G , ses ensembles Premier et SuivantSortie : la table d’analyse Tablepour toute production X → γ ∈ Pfaire pour tout a ∈ Premier(γ)
faire ajouter X → γ a Table[X , a] faitsi Eps(γ) = vrai alors pour tout b ∈ Suivant(X )
faire Table[X , b] = X → γfait
finsifait
Ajouter erreur dans les entrees de Table restees vides
Mirabelle Nebut Analyse descendante LL(k)
90/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple
S → AB :
I Premier(AB) = {a, b} ;
I Eps(AB) = vrai ;
I Suivant(S) = {#}.S → Da :
I Premier(Da) = {d , e} ;
I Eps(Da) = faux.
Rien a completer par erreur.
S
a S → AB
b S → AB
d S → Da
e S → Da
# S → AB
Mirabelle Nebut Analyse descendante LL(k)
91/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Ensembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Exemple
A→ aAb :
I Premier(aAb) = {a} ;
I Eps(aAb) = faux.
A→ ε :
I Premier(ε) = ∅ ;
I Eps(ε) = vrai ;
I Suivant(A) = {b,#}.On complete par erreur.
A
a A→ aAb
b A→ ε
d erreur
e erreur
# A→ ε
Mirabelle Nebut Analyse descendante LL(k)
92/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
93/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyseur LL(1)
Un analyseur LL(1) est deterministe et pilote par le sommet depile :
I si terminal a : lecture de a (ou erreur) ;
I si non terminal X avec a sous la tete de lecture : expansionselon Table[X , a].
Et si Table[X , a] contient plus d’une production ?
Non-determinisme :
I la grammaire n’est pas LL(1) ;
I on ne peut pas appliquer une analyse LL(1).
Mirabelle Nebut Analyse descendante LL(k)
94/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Caracterisation d’une grammaire LL(1)
Caracterisation par table d’analyse : une grammaire est LL(1) sichaque case contient exactement une production ou erreur.
Caracterisation � par contre-exemple � : une grammaire n’est pasLL(1) s’il existe 2 productions X → α et X → β telles que :
1. soit Premier(α) ∩ Premier(β) 6= ∅ ;Ex : S → aS |A, A→ a
2. soit Eps(α) = vrai et Premier(β) ∩ Suivant(X ) 6= ∅ ;Ex : S → aS |Ab, A→ ε | b
3. soit Eps(α) = vrai et Eps(β) = vrai (la grammaire estambigue)Ex : S → A |B, A→ ε, B → ε
Mirabelle Nebut Analyse descendante LL(k)
95/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
LL(1) et ambiguıte
Une grammaire LL(1) n’est pas ambigue.
Une grammaire ambigue n’est pas LL(1).
Mirabelle Nebut Analyse descendante LL(k)
96/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Cas classiques non LL(1)
Dans les cas suivants, la grammaire n’est pas LL(1) :
I ambiguıte ;I recursivite gauche : A→ Aa | ε ;
I intuitivement recursivite infinie de A().
I non factorisation gauche : S → aA | aB
Solutions : :
I factorisation a gauche (parfois) ;
I suppression de la recursivite gauche (parfois) ;
I utiliser un generateur de parser plus puissant !
Mirabelle Nebut Analyse descendante LL(k)
97/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
98/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
99/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Factorisation a gauche : exemple - 1
Les listes d’identificateur de Init :
listeIdent → IDENT | IDENT SEPVAR listeIdent
On factorise IDENT et on obtient :
listeIdent → IDENT suiteListeIdentsuiteListeIdent → ε | SEPVAR listeIdent
Mirabelle Nebut Analyse descendante LL(k)
100/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Factorisation a gauche : exemple - 2
X → ab | abbX | abbbXFactorisation de ab : on prend le plus grand prefixe commun.X → abYY → ε | bX | bbXPuis a nouveau factorisation de b.
Mirabelle Nebut Analyse descendante LL(k)
101/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Factorisation a gauche - algorithme
On remplace les regles de la forme :
X → αβ1 | . . . |αβn | γ1 | . . . | γmou
I α ∈ (VT ∪ VN)+ et βi , γj ∈ (VT ∪ VN)∗ ;
I le prefixe commun α est choisi le plus grand possible ;
I α n’est pas prefixe de γj .
par les regles :
X → αX ′ | γ1 | . . . | γmX ′ → β1 | . . . |βn
ou X ′ est un nouveau non-terminal.On reitere ce processus tant que necessaire.
Mirabelle Nebut Analyse descendante LL(k)
102/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
103/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Suppression de la recursivite a gauche
Recursivite gauche :
I immediate : production A→Aα, α ∈ (VT ∪ VN)+ ;
I generale : il existe une derivation A⇒∗Aα, α ∈ (VT ∪ VN)+.
Il est possible de supprimer les deux cas.
On ne verra que la recursivite immediate.
Mirabelle Nebut Analyse descendante LL(k)
104/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Suppression de la recursivite gauche immediate
On remplace les regles de la forme
X → Xα1 | . . . |Xαn |β1 | . . . |βmou
I αi ∈ (VT ∪ VN)+ et βj ∈ (VT ∪ VN)∗ ;
I les βj ne commencent pas par X .
par les regles :
X → β1X′ | . . . |βmX ′
X ′ → α1X′ | . . . |αnX
′ | ε
ou X ′ est un nouveau non-terminal.
Mirabelle Nebut Analyse descendante LL(k)
105/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Suppression de la recursivite gauche : exemple
Grammaire non ambiguedes expressions arithmetiques :
E → E + T |TT → T ∗ F |FF → i | (E )
X → Xα1 | . . . |Xαn
|β1 | . . . |βm
Apres suppression de la recgauche :
E → TE ′
E ′ → +TE ′ | εT → FT ′
T ′ → ∗FT ′ | εF → i | (E )
X → β1X′ | . . . |βmX ′
X ′ → α1X′ | . . . |αnX
′ | ε
Mirabelle Nebut Analyse descendante LL(k)
106/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Parfois ca ne suffit pas
La grammaire ({a, b}, {S ,A}, S ,P) avec
P = {S → aSb |A, A→ aA | ε}
I n’est pas ambigue ;
I n’est pas recursive gauche ;
I est factorisee a gauche ;
mais elle n’est pas LL(1).
Mirabelle Nebut Analyse descendante LL(k)
107/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Au dela des grammaires LL(1) - 1
La grammaire ({a, b}, {A,B},A,P) avec
P = {A→ abB | ε, B → Aaa | b}
n’est pas LL(1).
En effet Eps(A) = vrai et a ∈ Premier(A) ∩ Suivant(A).
Mirabelle Nebut Analyse descendante LL(k)
108/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Principes
Analyseur recursif
Construction de la table d’analyseEnsembles PremierEnsemble des ε-prodEnsembles SuivantRemplissage de la table d’analyse
Caracterisation d’une grammaire LL(1)
Quand une grammaire n’est pas LL(1)Factorisation a gaucheSuppression de la recursivite a gauche
Analyseurs LL(k), LL(*)
Mirabelle Nebut Analyse descendante LL(k)
109/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Grammaires LL(k), exemple
La grammaire :
declaration → DECLINT listeIdent FININSTRlisteIdent → IDENT | IDENT SEPVAR listeIdent
n’est pas LL(1).
Elle est LL(2), et acceptee par un analyseur LL(k).
En regardant 2 symboles sous la tete de lecture :
I si IDENT FININSTR : choisir listeIdent → IDENT
I si IDENT SEPVAR : choisir listeIdent → IDENT SEPVARlisteIdent
Mirabelle Nebut Analyse descendante LL(k)
110/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Grammaire LL(k), autre exemple
P = {A→ abB | ε, B → Aaa | b}
Cette grammaire est LL(2) :Premier2(A) = {ab}Premier2(B) = {ab, aa, b}Suivant2(A) = {aa,#}
Mirabelle Nebut Analyse descendante LL(k)
111/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Table d’analyse LL(2)
A→ abB | εB → Aaa | b
aa ab b #
A A→ ε A→ abB erreur A→ ε
B B → Aaa B → Aaa B → b erreur
Mirabelle Nebut Analyse descendante LL(k)
112/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyseurs LL(k), principe
Effectuent une prediction basee sur k symboles.
k borne.
Ex : javaCC
Mirabelle Nebut Analyse descendante LL(k)
113/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Insuffisance de l’approche LL(k), [antLR]
method → type ID [ args ] ;
| type ID [ args ] { body }args → unarg | unarg , argsunarg → INT ID
. . .
Cette grammaire n’est pas LL(k), mais est acceptee par antLR.
Mirabelle Nebut Analyse descendante LL(k)
114/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Analyseurs LL(*)
Ne fixent pas une taille de look-ahead a priori.
Representent par un AFD le langage de look-ahead, pourvu qu’ilsoit regulier.
Mirabelle Nebut Analyse descendante LL(k)
115/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Vers les formes eBNF
Meme un analyseur LL(*) refuse la recursivite gauche.
Facheux pour les grammaires a operateurs !
Solution : grammaires dites en forme eBNF.
E → T ( + T ) *T → F ( * T ) *F → ( E ) | id
E → E + T | TT → F * T | FF → ( E ) | id
Mirabelle Nebut Analyse descendante LL(k)
116/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Grammaires sous forme eBNF
Grammaires algebriques avec facilites d’ecriture.
En partie droite de production : operateurs a la expression reguliere
Refuse par Cup et tout generateur de parseur n’acceptant pas leseBNF
Accepte par la majorite des analyeurs LL(k).
Semble plus simple, attention a l’attribution.
Ne pas utiliser en DS sauf si explicitement demande.
Mirabelle Nebut Analyse descendante LL(k)
117/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Grammaires non LL(*) [antLR]
s : label ID ’=’ expr
| label ’return’ expr
;
label : ID ’:’ label
|
;
n’est pas LL(*) : [fatal] rule s has non-LL(*) decision
due to recursive rule invocations from alts 1,2.
[...]
Version LL(*) :
label : ( ID ’:’)*
Mirabelle Nebut Analyse descendante LL(k)
118/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Generation de code a la eBNF
E → T ( + T ) *
E() {
T();
tant que tetelect est ’+’ {
consommer(+);
T();
}
}
Cloture de Kleene ⇒ iteration dans le code
Mirabelle Nebut Analyse descendante LL(k)
119/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Generation de code a la eBNF
listeA → a*
listeA() {
tant que tetelect est ’a’ {
consommer(a);
}
}
plus efficace que le code recursif genere par :listeA → a listeA | ε
Mirabelle Nebut Analyse descendante LL(k)
120/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
AntLR
Outil tres riche.
Decrit dans le meme formalisme eBNF les entites lexicales et lasyntaxe.
Lit toute l’entree avant de lancer l’analyse lexicale.
Mirabelle Nebut Analyse descendante LL(k)