Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Analyse descendante LL(k) Mirabelle Nebut Bureau 203 - M3 extension mirabelle.nebut at lifl.fr 2012-2013 Mirabelle Nebut Analyse descendante LL(k) 2/119 Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Principes Analyseur r´ ecursif Construction de la table d’analyse Ensembles Premier Ensemble des -prod Ensembles Suivant Remplissage de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Factorisation ` a gauche Suppression de la r´ ecursivit´ e` a gauche Analyseurs LL(k), LL(*) Mirabelle Nebut Analyse descendante LL(k) 3/119 Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Objectif du cours Comprendre le fonctionnement des g´ en´ erateurs de parser descendants : LL(1), ex antLR V1 LL(k), ex javaCC LL(*), ex antLR V3 Mirabelle Nebut Analyse descendante LL(k) 4/119 Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Analyse descendante L’automate ` a pile sous-jacent : effectue uniquement des lectures et des expansions ; construit un arbre en ordre pr´ efixe (idem aut. items) ; part de l’axiome (idem aut. items) ; construit une d´ erivation gauche (idem aut. items). Mirabelle Nebut Analyse descendante LL(k) 5/119 Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Diff´ erence avec l’automate des items Deux diff´ erences fondamentales : analyse d´ eterministe dite pr´ edictive ; plus d’items ni de r´ eductions explicites. Mirabelle Nebut Analyse descendante LL(k) 6/119 Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Analyse d´ eterministe ` A chaque expansion l’analyseur sait choisir une production. Il ne revient jamais sur ce choix : en cas de succ` es le mot appartient au langage ; en cas d’´ echec on est sˆ ur que mot n’appartient pas au langage. Mirabelle Nebut Analyse descendante LL(k) 7/119 Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Analyse pr´ edictive L’analyseur ”pr´ edit” quelle production utiliser. . . . . . en analysant les k prochains symboles sous la tˆ ete de lecture. Cons´ equences : ne fonctionne qu’avec certaines grammaires, dites LL(k) ; tˆ ete de lecture toujours d´ efinie : marqueur de fin de mot #. NB : dans ce cours techniques pour k=1, on regarde uniquement la tˆ ete de lecture. Mirabelle Nebut Analyse descendante LL(k) 8/119 Principes Analyseur r´ ecursif Construction de la table d’analyse Caract´ erisation d’une grammaire LL(1) Quand une grammaire n’est pas LL(1) Analyseurs LL(k), LL(*) Se passer des items Rappel : item de la forme [X → α • β]: X est en cours de reconnaissance ; α a d´ ej` a´ et´ e reconnu ; il reste ` a reconnaˆ ıtre β, le futur de l’item Un analyseur LL : ne m´ emorise pas qu’il est en train de reconnaˆ ıtre X ; ne m´ emorise pas qu’il a reconnu α ; consid` ere uniquement β. Mirabelle Nebut Analyse descendante LL(k)
15
Embed
Analyse descendante LL(k) Objectif du cours Analyse ...
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
PrincipesAnalyseur 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 {
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 :
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