THL 4
THL 4
THL 4
Analyse syntaxique.
1 – Généralités.
Soit G = (V, A, R) une grammaire et soit S ∈ V une variable choisie comme axiome.
Une analyse syntaxique par G d’une “phrase” u ∈ A∗ est un algorithme qui doit décider si
u ∈ L(G, S) et :
k
– dans le cas d’une réponse positive, décrire une dérivation S =⇒ u,
G
– dans le cas contraire, déterminer pourquoi une dérivation ne peut être construite, c’est–à–
dire, faire un diagnostic sur l’“erreur” qui est la cause de cet échec.
Les algorithmes d’analyse syntaxique qui nous intéressent ont quelques points communs :
– Ils lisent le mot à analyser de la gauche vers la droite (ceci justifie la première lettre, un L,
des sigles angloricains qui servent à les désigner).
– Ils choisissent, parmi les dérivations équivalentes possibles d’un même mot, une dérivation
particulière : soit à droite soit à gauche.
– dans le cas de dérivations à gauche (Leftmost), la construction s’effectue de l’axiome
vers le mot à analyser : on parle d’analyse “descendante” ou “prédictive”,
– dans le cas de dérivations à droite (Rightmost), la construction s’effectue du mot à
analyser vers l’axiome : on parle d’analyse “ascendante”.
– Ils sont basés sur l’utilisation d’“automates à pile” (dont la définition générale ne sera pas
donnée ici) : le résultat d’une analyse réussie est une suite de règles qui définit une dérivation
k
S =⇒ u.
G
– Ils sont déterministes.
Ils ne peuvent évidemment pas s’appliquer avec le même succès à toute grammaire, en particulier,
les grammaires “ambiguës” que nous allons maintenant définir, sont a priori hors du domaine
d’application de ces algorithmes.
k
Soient X ∈ V et α ∈ (A + V)∗ : lorsqu’il existe une dérivation X =⇒ α dans G, il en existe
G
généralement beaucoup d’autres ! Cependant, on sait que deux dérivations équivalentes font le
même calcul, c’est–à–dire, ont le même arbre.
On est conduit à dire qu’une grammaire n’est pas ambiguë ssi, pour toute X ∈ V et tout
k k
α ∈ (A + V)∗ , deux dérivations d : X =⇒ α et d : X =⇒ α sont équivalentes.
G G
Le déterminisme des algorithmes d’analyse syntaxique que nous allons étudier implique que les
grammaires auxquelles ils s’appliquent ne sont pas ambiguës. Dans la pratique, l’ambiguı̈té d’une
grammaire provient de conventions d’écriture bien répertoriées, par exemple
– Préséance : dans une grammaire dont certaines constantes représentent des opérateurs, par
exemple × pour un produit et ⊕ pour une somme, une expression de la forme α ⊕ β × γ
devra généralement être analysée comme α ⊕ (β × γ) et non pas comme (α ⊕ β) × γ : on
dira alors que × a un degré de préséance supérieur à celui de ⊕.
k k
Une dérivation à droite sera symbolisée avec β =⇒ γ et plus simplement par β =⇒ γ lorsque G
d,G d
est évidente.
Le cas des dérivations à gauche (leftmost derivations), facile à imaginer, sera envisagé dans l’annexe.
Observations.
• Dans une dérivation à droite, il n’est plus nécessaire de préciser l’occurrence de la variable à
laquelle on applique une règle, puisque l’on a convenu une fois pour toutes que c’était la plus à
droite !
• Soit u ∈ L(G, S), alors, si G n’est pas ambiguë, il existe exactement une dérivation à droite
k
S =⇒ u (et réciproquement, on peut définir l’ambiguı̈té d’une grammaire sur la base des seules
d
dérivations à droite).
Exemple 3.1 (suite).
11
Voici une dérivation à droite S =⇒ aabbabaabba dans notre grammaire habituelle :
d
1
S =⇒ SbS
d
1
=⇒ SbSbS
d
1
=⇒ SbSba
d
1
=⇒ Sbba
d
1
=⇒ SbSbba
d
1
=⇒ SbSbSbba
d
1
=⇒ SbSbaabba
d
1
=⇒ Sbabaabba
d
1
=⇒ SbSbabaabba
d
1
=⇒ Sbbabaabba
d
1
=⇒ aabbabaabba
d
dont l’arbre associé est encore la figure 3 du chapitre 3.
En énumérant les règles de la façon suivante :
1 : S −→ SbS 2 : S −→ ε 3 : S −→ a 4 : S −→ aa
on obtient la suite 1, 1, 3, 2, 1, 1, 4, 3, 1, 2, 4 avec laquelle on peut effectivement construire une
dérivation à droite.
1
X =⇒ α β =⇒ α v
d
1
X0 =⇒ α1 α1 =⇒ α1 v1 pour v1 ∈ A∗
d
Commentaires.
1
• Un cas particulièrement intéressant est celui où αn+1 = ε : on a alors vn+1 = ε et Xn =⇒ αn+1
est la dernière dérivation élémentaire, ce qui veut dire que la règle Xn −→ αn+1 est la dernière de
la liste définissant la dérivation qui nous intéresse.
• Ce qui vient d’être dit est valable pour toute dérivation non triviale : la dérivation triviale
0
S =⇒ S, qui joue un rôle dans notre algorithme, ne rentre donc pas dans ce cadre. Ceci justifie la
notion d’“augmentation”, purement technique, dont il va être question maintenant.
Augmentation d’une grammaire.
La désignation effective de l’axiome S, se fait habituellement en “augmentant” la grammaire de
la façon suivante : on introduit une nouvelle variable S ∈ V et une seule nouvelle règle S −→ S.
Ainsi, S n’est–elle présente dans aucune autre règle que la sienne, contrairement à S qui peut très
bien être présente dans la partie droite de n’importe quelle règle, et S est l’axiome de la grammaire
ainsi construite. Nous préférons utiliser l’augmentation
∅ −→ S
produisant S à partir de l’ensemble vide lui–même (qui n’est pas un élément de V) : l’axiome se
trouve ainsi engendré à partir de “rien”, comme il se doit.
k k+1
Dans la grammaire ainsi augmentée, toute dérivation S =⇒ γ devient une dérivation ∅ =⇒ γ de
d d
1
longueur > 0 qui commence toujours par ∅ =⇒ S.
Nous sommes maintenant en mesure de caractériser les “préfixes” qui nous intéressent, en anticipant
sur une notation qui sera l’objet de la section suivante.
Préfixes viables
πα ∈ (A + V)∗ est appelé un préfixe viable ssi il existe une dérivation à droite
1
∅ =⇒ πXv =⇒ πα α v
d
(v est alors nécessairement un élément de A∗ ).
La règle X −→ α α définit alors un item valide pour ce préfixe viable, que l’on notera
. X −→ α . α , où . est un nouveau symbole (cf. ci–dessous).
Ce que nous avons observé au sujet des dérivations à droite peut s’exprimer en disant que toute
dérivation à droite détermine un enchaı̂nement d’item, c’est–à–dire, avec les notations ci–dessus :
ou bien :
∅ −→ . S
.S −→ α1 . X1 α1
. X1 −→ α2 . X2 α2
... ...
. Xn−1 −→ αn . Xn αn
. Xn −→ αn+1 . αn+1
ce qui, dans le cas où n = 0, se présente de la façon suivante :
∅ −→ .S
.S −→ α1 . α1
ou bien, le cas spécial
∅ −→ S .
qui provient de l’augmentation de la grammaire.
Réciproquement, tout enchaı̂nement d’item comme ci–dessus permet de construire des dérivations
à droite assurant la viabilité d’un préfixe donné.
Cette remarque est importante pour la compréhension et la justification de la suite. Par exemple,
la propriété importante
• Tout préfixe (facteur gauche) d’un préfixe viable est un préfixe viable.
s’observe très facilement en “raccourcissant” l’enchaı̂nement qui définit le préfixe viable en question.
– l’item final : ∅ −→ S .
ne règle X −→ ε ne définit que le seul item : . X −→ . dont le second membre se réduit
effectivement à une occurrence de . !
La règle X −→ aXaY b définit les item suivants :
. X −→ . aXaY b . X −→ aX . aY b . X −→ aXaY . b
. X −→ a . XaY b . X −→ aXa . Y b . X −→ aXaY b .
2.3.1 – AFD des item LR(0).
Considérons l’ε–AF A, sur l’alphabet A + V, défini par les données suivantes :
– Les états sont les item ;
– l’entrée est ∅ −→ . S ;
– une transition(∗ ) par ξ ∈ A + V est définie sur les états de la forme . X −→ α . ξβ par un
décalage
ξ
. X −→ α . ξβ . X −→ αξ . β
. X −→ α . Y β ε . Y −→ . γ
ξ
(∗ ) On représente la propriété r ∈ δ(q, ξ) par l’arête q r du graphe de transition.
Si l’on fait une sortie de chacun de ses états, A reconnaı̂t le langage formé des préfixes viables.
Plus précisément
ε–AF des item
∗
Pour tout π ∈ (A + V) :
(∅ −→ . S, π) ∗ (. X −→ α . β, ε) ssi π est un préfixe viable et . X −→ α . β est valide pour π.
Un ε–AF A est peu maniable et il est préférable de considérer l’AFD D(A) équivalent obtenu en
appliquant l’algorithme de détermination (chapitre 2, section 5), et en négligeant l’état vide.
Ainsi, l’AFD équivalent à A est la partie accessible de l’AFD défini de la façon suivante :
– les états sont des ensembles clos non vides d’item,
– l’état initial : cl(∅ −→ . S),
– l’action de ξ sur q, q • ξ est la clôture de la réunion des images des éléments de q,
– les sorties ne jouent aucun rôle ici (on peut, par exemple, prendre tous les états comme
sorties).
Lorsque q • π = ∅, π définit un chemin partant de q ∈ Q : ch(q, π) ∈ Chem(q, q • π).
Plus précisément (cf. la section 7 du chapitre 1) :
– ch(q, ε) = q,
– si ch(q, π) = χr et si r • ξ = s, alors ch(q, πξ) = ch(q, π) ◦ rs = χrs.
I1 = I0 • S Σ1 = ∅
= {∅ −→ S .}
I2 = I0 •( Σ2 = S + (+¬ + id
= {. S −→ (. S ∧ S),
. S −→ .(S ∧ S), . S −→ . ¬S, . S −→ . id}
I3 = I0 • ¬ Σ3 = S + (+¬ + id
= {. S −→ ¬ . S,
. S −→ .(S ∧ S), . S −→ . ¬S, . S −→ . id}
I4 = I0 • id Σ4 = ∅
= {. S −→ id .}
I5 = I2 • S Σ5 = ∧
= {. S −→ (S . ∧S)}
I2 = I2 •(
I3 = I2 • ¬
I4 = I2 • id
I6 = I3 • S Σ6 = ∅
= {. S −→ ¬S .}
I2 = I3 •(
I3 = I3 • ¬
I4 = I3 • id
I7 = I5 • ∧ Σ7 = S + (+¬ + id
= {. S −→ (S ∧ . S),
. S −→ .(S ∧ S), . S −→ . ¬S, . S −→ . id}
I8 = I7 • S Σ8 =)
= {. S −→ (S ∧ S .)}
I2 = I7 •(
I3 = I7 • ¬
I4 = I7 • id
I9 = I8 •) Σ9 = ∅
= {. S −→ (S ∧ S) .}
Exemple 2.
Soit G2 la grammaire :
1 : E −→ E ⊕ T 3 : T −→ T ∗ F 5 : F −→ (E)
2 : E −→ T 4 : T −→ F 6 : F −→ id
AFD des item LR(0) de G2 .
I0 = {∅ −→ . E, Σ0 = E + T + F + (+id
. E −→ . E ⊕ T, . E −→ . T,
. T −→ . T ∗ F, . T −→ . F,
. F −→ .(E), . F −→ . id}
I0 • E = I1 Σ1 = ⊕
= {∅ −→ E .,
. E −→ E . ⊕T }
I0 • T = I2 Σ2 = ∗
= {. E −→ T .,
. T −→ T . ∗F }
I0 • F = I3 Σ3 = ∅
= {. T −→ F .}
I0 •( = I4 Σ4 = E + T + F + (+id
= {. F −→ (. E),
. E −→ . E ⊕ T, . E −→ . T,
. T −→ . T ∗ F, . T −→ . F,
. F −→ .(E), . F −→ . id}
I0 • id = I5 Σ5 = ∅
= {. F −→ id .}
I1 • ⊕ = I6 Σ6 = T + F + (+id
= {. E −→ E ⊕ . T,
. T −→ . T ∗ F, . T −→ . F,
. F −→ .(E), . F −→ . id}
I2 • ∗ = I7 Σ7 = F + (+id
= {. T −→ T ∗ . F,
. F −→ .(E), . F −→ . id}
I4 • E = I8 Σ8 =) + ⊕
= {. F −→ (E .),
. E −→ E . ⊕T }
I4 • T = I2
I4 • F = I3
I4 •( = I4
I4 • id = I5
I6 • T = I9 Σ9 = ∗
= {. E −→ E ⊕ T .,
. T −→ T . ∗F }
I6 • F = I3
I6 •( = I4
I6 • id = I5
I7 • F = I10 Σ10 = ∅
= {. T −→ T ∗ F .}
I7 •( = I4
I7 • id = I5
I8 •) = I11 Σ11 = ∅
= {. F −→ (E) .}
I8 • ⊕ = I6
I9 • ∗ = I7
C’est donc la table de transition de l’AFD des item LR(0) de G enrichi d’une colonne pour ε qui
comporte, pour chaque état, l’ensemble des “item complets” qu’il contient : on l’appelle la table
LR(0) de G.
Propriété.
Pour tout u ∈ A∗ :
∗
u ∈ L(G, S) ssi (q0 , u) (q0 q1 , ε)
∗
où signifie l’existence d’un enchaı̂nement de transitions.
La démonstration de cette propriété est basée sur des récurrences très évidentes.
Remarques.
• Lorsque ces conditions sont vérifiées, chaque état q est d’une nature bien déterminée :
– si Action(q, ε) = ∅, alors Action(q, ε) contient un seul élément qui est :
– ou bien une réduction : q est un état de réduction,
– ou bien Acc : q = q1 = q0 • S est l’état d’acceptation,
– sinon, Action(q, x) contient au plus un décalage pour chaque x ∈ A : q est un état de
décalage.
• Les conditions signifient que l’automate à pile est déterministe : une analyse, lorsqu’elle est
faisable, l’est de façon unique. En particulier, une grammaire LR(0) n’est pas ambiguë.
2.5.1 – Algorithme d’analyse LR(0).
Soit G une grammaire LR(0) dont l’axiome est S.
L’analyse LR(0) de u ∈ A∗ s’effectue à partir de la configuration initiale (q0 , u) en tentant
d’exécuter une suite de transitions (D) ou (R). Chaque application de (R) ajoute une règle au
début de la liste d’analyse, initialement vide.
Soit (χ, v) la configuration courante. Lors de l’exécution de l’algorithme, on peut vérifier que χ
n’est jamais vide : notons χ = χ q pour mettre en valeur le sommet q de cette pile, qui est l’“état
courant” de l’automate. Alors :
• si q est un état de réduction :
si Action(q, ε) = (X −→ α), χ est alors nécessairement de la forme χ ch(r, α) (comme
on peut le vérifier par une induction) et si Action(r, X) = s : on passe à la configuration
(χ rs, v) par application d’une transition (R),
• si q est un état de décalage :
si v = xv avec x ∈ A et si Action(q, x) = r : on passe à la configuration (χ qr, v ) par
application d’une transition (D),
• si q = q1 = q0 • S est l’état d’acceptation :
si χ = q0 q1 et si v = ε : on est parvenu à la configuration d’acceptation et l’analyse est
terminée de façon satisfaisante.
• Dans les autres cas : l’analyse se termine sur un échec. Une bonne table d’analyse doit comporter
un diagnostic d’“erreur syntaxique” pour chacun de ces cas (qui correspondent aux cases vides de
la table).
Présentation pratique de la table LR(0).
Les états sont codés par des entiers (I0 , . . . , In ) et on note di (décaler en i) au lieu de Ii dans
la table de transition. De même, les règles sont codées par des entiers et on note rk (réduire par
la règle k), au lieu de la règle elle–même, dans la colonne ε (la réduction par ∅ −→ S, que l’on
n’effectue pas réellement, est codée par Acc). Ceci donne la description suivante de la table LR(0) :
– si Ii • ξ = Ij alors dj ∈ Action(i, ξ)
– si (. X −→ α .) ∈ Ii avec X ∈ V alors rk ∈ Action(i, ε) où k est le numéro de la règle
X −→ α
– si (∅ −→ S .) ∈ Ii alors Acc ∈ Action(i, ε).
Exemple.
Reprenons la grammaire G1 de l’exemple 1 ci–dessus, dont on connaı̂t déjà l’AFD des item LR(0).
ε ( ∧ ) ¬ id S
0 d2 d3 d4 d1
1 Acc
2 d2 d3 d4 d5
3 d2 d3 d4 d6
4 r3
5 d7
6 r2
7 d2 d3 d4 d8
8 d9
9 r1
Table LR(0) de G1 .
en a trois) est caractérisé par une gestion particulière des symboles de prévision lors de la définition
de l’AF de ses item : nous la préciserons à la fin.
P remierk (X) est l’ensemble de tous les p que l’on peut obtenir ainsi et Suivantk (X) celui de tous
les s que l’on peut obtenir ainsi.
Le cas où k = 0 est toujours trivial puisque P remier0 (v) = ε pour tout v. Le cas où k = 1 est assez
simple mais déjà très signicatif ; de plus, il est suffisant pour analyser les langages que nous avons
en vue (des langages de programmation) : nous nous limiterons donc essentiellement à lui et nous
ne mentionnerons k que lorsqu’il ne sera pas supposé être égal à 1 : ainsi, P remier et Suivant
signifieront–ils respectivement P remier1 et Suivant1 .
Dans la clause 4), on a étendu l’application P remier aux langages de la façon habituelle, elle doit
donc se comprendre comme étant :
P remier(X) = P remier(α).
α∈l
L’ensemble Eps(G) ⊆ V des variables de G qui produisent ε, défini par X ∈ Eps(G) ssi ε ∈ L(G, X)
a été étudié au chapitre 3 (section 4.2).
On a évidemment P remier0 (X) = ε. La définition de P remierk pour k > 1 est techniquement
plus compliquée, mais ne présente pas de réelle difficulté.
Exemple.
Appliquons cette construction à la grammaire G :
1 : E −→ E ⊕ T 3 : T −→ T ∗ F 5 : F −→ (E)
2 : E −→ T 4 : T −→ F 6 : F −→ id
• Il est clair que Eps(G) = ∅ ;
Remarques.
• Il ne faut pas oublier le cas où X se trouve en plusieurs occurrences dans la partie droite d’une
règle, lorsque l’on applique les clauses 2) et 3).
• De même, il ne faut pas oublier le cas β = ε dans la clause 3).
Exemple.
Suivant(E) = ε + ⊕+)
• Suivant(T ) :
En appliquant 3) à 1 : ou 2 :, il vient Suivant(E) ⊆ Suivant(T )
En appliquant 2) à la règle 3 :, on a ∗ ⊆ Suivant(T ).
Finalement Suivant(T ) = ε + ⊕ + ∗+).
• Suivant(F ) :
L’application de 3) à 3 : ou 4 : implique que Suivant(T ) ⊆ Suivant(F ). Comme il n’y a pas d’autre
possibilité, on peut en conclure que
Il est commode de représenter les données nécessaires à la définition des transitions dans une
“table” Action(q, ξ) définie pour les états q de l’AFD des item de type LR(1) et ξ ∈ ε + A + V, de
la façon suivante :
C’est donc la réunion de la table de transition de l’AFD en question et d’une table caractérisant
la position des “item complets”.
Il faut remarquer que l’application d’une transition (R) est maintenant sujette à une condition sur
P remier(v) ∈ ε + A, contrairement au cas LR(0).
. X −→ α . Y β, x ε . Y −→ . γ, y
• Cette condition signifie qu’il ne se produit pas de conflit et assure évidemment que l’automate
à pile correspondant est déterministe.
• Contrairement au cas LR(0), la nature de la transition à exécuter n’est pas déterminée par le
seul état courant (sommet de la pile d’états) mais aussi par le symbole de prévision.
• Comme dans le cas LR(0), on peut voir qu’une grammaire de type LR(1) n’est pas ambiguë.
ξ
(∗ ) On représente la propriété r ∈ δ(q, ξ) par l’arête q r du graphe de transition.
Reprenons la grammaire G2 de l’exemple 2 ci–dessus, dont on connaı̂t déjà l’AFD des item LR(0).
Symboles de prévision.
Eps(G) = ∅
P remier(E) = P remier(T ) = P remier(F ) = (+id
Suivant(E) = ε + ⊕+)
Suivant(T ) = Suivant(F ) = ε + ⊕ + ∗+)
La table SLR(1) de G2 et un exemple d’analyse sont présentés dans les tableaux ci–dessous.
ε ⊕ ∗ ( ) id E T F
0 d4 d5 d1 d2 d3
1 Acc d6
2 r2 r2 d7 r2
3 r4 r4 r4 r4
4 d4 d5 d8 d2 d3
5 r6 r6 r6 r6
6 d4 d5 d9 d3
7 d4 d5 d10
8 d6 d11
9 r1 r1 d7 r1
10 r3 r3 r3 r3
11 r5 r5 r5 r5
Table SLR(1) de G2 .
Il est commode de regrouper les item d’un même état qui ne diffèrent que par leur symbole de
prévision, en notant ( , P ) un ensemble d’item de ce type ( , x), où P ⊆ ε + A (une notation
x∈P
plus standard serait simplement × P , qui désigne bien l’ensemble des couples que l’on veut
représenter).
Grâce à la gestion plus parcimonieuse des symboles de prévision, les item LR(1) définissent un
AFD dont aucun état ne connaı̂t de conflit ; dans l’état I2 qui était conflictuel dans la version
SLR(1), le symbole = n’est plus utilisé pour déclencher une réduction par la règle D −→ G, ainsi
la table LR(1) est–elle déterministe.
ε = ∗ id S G D
0 d4 d5 d1 d2 d3
1 Acc
2 r5 d6
3 r2
4 d4 d5 d8 d7
5 r4 r4
6 d11 d12 d10 d9
7 r3 r3
8 r5 r5
9 r1
10 r5
11 d11 d12 d10 d13
12 r4
13 r3
Table LR(1) de G3 .
Lorsque l’on fait la réunion des états de l’AFD LR(1) qui ne diffèrent que par les symboles de
prévision, on ne réintroduit pas de conflit : la table LALR(1) a été construite en numérotant les
nouveaux états de la façon suivante :
I4 = I4 + I11 I5 = I5 + I12 I7 = I7 + I13 I8 = I8 + I10
La grammaire G3 est donc LALR(1).
ε = ∗ id S G D
0 d4 d5 d1 d2 d3
1 Acc
2 r5 d6
3 r2
4 d4 d5 d8 d7
5 r4 r4
6 d4 d5 d8 d9
7 r3 r3
8 r5 r5
9 r1
Table LALR(1) de G3 .
où w ∈ A∗ : ceci signifie que l’on applique toujours une règle sur la variable qui est le plus à gauche
du mot courant.
L’analyse descendante de u ∈ A∗ est la construction d’une dérivation S =⇒ u dont on connaı̂t
l’aboutissement.
On peut appeler “analyse partielle de u” une dérivation S =⇒ wπ telle qu’il existe une dérivation
g
π =⇒ v pour laquelle wv = u. Avec ces notations, une configuration d’analyse partielle de u peut
g
s’écrire (w; π, v)
la configuration initiale est (ε; S, u)
la configuration d’acceptation est (u; ε, ε)
les modifications permises sont de deux types :
1
L : (w; xπ , xv ) =⇒ (wx; π , v ) pour x ∈ A
1
D : (w; Xπ , v) =⇒ (w; απ , v) pour X −→ α.
G
• Une “lecture”, c’est–à–dire une modification L, ne s’applique que lorsque π = xπ et v = xv
pour le même x ∈ A.
• Chaque modification D ajoute une règle à la liste qui constituera l’analyse de u. Or, S =⇒
g
1
wXπ =⇒ wαπ n’est une analyse partiele de u que s’il existe une dérivation απ =⇒ v.
g g
Une condition nécessaire à l’existence d’une telle dérivation est, si l’on prévoit 1 caractère
x = P remier(v), que :
– ou bien x ∈ P remier(α),
– ou bien ε ∈ P remier(α) et x ∈ Suivant(X).
La démonstration de cette propriété est basée sur des récurrences très évidentes.
Remarques.
• Ce qui vient d’être dit implique en particulier qu’une grammaire LL(1) n’est pas ambiguë.
• En regardant la définition en détails, on peut vérifier qu’une grammaire qui comporte une règle
“récursive à gauche” X −→ Xα n’est pas LL(1), mais les méthodes de dérécursion (voir chapitre
3) peuvent alors s’appliquer.
• De même, qu’une grammaire n’est pas LL(1) lorsqu’elle admet une factorisation, c’est–à–dire,
deux règles distinctes X −→ ξα et X −→ ξβ pour ξ ∈ A + V.
En fait, ces deux derniers points peuvent se résoudre en modifiant la grammaire de façon adéquate.
ε ⊕ ∗ ( ) id
E 1 1
E 3 2 3
T 4 4
T 6 6 5 6
F 7 8
La table LL(1) de G4 .
EXERCICES.
Analyse LR.
Exercice 1.
Montrer que la grammaire suivante est LR(0) :
1 : S −→ CC 2 : C −→ c C 3 : C −→ d
Exercice 2.
Montrer que la grammaire suivante est LR(0) :
1 : S −→ f SS 2 : S −→ g S 3 : S −→ a
Faire l’analyse de g f f a g a g a et construire l’arbre de dérivation correspondant.
Exercice 3.
La grammaire suivante est–elle LR(0) ? SLR(1) ?
1 : S −→ SS f 2 : S −→ S g 3 : S −→ a
Faire l’analyse de a g a g a f f g et construire l’arbre de dérivation correspondant.
Exercice 4.
Construire la table SLR(1) de la grammaire suivante :
1 : E −→ T F 2 : F −→ ε 4 : T −→ (E)
3 : F −→ ⊕T F 5 : T −→ id
La grammaire en question est–elle SLR(1) ? Si oui, utiliser la table pour faire l’analyse de id ⊕( id )
et construire l’arbre de dérivation correspondant.
Exercice 5.
Voici quelques grammaires sur la nature desquelles vous pourrez vous interroger. Au passage,
vérifiez que, pour toute grammaire G :
– si G est LR(0) alors G est SLR(1),
– si G est SLR(1) alors G est LALR(1),
– si G est LALR(1) alors G est LR(1).
G5 : 1 : S −→ a A c 2 : A −→ A b b 3 : A −→ b
G6 : 1 : A −→ a S 2 : S −→ b S 3 : S −→ a a b
G7 : 1 : A −→ BA 2 : A −→ a 3 : B −→ AB 4 : B −→ b
G8 : 1 : S −→ S a S b 2 : S −→ ε
G9 : 1 : S −→ AB 2 : A −→ a A b 4 : B −→ b B
3 : A −→ ε 5 : B −→ b
G10 : 1 : S −→ AB 3 : B −→ CD 5 : C −→ a b 7 : E −→ b b a
2 : A −→ a 4 : B −→ a E 6 : D −→ b b
G11 : 1 : S −→ S ⊕ A 3 : A −→ (S) 5 : A −→ a
2 : S −→ A 4 : A −→ a (S)
G12 : 1 : S −→ a D ; I b 2 : D −→ D ; d 4 : I −→ i ; I
3 : D −→ d 5 : I −→ i
Analyse LL.
(Il faudrait ajouter des exercices sur l’analyse descendante.)