Sim. Muitas linguagens de programação modernas possuem essa propriedade, incluindo Algol 60, C e C ++; veja abaixo para detalhes.
O Algol 60 teve o famoso problema dos outros pendentes , para alguns programas, era ambíguo como eles deveriam ser analisados (que árvore de análise deveria resultar).
Muitas línguas modernas resolvem isso escolhendo uma gramática que resolve a ambiguidade de uma maneira específica. No entanto, isso requer a construção cuidadosa da gramática para eliminar a ambiguidade. Geralmente, a maneira mais natural de escrever a gramática leva a uma gramática ambígua, e você deve transformá-la para evitar a ambiguidade.
Outra abordagem é usar um analisador GLR, que pode lidar com essas gramáticas. Em seguida, você pode verificar em tempo de execução se existem vários analisadores possíveis e resolver a ambiguidade.
Outro exemplo clássico são as linguagens de programação C e C ++. A gramática de referência para C não é livre de contexto, porque quando você vê um nome, precisa saber se é o nome de um tipo ou de uma variável para saber como analisar a instrução. Por exemplo, considere a expressão
(A)*B
Se A
é uma variável, esta é a multiplicação de duas variáveis e é equivalente a A*B
. No entanto, se A
é o nome de um tipo, essa é uma desreferência de ponteiro e conversão de tipo (assim B
como um nome de variável que contém um tipo de ponteiro) e equivalente a (A) *B
.
Similarmente,
A*B;
pode ser uma declaração de variável (se A
é o nome de um tipo, está declarando uma variável chamada B
cujo tipo é ponteiro para A
) ou uma multiplicação (se A
e B
são os nomes das variáveis).
Os compiladores geralmente corrigem isso incluindo código extra que "sai de cena" da linguagem das gramáticas puras e livres de contexto. Eles controlam todos os nomes de variáveis e nomes de tipos no escopo e usam isso para orientar a análise em caso dessa ambiguidade. Veja o lexer hack .
Consulte também LL e LR em Contexto: Por que as ferramentas de análise são difíceis e as páginas de manual de Bison em seu analisador GLR (que inclui uma discussão de outro caso ambíguo na gramática C ++).
Por fim: acho que a pergunta tem alguma confusão sobre a diferença entre ambiguidade e não-determinismo. Autômatos e idiomas podem ser determinísticos / não determinísticos, mas não gramáticos. Gramáticas e idiomas podem ser ambíguos / inequívocos. Consulte Existem linguagens inerentemente ambíguas e deterministas sem contexto? e caracterização gramatical de linguagens determinísticas livres de contexto e Se um analisador pode analisar uma gramática não determinística, o analisador não é determinístico? . Os exemplos acima, na verdade, qualificam tanto gramáticas ambíguas quanto linguagens não determinísticas.