IFT313 Introduction aux langage formels Francis Bisson Département d’informatique Université de Sherbrooke Lab 7 Analyses LR(1) et LALR(1)
Exercice 1 IFT313
Exercice 1 Étant donné la grammaire G= ({S}, {i, e, o}, R, S), avec 1. S → iSeS 2. S → iS 3. S → o } Donnez l’AFD LR(1). Donner la table d’analyse LR(1). Est-ce une grammaire LR(1)? Donnez l’AFD LALR(1). Donnez la table d’analyse LALR(1). Est-ce une grammaire LALR(1)? Note: c’est la grammaire approximant « if then else » vue au Lab 6. IFT313/IFT451 © Froduald Kabanza
1. a-b AFD LR(1) et Table d’analyse LR(1) actions goto S’® .S, $ S® .iSeS, $ S® .iS, $ S® .o, $ i e o $ S s2 s3 1 acc 2 s8 s7 4 3 r3 s5 r2 5 6 r1 7 8 9 s10 10 11 3 S® o., $ o S 1 S’® S., $ i i 8 S® i.SeS, $/e S® i.S, $/e S® .iSeS, $/e S® .iS, $/e S® .o, $/e 2 S® i.SeS, $ S® i.S, $ S® .iSeS, $/e S® .iS, $/e S® .o, $/e i 7 S® o., $/e o i o S S o 4 S® iS.eS, $ S® iS., $ 9 S® iS.eS, $/e S® iS., $/e 7 6 S® iSeS., $ e e o i S 5 S® iSe.S, $ S® .iSeS, $ S® .iS, $ S® .o, $ 10 S® iSe.S, $/e S® .iSeS, $/e S® .iS, $/e S® .o, $/e 11 S® iSeS., $/e S 1. S® iSeS 2. S® iS 3. S® o 1.c. La grammaire n’est pas LR(1) parce qu’il y a un conflit shift/reduce dans l’entrée [9,e] de table LR(1) IFT313/IFT451 © Froduald Kabanza
1.d-e AFD LALR(1) et Table d’analyse LALR(1) actions goto S’® .S, $ S® .iSeS, $ S® .iS, $ S® .o, $ S 1 S’® S., $ i e o $ S s2 s3 1 acc 2 4 3 r3 r2 s5 5 6 r1 o i 2 S® i.SeS, $/e S® .iSeS, $/e S® .iS, $/e S® .o, $/e 3 S® o., $/e o i S 4 S® iS.eS, $/e S® iS., $/e i o e Ce qui est normal. Si la grammaire est non LR(1), elle ne peut pas non plus être LALR(1). 5 S® iSe.S, $/e S® .iSeS, $/e S® .iS, $/e S® .o, $/e 1. S® iSeS 2. S® iS 3. S® o S 6 S® iSeS., $/e 1.f. La grammaire n’est pas LR(1) parce qu’il y a un conflit shift/reduce dans l’entrée [4,e] de table LALR(1) IFT313/IFT451 © Froduald Kabanza
Exercice 2 IFT313
Exercice 2 Soit la grammaire G= ({S, E}, { id, +, ), ( }, R, S), avec 3. E → id (E) 4. E → E + id } Les numéros a) à d) sont à faire à domicile. Donnez l’AFD LR(0) de la grammaire. Donnez la table d’analyse LR(0). Est-ce une grammaire LR(0)? Expliquez. Donnez la table d’analyse SLR(1). Es-ce une grammaire SLR(1) ? Expliquez. Donnez l’AFD LR(1). Est-ce une grammaire LR(1)? Donnez l’AFD LALR(1). Donnez la table d’analyse LALR(1). Est-ce une grammaire LALR(1)? IFT313
s E id id + + id ( E ) 2.a. AFD LR(0). 1 4 2 6 3 5 7 8 IFT313 1 Closure([S’S]) ={[S’ S], [S E], [E id], [E id(E)], [E E+id]} Closure([S’S]) ={[S’ S]} s 4 =Closure([E E+id]) ={[E E+id]} E 2 id id =Closure({[SE], [E E+id]}) ={[SE], [E E+id]} 6 + Goto(4, id) =Closure([E E+id]) ={[E E+id]} 3 =Closure({[E id], [E id(E)]}) ={[E id], [E id(E)]} + id 5 7 =Closure([E id(E)]) ={[E id(E)],[E id], [E id(E)],[E E+id]} =Closure({[E id(E)], [E E+id]}) ={[E id(E)], [E E+id]} ( E ) 8 =Closure([E id(E)]) ={[E id(E)]} IFT313
2.b Table d’analyse LR(0) id + ( ) $ S E s3 1 2 acc r1 s4 3 r2 s5 4 s6 action/goto goto id + ( ) $ S E s3 1 2 acc r1 s4 3 r2 s5 4 s6 5 7 6 r4 s8 8 r3 2.c Ce n’est pas une grammaire LR(0) parce que la table d’analyse contient des conflits dans les entrées [2,+] et [3,(]. IFT313
2.d Table d’analyse SLR(1) id + ( ) $ S E s3 1 2 acc s4 r1 3 r2 s5 4 action/goto goto id + ( ) $ S E s3 1 2 acc s4 r1 3 r2 s5 4 s6 5 7 6 r4 s8 8 r3 2.e C’est une grammaire SLR(1) parce que la table d’analyse SLR(1) n’a pas de conflit. IFT313
2.f. AFD LR(1) 4 Closure([E E+id;{$,+}]) ={[E E+id;{$,+}]} 6 1 Closure([E E+id;{$,+}]) ={[E E+id;{$,+}]} Closure([S’S;{$}]) ={[S’ S;{$}], [S E;{$}], [E id;{$,+}], [E id(E) ;{$,+}], [E E+id;{$,+}]} id Closure([S’S;{$}]) ={[S’ S;{$}]} S 2 Closure({[E id(E);{$,+}], [E E+id;{),+}]}) ={[E id(E);{$,+}], [E E+id;{),+}]} Closure({[SE;{$}], [E E+id;{$,+}]}) ={[SE;{$}], [E E+id;{$,+}]} + E 7 ) 9 id 3 Closure([E id(E);{$,+}]) ={[E id(E);{$,+}]} Closure({[E id;{$,+}], [E id(E) ;{$,+}]}) ={[E id;{$,+}], [E id(E) ;{$,+}]} E 5 + 10 Closure([E id(E);{$,+}]) ={[E id(E) {$,+}], [E id;{), +}], [E id(E);{), +}], [E E+id;{), +}]} Closure([E E+id;{),+}]}) ={[E E+id;{),+}]} 12 Goto(10, id) =Closure([E E+id;{),+}]}) ={[E E+id;{),+}]} ( id id 8 + Closure({[E id;{), +}], [E id(E);{), +}]) ={[E id;{), +}], [E id(E);{), +}]} 13 id Closure({[E id(E);{),+}], [E E+id;{),+}]}) ={[E id(E);{),+}], [E E+id;{),+}]} Closure([E id(E);{),+}]) ={[E id(E) {),+}], [E id;{), +}], [E id(E);{), +}], [E E+id;{), +}]} 11 ( ) 14 E Closure([E id(E);{),+}]) ={[E id(E);{),+}]} IFT313
7. Table d’analyse LR(1) action/goto goto id + ( ) $ S E s3 1 2 acc s4 r1 3 r2 s5 4 s6 5 s8 7 6 r4 s10 s9 8 s11 9 r3 10 s12 11 12 13 s14 14 8. C’est une grammaire LR(1) parce que la table d’analyse LR(1) n’a pas de conflit. IFT313
8. AFD LALR(1) 6 1 {[E E+id;{$,+,)}]} {[S’ S;{$}], [S E;{$}], [E id;{$,+}], [E id(E) ;{$,+}], [E E+id;{$,+}]} {[S’ S ;{$}]} S id 2 4 {[SE;{$}], [E E+id;{$,+}]} {[E E+id;{$,+,)}]} E + 8 id 3 {[E id(E);{$,+,)}]} {[E id;{$,+, )}], [E id(E) ;{$,+, )}]} id 5 {[E id(E) {$,+,)}], [E id;{), +}], [E id(E);{), +}], [E E+id;{), +}]} + 7 E ( {[E id(E);{$,+, )}], [E E+id;{),+}]} ) Obtenu de l’AFD LR(1) en fusionnant les états ayant les mêmes couleurs : 8-3; 4-10; 5-11; 7-13; 9-14. L’état 8 correspond au 9 dans l’AFD LR(1). Sans surprise, c’est le même AFD que l’AFD LR(0) mis à part les lookahead, vu que la grammaire est SLR(1). IFT313
2.g Table d’analyse LALR(1) id + ( ) $ S E s3 1 2 acc s4 r1 3 r2 s5 4 action/goto goto id + ( ) $ S E s3 1 2 acc s4 r1 3 r2 s5 4 s6 5 7 6 r4 s8 8 r3 2.h C’est une grammaire LALR(1) parce que la table d’analyse LALR(1) n’a pas de conflit. On s’y attend puisque la grammaire est SLR(1). En fait la table LALR(1) est la même que la table SLR(1). IFT313