Cómo determinar si un idioma es LL(1) LR(0) SLR(1)


¿Existe una forma sencilla de determinar si una gramática es LL(1), LR(0), SLR(1)?.. ¿solo por mirar la gramática sin hacer ningún análisis complejo?

Por ejemplo: Para decidir si una gramática BNF es LL(1), debe calcular Primero y Seguir conjuntos, lo que puede llevar mucho tiempo en algunos casos.

¿Alguien tiene una idea de cómo hacer esto más rápido? Cualquier ayuda sería realmente apreciada!

Author: OrenIshShalom, 2009-01-24

7 answers

Primero, un poco de pedantería. No puede determinar si un lenguaje es LL(1) al inspeccionar una gramática para él, solo puede hacer declaraciones sobre la gramática en sí. Es perfectamente posible escribir gramáticas no LL (1) para idiomas para los que existe una gramática LL(1).

Con eso fuera del camino:

  • Podría escribir un analizador para la gramática y hacer que un programa calcule primero y siga conjuntos y otras propiedades para usted. Después de todo, eso es la gran ventaja de las gramáticas BNF, que son comprensibles máquina.

  • Inspeccione la gramática y busque violaciones de las restricciones de varios tipos de gramática. Por ejemplo: LL(1) permite recursión a la derecha pero no a la izquierda, por lo tanto, una gramática que contiene recursión a la izquierda no es LL(1). (Para otras propiedades gramaticales vas a tener que pasar algún tiempo de calidad con las definiciones, porque no puedo recordar nada más de la parte superior de mi cabeza en este momento :).

 34
Author: Aaron Maenpaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-24 13:22:23

En respuesta a su pregunta principal: Para una gramática muy simple, puede ser posible determinar si es LL(1) sin construir PRIMERO y SEGUIR conjuntos, por ejemplo,

A → A + A / a

No es LL (1), mientras que

A → a / b

Es.

Pero cuando usted consigue más complejo que eso, usted necesitará hacer un cierto análisis.

A → B / a
B → A + A

Esto no es LL (1), pero puede no ser inmediatamente obvio

Las reglas gramaticales para la aritmética se vuelven rápidamente muy complejas:

Expr → term {'+'term }
término → factor {'*'factor }
factor → número / '('expr') '

Esta gramática solo maneja la multiplicación y la suma, y ya no está claro de inmediato si la gramática es LL(1). Todavía es posible evaluarlo mirando a través de la gramática, pero a medida que la gramática crece se vuelve menos factible. Si estamos definiendo una gramática para un lenguaje de programación, es casi seguro que va a tomar algún análisis complejo.

Dicho esto, hay algunos signos reveladores obvios de que la gramática no es LL(1) - como la A → A + A anterior - y si puedes encontrar cualquiera de estos en tu gramática, sabrás que necesita ser reescrita si estás escribiendo un analizador de descenso recursivo. Pero no hay atajo para verificar que la gramática es LL(1).

 15
Author: Bruce Alderman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-20 16:46:14

Un aspecto, "es el lenguaje/gramática ambiguo", es una pregunta indecidible conocida como el Correo correspondencia y detener problemas.

 9
Author: BCS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-10 18:44:41

Directamente del libro "Compilers: Principles, Techniques, & Tools" por Aho, et. al.

Página 223:

Una gramática G es LL(1) si y solo si siempre que A - > alfa | beta son dos producciones distintas de G, se cumplen las siguientes condiciones:

  1. Para ninguna terminal "a", ambos alpha y beta derivan cadenas que comienzan con " a "
  2. A lo sumo uno de alfa y beta puede derivar el vacío string
  3. Si beta puede alcanzar la transición vacía a través de cero o más transiciones, entonces alpha no deriva ninguna cadena que comience con un terminal en FOLLOW(A). Del mismo modo, si alpha puede alcanzar la transición vacía a través de cero o más transiciones, entonces beta no deriva ninguna cadena que comience con un terminal en FOLLOW (A)

Esencialmente, esto es una cuestión de verificar que la gramática pase la Prueba de Incongruencia de Pares y también no implica Recursión izquierda. O más sucintamente una gramática G que es recursiva a la izquierda o ambigua no puede ser LL (1).

 9
Author: Matthew Erwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-27 18:44:00

Compruebe si la gramática es ambigua o no. Si lo es, entonces la gramática no es LL(1) porque ninguna gramática ambigua es LL(1).

 2
Author: Ananya Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-25 18:28:09

Ya hay atajos para la gramática ll(1)

1) si A->B1|B2|......./ Bn entonces primero (B1) intersección primero (B2) intersección .first(Bn)=empty set then it is ll (1) grammar

2) si A- > B1 / epsilon entonces B1 intersección seguir (A)está vacío conjunto

3) si G es cualquier gramática tal que cada no terminal deriva solo una producción entonces la gramática es LL (1)

 0
Author: srinath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-31 10:16:15
p0 S' → E
p1 E → id
p2 E → id ( E )
p3 E → E + id
  • Construya el DFA LR(0), el SIGUIENTE conjunto para E y las tablas de acción/goto SLR.
  • ¿Es esto una gramática LR(0)? Prueba tu respuesta.
  • Usando las tablas SLR, muestra los pasos (cambios, reducciones, aceptar) de un analizador LR parsing:
    id ( id + id )
 -2
Author: dida,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-12 15:55:17