Vous êtes sur la page 1sur 12

Introduction Introduction

Analyseurs LR(0) Analyseurs LR(0)


Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Introduction

Analyse ascendante Analyseurs LR(0)


Principes
Construction de l’automate LR-AFD
Mirabelle Nebut
Tables d’analyse LR(0)
Bureau 203 - extension M3
mirabelle.nebut at lifl.fr
Analyseurs SLR(1)
2012-2013
Analyseurs LR(1)

2/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Analyseur ascendant Exemple

I Effectue des lectures et des réductions ;


I construit un arbre en ordre postfixe ; S → AD | B
I en partant du mot à reconnaı̂tre ; A → aAb | b
B → aB | c
I construction d’une dérivation droite ;
D→e
I analyseurs LR(k) (from Left to rigth, Rigth derivation).
On parle aussi : Cette grammaire n’est pas LL(k) (pourquoi ?)
I d’analyse par décalage et réduction On va la traiter en LR(k), avec k=0 pour commencer.
I shift/reduce analysis.

3/93 4/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Exemple Exemple de reconnaissance

Analyseur LR(0) basé sur une variante de l’automate des items.


(vous vous rappelez ?) S0 → S
S → AD | B
⇒ nouvel axiome S 0
A → aAb | b
⇒ production S 0 → S
B → aB | c
D→e
S0 → S
S → AD | B
A → aAb | b Reconnaı̂tre le mot abbe# ?
B → aB | c On essaie intuitivement, avec une pile contenant des mots de
D→e (VT ∪ VN )∗.

5/93 6/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Exemple de reconnaissance Analyse ascendante : défis

Contenu de la pile :
b
b A A e D I mot de (VN ∪ VT )∗ ;
a a a a A A A S I début de la dérivation droite construite ;
I préfixe viable.

Comment choisir de manière déterministe :


S’ I entre lecture et réduction ;
I I quelle partie du sommet de pile réduire ? (= le manche)
Construction arbre ordre postfixe : lectures et réductions ;
I I par quelle production réduire.
Dérivation droite.
Comment faire ?
7/93 8/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Analyse ascendante : solutions


Introduction

On repart de l’automate des items. Analyseurs LR(0)


On explicite l’automate fini sous-jacent : Principes
I automate caractéristique (un état = un item) ; Construction de l’automate LR-AFD
Tables d’analyse LR(0)
I on comprend comment l’analyse ascendante fonctionne avec ;
I mais cet automate est non déterministe.
Analyseurs SLR(1)
On le déterminise.
Et c’est gagné ! On a un analyseur LR(0). Analyseurs LR(1)

9/93 10/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Retour à l’automate des items - exemple Retour à l’automate des items

Ex : abbe# ?
[A → •aAb]
Trois types de transitions :
[S → •AD] [S → •AD]
I lecture de a :
[S 0 → •S] −→
E [S 0 → •S] −→
E [S 0 → •S] −→
L
( [X → α • aβ] , a ) → [X → αa • β]
[A → •b] [A → b•]
I expansion par Y → γ :
[A → a • Ab] [A → a • Ab] [A → a • Ab]
[S → •AD] [S → •AD] [S → •AD] ( [X → α • Y β] ,  ) → [X → α • Y β] [Y → •γ]
[S 0 → •S] E
−→ [S 0 → •S] L
−→ [S 0 → •S] R
−→ I réduction par Y → γ :
[A → aA • b] [A → aAb•] ( [X → α • Y β] [Y → γ•] ,  ) → [X → αY • β]
[S → •AD] [S → •AD]
[S 0 → •S] 0 0
−→ [S → •S] . . .−→ [S → S•]
L R

11/93 12/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Automate caractéristique - exemple Automate caractéristique - généralités

... Automate à nombre fini d’états :


I sous-jacent à l’automate des items ;
...
[A → •b] b [A → b•]
[S → •B] [S 0 → S•] I indique son état courant ;
S  
  I = l’item en sommet de pile.
[S 0 → •S]  [S → •AD]  [A → •aAb] a [A → a • Ab]
A A Pour chaque transition de l’aut des items, l’aut caractéristique :
D [A → aA • b] I effectue une transition ;
[S → AD•] [S → A • D]
b I ou, depuis un état puit,  revient en arrière.

[D → •e] [A → aAb•]
Comment se comporte l’automate caractéristique ?
e

abbe# ? [D → e•] 13/93 14/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Automate caractéristique et lecture Automate caractéristique et expansion

Idem automate des items. Idem automate des items.


VT -transition sur le terminal lu : Expansion par Y → γ : -transition
a
[X → α • aβ] −→ [X → αa • β] 
[X → α • Y β] −→ [Y → •γ]

Ex lecture de a : Ex expansion par A → b :



[A → •aAb] −→ [A → a • Ab]
a [A → a • Ab] −→ [A → •b]

15/93 16/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Automate caractéristique et réduction Automate caractéristique et réduction par une production


vide
Différent de l’automate des items (-production).
Conséquence d’une réduction par A ∈ VN : VN -transition sur A
Ex : on réduit par A → aAb : Cas particulier, on réduit par X →  :
I quand on est dans l’état puit [A → aAb•] ; I dans l’état puit X → • ;
I alors on rebrousse chemin des 4 transitions qui ont amené I on rebrousse chemin d’une transition (|| + 1 = 1) ;
dans cet état :
I et on transite sur X .
I les 3 transitions qui correspondent à aAb ;
I l’-transition qui correspond à l’expansion par A → aAb ;
I et on transite sur A (A-transition, on a reconnu un A).

17/93 18/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Déterminiser l’automate caractéristique Automate LR-AFD, exemple


E2 E11
S 0 → S• S → B•
L’automate caractéristique : S B a
E1 E3 E5 E6
a A
I est non déterministe (des -transitions) ; S 0 → •S A → a • Ab A → aA • b A → aAb•
b
S → •AD B →a•B B
I contient des expansions (justement les -transitions). S → •B A → •aAb B → aB• E7
A → •aAb A → •b
On veut un analyseur ascendant : A → •b B → •aB
B → •aB B → •c
I déterministe ; B → •c
b
E4
I sans expansions explicites (lectures et réductions). A b
A → b• c
E8 c
⇒ on déterminise l’automate caractéristique. S →A•D E12
D → •e B → c•
⇒ on obtient un automate dit LR-AFD. e
D
E9 E10
19/93
S → AD• D → e• 20/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Automate LR(0) Exemple de fonctionnement


abbe# ?

L’automate LR-AFD décrit un automate à pile déterministe appelé E6


automate LR(0) effectuant 2 types d’actions : E4 E5 E5 E10
E3 E3 E3 E3 E8 E8
I lecture
E1 E1 E1 E1 E1 E1 E1
I réduction
E9
Dans un état contenant X → · · · • a . . . : Lecture de a E8 E2
Dans un état contenant X → α• : Réduction par X → α• E1 E1

La pile permet de mémoriser les états parcourus lors des lectures et On a ce qu’on voulait :
des réductions. I l’arbre en ordre postfixe, et la dérivation droite ;
I avec des lectures et des réductions.
21/93 22/93
Reste à formaliser.
Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante
Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Définition de l’automate LR(0) Définition de l’automate LR(0) : relation de transition

Un état est un ensemble d’item : si Q est l’ensemble des états On note δ la relation de transition de l’AF LR-AFD.
δ(q, X ) = q 0 signifie :
Q ⊆ P(It G )
I si l’état courant est q ;
L’alphabet de pile est Q. I et que X ∈ VT ∪ VN est le symbole courant à traiter ;
L’état initial q0 : I alors l’état courant devient q 0 .
I contient l’item initial de la forme [S 0 → •S] ; Exemple :
I sert à initialiser la pile. S
I δ(E1 , S) = E2 ou E1 −→ E2
b
L’état final qf contient l’item final, de la forme [S 0 → S•]. I δ(E1 , b) = E4 ou E1 −→ E2

23/93 24/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Définition de l’automate LR(0) : relation de transition Définition de l’automate LR(0) : relation de transition
Lecture Réduction

Relation de transition de l’automate LR(0) pour une lecture : Relation de transition de l’automate LR(0) pour une réduction :

(q, a) → qδ(q, a) (qq1 . . . qn , ) → qδ(q, X )

I si qn est en sommet de pile ;


I si q est en sommet de pile
I si l’un des items de qn est de la forme [X → α•], | α |= n ;
I si a est sous la tête de lecture
I alors on dépile n états ;
I et l’un des items de q est de la forme [X → · · · • a . . . ] ;
I puis on empile δ(q, X ) le successeur par X de l’état q en
I alors on empile l’état successeur de q pour a dans δ.
sommet de pile.

25/93 26/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Et les expansions ?
Introduction
Les -transition d’expansion ont disparu avec la déterminisation.
Analyseurs LR(0)
Elles se font implicitement à l’intérieur des états.
Principes
E1 Construction de l’automate LR-AFD
[S 0 → •S] lecture de c possible après expansions Tables d’analyse LR(0)
[S → •AD] successives par :
[S → •B] c I S 0 → S ; [S 0 → •S] ∈ E 1
−→ E12 Analyseurs SLR(1)
[A → •aAb]
I S → B ; [S → •B] ∈ E 1
[A → •b]
[B → •aB] I B → c ; [B → •c] ∈ E 1 Analyseurs LR(1)
[B → •c]

27/93 28/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Construction de LR-AFD - en première approche Construction algorithmique directe de LR-AFD

On construit Q (les états) et δ (les transitions) de l’automate


Principe :
caractéristique à partir de la grammaire.
I on sature les états par expansion ;
On le déterminise, on obtient LR-AFD. I on transite sur chaque symbole Y tel que [· · · → · · · • Y . . . ].
En fait, on peut construire directement LR-AFD (ouf !).

29/93 30/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Saturation des états par expansion Algorithme de construction de Q et δ

Un ensemble d’items E est saturé si : L’état initial est Saturation([S 0 → •S]).


I pour tout item [X → α • Y β] de E , Y ∈ VN ;
Ensuite, pour chaque état saturé E et chaque symbole
I pour toute production Y → γ de G de membre gauche Y ; Y ∈ VT ∪ VN (lecture pour VT , réduction pour VN ) :
I l’item [Y → •γ] appartient aussi à E . I si E contient un ensemble de n items de la forme  •Y  :
On en déduit la fonction Saturation pour une grammaire G : { [X → αi • Y βi ] | 1 ≤ i ≤ n}
I alors on calcule
fonction Saturation (s : ensemble d’items) :
ensemble d’items E 0 = Saturation({[X → αi Y • βi ] | 1 ≤ i ≤ n} )
// calcule tous les items d’un état de LR-AFD(G ) I si cet état E 0 n’existe pas, on l’ajoute à Q ;
// contenant au moins les items de s I et on définit δ(E , Y ) = E 0 .
// retourne cet état.
31/93 32/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Exemple et remarque Conflits LR(0), grammaire LR(0)


Pour ne pas manquer de place sur sa feuille : séparer le contenu
des états et la relation de transition. L’automate LR(0) construit peut ne pas être déterministe (2 cas).
E1 [S 0 → •S] État autorisant 2 réductions (ou plus) :
[S → •AD]
[S → •B] conflit LR(0) reduce/reduce Ex :
[A → •aAb] E2 [A → b•]
[A → •b] E11 a [B → b•]
[B → •aB] S B
a A b
[B → •c] E E3 E5 E6
A 1 b
E3 b B État autorisant 1 réduction et 1 lecture (ou plus) :
E8 c E7
[A → a • Ab] D c E4
e conflit LR(0) shift/reduce Ex :
[B → a • B] E12 [A → •b]
E9 E10
[A → •aAb]
[B → c•]
[A → •b]
[B → •aB] 33/93 34/93
[B → •c]
Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante
Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Conflits LR(0), grammaire LR(0) Remarque - Cup

On comprend mieux les messages d’erreurs de Cup, notamment en


cas de grammaire ambiguë.
Une grammaire est dite LR(0) si aucun de ses états ne contient de
conflit LR(0) :
[java] Warning : *** Shift/Reduce conflict found
I ni shift-reduce [java] in state #60
I ni reduce-reduce [java] between expr ::= expr MOINS expr (*)
[java] and expr ::= expr (*) MOINS expr
Les conflits shift/shift n’existent pas (aucun sens). [java] under symbol MOINS
[java] Resolved in favor of shifting.

35/93 36/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Tables d’un analyseur LR(0)


Introduction

Analyseurs LR(0)
Principes
Construction de l’automate LR-AFD Un analyseur LR(0) est défini par 2 tables :
Tables d’analyse LR(0) I la table des successeurs ;
I la table des actions.
Analyseurs SLR(1)

Analyseurs LR(1)

37/93 38/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Table des successeurs LR(0) Exemple, table des successeurs


Pour tout q ∈ Q et X ∈ VT ∪ VN :

si δ(q, X ) = q 0 alors mettre q 0 dans la case (q, X )

E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12


Encode la relation de transition δ de LR-AFD : a E3 E3
b E4 E4 E6
Q × (VT ∪ VN ) → Q
c E12 E12
e E10
S0
S E2
A E8 E5
B E11 E7
39/93 D E9 40/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Table des actions LR(0) Exemple, table des actions

Indique quelle action effectuer : E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12


a d e d red e red red e red red red red
I dans un état q ∈ Q ; A→b A → aBb B → aB S → AD D → e S → B B → c
I si x ∈ VT ∪ {#} est sous la tête de lecture. b d e d red d red red e red red red red
A→b A → aBb B → aB S → AD D → e S → B B → c
Q × (VT ∪ {#}) → ensemble d’actions c d e d red e red red e red red red red
A→b A → aBb B → aB S → AD D → e S → B B → c
Une action peut être : e e e e red e red red d red red red red
A→b A → aBb B → aB S → AD D → e S → B B → c
I la lecture du terminal x (decale) ;
# e a e red e red red e red red red red
I la réduction par une production p (red par p) ; A→b A → aBb B → aB S → AD D → e S → B B → c
I l’acceptation (acc). a : acceptation, d : décale, e : erreur, red : réduction par p

41/93 42/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Table des actions, remplissage Table des actions, remarque

Pour tout a ∈ VT et q ∈ Q : Pour un automate LR(0), cas dégénéré pour le remplissage de la


table par une réduction.
si q contient un item de la forme [X → · · · • a . . . ]
alors mettre decale dans la case (q, a) k=0 : aucun symbole de prédiction (pas de Premier , Suivant).
Pour tout q ∈ Q, Q 6= qf : Une réduction est effectuée quelque soit la tête de lecture.
I si q contient un item terminal de la forme [X → α•] ; ⇒ colonnes remplies de la même réduction.
I alors, pour tout a ∈ VT ∪ {#}, mettre réduction X → α dans
Le cas général est : pour tout a ∈ VT ∪ {#} et q ∈ Q :
la case (q, a).
I si q contient un item terminal de la forme X → α• et que la
Mettre acceptation dans la case (qf , #). réduction peut se faire avec a sous la tête de lecture ;
I alors, mettre réduction X → α dans la case (q, a).
Mettre erreur dans les cases encore vides.
43/93 44/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Caractérisation d’une grammaire LR(0) Exemple, table des actions et conflits

E ...
E c red A→b
red B→b
Une grammaire est LR(0) si sa table des actions contient pour [A → b•] b red A→b
chaque case : [B → b•] red B→b
I une seule action ...
I ou erreur. E ...
E
c red B → c
[A → •b] b red B → c
[B → c•] decale
...
45/93 46/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Principes Principes
Analyseurs LR(0) Analyseurs LR(0)
Construction de l’automate LR-AFD Construction de l’automate LR-AFD
Analyseurs SLR(1) Analyseurs SLR(1)
Tables d’analyse LR(0) Tables d’analyse LR(0)
Analyseurs LR(1) Analyseurs LR(1)

Quand une grammaire n’est pas LR(0) Exemple

Soit la grammaire S 0 → S, S → a | .
Conflit shift/reduce dans l’état initial (lire a, réduire par S → ) :
C’est peut-être à cause du 0. S 0 → •S
S → •a
On peut essayer une analyse LR(1) : beaucoup plus puissante.
S →•
C’est plus facile d’expliquer d’abord les grammaires SLR(1) :
Mais si la tête de lecture est :
Simple LR(1).
I dans {a}, alors lire a ;
I dans {#} = Suivant(S) alors réduire par S → .

Un automate SLR(1) exploite cette information.

47/93 48/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Principe : k=1 et exploitation des Suivant


Introduction

Analyseurs LR(0)
Un analyseur SLR(1) prend en compte le symbole sous la tête de
Principes
lecture (k=1, cf LL(1)) pour décider d’une réduction :
Construction de l’automate LR-AFD
Tables d’analyse LR(0) Réduction par X → α seulement si tête lecture ∈ Suivant(X )

Analyseurs SLR(1) Repose comme l’analyse LR(0) sur l’automate LR-AFD.


Permet d’arbitrer certains conflits LR(0) S/R et R/R.
Analyseurs LR(1)

49/93 50/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Conflits shift/reduce au sens SLR(1) Conflits reduce/reduce au sens SLR(1)

Un état de LR-AFD provoque un conflit R/R au sens SLR(1) s’il


Un état de LR-AFD provoque un conflit S/R au sens SLR(1) s’il
contient à la fois :
contient à la fois :
I un item de la forme [Y → β•]
I un item de la forme [Y → · · · • a . . . ]
I un item de la forme [X → α•]
I un item de la forme [X → α•] avec a ∈ Suivant(X )
I avec Suivant(X ) ∩ Suivant(Y ) 6= ∅
Comparer avec LR(0) : conflit S/R au sens LR(0) si l’état contient
les items [Y → · · · • a . . . ] et [X → α•] Comparer avec LR(0) : conflit R/R au sens LR(0) si l’état contient
les items [Y → β•] et [X → α•]

51/93 52/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Grammaire SLR(1) Grammaire SLR(1), exemple

Listes de x séparés par , et à trou

L → E | E ,L
Une grammaire est dite SLR(1) si l’automate LR-AFD ne contient
E → |x
pas de conflits au sens SLR(1).

S →L

53/93 54/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Exemple : automate LR-AFD Exemple : conflits au sens LR(0)

I E 0 : conflit S/R entre lire x et réduire par E →  ;


E1
I E 2 : conflit S/R entre lire ”,” et réduire par L → E ;
S → L•
L I E 4 : conflit S/R entre lire x et réduire par E → .
E0
E2 E4
S → •L
E L → E• , L → E , •L La grammaire n’est donc pas LR(0).
L → •E E5
L → E •, L L → •E L
L → •E , L L → E , L•
L → •E , L Pour savoir si ce sont des conflits au sens SLR(1) : calcul des
E →• E Suivant.
x E →•
E → •x E3
E → •x I Suivant(S) = {#} ;
E → x•
x
I Suivant(L) = Suivant(S) = {#} ;
I Suivant(E ) = Suivant(L) ∪ {”, ”} = {”, ” , #}.
55/93 56/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Exemple : conflits au sens SLR(1) Construction de la table des actions SLR(1)

Pour tout a ∈ VT et q ∈ Q :

I
si q contient un item de la forme [X → · · · • a . . . ]
E 0 : x 6∈ Suivant(E ) donc pas de conflit entre lire x et réduire
alors mettre decale dans la case (q, a)
par E →  ;
I E 2 : ”, ” 6∈ Suivant(L) donc pas de conflit entre lire , et Pour tout q ∈ Q, q 6= qf et tout a ∈ VT ∪ {#} :
réduire par L → E ; I si q contient un item terminal de la forme X → α• ;
I E 4 : idem E 0. I alors, si a ∈ Suivant(X ), mettre réduction X → α dans la
case (q, a).
La grammaire est donc SLR(1).
Mettre acceptation dans la case (qf , #).
Mettre erreur dans les cases encore vides.
57/93 58/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Exemple : table des actions SLR(1) Caractérisation d’une grammaire SLR(1)

Suivant(S) = {#} Suivant(L) = {#}


Suivant(E ) = {”, ” , #}
La grammaire est SLR(1) si sa table des actions contient pour
E0 E1 E2 E3 E4 E5 chaque case :
x decale erreur erreur erreur decale erreur
I une seule action
red red red
, erreur decale erreur I ou erreur.
E → E →x E →
red red red red red
# accepte
E → L→E E →x E → L → E, L

59/93 60/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Remarques Comparaison SLR(1) - LR(0)

Méthode SLR(1) basée comme LR(0) sur l’automate LR-AFD :


Une grammaire LR(0) ou SLR(1) n’est pas ambiguë. I les tables des successeurs LR(0) et SLR(1) sont identiques ;
Une grammaire ambiguë n’est ni LR(0) ni SLR(1). I les tables LR(0) et SLR(1) ont le même encombrement
mémoire.

61/93 62/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Comparaison SLR(1) - LR(0) Exemple 1 : G1

Grâce au k = 1 :
I l’analyse SLR(1) est strictement plus puissante que l’analyse
S → A | xb
LR(0) ;
A → aAb | x
I = elle engendre moins de conflits.

LR(0) ⊂ SLR(1) G1 grammaire non ambiguë (mais non LL(1)) :


I si xb : S ⇒ xb ;
Néanmoins beaucoup de grammaires (non ambiguës) ne sont pas I si an xb n : S ⇒ A ⇒n an Ab n ⇒ an xb n .
SLR(1).

63/93 64/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Automate LR-AFD de G1 Conflit pour G1

E2 E5 L’automate LR-AFD contient un conflit S/R au sens LR(0) dans


S 0 → S• S → A• l’état E3 :
A
S
E1 E3 E4 [S → x • b]
0
S → •S x S →x •b b S → xb• [A → x•]
S → •A A → x•
S → •xb Pour savoir si c’est un conflit au sens SLR(1), calcul des Suivant :
E6 E7
A → •aAb a x
A → a • Ab A → x• I Suivant(S 0 ) = Suivant(S) = {#} ;
A → •x A → •aAb E9 I Suivant(A) = Suivant(S) ∪ {b} = {#, b} ;
A → •x A → aA • b b A → aAb•
A
a E8 b ∈ Suivant(A) donc E3 contient un conflit S/R au sens SLR(1).

65/93 66/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Conflit SLR(1) pour G1 : origine Conflit SLR(1) pour G1 : solution

E1 S’
[S 0 → S]
E3 S
[S → •A] x
Conflit dans E3 car b ∈ Suivant(A). Et pourtant. . . −→ [S → x • b]
[S → •xb]
[A → x•] A
. . . la lecture de b impose la dérivation S 0 ⇒ S ⇒ xb. [A → •aAb]
[A → •x]
. . . mais Suivant trop imprécis pour le voir.
Comment être plus précis ? Les A de E 1 et E 3 ne peuvent être suivis que d’un #, pas d’un b.
Ce A (suivi par b) n’est pas expansé dans E 1 et E 3, mais dans E 6.
Si on considère les symboles de VT ∪ {#} qui peuvent suivre A
dans E3, on fait sauter le conflit.
67/93 68/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Restriction des symboles de look-ahead Exemple 2 : G2

L’analyse LR(1) ne considère pas tous l’ensemble Suivant(X ) pour S → G = D |D


réduire par X → . . . . G → ∗D | i
Elle calcule : D→G
I pour chaque item [X → α] d’un état E ;
Grammaire G2 non ambiguë :
I un ensemble L ⊆ Suivant(X ) ;
I la présence ou l’absence du = indique s’il faut choisir
I contenant les symboles qui peuvent suivre X dans E .
S → G = D ou S → D ;
L peut parfois être égal à Suivant(X ). I la grammaire de productions { G → ∗D | i, D → G } est
LL(1).

69/93 70/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Automate LR-AFD pour G2 Conflit pour G2


E2 E1 L’automate LR-AFD contient un conflit S/R au sens LR(0) dans
S → D• S 0 → S•
l’état 5 :
S E6
D * G → ∗D• E5
E0 E3 D
0 * G →∗•D E7
[S → G • = D]
S → •S G
D → •G D → G• [D → G •]
S → •D
S → •G = D G →•∗D
G → •i * Pour savoir si c’est un conflit au sens SLR(1), calcul des Suivant :
G →•∗D E8 G
G → •i E4 i S → G = •D I Suivant(S 0 ) = Suivant(S) = {#} ;
i i D → •G
D → •G G → i• I Suivant(G ) = {=} ∪ Suivant(D) ;
G →•∗D
G G → •i I Suivant(D) = Suivant(S) ∪ Suivant(G ) ;
E5 S → G • = D
= D D’où Suivant(G ) = Suivant(D) = {#, =}.
D → G•
E9
S → G = D• 71/93
=∈ Suivant(D) donc E5 contient un conflit S/R au sens SLR(1). 72/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Conflit SLR(1) pour G2 : origine Restriction des symboles de look-ahead

Conflit car ”=” ∈ Suivant(D). Si on particularise les symboles de look-ahead aux états E 0 et E 5 :
Pourtant il n’existe pas de dérivation t.q. S ⇒∗ w1 D = w2
E0
S’ S’ [S 0 → •S]
[S → •D] E5
S S G
[S → •G = D] −→ [S → G • = D]
G D [G → • ∗ D] [D → G •]
D
[G → •i]
G = [D → •G ]

Suivant(D) contient ici un ”=” jamais rencontré comme


look-ahead dans une analyse effective. En E 0 et E 5, D ne peut être suivi que par # : levée du conflit.
73/93 74/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Principe
Introduction

Analyseurs LR(0)
Principes Enrichissement des items : items généralisés de la forme
Construction de l’automate LR-AFD [X → α•, L], avec L ⊆ VT ∪ {#}
Tables d’analyse LR(0)
Dans [X → α1 • α2 , L], L contient les symboles qui peuvent suivre
Analyseurs SLR(1) X à ce stade de l’analyse.
Remarque : pour [X → α•, L], L ⊆ Suivant(X )
Analyseurs LR(1)

75/93 76/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Principe Automate LR(1)

La méthode LR(1) ne repose pas sur l’automate LR-AFD.


Un analyseur LR(1) réduit par X → α . . . Deux items [X → α • β, L] et [X → α • β, L0 ] sont considérés
dans un état E contenant [X → α•, L] . . . comme différents si L 6= L0 .

seulement si le symbole sous la tête de lecture appartient à L. L’automate fini caractéristique d’un analyseur LR(1) (dit automate
LR(1)) est donc beaucoup plus gros que l’automate LR-AFD, ce
qui explique sa plus grande puissance.

77/93 78/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Algorithme de construction de l’automate LR(1) Saturation des états LR(1) : intuition

On procède comme pour l’automate LR-AFD :


I on sature les états par expansion ; On considère l’item généralisé unitaire [X → α • Y β, a] ;
I on transite sur chaque symbole Y tel que [· · · → · · · • Y . . . ] I on cherche à saturer pour Y : qui peut suivre Y ?
Mais on modifie la saturation pour calculer L. I au moins les Premier (β) ;
Plus facile à expliquer si on décompose [X → α, {x1 , . . . , xn }] en I mais si β ⇒∗ , alors a, qui peut suivre X , peut aussi suivre Y .
un ensemble d’items généralisés unitaires : I Donc Y peut être suivi par Premier (βa).
[X → α, x1 ], . . ., [X → α, xn ]

79/93 80/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Saturation des états LR(1) : définition Algorithme de construction de Q et δ

L’état initial est Saturation([S 0 → •S, {#}]).


Ensuite, pour chaque état saturé E et chaque symbole
Un ensemble d’items généralisés unitaires E est saturé si :
Y ∈ VT ∪ VN (lecture pour VT , réduction pour VN ) :
I s’il contient l’item généralisé unitaire [X → α • Y β, a] ; I si E contient un ensemble de n items enrichis de la forme
I alors pour toutes les productions Y → γ ∈ P, •Y  :

I et pour tout b ∈ Premier (βa), { [X → αi • Y βi , Li ] | 1 ≤ i ≤ n}


I on a [Y → •γ, b] ∈ E . I alors on calcule
En fin de saturation on reconstruit les items généralisés. E 0 = Saturation({[X → αi Y • βi , Li ] | 1 ≤ i ≤ n} )
I si cet état E 0 n’existe pas, on l’ajoute à Q ;
I et on définit δ(E , Y ) = E 0 .
81/93 82/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Exemple de G1 État initial de G1

E0 E0
[S 0 → •S, #] [S 0 → •S, {#}]
[S → •A, #] [S → •A, {#}]
S0 → S ou
[S → •xb, #] [S → •xb, {#}]
S → A | xb [A → •aAb, #] [A → •aAb, {#}]
A → aAb | x [A → •x, #] [A → •x, {#}]

Premier (S) = Premier (A) ∪ {x} = {a, x} [S → x • b, {#}]


Premier (A) = {a, x} Transition par x vers E 3 = Saturation( )
[A → x•, {#}]
E3
[S → x • b, {#}] Conflit au sens LR(1) ?
83/93
[A → x•, {#}] 84/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Conflits au sens LR(1) Automate LR(1) pour G1 , suite

E2 E5
Un ensemble d’items généralisés provoque un conflit S/R s’il S 0 → S•, {#} S → A•, {#}
contient à la fois : A
I un item de la forme [Y → · · · • a . . . , L], avec a ∈ VT ; E1 S
S 0 → •S, {#} x E3 E4
I un item de la forme [X → α•, L0 ] avec a ∈ L0 b
S → •A, {#} S → x • b, {#} S → xb•, {#}
S → •xb, {#} A → x•, {#}
Un ensemble d’items généralisés provoque un conflit R/R s’il
A → •aAb, {#}
contient à la fois : A → •x, {#} a A → a • Ab, {#} x
I un item de la forme [X → α•, L] ; A → •aAb, {b} ...
A → •x, {b}
I un item de la forme [Y → β•, L0 ] avec L ∩ L0 6= ∅. A
E6 a
⇒ pas de conflit au sens LR(1) en E 3 : G1 est LR(1). ...
...
85/93 86/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Automate LR(1) pour G1 , remarque Exemple de G2

[A → •Ab]
L’état E 6 de LR-AFD : [A → •aAb]
[A → •x]
S0 → S
a éclaté en deux états LR(1) :
S → G = D |D
G → ∗D | i
[A → •Ab, {#}] [A → •Ab, {b}]
D→G
[A → •aAb, {b}] et [A → •aAb, {b}]
[A → •x, {b}] [A → •x, {b}]

⇒ automate LR(1) plus gros que LR-AFD.

87/93 88/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

État initial LR(1) pour G2 Automate LR(1) pour G2

G
Transition E 0 −→ E 5 :
[S 0 → •S, #]
[S → •G = D, #] [S 0 → •S, {#}]
[S → •D, #] [S → •G = D, {#}] E5
[G → •∗D, =] [S → •D, {#}] [S → G • = D, {#}]
ou [D → G •, {#}]
[G → •i, =] [G → •∗D, {=, #}]
[D → •G , #] [G → •i, {=, #}]
Conflit S/R levé au sens LR(1) : G2 est LR(1).
[G → •∗D, #] [D → •G , {#}]
[G → •i, #] L’automate LR(1) comporte 14 états, contre 10 pour l’automate
LR-AFD.

89/93 90/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction Introduction
Analyseurs LR(0) Analyseurs LR(0)
Analyseurs SLR(1) Analyseurs SLR(1)
Analyseurs LR(1) Analyseurs LR(1)

Construction de la table des actions LR(1) Caractérisation d’une grammaire LR(1)

Pour tout a ∈ VT et q ∈ Q :
si q contient un item de la forme [X → · · · • a . . . ]
alors mettre decale dans la case (q, a) Une grammaire est LR(1) si sa table des actions contient pour
chaque case :
Pour tout q ∈ Q, q 6= qf et tout a ∈ VT ∪ {#} :
I une seule action
I si q contient un item terminal de la forme [X → α•, L] ;
I ou erreur.
I alors, si a ∈ L, mettre réduction X → α dans la case (q, a).
Mettre acceptation dans la case (qf , #).
Mettre erreur dans les cases encore vides.

91/93 92/93

Mirabelle Nebut Analyse ascendante Mirabelle Nebut Analyse ascendante


Introduction
Analyseurs LR(0)
Analyseurs SLR(1)
Analyseurs LR(1)

Au delà des grammaires LR(1)

Beaucoup de grammaires sont LR(1).


Mais les tables sont rapidement trop grosses pour tenir en
mémoire.
L’analyse utilisée en pratique est l’analyse LALR(1) (Look-Ahead
LR(1)), avec :

LR(0) ⊆ SLR(1) ⊆ LALR(1) ⊆ LR(1)

L’analyse LALR(1) est un bon compromis entre puissance et


encombrement mémoire.
Cup est un analyseur LALR(1).
93/93

Mirabelle Nebut Analyse ascendante

Vous aimerez peut-être aussi