As respostas acima dão uma boa definição do que é. Vamos ver se eu posso colocar isso com minhas próprias palavras, para que você tenha 23 explicações em vez de 20. Todo o objetivo de uma gramática, qualquer gramática, é descobrir se uma sentença específica é uma sentença no idioma especificado. No entanto, o que realmente usamos gramáticas e análises é descobrir o que a frase significa. É como o velho diagrama de uma frase que você pode ou não ter feito na aula de inglês na escola. Uma frase é feita de uma parte do sujeito e uma parte do predicado, uma parte do sujeito tem um substantivo e talvez alguns adjetivos, uma parte do predicado tem um verbo e talvez um substantivo do objeto, com mais adjetivos, etc.
Se houvesse uma gramática para o inglês (e acho que não existe, não no sentido da ciência da computação), ela teria regras da seguinte forma, denominadas produções.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
etc ...
Em seguida, você pode escrever um programa e entregá-lo a qualquer frase, e o programa pode usar a gramática para descobrir qual parte da frase cada palavra é e qual a relação entre elas.
Se em todas as produções houver apenas uma coisa no lado esquerdo, isso significa que, sempre que você vir o lado direito na frase, poderá substituir no lado esquerdo. Por exemplo, sempre que você vê o substantivo adjetivo, pode dizer "Essa é uma parte do sujeito" sem prestar atenção a nada fora dessa frase.
No entanto, o inglês (mesmo a descrição simplificada do inglês que forneci acima) é sensível ao contexto. "Substantivo adjetivo" nem sempre é um SubjectPart, pode ser um NounPhrase em um PredicatePart. Depende do contexto. Vamos expandir um pouco nossa gramática pseudo-inglesa:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Você só pode transformar um "substantivo adjetivo" em um ObjectNounPhrase se ele vier logo após um VerbPhrase.
Basicamente, se você tem uma produção e pode aplicá-la a qualquer momento, não importa o que a rodeia, ela é livre de contexto.
Você sempre pode saber se uma gramática é livre de contexto facilmente. Basta verificar se há mais de um símbolo no lado esquerdo das setas.
Qualquer idioma pode ser descrito por mais de uma gramática. Se alguma gramática de um idioma é livre de contexto, o idioma é livre de contexto. Pode ser comprovado para alguns idiomas que não há gramática livre de contexto. Suponho que possa haver uma gramática livre de contexto para o subconjunto pseudo-inglês simplificado que estou descrevendo acima.
Quanto ao motivo, é necessário um tipo mais simples de programa para analisar uma gramática livre de contexto. Conforme observado nas outras respostas, ele não requer todo o poder de uma máquina de Turing para analisar uma gramática livre de contexto. Um analisador lookahead LR (1) (que é um tipo de máquina de empilhamento) para uma gramática livre de contexto específica pode analisar qualquer sentença nessa gramática no tempo e no espaço linear ao comprimento da sentença. Se a sentença estiver no idioma, o analisador produzirá uma árvore de estrutura identificando o significado de cada símbolo na sentença (ou pelo menos que parte ela desempenha na estrutura). Se a sentença não estiver na gramática, o analisador notará e parará no primeiro símbolo que é impossível reconciliar com a gramática e os símbolos anteriores (no primeiro "erro").
O melhor de tudo é que existem programas que você pode fornecer uma descrição de uma gramática e uma lista de instruções sobre o que fazer com cada parte (de certa forma anexando um "significado" a cada produção) e o programa escreverá o analisador para voce. O programa analisará a sentença, encontrará a estrutura e executará suas instruções em cada parte da estrutura. Esse tipo de programa é chamado de gerador de analisador ou compilador-compilador.
Esse tipo de análise de linguagem foi inventado para análise automática de linguagem natural (como o inglês), mas acontece que isso é mais útil para analisar linguagens de computador. Um designer de linguagem pode escrever uma gramática que captura seu novo idioma, depois executá-lo através do gerador de analisador para obter um programa que analisa seu idioma e traduz, interpreta, compila, executa, etc., se ele quiser.
De fato, na maioria dos casos, você realmente não pode fazer isso. Por exemplo, parênteses balanceados são uma linguagem livre de contexto, mas uma linguagem em que é necessário declarar todas as variáveis antes de usá-las é sensível ao contexto. O analisador faz parte do compilador, mas é necessária lógica adicional para impor esses outros requisitos. O que você precisa fazer é escrever uma gramática que capte o máximo de seu idioma possível, executar isso através de um gerador de analisador e depois escrever um código que imponha o restante dos requisitos (manipulador de tabela de símbolos, etc.).
Geralmente, não usamos gramáticas sensíveis ao contexto porque elas são muito mais mal suportadas. Não sei se existe um equivalente a um gerador de analisador LR (k) para linguagens sensíveis ao contexto. Sim, uma máquina de Turing (ou máquina de ligação linear) pode analisar uma, mas não sei se existe um algoritmo geral para transformar uma gramática sensível ao contexto em um programa para uma máquina de Turing, no sentido de que uma LR (1 ) cria tabelas de análise para uma máquina de empilhamento. Meu palpite é que as tabelas subjacentes ao analisador seriam exponencialmente maiores. De qualquer forma, os estudantes de CS (como eu, antigamente) são geralmente ensinados gramáticas sem contexto e geradores de analisadores LR (1), como o YACC.