du 7 décembre 2007, documents non autorisés.
On modélise par une grammaire G un sous-ensemble du français. Les classes des unités lexicales sont {verbe, nom, qui, et, . }. Ces classes sont aussi les symboles terminaux de la grammaire G. L'unité lexicale verbe peut prendre les valeurs: dérange, suit, aime, frappe, et écoute. L'unité lexicale nom peut prendre les valeurs Alphonse, Bastien, Yannick et Hélène. Les unités lexicales qui, et, et . ont une seule valeur (eux-mêmes).
| P → | S verbe C . |
|---|---|
| S → | nom |
| C → | nom | nom R |
| R → | qui verbe C | R et R |
On veut analyser la phrase : Alphonse suit Bastien qui écoute Hélène qui dérange Yannick et qui aime Alphonse.
| P → | nom | ||||||
|---|---|---|---|---|---|---|---|
| + | verbe | ||||||
| + | C1 → | nom | |||||
| + | R1 → | 'qui' | |||||
| + | verbe | ||||||
| + | C2 → | nom | |||||
| + | R2 → | R3 → | 'qui' | ||||
| + | verbe | ||||||
| + | C3 → | nom | |||||
| + | 'et' | ||||||
| + | R4 → | 'qui' | |||||
| + | verbe | ||||||
| + | C4 → | nom | |||||
| + | '.' |
exempleSupprimons la récursivité gauche dans la production R → 'qui' verbe C | R 'et' R :
Calculer la table de transitions LL(1) pour les productions R et R':
| FIRST | FOLLOW | |
|---|---|---|
| R | 'qui' | '.', 'et' |
| R' | 'et', epsilon | 'et', '.' |
| verbe | nom | qui | et | '.' | $ | |
| R | r1 | |||||
| R' | r2, r3 | r3 |
Il y a un conflit lorsqu'on rencontre 'et'.
: Quelle explication peut-on donner?
On considère la grammaire G2 obtenue à partir de la grammaire initiale G en supprimant la production R → R et R. Transformer la grammaire G2 pour la rendre LL(1). Calculer la table de transitions LL(1) de G2.
| n°. | G “allégée” | G2 |
|---|---|---|
| 1 | P→ S verbe C . | P→ S verbe C . |
| 2 | S → nom | S → nom |
| 3 | C → nom | C → nom C' |
| 4 | C → nom R | C' → R |
| 5 | R → qui verbe C | C' → epsilon |
| 6 | R → qui verbe C |
Puisque deux productions de C commençaient par nom, il faut désambiguer.
| nom | verbe | 'qui' | '.' | '$' | |
|---|---|---|---|---|---|
| P | r1 | ||||
| S | r2 | ||||
| C | r3 | ||||
| C' | r5 | r4 | |||
| R | r6 |
En suivant la table de transitions calculée à la question précédente, donner les étapes de l'analyse descendante de la phrase Hélène frappe Bastien qui dérange Yannick.
| Pile | Entrée | Action |
|---|---|---|
| $P | nom verbe nom 'qui' verbe nom '.' $ | Prod 1 |
| $ . C verbe S | nom verbe nom 'qui' verbe nom '.' $ | Prod 2 |
| $ . C verbe nom | nom verbe nom 'qui' verbe nom '.' $ | pop |
| $ . C verbe | verbe nom 'qui' verbe nom '.' $ | pop |
| $ . C | nom 'qui' verbe nom '.' $ | Prod 3 |
| $ . C' nom | nom 'qui' verbe nom '.' $ | pop |
| $ . C' | 'qui' verbe nom '.' $ | Prod 5 |
| $ . R | 'qui' verbe nom '.' $ | Prod 6 |
| $ . C verbe 'qui' | 'qui' verbe nom '.' $ | pop |
| $ . C verbe | verbe nom '.' $ | pop |
| $ . C | nom '.' $ | prod 3 |
| $ . C' nom | nom . $ | pop |
| $ . C' | . $ | prod 4 |
| $ . | . $ | pop |
| $ | $ | acc |
On se donne la grammaire suivante pour reconnaitre des expression arithmétiques écrites de manière post-fixée. L'ensemble des terminaux est {num, op } et la grammaire possède un seul non-terminal E et les règles suivantes
| E | → | num |
| E | → | E E op |
Les expressions suivantes appartiennent-elles au langage engendré par cette grammaire?
| Expression | Réponse |
|---|---|
| num num num op op | oui : E [E E op] op |
| num num op num op op | non : ([E E op] E op) E manquant op (ou op en trop) |
Autrement dit, dans la deuxième expression, il faudrait trouver une dérivation de num num op num op à partir de E E. On peut tout essayer, on n'y arrivera pas
| E1 | E2 | |
|---|---|---|
| num | num op num op | Faux, E2 n'est pas ainsi dérivable |
| num num op | num op | Faux, E2 n'est pas ainsi dérivable |
Cette grammaire est-ell LL(1)? LR(0)? SLR(1)? Dans le cas de réponse positive, construire la table de transitions correspondante.
Fixons notre grammaire:
| 0 | E' → E |
|---|---|
| 1 | E → num |
| 2 | E → E E num |
| num | op | $ | E | ||
| 0 | s2 | : | 1 | ||
| 1 | s2 | : | 3 | ||
| 2 | r1 | r1 | r1 | : | |
| 3 | s2 | s4 | : | 3 | |
| 4 | r2 | r2 | r2 | : |
On suppose que l'on veut traiter également des opérations unaires. Pour cela on ajoute la règle : E → E op. La nouvelle grammaire ainsi obtenue est-elle LL(1)? SLR(1)? LR(1)?
| règle | Production |
|---|---|
| 1 | E' → E |
| 2 | E → num |
| 3 | E → E E op |
| 4 | E → E op |
Pour la table LR(), d'abord les états:
| goto | fermeture | LA | état |
|---|---|---|---|
| s0 = | E' → . E | $ | |
| E → . num | $ | ||
| E → . E E op | $ | ||
| E → . E op | $ | ||
| goto(s0,E) = | E' → E. | $ | |
| E → E . E op | $ | ||
| E → . num | op | ||
| E → . E E op | op | ||
| E → . E op | op | ||
| E → E . op | op | ||
| E → E . op | $ | = s1 | |
| goto(s0, num) = | E → num . | $ | = s2 |
| goto(s1, E ) = | E → E E . op | $ | |
| E → E . E op | op | ||
| E → . num | op | ||
| E → . E E op | op | ||
| E → . E op | op | ||
| E → E . op | $ | = s3 | |
| goto(s1, num) = | E → num . | $ | = s4 |
| goto(s1, op) = | E → E E op . | $ | = s5 |
| goto(s3, op) = | E → E op . | $ | |
| E → E E op . | op | = s6 | |
| goto(s3, E ) = | E → E E . op | op | |
| E → E . E op | op | ||
| E → . E E op | op | ||
| E → . E op | op | ||
| E → E . op | op | ||
| E → . num | op | = s7 | |
| goto(s3, num) = | E → num . | $ | = s4 |
| goto(s7, op ) = | E → E E op . | op | |
| E → E op . | op | = s8 | |
| goto(s7, E ) = | E → E E . op | op | |
| E → E . E op | op | ||
| E → . E E op | op | ||
| E → . E op | op | ||
| E → E . op | op | ||
| E → . num | op | = s7 | |
| goto(s7, num) = | E → num . | $ | = s4 |
| état | num | op | $ | : | E |
|---|---|---|---|---|---|
| 0 | s2 | : | 1 | ||
| 1 | s4 | s5 | acc | : | 3 |
| 2 | r2 | r2 | r2 | : | |
| 3 | s4 | s6 | : | 7 | |
| 4 | r2 | r2 | r2 | : | |
| 5 | r4 | r4 | r4 | : | |
| 6 | r3/r4 | r3/r4 | : | ||
| 7 | s4 | : | 7 | ||
| 8 | r3/r4 | r3/r4 | r3/r4 | : |
Il y a des conflits (reduce/reduce), ce n'est donc pas LR(1).
Note: pour passer de LR(1) à LALR(1), on regroupe les état s6 et s8, s2 et s4