Existem exemplos de linguagens de computador do mundo real que não são deterministas?
Por linguagens de computador eu incluo linguagens de programação, linguagens de marcação, linguagens de consulta, linguagem de modelagem, linguagens de transformação, etc.
Por não determinístico, quero dizer que eles não podem ser analisados com gramáticas determinísticas.
Respostas:
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
Se
A
é uma variável, esta é a multiplicação de duas variáveis e é equivalente aA*B
. No entanto, seA
é o nome de um tipo, essa é uma desreferência de ponteiro e conversão de tipo (assimB
como um nome de variável que contém um tipo de ponteiro) e equivalente a(A) *B
.Similarmente,
pode ser uma declaração de variável (se
A
é o nome de um tipo, está declarando uma variável chamadaB
cujo tipo é ponteiro paraA
) ou uma multiplicação (seA
eB
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.
fonte