TD5
TD5
TD5
Parcours Miage-2010/2011
a c c b b a d b c a c c b b a d b c
4 4
g
S S →G aSbT
a c c b b a d b c
4
g g g g g
. . . →G acT bT →G accbT →G accbbS →G accbbaSbT →G accbbadbc
a c b a c b a c b
4 4 4
g g g
S S →G0 aAb S →G0 aAb →G0 acdb
On a choisi la règle A → cd. Il y a un conflit entre b et d. On fait un rebroussement et on
essaye avec un autre choix, A → c.
a c b a c b
4 4
g g g
S →G0 aAb S →G0 aAb →G0 acb
Cette méthode est peu efficace en cas de rebroussement (proche de la méthode naı̈ve).
Analyseur prédictif descendant LL(k)
Prédictif : on utilise une partie du mot d’entrée pour “prédire” la règle à utiliser et de façon
irrémédiable.
Analyse prédictive descendante : Analyse LL(k)
– Left-to-right scanning : on lit l’entrée de gauche à droite.
– Leftmost derivation : on construit une dérivation gauche partant de l’axiome.
– on utilise les k lettres courantes de l’entrée pour faire la prédiction.
On va principalement s’intéresser à l’analyse LL(1) : on ne regarde qu’une lettre de l’entrée.
Il y a deux types d’analyse descendante : l’analyse récursive et l’analyse non-récursive.
Pour la procédure Vi () :
1. selon le terminal pointé par 4 (chaque terminal est donc un cas), on considère la règle
de production Vi → α1 . . . αn à utiliser
2. en séquence, pour j allant de 1 à n,
– si αj ∈ Σ, alors on appelle consommer(αj ).
– si αj ∈ V , on appelle la procédure αj ()
3. si la règle à considérer est Vi → , alors on ne fait rien.
procedure consommer(a) :
- si 4 pointe sur le terminal a alors on avance 4
sinon on lève exception d’erreur de syntaxe
procedure analyse() :
- on place le 4 sur la première lettre du mot à analyser ;
- S() ;
- si 4 ne pointe pas sur $ alors
on lève une exception d’erreur de syntaxe ;
2
On ne peut pas construire un analyseur (récursif) LL(1) pour une grammaire G si :
– G est ambiguë
– G est récursive gauche
A → Aa | : le pointeur reste sur la première lettre du mot à analyser et on ne
peut choisir avec cette information assurément entre A → Aa et A → .
– G n’est pas factorisée à gauche
A → aA | aB : si le pointeur désigne a, on ne peut choisir avec cette information
assurément entre A → aA et A → aB.
Récursivité à gauche
– immédiate : la grammaire contient un non-terminal A et une règle de production A → Aα
(α ∈ (Σ ∪ V )+ ).
– générale : la grammaire contient un non-terminal A et il existe une dérivation A →+ G Aα
(α ∈ (Σ ∪ V ) ).+
3
S → Aa | b
Premier exemple : On ordonne : S, A
A → Ac | Sd | c
– 1ère itération : S → Aa | b, on ne change rien ...
– 2ème itération : On remplace A → Sd par A → Aad | bd.
S → Aa | b
A → Ac | Aad | bd | c
S → Aa | b
A → cA0 | bdA0
A0 → cA0 | adA0 |
S → Sa | T Sc | d
Deuxième exemple :
T → T bT |
On ordonne : S, T
– 1ère itération : S → Sa | T Sc | d, élimination de la récursivité immédiate pour S
S → T ScS 0 | dS 0 T → T bT |
S 0 → aS 0 |
S → T ScS 0 | dS 0 T → T0
S 0 → aS 0 | T 0 → bT T 0 |
X → αβ1 | . . . | αβn | γ1 | . . . | γm
où
– α ∈ (Σ ∪ V )+ et βi , γj ∈ (Σ ∪ V )∗ ,
– le préfixe commun α est choisi le plus grand possible,
– α n’est pas préfixe des γj .
par les règles
X → αX 0 | γ1 | . . . | γm
X 0 → β1 | . . . | βn
où X 0 est un nouveau non-terminal.
– On réitère tant que nécessaire.