En primer lugar, si no lo ha hecho ya, debe leer el artículo de McPeak sobre GLR http://www.cs.berkeley.edu/~smcpeak/papers/elkhound_cc04.ps. Es un documento académico, pero brinda buenos detalles sobre GSS, GLR y las técnicas utilizadas para implementarlos. También explica algunos de los problemas peludos con la implementación de un analizador GLR.
Tiene tres partes para implementar una pila estructurada por gráficos.
I. La estructura de datos de gráfico en sí
II. Las pilas
III. Uso de GLR de un GSS
Tienes razón, google no es de mucha ayuda. Y a menos que le guste leer libros de algoritmos, tampoco serán de mucha ayuda.
I. La estructura de datos del gráfico
respuesta de Rob sobre "la representación directa" sería más fácil de implementar. Se parece mucho a una lista enlazada, excepto que cada nodo tiene una lista de los siguientes nodos en lugar de uno solo.
Esta estructura de datos es un gráfico dirigido, pero como dice McPeak, el GSS puede tener ciclos para epsilon-gramáticas.
II. Las pilas
Una pila estructurada por gráficos es conceptualmente solo una lista de pilas regulares. Para una gramática no ambigua, solo necesitas una pila. Necesitas más stacks cuando hay un conflicto de análisis para que puedas tomar ambas acciones de análisis al mismo tiempo y mantener el diferente estado que crean ambas acciones. El uso de un gráfico le permite aprovechar el hecho de que estas pilas comparten elementos.
Puede ser útil comprender cómo implementar una única pila con una lista vinculada primero. El encabezado de la lista enlazada es la parte superior de la pila. Al presionar un elemento en la pila solo se crea una nueva cabeza y se apunta a la cabeza anterior. Saltar un elemento de la pila es simplemente mover el puntero a la cabeza-> siguiente.
En un GSS, el principio es el mismo. Presionar un elemento es simplemente crear un nuevo nodo principal y apuntarlo a la cabeza anterior. Si tiene dos operaciones de cambio, empujará dos elementos en la cabeza anterior y luego tendrá dos nodos de cabeza. Conceptualmente, esto es solo dos pilas diferentes que suceden comparten cada elemento excepto los superiores. Hacer estallar un elemento es simplemente mover el puntero de la cabeza por la pila siguiendo cada uno de los siguientes nodos.
III. Uso de GLR del GSS
Aquí es donde el documento de McPeak es una lectura útil.
El algoritmo GLR aprovecha el GSS fusionando los cabezales de pila que tienen el mismo elemento de estado. Esto significa que un elemento de estado puede tener más de un hijo. Al reducir, el algoritmo GLR tendrá que explorar todas las rutas posibles desde el cabezal de pila.
Puede optimizar GLR manteniendo la profundidad determinista de cada nodo. Esta es solo la distancia desde una división en la pila. De esta forma, no siempre tiene que buscar una división de pila.
¡Esta es una tarea difícil! ¡Buena suerte!
Aquí, seis años después, todavía parece haber poco que encontrar en la estructura de datos de GSS. Wikipedia tiene un "ejemplo" muy breve, pero tampoco enumera las operaciones, y me confunde, porque parece tener todas las pilas "paralelas" a la misma profundidad. ¿Alguien puede agregar más información sobre esto? – LHP