Boa pergunta. Embora, como mencionado nos comentários, muitas linguagens de programação sejam sensíveis ao contexto, essa sensibilidade ao contexto geralmente não é resolvida na fase de análise, mas nas fases posteriores - ou seja, um superconjunto da linguagem é analisado usando uma gramática livre de contexto, e algumas dessas árvores de análise são posteriormente filtradas.
No entanto, isso não significa que essas linguagens não sejam sensíveis ao contexto , então, aqui estão alguns exemplos:
Haskell permite definir funções que são usadas como operadores e também definir a precedência e associatividade desses operadores. Em outras palavras, você não pode construir a árvore de análise correta para uma expressão de operador como:
a @@ b @@ c ## d ## e
a menos que você já tenha analisado as declarações de precedência / associatividade para @@
e ##
:
infixr 8 @@
infixr 6 ##
Um segundo exemplo é o Bencode , uma linguagem de dados que prefixa o conteúdo com seu comprimento:
<length>:<contents>
O problema desse formato é que é praticamente impossível analisar sem algo sensível ao contexto, porque a única maneira de descobrir os tamanhos dos "campos" é ... analisando a sequência.
Um terceiro exemplo é XML, assumindo que nomes arbitrários de tags são permitidos: os nomes de tags de abertura devem ter tags de fechamento correspondentes:
<hi>
<bye>
the closing tag has to match bye
</bye>
</hi> <!-- has to match "hi" -->