web-dev-qa-db-fra.com

Grammaires sans contexte versus grammaires contextuelles?

Quelqu'un peut-il m'expliquer pourquoi des grammaires [grammaire sans contexte et grammaire contextuelle] de ce type acceptent une chaîne?

Ce que je sais c'est

Grammaire sans contexte est une grammaire formelle dans laquelle chaque règle de production (réécriture) est une forme de V → w où V est un symbole non terminal unique et w est une chaîne de terminaux et/ou de non-terminaux . w peut être vide

Grammaire contextuelle est une grammaire formelle dans laquelle les côtés gauche et droit de toute règle de production (réécriture) peuvent être entourés par un contexte de symboles terminaux et non terminaux.

Mais comment expliquer pourquoi cette grammaire accepte une chaîne?

39
user1004413

Un détail important ici est que les grammaires n'acceptent pas les chaînes ; ils génèrent des chaînes. Les grammaires sont des descriptions de langues qui fournissent un moyen de générer toutes les chaînes possibles contenues dans la langue. Pour savoir si une chaîne particulière est contenue dans le langage, vous utiliseriez un identificateur , une sorte d'automate qui traite une chaîne donnée et dit " Oui ou non."

A grammaire hors contexte (CFG) est une grammaire où (comme vous l'avez noté) chaque production a la forme A → w, où A est un non terminal et w est une chaîne de terminaux et non terminaux. De manière informelle, un CFG est une grammaire où tout non terminal peut être étendu à n'importe laquelle de ses productions à tout moment. La langue d'une grammaire est l'ensemble des chaînes de terminaux qui peuvent être dérivées du symbole de début.

Une contexte - grammaire sensible (CSG) est une grammaire où chaque production a la forme wAx → wyx, où w et x sont des chaînes de terminaux et non terminaux et y est également une chaîne de terminaux. En d'autres termes, les productions donnent des règles disant "si vous voyez A dans un contexte donné , vous pouvez remplacer A par la chaîne y". Il est regrettable que ces grammaires soient appelées "grammaires contextuelles" car cela signifie que "sans contexte" et "contextuelles" ne sont pas opposées, et cela signifie qu'il existe certaines classes de grammaires qui prennent sans doute beaucoup de contexte informations mais ne sont pas formellement considérées comme sensibles au contexte.

Pour déterminer si une chaîne est contenue dans un CFG ou un CSG, il existe de nombreuses approches. Tout d'abord, vous pouvez créer un identificateur pour la grammaire donnée. Pour les CFG, le automate pushdown (PDA) est un type d'automate qui accepte précisément les langages sans contexte, et là est une construction simple pour transformer n'importe quel CFG en PDA. Pour les grammaires contextuelles, l'automate que vous utiliseriez s'appelle un automate borné linéaire (LBA).

Cependant, ces approches ci-dessus, si elles sont traitées naïvement, ne sont pas très efficaces. Pour déterminer si une chaîne est contenue dans le langage d'un CFG, il existe des algorithmes beaucoup plus efficaces. Par exemple, de nombreuses grammaires peuvent avoir LL (k) ou LR (k) analyseurs construits pour elles, ce qui vous permet (en temps linéaire) de décider si une chaîne est contenue dans la grammaire. Toutes les grammaires peuvent être analysées en utilisant le analyseur Earley , qui en O (n3) peut déterminer si une chaîne de longueur n est contenue dans la grammaire (il est intéressant de noter qu'elle peut analyser tout CFG sans ambiguïté dans O (n2), et avec lookaheads peut analyser n'importe quelle grammaire LR (k) en O(n) fois!). Si vous étiez purement intéressé par la question "la chaîne x est-elle contenue dans le langage généré par la grammaire G?", Alors l'une de ces approches serait excellente. Si vous vouliez savoir comment la chaîne x a été générée (en trouvant un arbre d'analyse), vous pouvez adapter ces approches à fournir également ces informations. Cependant, l'analyse des CSG est, en général, terminée par PSPACE, il n'y a donc pas d'algorithmes d'analyse connus pour eux qui s'exécutent dans le pire cas polynomial. Cependant, certains algorithmes ont tendance à s'exécuter rapidement. Les auteurs de Techniques d'analyse: un guide pratique (voir ci-dessous) ont rassemblé ne page fantastique contenant toutes sortes d'algorithmes d'analyse , dont un qui analyse les langages contextuels.

Si vous souhaitez en savoir plus sur l'analyse, consultez l'excellent livre " Parsing Techniques: A Practical Guide, Second Edition " de Grune et Jacobs, qui traite de toutes sortes d'algorithmes d'analyse pour déterminer si une chaîne est contenue dans une grammaire et, si oui, comment elle est générée par l'algorithme d'analyse.

J'espère que cela t'aides!

109
templatetypedef

Comme cela a été dit précédemment, une grammaire n'accepte pas une chaîne, mais c'est simplement un moyen de générer des mots spécifiques d'un langage que vous analysez. En fait, la grammaire comme règle générative dans la théorie du langage formel au lieu de l'automate à états finis fait ce que vous dites, la reconnaissance de chaînes spécifiques. En particulier, vous avez besoin d'un automate énumérable récursif afin de reconnaître les langages de type 1 (les langages sensibles au contexte dans la hiérarchie de Chomsky). Une grammaire pour une langue spécifique vous accorde uniquement de spécifier la propriété de toutes les chaînes qui se rassemblent à l'ensemble de chaînes de la langue CS. J'espère que mon explication était claire.

1
Alessandro S

Un moyen simple de montrer qu'une grammaire accepte une chaîne est d'afficher les règles de production de cette chaîne.

0
Rob Neuhaus