La récursivité à gauche, et ce que la réécriture coûte
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 30 — Grammaires non contextuelles
Énoncé
La grammaire , est récursive à gauche. On la réécrit
- Vérifier que les deux grammaires engendrent le même langage.
- Comparer les arbres d'analyse de
n-n-n. - Quelle valeur un analyseur naïf calculerait-il pour
8-3-2?
Corrigé
1. Les deux engendrent . Vérifié par énumération de tous les mots sur jusqu'à la longueur : les deux ensembles coïncident. Les grammaires sont faiblement équivalentes.
2. Chaque mot a un arbre unique dans chacune des deux — aucune n'est ambiguë. Mais les arbres n'ont pas la même forme :
On a omis, sous chaque , la feuille n qu'elle produit ; et le le plus à droite de l'arbre de droite se dérive en . Les feuilles lues de gauche à droite donnent n-n-n dans les deux cas — c'est bien le même mot, et ce sont bien deux arbres différents.
3. Un analyseur qui suivrait naïvement la grammaire réécrite construirait et calculerait 7. La bonne réponse est 3. Les deux valeurs ont été mesurées en exécutant les deux analyseurs.
Ce que la réécriture coûte, exactement. Elle conserve le langage et détruit la structure. Or c'est la structure qui porte le sens : est associatif à gauche, l'arbre penché à droite dit le contraire.
Comment on s'en sort en pratique — et c'est ce que fait le problème sur les expressions arithmétiques : on écrit la boucle
let rec e () =
let acc = ref (t ()) in
while pointe_sur '-' do lire '-'; acc := Moins (!acc, t ()) done;
!acc
qui consomme comme la grammaire réécrite — donc termine — mais accumule à gauche, donc construit le bon arbre. La boucle règle les deux problèmes d'un coup ; la simple traduction de la grammaire réécrite n'en règle qu'un.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.