Je me suis amusé récemment à explorer le développement des analyseurs de langage dans le contexte de leur intégration dans la hiérarchie de Chomsky.
Qu'est-ce qu'un bon exemple concret (c'est-à-dire non théorique) d'une grammaire contextuelle?
Je me suis amusé récemment à explorer le développement des analyseurs de langage dans le contexte de leur intégration dans la hiérarchie de Chomsky.
Qu'est-ce qu'un bon exemple concret (c'est-à-dire non théorique) d'une grammaire contextuelle?
Réponses:
Bonne question. Bien que, comme mentionné dans les commentaires, de nombreux langages de programmation soient sensibles au contexte, cette sensibilité au contexte n'est souvent pas résolue dans la phase d'analyse mais dans les phases ultérieures - c'est-à-dire qu'un sur-ensemble du langage est analysé à l'aide d'une grammaire sans contexte, et certains de ces arbres d'analyse sont ensuite filtrés.
Cependant, cela ne signifie pas que ces langues ne sont pas contextuelles , voici donc quelques exemples:
Haskell vous permet de définir des fonctions qui sont utilisées comme opérateurs, ainsi que de définir la priorité et l'associativité de ces opérateurs. En d'autres termes, vous ne pouvez pas créer l'arborescence d'analyse correcte pour une expression d'opérateur comme:
a @@ b @@ c ## d ## e
sauf si vous avez déjà analysé les déclarations de priorité / associativité pour @@
et ##
:
infixr 8 @@
infixr 6 ##
Un deuxième exemple est le Bencode , un langage de données qui préfixe le contenu avec sa longueur:
<length>:<contents>
Le problème avec ce format est qu'il est à peu près impossible d'analyser sans quelque chose de contextuel, car la seule façon de déterminer les tailles de "champ" est de ... analyser la chaîne.
Un troisième exemple est XML, en supposant que les noms de balises arbitraires sont autorisés: les noms de balises d'ouverture doivent avoir des balises de fermeture correspondantes:
<hi>
<bye>
the closing tag has to match bye
</bye>
</hi> <!-- has to match "hi" -->
Pour autant que je sache, les grammaires contextuelles sont utilisées uniquement dans le traitement du langage naturel . Les interprètes et les compilateurs de langages de programmation n'essaient pas d'analyser une grammaire sans contexte à cause de la complexité (même si une tentative a été faite dans le passé).
Peut-être, vous pouvez trouver un exemple d'utilisation réelle dans l'une de ces bibliothèques:
http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits
Des grammaires sensibles au contexte sont parfois utilisées dans les descriptions de la sémantique des langages de programmation. L'utilisation la plus complète des grammaires contextuelles était peut-être la définition du langage Algol68. Il a utilisé une grammaire sans contexte à deux niveaux (voir http://en.wikipedia.org/wiki/Two-level_grammar ) pour décrire à la fois la syntaxe et la sémantique des programmes Algol68.
Un couple de mes collègues a utilisé la grammaire van Wijngaarden pour diriger leur implémentation d'Algol68 (voir http://en.wikipedia.org/wiki/FLACC ).