¿Hay alguna manera de distinguir entre la gramática LL (k) y LR (k)?

12

Recientemente estoy estudiando sobre el diseño de compiladores. Llegué a conocer dos tipos de gramática, una es la gramática LL y la otra es la gramática LR.

También conocemos los hechos de que cada gramática LL es LR, es decir, la gramática LL es un subconjunto adecuado de la gramática LR. El primero se usa en el análisis de arriba hacia abajo y el segundo se usa en el análisis de abajo hacia arriba.

¿Pero hay alguna manera de que podamos decir que una gramática dada es LL o LR?

Debutante
fuente
3
¿Qué tal usar las técnicas canónicas para generar las tablas y L R ( k ) y verificar si contienen conflictos? L L ( 1 ) y L R ( 1 ) generalmente se tratan en cualquier libro de texto estándar sobre análisis; Las técnicas L L ( k ) y L R ( k ) son un poco más difíciles de encontrar, pero también son bien conocidas. LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Alex ten Brink
@AlextenBrink ¡Esto suena como si pudieras dar una respuesta! (¡Bienvenido de nuevo, te extrañaron!)
Raphael
El uso de la técnica canónica para verificar si una gramática es LL o LR es correcta pero de una manera larga. Estoy intentando una pequeña forma de encontrar esto que encontré en el libro de Compiladores de Aho-Lam-Sethi-Ullman.
Deb

Respuestas:

11

LL(k)LR(k)LL(k)LR(k), y porque podemos generar tablas para ellos (las tablas de análisis se utilizan para analizar cadenas de entrada). Tenga en cuenta que para estas dos clases, tener la tabla de análisis inmediatamente le permite verificar si las gramáticas están en las clases, porque esto es así si y solo si las tablas no contienen errores. Además, sí, hay clases de gramáticas que podemos analizar de manera eficiente si tenemos una tabla de análisis, pero para las cuales no podemos generar la tabla si existe.

LL(1)LR(1)SLR(1)LL(k)LR(k)

LL(k)LR(k)LL(1)kLL(k)LR(k)o no que corra en tiempo polinómico (la generación de la tabla es exponencial). Para más detalles, lea el libro de texto anterior. Tenga en cuenta que en muchos casos, la tabla tiene un tamaño razonable, por lo que la prueba no es necesaria.

kkLL(k)LR(k)LR(k)kLL(c)ck(ver aquí para más detalles).

Alex ten Brink
fuente
¿Sabes dónde puedo encontrar los detalles del algoritmo de tiempo polinómico para probar si un idioma es LR (k) (aparte de comprar el libro de texto)?
user541686
2

Tenemos que verificar solo que una gramática es LL o no porque cada gramática LL es LR, es decir, LL es un subconjunto apropiado de LR. Entonces, si una gramática es LL, entonces debe ser LR pero cada LR no es LL.

Una gramática G está en LL si siempre que A-> C | D, se debe cumplir la siguiente condición:

  1. Primero (C) y Primero (D) son conjuntos disjuntos.
  2. Si el vacío está en Primero (D), el Primero (C) y el Seguir (A) son conjuntos disjuntos, del mismo modo, el vacío está en Primero (C).
Debutante
fuente