Eliminar la recursividad izquierda en la gramática mientras se mantiene la asociación izquierda del operador

13

Tengo un problema con este ejercicio:

Sea G la siguiente gramática ambigua para el cálculo λ:

E → v | λv.E | EE | (E)

donde E es el símbolo único no terminal, λv.E representa la abstracción wrt la variable v en E, y EE representa la aplicación.

  1. Defina una gramática LL (1) G 'tal que L (G') = L (G) y la ambigüedad de G se resuelva imponiendo las siguientes convenciones habituales:
    1. la abstracción es correcta asociativa;
    2. la aplicación se deja asociativa;
    3. La aplicación tiene mayor prioridad que la abstracción.
  2. Muestre la tabla de análisis LL (1) para G 'y el árbol de análisis obtenido al analizar la cadena λv1. λv2. v1v2v1.

Eliminé la precedencia y la asociación de la ambigüedad, obteniendo esta gramática:

E -> EF | F
F -> λv.G | G
G -> (E) | v

que no es LL (1), ya que la producción E -> EFse deja recursiva. Sin embargo, eliminando la recursión izquierda de esa producción obtengo:

E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v

que no cumple con el requisito 1.2.

Busqué una solución en Internet, pero parece que no es posible eliminar la recursividad izquierda conservando la asociatividad izquierda.

Sin embargo, este ejercicio apareció en el examen de compiladores hace algunos años, por lo que debe haber una respuesta correcta.

Gracias por tu ayuda.

Marco DallaG
fuente

Respuestas:

11

Compatibilidad de asociatividad izquierda y análisis LL (1)

Acaba de llegar a una de las principales inconsistencias en el uso de la sintaxis sin contexto (CF). La gente quiere elegir gramáticas para que el árbol de análisis refleje la estructura prevista de la oración, cerca de su semántica, especialmente en el caso de operadores no asociativos, como la aplicación . Esta fue la intención original de las gramáticas de FQ en lingüística. Pero al mismo tiempo se están limitando a analizar la tecnología que tolerará solo algunos tipos de gramáticas.

De hecho, si el árbol de análisis debe reflejar la asociatividad izquierda de un operador, entonces la gramática es necesariamente recursiva a la izquierda, ya que el nodo de aplicación superior en el árbol de análisis agrega necesariamente el término más a la derecha de las aplicaciones sucesivas no parentetizadas. Por lo tanto, el análisis LL está fuera de discusión. Tienes razón.

Hay dos formas de salir de esto. Una de ellas es no confiar en el analizador para dar el "árbol de análisis" adecuado para su uso en etapas posteriores del procesamiento (como la reducción de la expresión lambda, aquí). Esto condujo al concepto de árboles de sintaxis abstracta (AST) que se pueden construir desde el árbol de análisis, pero con una estructura diferente.

La otra solución es utilizar técnicas de análisis más generales que acepten cualquier gramática CF y analizar de acuerdo con ella. Los analizadores generales CF son una tecnología bien desarrollada (y no dejo de preguntarme por qué LL sigue siendo tan popular).

No tengo idea de qué podría considerarse una respuesta adecuada a estos requisitos contradictorios.

Lo que haría es mostrar que contradicen los requisitos. Dé una primera gramática que cumpla con las restricciones de asociatividad y prioridad, luego transforme la gramática en una gramática LL (1) para el análisis.

El hecho de que algo apareció en un diario o en un examen no es una garantía total de que sea correcto. Y podría estar equivocado también ... pero hice algunas comprobaciones, además de mi propio conocimiento del problema.

Sobre este ejemplo específico

Dicho esto, la primera gramática que sugiere no parece correcta. No tiene una forma de producir λu.λv.v.

Un truco para saber es comenzar con operadores (aquí abstracción o aplicación) con la prioridad más baja (abstracción). Es lo mismo para las expresiones aritméticas.

babou
fuente
Muchas gracias por tu comentario detallado. Tienes razón, cometí un error con la primera gramática, gracias por esto también. Le preguntaré al profesor entonces.
Marco DallaG
Puedo agregar a la respuesta, con una pequeña nota sobre diseño gramatical para tontos (yo también), si está interesado. Además, cuéntanos qué dice tu profesor sobre esto.
babou
Actualizaré el hilo cuando el profesor responda esta pregunta. De todos modos, siéntase libre de agregar más información si eso no es un problema para usted, por supuesto que lo agradecería mucho. Gracias nuevamente por su ayuda
Marco DallaG
@MarcoDallaG Encontré esto cuando trabajaba en TAPL de Pierce. ¿Su profesor dijo algo diferente de esta respuesta? :)
lcn
0

Mi intento:

E  -> A | λv.E
A  -> FA'
A' -> A | ɛ
F  -> (E) | v

Esta gramática es LL (1) y debe respetar las propiedades requeridas.


fuente