Existe algum algoritmo de análise não-geral de CFG que reconheça o EPAL?

23

EPAL, o idioma dos palíndromos pares, é definido como o idioma gerado pela seguinte gramática inequívoca e livre de contexto:

Saa

Sbb

SaSa

SbSb

O EPAL é o 'bane' de muitos algoritmos de análise: ainda não encontrei nenhum algoritmo de análise para CFGs inequívocos que possam analisar qualquer gramática que descreva o idioma. É frequentemente usado para mostrar que existem CFGs inequívocos que não podem ser analisados ​​por um analisador específico. Isso inspirou minha pergunta:

Existe algum algoritmo de análise que aceita apenas CFGs inequívocos que funcionam no EPAL?

Obviamente, é possível projetar um analisador ad-hoc de duas passagens para a gramática que analisa o idioma em tempo linear. Estou interessado em analisar métodos que não foram projetados especificamente com o EPAL em mente.

Alex ten Brink
fonte
1
Estou quase com medo de perguntar: o que há de errado com LL (1) por descendência recursiva?
Raphael
3
A descida recursiva sem retorno atrás não pode lidar com o EPAL, pois o idioma não é LL (k) para nenhum k. A descida recursiva com retorno pode lidar com a gramática no tempo O(n2) , mas esse é um algoritmo geral com comportamento exponencial de pior caso, que não é o que estou procurando.
Alex-Brink
não é exponencial, é quadrático. O ( 2 N ) é exponencial. O(N2)O(2N)
22330 Victor Stafusa
1
@ Victor: o retorno tem um comportamento exponencial em algumas gramáticas, mas não nessa gramática específica. Ainda assim, o fato de ser um algoritmo que trabalha com gramáticas ambíguas desconta-o como resposta à minha pergunta.
Alex-Brink
1
@jmad: minha intenção não é analisar o idioma (você pode fazer isso trivialmente em tempo linear), mas sim satisfazer minha curiosidade: já vi isso sendo usado como exemplo de um idioma que não pode ser analisado por um método de análise tantas vezes que estou curioso para saber se existe algum método de análise que o reconheça.
Alex-Brink

Respostas:

14

Considere o seguinte esboço de uma estratégia de análise por seu próprio risco.

Em vez de ler a entrada apenas de uma extremidade, lemos de ambos os lados e procuramos regras de correspondência. Podemos fazer isso no estilo descendente recursivo; em uma chamada para , encontre o prefixo w e o sufixo v na entrada, de modo que exista uma regra A w B v , desça para B ( ) na palavra restante. Se não houver uma regra correspondente, rejeite a palavra.A()wvAwBvB()

AwBvAwBvwpwvsvΘ(n2)

A idéia não funciona para gramáticas não lineares. Gramáticas lineares, porém ambíguas, em geral não podem ser analisadas sem retorno (pelo menos para entradas negativas).


  1. wpv meios aqui que e , ou seja, nem palavra é um prefixo do outro. é semelhante para sufixos.wvvws
Rafael
fonte
1
Excelente! Exatamente o que eu estava procurando. É ótimo que uma linguagem que não seja para qualquer seja analisável por um algoritmo tão simples. NLR(k)k
Alex-Brink
1
Depois de pensar mais sobre isso, descobri um pequeno erro na sua descrição: a gramática linear não é ambíguo, mas não existe um prefixo exclusivo como você o descreve. Ainda existe um prefixo exclusivo, mas talvez você precise procurar dentro do não-terminal para obtê-lo, e seu tempo de execução se torna . Seu algoritmo funciona no . SaAb|aBb,Aa,BbO(n2)EPAL
Alex10 Brink
@AlextenBrink Good catch. Eu editei para explicar isso.
Raphael