Le sinon pendant, et sa réparation
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 30 — Grammaires non contextuelles
Énoncé
On code si par s, sinon par e, l'instruction élémentaire par a, et l'on omet la condition :
- Trouver le plus court mot ambigu et décrire ses deux arbres.
- Proposer une grammaire faiblement équivalente et non ambiguë.
Corrigé
1. Le plus court mot ambigu est ssaea, soit si si a sinon a. Il a exactement deux arbres :
- le
sinonse rattache au secondsi: avec à l'intérieur ; - le
sinonse rattache au premier : avec à l'intérieur.
Les deux lectures ne diffèrent pas seulement sur le papier : dans le premier cas, l'instruction du sinon s'exécute quand la première condition est vraie et la seconde fausse ; dans le second, quand la première est fausse. Un décompte par programmation dynamique donne arbres pour ssaea, pour sssaeaea — le nombre croît avec l'imbrication.
2. La réparation. On distingue les instructions appariées — dont tout si a son sinon — des autres :
La clé est la règle : entre un si et son sinon, on n'autorise qu'une instruction appariée. Un sinon ne peut donc jamais « sauter » par-dessus un si ouvert : il se rattache forcément au plus proche.
Vérifications. Les deux grammaires engendrent le même langage : les mots de longueur au plus coïncident. La seconde n'est ambiguë sur aucun mot de longueur au plus , et ssaea n'y a plus qu'un arbre.
Ce que font les vrais langages. Trois attitudes, et toutes se rencontrent :
- garder la grammaire ambiguë et ajouter une règle hors grammaire — « le
sinonse rattache ausile plus proche » : c'est le choix de C et de Java ; - remanier la grammaire comme ci-dessus ;
- rendre le marqueur de fin obligatoire (
fi,end, accolades) : l'ambiguïté disparaît alors par construction, sans qu'aucune règle extérieure ne soit nécessaire. C'est le choix d'Algol 68 et de Python.
Le troisième est le seul où l'on n'a rien à retenir.
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.