Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
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∈PSSuivantp(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 | abbbX
Factorisation de ab : on prend le plus grand prefixe commun.X → abYY → ε | bX | bbX
Puis a nouveau factorisation de b.
Mirabelle Nebut Analyse descendante LL(k)
101/119
PrincipesAnalyseur recursif
Construction de la table d’analyseCaracterisation d’une grammaire LL(1)Quand une grammaire n’est pas LL(1)
Analyseurs LL(k), LL(*)
Factorisation a gaucheSuppression de la recursivite a gauche
Factorisation a gauche - algorithme
On remplace les regles de la forme :
X → αβ1 | . . . |αβn | γ1 | . . . | γm
ou
I α ∈ (VT ∪ VN)+ et βi , γj ∈ (VT ∪ VN)∗ ;
I le prefixe commun α est choisi le plus grand possible ;
I α n’est pas prefixe de γj .
par les regles :
X → αX ′ | γ1 | . . . | γmX ′ → β1 | . . . |βn
ou X ′ est un nouveau non-terminal.On reitere ce processus tant que necessaire.
Mirabelle Nebut Analyse descendante LL(k)
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 | . . . |βm
ou
I αi ∈ (VT ∪ VN)+ et βj ∈ (VT ∪ VN)∗ ;
I les βj ne commencent pas par X .
par les regles :
X → β1X′ | . . . |βmX ′
X ′ → α1X′ | . . . |αnX
′ | ε
ou X ′ est un nouveau non-terminal.
Mirabelle Nebut Analyse descendante LL(k)
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)