2012-08-29 22 views
12

He estado usando lex/yacc y ahora estoy intentando cambiar a ANTLR. La principal preocupación es que ANTLR es un analizador LL (*) a diferencia de yacc que es LALR. Estoy acostumbrado a pensar de abajo hacia arriba y no sé exactamente cuál es la ventaja de LL grammars. La gente dice que las gramáticas LL son más fáciles de entender y más populares en estos días. Pero parece que los analizadores de LR son más potentes, p. Los analizadores de LL son incapaces de manejar recursiones a la izquierda, aunque parece que hay algunas soluciones.Analizador LALR vs LL

Entonces, la pregunta es: ¿cuál es la ventaja de las gramáticas LL sobre LALR? Apreciaría si alguien pudiera darme algunos ejemplos. Los enlaces a artículos útiles también serían geniales.

Gracias por su ayuda con anticipación!

(Veo esto es un gran recurso:. What advantages do LL parsers have over LR parsers?, pero hubiera sido mejor con algunos ejemplos)

Respuesta

9

La mayor ventaja que veo a LL programas de análisis es que son tan fáciles de entender y poner en práctica! Puede escribir analizadores recursive descent a mano con un código que coincida con la gramática.

LR se consideran generalmente más potente y también mucho más rápido, pero hay algunas soluciones de compromiso, que yo sepa:

  • análisis de LR sólo pueden utilizar atributos sintetizados; ellos no pueden pasar atributos heredados
  • Las acciones en una gramática LR pueden causar no determinismo gramatical pero no en LL.

Sin embargo, usted encontrará que LL (*) también son muy potentes.

+1

Si alguien te entrega el generador del analizador, por definición, lo que hace es "fácil de implementar". En ese caso, usted elige el generador de analizadores que maneja fácilmente la clase más grande de idiomas, para minimizar sus esfuerzos. Desde la perspectiva, en mi humilde opinión, LR gana bastante bien LL. GLR gana con LR bastante bien. –

+0

Estoy de acuerdo, pero, sin embargo, LL aún son fáciles de implementar. Estaba señalando que LR generalmente requiere el uso de una herramienta. Me parece muy intrigante que puedas escribir a mano el descenso recursivo y el código y la gramática van de la mano. –

+3

Sí, sus analizadores intrigantes y generadores de personas deberían conocerlos. A medida que sus gramáticas crecen, es inconveniente forzarlo a formar LL, y en algunos puntos (bastante pequeños) la conveniencia de LR gana la simplicidad conceptual en su cabeza. LR es bastante fácil de entender si no estás construyendo el generador de analizadores, y no es como si no hubiera muchos alrededor. –

9

Los analizadores LR son estrictamente más potentes que los analizadores LL y, además, los analizadores LALR pueden ejecutarse en O (n) como los analizadores LL. Por lo tanto, no encontrará ninguna ventaja funcional de LL sobre LR.

Por lo tanto, la única ventaja de LL es que las máquinas de estado LR son bastante más complejas y difíciles de entender, y los analizadores LR en sí mismos no son especialmente intuitivos. Por otro lado, el código del analizador de LL que se genera automáticamente puede ser muy fácil de comprender y depurar.

+0

Gracias por la opinión, DeadMG. –

Cuestiones relacionadas