Les réponses ci-dessus donnent une très bonne définition de ce que c'est. Voyons si je peux le formuler avec mes propres mots, pour que vous ayez 23 explications au lieu de 20. Le but d'une grammaire, toute grammaire, est de déterminer si une phrase particulière est une phrase dans la langue donnée. Cependant, ce que nous utilisons réellement pour les grammaires et l'analyse syntaxique est de comprendre le sens de la phrase. C'est comme le vieux diagramme d'une phrase que vous pourriez avoir ou non fait en classe d'anglais à l'école. Une phrase est composée d'une partie de sujet et d'une partie de prédicat, une partie de sujet a un nom et peut-être quelques adjectifs, une partie de prédicat a un verbe et peut-être un nom d'objet, avec quelques adjectifs supplémentaires, etc.
S'il existait une grammaire anglaise (et je ne pense pas qu'il en existe, pas au sens informatique), elle aurait des règles de la forme suivante, appelées productions.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
etc...
Vous pouvez ensuite écrire un programme et lui transmettre n'importe quelle phrase. Le programme pourrait également utiliser la grammaire pour déterminer la partie de la phrase de chaque mot et la relation entre eux.
Si dans chaque production, il n'y a qu'une chose du côté gauche, cela signifie que chaque fois que vous voyez le côté droit de la phrase, vous êtes autorisé à le remplacer par le côté gauche. Par exemple, chaque fois que vous voyez un nom adjectif, vous pouvez dire "Voilà un sujet" sans faire attention à rien en dehors de cette phrase.
Cependant, l'anglais (même la description simplifiée de l'anglais que j'ai donnée ci-dessus) est sensible au contexte. Le "nom adjectif" n'est pas toujours un SubjectPart, il pourrait s'agir d'un NounPhrase dans un PredicatePart. Ça dépend du contexte. Développons un peu notre pseudo-grammaire anglaise:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Vous ne pouvez créer un "nom adjectif" dans un ObjectNounPhrase que s'il vient juste après un VerbPhrase.
Fondamentalement, si vous avez une production et que vous pouvez l'appliquer à tout moment, peu importe ce qui l'entoure, elle est sans contexte.
Vous pouvez toujours savoir si une grammaire est sans contexte facilement. Il suffit de vérifier s’il ya plus d’un symbole à gauche des flèches.
Toute langue peut être décrite par plus d'une grammaire. Si une grammaire pour une langue est sans contexte, la langue est sans contexte. On peut prouver pour certaines langues qu’il n’ya pas de grammaire sans contexte possible. Je suppose qu'il pourrait exister une grammaire sans contexte pour le sous-ensemble de pseudo-anglais simplifié que je décris ci-dessus.
Pour ce qui est de savoir pourquoi cela compte, il faut un type de programme plus simple pour analyser une grammaire sans contexte. Comme indiqué dans les autres réponses, il n’est pas nécessaire de disposer de toute la puissance d’une machine de Turing pour analyser une grammaire sans contexte. Un analyseur syntaxique LR (1) à la recherche (qui est une sorte de machine à dérouler) pour une grammaire particulière sans contexte peut analyser n'importe quelle phrase de cette grammaire dans le temps et dans l'espace linéairement à la longueur de la phrase. Si la phrase est dans le langage, l'analyseur produira un arbre de structure identifiant la signification de chaque symbole dans la phrase (ou au moins le rôle qu'il joue dans la structure). Si la phrase ne figure pas dans la grammaire, l'analyseur remarquera et s'arrêtera sur le premier symbole impossible à réconcilier avec la grammaire et les symboles précédents (sur le premier "erreur").
Ce qui est encore mieux, c’est qu’il existe des programmes pour décrire une grammaire et une liste d’instructions sur ce qu’il faut faire avec chaque partie (en un sens associant un "sens" à chaque production) et que le programme écrira l’analyseur. pour vous. Le programme va analyser la phrase, trouver la structure et exécuter vos instructions sur chaque partie de la structure. Ce type de programme s'appelle un analyseur-générateur ou un compilateur-compilateur.
Ce type d’analyse linguistique a été inventé pour l’analyse automatique du langage naturel (comme l’anglais), mais il s’avère que c’est très utile pour l’analyse des langages informatiques. Un concepteur de langage peut écrire une grammaire qui capture son nouveau langage, puis l'exécuter à travers l'analyseur-générateur pour obtenir un programme qui analyse son langage et qui traduit, interprète, compile, exécute, etc. s'il le souhaite.
En fait, dans la plupart des cas, vous ne pouvez pas vraiment faire cela. Par exemple, les parenthèses équilibrées sont un langage sans contexte, mais un langage dans lequel il est nécessaire de déclarer toutes les variables avant de les utiliser est sensible au contexte. L'analyseur est une partie du compilateur, mais une logique supplémentaire est nécessaire pour appliquer ces autres exigences. Ce que vous devez ensuite faire, c'est écrire une grammaire qui capture le plus possible votre langage, l'exécuter à l'aide d'un générateur d'analyseurs syntaxiques, puis écrire un code qui applique le reste des exigences (gestionnaire de table de symboles, etc.).
Nous n'utilisons généralement pas de grammaires contextuelles car elles sont beaucoup plus mal prises en charge. Je ne sais pas s'il existe un équivalent à un générateur d'analyseur syntaxique LR (k) pour les langages contextuels. Oui, une machine de Turing (ou une machine liée linéaire) peut en analyser une, mais je ne sais pas s'il existe un algorithme général permettant de transformer une grammaire contextuelle en un programme pour une machine de Turing, en ce sens qu'une LR (1 ) générateur crée des tables d'analyse pour une machine à pression. À mon avis, les tables sous-jacentes à l'analyseur seraient exponentiellement plus grandes. Dans tous les cas, les élèves CS (comme moi, à l'époque) apprennent généralement des grammaires sans contexte et des générateurs d'analyseurs LR (1) tels que YACC.