¿Existe algún algoritmo de análisis de CFG no general que reconozca EPAL?

23

EPAL, el lenguaje de incluso palíndromos, se define como el lenguaje generado por la siguiente gramática libre de contexto inequívoca:

Saa

Sbb

SaSa

SbSb

EPAL es la "ruina" de muchos algoritmos de análisis: todavía tengo que encontrar algún algoritmo de análisis para CFG inequívocos que puedan analizar cualquier gramática que describa el lenguaje. A menudo se usa para mostrar que hay CFG inequívocos que un analizador en particular no puede analizar. Esto inspiró mi pregunta:

¿Existe algún algoritmo de análisis que acepte solo CFG no ambiguos que funcionan en EPAL?

Por supuesto, uno puede diseñar un analizador ad-hoc de dos pasos para la gramática que analiza el lenguaje en tiempo lineal. Me interesan los métodos de análisis que no se han diseñado específicamente con EPAL en mente.

Alex ten Brink
fuente
1
Casi tengo miedo de preguntar: ¿qué hay de malo en LL (1) por descenso recursivo?
Raphael
3
El descenso recursivo sin retroceso no puede manejar EPAL ya que el lenguaje no es LL (k) para ningún k. El descenso recursivo con retroceso puede manejar la gramática en el tiempo O(n2) , pero ese es un algoritmo general con un comportamiento exponencial en el peor de los casos, que no es lo que estoy buscando.
Alex ten Brink
no es exponencial, es cuadrático. O ( 2 N ) es exponencial. O(N2)O(2N)
Victor Stafusa
1
@Victor: el retroceso tiene un comportamiento exponencial en algunas gramáticas, pero no en esta gramática en particular. Aún así, al ser un algoritmo que funciona en gramáticas ambiguas, lo descuenta como respuesta a mi pregunta.
Alex ten Brink
1
@jmad: mi intención no es analizar el lenguaje (puedes hacerlo trivialmente en tiempo lineal), sino satisfacer mi curiosidad: lo he visto como un ejemplo de un lenguaje que no puede analizarse mediante un método de análisis tantas veces que tengo curiosidad por saber si hay algún método de análisis que lo reconozca.
Alex ten Brink

Respuestas:

14

Considere el siguiente bosquejo de una estrategia de análisis bajo su propio riesgo.

En lugar de leer la entrada solo desde un extremo, leemos desde ambos lados y buscamos reglas coincidentes. Podemos hacer esto en un estilo de descenso recursivo; en una llamada a , encuentre el prefijo w y el sufijo v en la entrada de modo que haya una regla A w B v , descienda a B ( ) en la palabra restante. Si no hay una regla coincidente, rechace la palabra.A()wvAwBvB()

Este algoritmo analiza todas las gramáticas lineales e inequívocas. Se necesita tiempo lineal si todos los pares de reglas y A w B v tienen w p w o v s v ¹. Esto incluye EPAL. De lo contrario, debemos mirar hacia adelante para que podamos tomar el tiempo Θ ( n 2 ) .AwBvAwBvwpwvsvΘ(n2)

La idea no funciona para las gramáticas no lineales en absoluto. Las gramáticas lineales pero ambiguas en general no pueden analizarse sin retroceder (al menos para entradas negativas).


  1. significa aquí que w v y v w , es decir, ninguna palabra es el prefijo de la otra. s es similar para sufijos.wpvwvvws
Rafael
fuente
1
¡Excelente! Exactamente lo que estaba buscando. Es genial que un lenguaje que no es para cualquier k sea ​​analizable por un algoritmo tan simple. NLR(k)k
Alex ten Brink
1
Después de pensarlo un poco más, descubrí un pequeño error en su descripción: la gramática lineal no es ambiguo, pero no existe un prefijo único tal como lo describe. Todavía hay un prefijo único, pero es posible que tenga que mirar dentro del no terminal para obtenerlo, y su tiempo de ejecución se convierte en O ( n 2 ) . Su algoritmo funciona en E P A L embargo. SaAb|aBb,Aa,BbO(n2)EPAL
Alex ten Brink
@AlextenBrink Buena captura. Edité para dar cuenta de esto.
Raphael