Las respuestas anteriores dan una muy buena definición de lo que es. Veamos si puedo expresarlo con mis propias palabras, para que tenga 23 explicaciones en lugar de 20. El propósito completo de una gramática, cualquier gramática, es averiguar si una oración en particular es una oración en el idioma dado. Sin embargo, para lo que realmente utilizamos las gramáticas y el análisis es averiguar qué significa la oración. Es como la antigua diagramación de una oración que puedes haber hecho o no en la clase de inglés en la escuela. Una oración está hecha de una parte sujeto y una parte predicada, una parte sujeto tiene un sustantivo y quizás algunos adjetivos, una parte predicada tiene un verbo y quizás un sustantivo objeto, con algunos adjetivos más, etc.
Si hubiera una gramática para el inglés (y no creo que la haya, no en el sentido informático), tendría reglas de la siguiente forma, llamadas producciones.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
etc ...
Luego, podría escribir un programa y entregarle cualquier oración, y el programa podría usar la gramática para descubrir qué parte de la oración es cada palabra y qué relación tienen entre sí.
Si en cada producción, solo hay una cosa en el lado izquierdo, eso significa que siempre que vea el lado derecho en la oración, se le permite sustituir en el lado izquierdo. Por ejemplo, cada vez que viste un sustantivo de adjetivo, podrías decir "Esa es una Parte de Sujeto" sin prestar atención a nada fuera de esa frase.
Sin embargo, el inglés (incluso la descripción simplificada del inglés que di anteriormente) es sensible al contexto. "Adjetivo sustantivo" no siempre es una SubjectPart, podría ser una NounPhrase en un PredicatePart. Depende del contexto. Expandamos un poco nuestra gramática pseudo-inglesa:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Solo puede hacer un "sustantivo adjetivo" en una ObjectNounPhrase si viene inmediatamente después de una VerbPhrase.
Básicamente, si tiene una producción y puede aplicarla en cualquier momento que desee, sin importar lo que la rodee, no tiene contexto.
Siempre se puede saber si una gramática está libre de contexto fácilmente. Simplemente verifique si hay más de un símbolo en el lado izquierdo de las flechas.
Cualquier lenguaje puede ser descrito por más de una gramática. Si alguna gramática de un idioma no tiene contexto, el idioma no tiene contexto. Se puede demostrar para algunos idiomas que no hay una gramática libre de contexto posible. Supongo que podría haber una gramática libre de contexto para el subconjunto pseudo-inglés simplificado que describo anteriormente.
En cuanto a por qué es importante, requiere un tipo de programa más simple para analizar una gramática libre de contexto. Como se señaló en las otras respuestas, no requiere toda la potencia de una máquina de Turing para analizar una gramática libre de contexto. Un analizador LR (1) de búsqueda anticipada (que es una especie de máquina pushdown) para una gramática particular sin contexto puede analizar cualquier oración en esa gramática en tiempo y espacio lineal a la longitud de la oración. Si la oración está en el idioma, el analizador producirá un árbol de estructura que identifica lo que significa cada símbolo en la oración (o al menos qué papel juega en la estructura). Si la oración no está en la gramática, el analizador notará y se detendrá en el primer símbolo que es imposible de conciliar con la gramática y los símbolos anteriores (en el primer "error").
Lo que es aún mejor es que hay programas a los que puede dar una descripción de una gramática y una lista de instrucciones sobre qué hacer con cada parte (en cierto sentido adjuntando un "significado" a cada producción) y el programa escribirá el analizador para ti. El programa analizará la oración, encontrará la estructura y ejecutará sus instrucciones en cada parte de la estructura. Este tipo de programa se llama generador de analizadores o compilador-compilador.
Este tipo de análisis del lenguaje fue inventado para el análisis automático del lenguaje natural (como el inglés), pero resulta que esto es muy útil para analizar lenguajes de computadora. Un diseñador de idiomas puede escribir una gramática que capture su nuevo idioma, luego ejecutarlo a través del generador de analizadores para obtener un programa que analice su idioma y traduzca, interprete, compile, ejecute, etc. si lo desea.
De hecho, en la mayoría de los casos realmente no puedes hacer esto. Por ejemplo, los paréntesis equilibrados son un lenguaje libre de contexto, pero un lenguaje donde se requiere declarar todas las variables antes de usarlas es sensible al contexto. El analizador es parte del compilador, pero se requiere lógica adicional para hacer cumplir estos otros requisitos. Lo que debe hacer es escribir una gramática que capture la mayor cantidad posible de su idioma, ejecutarla a través de un generador de analizadores, luego escribir código que aplique el resto de los requisitos (controlador de tabla de símbolos, etc.).
Por lo general, no usamos gramáticas sensibles al contexto porque son mucho menos compatibles. No sé si hay un equivalente a un generador de analizadores LR (k) para lenguajes sensibles al contexto. Sí, una máquina de Turing (o máquina lineal) puede analizar una, pero no sé si hay un algoritmo general para convertir una gramática sensible al contexto en un programa para una máquina de Turing, en el sentido de que un LR (1 ) generador hace tablas de análisis para una máquina pushdown. Mi conjetura es que las tablas que subyacen al analizador serían exponencialmente más grandes. En cualquier caso, a los estudiantes de CS (como yo, en el pasado) generalmente se les enseñan gramáticas libres de contexto y generadores de analizadores LR (1) como YACC.