Anda di halaman 1dari 10

Grammaires LR

Sébastien VERBOIS

Facultés universitaires Notre-Dame de la Paix


Institut d’Informatique
Juin 2002

Sections
1 Une grammaire LR(0) 2

2 Une grammaire SLR(1) non LR(0) 3

3 Une grammaire LALR(1) non SLR(1) (Dragon) 4

4 Un conflit R/R dans une grammaire ambiguë (juin 2002) 5

5 Priorité et associativité pour lever l’ambiguı̈té 6

6 Examen de juin 2002 (Charleroi) 8

7 Bien calculer les symboles de pré-vision LALR(1) 9

8 Une grammaire LR(1) non LALR(1) 10

1
1 Une grammaire LR(0)
1.1 Grammaire originale 1.2 Grammaire augmentée
(1) S ::= Ac
S ′ ::= S
(2) A ::= AaAb
S ::= Ac
(3) A ::= d
A ::= AaAb|d

1.3 Automate LR(0)


E0 E1 E4
S’ → .S S S’ → S. S → Ac.
S → .Ac
E2
A → .AaAb
S → A.c
A → .d A c E7
A → A.aAb
d A → AaAb.
E3 a
E5 E6 b
A → d.
A → Aa.Ab A → AaA.b
A
d A → .AaAb A → A.aAb
A → .d
a

1.4 Table d’analyse LR(0)


Etat Action Successeur
no a b c d # A S
0 d3 2 1
1 A
2 d5 d4
3 r3 r3 r3 r3 r3
4 r1 r1 r1 r1 r1
5 d3 6
6 d5 d7
7 r2 r2 r2 r2 r2

2
2 Une grammaire SLR(1) non LR(0)
2.1 Grammaire originale 2.2 Grammaire augmentée
(1) S ::= 0S2
(2) S ::= A S ′ ::= S
(3) A ::= 1A S ::= 0S2|A
(4) A ::= 1 A ::= 1A|1

2.3 Automate LR(0)


E0 E1
S’ → .S S S’ → S.
S → .0S2
S → .A E3
A → .1A A S → A.
A → .1 E6
0 A S → 0S2.
E4 1 E2
A → 1.A S → 0.S2 2
E5
A → 1. S → .0S2
1 S S → 0S.2
A → .1A S → .A
A → .1 A → .1A
1
A → .1
E7 A
A → 1A. 0

2.4 Conflits LR(0)


• Conflit S/R à l’état E4 (Shift sur 1 et Reduce A ::= 1)

2.5 Calcul de SU IV AN T pour lever le conflit S/R de E4


• SUIV ANT (A) = SUIV ANT (S) = {#, 2}

2.6 Table d’analyse SLR(1)


Etat Action Successeur
no 0 1 2 # A S
0 d2 d4 3 1
1 A
2 d2 d4 3 5
3 r2 r2
4 d4 r4 r4 7
5 d6
6 r1 r1
7 r3 r3

3
3 Une grammaire LALR(1) non SLR(1) (Dragon)
3.1 Grammaire originale 3.2 Grammaire augmentée
(1) S ::= G=D
(2) S ::= D S′ ::= S
(3) G ::= ∗D S ::= G = D|D
(4) G ::= id G ::= ∗D|id
(5) D ::= G D ::= G

3.3 Automate LR(0) avec symboles de pré-vision LALR(1)


E0 E1 E9
S’ → .S {# } S S’ → S. {# } S → G=D. {# }
S → .G=D {# }
E2 D
S → .D {# } E6
S → G.=D {# }
G → .*D {=,#} G S → G=.D {# }
D → G. {# }
G → .id {=,#} D → .G {# }
D → .G {# } =
E3 G → .*D {# }
D S → D. {# } G → .id {# }

id E4 * G
G → *.D {=,#} E8
* D → .G {=,#} G D → G. {=,#}
E5
G → .*D {=,#} E7
G → id. {=,#} id
G → .id {=,#} D G → *D. {=,#}
*
id

3.4 Conflits LR(0)


• Conflit S/R à l’état E2 (Shift sur = et Reduce D ::= G)

3.5 Calcul de SU IV AN T
• SUIV ANT (D) = SUIV ANT (S) ∪ SUIV ANT (G) = {#, =}

3.6 Table d’analyse LALR(1)


Etat Action Successeur Etat Action Successeur
no = * id # G D S no = * id # G D S
0 d4 d5 2 3 1 5 r4 r4
1 A 6 d4 d5 9
2 d6 r5 7 r3 r3
3 r2 8 r5 r5
4 d4 d5 8 7 9 r1

4
4 Un conflit R/R dans une grammaire ambiguë (juin
2002)
4.1 Grammaire originale 4.2 Grammaire augmentée
X ::= Xf
X ::= hXf X ′ ::= X
X ::= g X ::= Xf |hXf |g

4.3 Automate LR(0) avec symboles de pré-vision LALR(1)


E0 E1 E4
X’ → .X {# } X’ → X. {# } f X → Xf. {#, f }
X
X → .Xf {#, f} X → X.f {#, f }
X → .hXf {#, f} E5
E2
X → .g {#, f} X → hX.f {#, f }
X → h.Xf {#, f} X
X → X.f {f }
g X → .Xf {f }
E3 h
X → .hXf {f } E6 f
X → g. {#, f } g X → .g {f } X → hXf. {#, f }
h X → Xf. {f }

4.4 Remarques
• Les mots de la grammaire sont du type hm gf m+n avec m, n ∈ N.

• La grammaire est ambiguë. Le mot hgf f possède les deux arbres d’analyse suivants :

X X
X f h X f
h X f X f
g g

• Les symboles de prévision LALR(1) permettent de lever le conflit S/R de E1 , mais pas
le conflit R/R de E6 .

• Une grammaire LL(1) équivalente est la suivante :

X ::= AB
A ::= hAf |g
B ::= f B|ǫ

5
5 Priorité et associativité pour lever l’ambiguı̈té
5.1 Grammaire 5.2 Grammaire augmentée
(1) E ::= E+E
(2) E ::= E∗E
(3) E ::= (E) E ′ ::= E
(4) E ::= id E ::= E + E|E ∗ E|(E)|id

5.3 Automate LR(0)


(
E0 E1 E7
E’ → .E {# } E’ → E. {# } E → E+E. {#,),+,*}
E → .E+E {#,+,* } E E → E.+E {#,+,* } E → E.+E {#,),+,*}
E → .E*E {#,+,* } E → E.*E {#,+,* } + E → E.*E {#,),+,*}
E → .(E) {#,+,* }
E → .id {#,+,* } id + E
E3 E4
( id E → id. {#,),+,*} E → E+.E {#,),+,*}
E2 *
* E → .E+E {#,),+,*}
E → (.E) {#,+,* } id
id E → .E*E {#,),+,*}
E5
E → .E+E {),+,* }
E → E*.E {#,+,* } E → .(E) {#,),+,*}
E → .E*E {),+,* }
E → .E+E {#,+,*,)} E → .id {#,),+,*}
( E → .(E) {),+,* } (
E → .E*E {#,+,*,)}
E → .id {),+,* } +
E → .(E) {#,+,*,)} E8
* E → .id {#,+,*,)}
E E E → E*E. {#,+,* }
E6
E → E.+E {#,+,*,)}
E → (E.) {#,+,*,)} *
E9 E → E.*E {#,+,*,)}
E → E.+E {),+,* }
) E → (E). {#,+,*,)}
E → E.*E {),+,* }
+

5.4 Table d’analyse LALR(1)


Etat Action Successeur
no id + * ( ) # E
0 d3 d2 1
1 d4 d5 A
2 d3 d2 6
3 r4 r4 r4 r4
4 d3 d2 7
5 d3 d2 8
6 d4 d5 d9
7 d4/r1 d5/r1 r1 r1
8 d4/r2 d5/r2 r2 r2
9 r3 r3 r3 r3

6
5.5 Règles de priorité et d’associativité
• Les deux conflit S/R de E1 sont levés grâce aux symboles de pré-vision LALR(1) mais
il reste deux conflits S/R en E7 et deux conflits S/R en E8 .

• L’associativité à gauche pour + permet de lever le conflit d4/r1 de E7 en faveur de r1.

• L’associativité à gauche pour ∗ permet de lever le conflit d5/r2 de E8 en faveur de r2.

• La priorité de ∗ par rapport à + privilégie d5 dans le conflit d5/r1 de E7 et r2 dans le


conflit d4/r2 de E8 .

• Ces règles d’associativité et de priorité peuvent être ajoutées à la grammaire dans Y ACC
à l’aide des deux lignes suivantes :

%left ’+’
%left ’*’

7
6 Examen de juin 2002 (Charleroi)
6.1 Grammaire originale 6.2 Grammaire augmentée
(1) X ::= Xa
(2) X ::= aXb X ′ ::= X
(3) X ::= a X ::= Xa|aXb|a

6.3 Automate LR(0) avec symboles de pré-vision LALR(1)


E0 E1 E3
X’ → .X {# } X’ → X. {# } a X → Xa. {#, a, b }
X
X → .Xa {#, a } X → X.a {#, a }
a
X → .aXb {#, a } E4
E2
X → .a {#, a } X → aX.b {#, a, b }
X → a.Xb {#, a, b } X
X → X.a {b, a }
X → a. {#, a, b }
a X → .Xa {b, a } E5 b
X → .aXb {b, a } X → aXb. {#, a, b }
X → .a {b, a }
a

6.4 Remarques
• Les mots de la grammaire sont du type an (ba∗ )m avec m, n ∈ N et n > m.

• La grammaire n’est pas ambiguë.


En effet, on peut construire le seul arbre d’analyse possible par le programme suivant :

– Si la chaı̂ne ne contient qu’un a, on emploie la 3ème règle.


– Si la chaı̂ne se termine par b, on utilise la 2ème règle, donc on doit trouver un a
au début, on le supprime et on revient au début du programme pour analyser X.
– Si la chaı̂ne se termine par a et contient plus d’un caractère, on utilise la 1ère règle.

On voit qu’une seule analyse au plus est applicable à tout moment.

• Les symboles de prévision LALR(1) permettent de lever le conflit S/R de E1 , mais pas
le conflit S/R de E2 .

8
7 Bien calculer les symboles de pré-vision LALR(1)
7.1 Grammaire 7.2 Grammaire augmentée
S ::= nASA
S ::= s S′ ::= S
A ::= aB S ::= nASA|s
B ::= aAB A ::= aB
B ::= ǫ B ::= aAB|ǫ

7.3 Automate LR(0)

E0 E3
S’ → .S {# } s S → s. {#,a } s
S → .nASA{# }
E4
S → .s {# } n E2 S → nA.SA{#,a }
S S → n.ASA{#,a } A S → .nASA{a }
E1 n
A → .aB {n,s } S → .s {a }
S → S. {# }
a
E5 S
E8 A → a.B {n,s,#,a } E6
B → a.AB {n,s,#,a } a B → .aAB {n,s,#,a } a S → nAS.A{#,a }
A → .aB {a,n,s,# } a B →. {n,s,#,a } A → .aB {#,a }

a B A
A E7 E9
E10 A → aB. {n,s,#,a } S → nASA.{#,a }
B → aA.B {n,s,#,a }
B → .aAB {n,s,#,a }
B E11
B →. {n,s,#,a }
B → aAB. {n,s,#,a }

7.4 Calcul de P REMIER


• P REMIER(S) = {n, s} • P REMIER(B) = {a, ǫ}
• P REMIER(A) = {a}

7.5 Questions
• D’où vient le symbole de pré-vision a dans l’item S → nA.SA de l’état E4 ?
• Expliquer comment calculer les symboles de pré-vision de l’item A → .aB de l’état E8 .

7.6 Remarque
• Les états E5 et E10 présentent des conflits S/R qui ne sont pas levés par les symboles
de pré-vision LALR(1).

9
8 Une grammaire LR(1) non LALR(1)
8.1 Grammaire originale 8.2 Grammaire augmentée
S′ ::= S
S ::= aAd|aBe|bAe|bBd S ::= aAd|aBe|bAe|bBd
A ::= c
A ::= c
B ::= c
B ::= c

8.3 Automate LR(0) avec symboles de pré-vision LALR(1)


E4 E10
E2 S → aA.d {# } d S → aAd. {# }
S → a.Ad {# } A
E5 E11
S → a.Be {# }
E0 B S → aB.e {# } e S → aBe. {# }
A → .c {d }
S’ → .S {# } a
B → .c {e } E6−9
S → .aAd {# } c
A → c. {d,e }
S → .aBe {# } E3
B → c. {e,d }
S → .bAe {# } S → b.Ae {# } c
S → .bBd {# } b E7 E12
S → b.Bd {# }
A S → bA.e {# } e S → bAe. {# }
A → .c {e }
S
E1 B → .c {d } B E8 E13
S’ → S. {# } S → bB.d {# } d S → bBd. {# }

8.4 Automate LR(1)

E4 E10
E2 S → aA.d {# } d S → aAd. {# }
S → a.Ad {# } A
E5 E11
S → a.Be {# }
B S → aB.e {# } e S → aBe. {# }
A → .c {d }
B → .c {e } E6
c
E0 a A → c. {d }
S’ → .S {# } B → c. {e }
S → .aAd {# }
S → .aBe {# } E9
S → .bAe {# } A → c. {e }
S → .bBd {# } E3
B → c. {d }
b S → b.Ae {# } c
S E7 E12
S → b.Bd {# }
E1 A S → bA.e {# } e S → bAe. {# }
A → .c {e }
S’ → S. {# }
B → .c {d } B E8 E13
S → bB.d {# } d S → bBd. {# }

10

Anda mungkin juga menyukai