¿Qué ventajas tienen los analizadores LL sobre los analizadores LR?


¿Qué ventajas tienen los analizadores LL sobre los analizadores LR para garantizar su popularidad relativa en las herramientas actuales del generador de analizadores?

De acuerdo con Wikipedia , el análisis de LR parece tener ventajas sobre LL:

LR parsing puede manejar un mayor rango de lenguajes que LL parsing, y también es mejor en el reporte de errores, es decir, detecta errores sintácticos cuando la entrada no se ajusta a la gramática tan pronto como sea posible. Esto está en contraste con un LL (k) (o peor aún, un analizador LL (*) que puede diferir la detección de errores a una rama diferente de la gramática debido al retroceso, a menudo haciendo que los errores sean más difíciles de localizar a través de disyunciones con prefijos comunes largos.

Nota: Esto no es tarea. Me sorprendió cuando descubrí que Antlr es un generador de analizador de LL (a pesar de tener "LR" en su nombre!).

Author: Adam Paynter, 2010-11-04

6 answers

GLR es genial si quieres un árbol/bosque de análisis y no te importan las cajas negras. Le permite escribir cualquier CFG que desee a costa de verificar ambigüedades en el momento del análisis mediante pruebas exhaustivas, en lugar de resolver los conflictos LR/LALR de forma estática. Algunos dicen que es una buena compensación. La herramienta DMS de Ira Baxter o Elkhound, que tiene una gramática gratuita de C++, son útiles para esta clase de problemas. ANTLR también es útil para una gran clase de aplicaciones de lenguaje, pero utiliza un aproximación, generando analizadores recursivos de descenso llamados LL (*) que permiten predicados semánticos. Declararé sin pruebas aquí que los predicados le permiten analizar lenguajes sensibles al contexto más allá de CFGs. A los programadores les gusta insertar acciones en gramáticas, como un buen manejo de errores y como depurar en un solo paso. LL es bueno en los tres. LL es lo que hacemos a mano para que sea más fácil de entender. No creas las tonterías de wikipedia sobre que LR es mejor manejando errores . Dicho esto, si usted retrocede mucho con ANTLR, los errores son de hecho peores con LL ( * ) (PEGs tienen este problema).

Volver atrás. GLR especula (es decir, backtracks) también, al igual que PEGs, ANTLR, y cualquier otra estrategia no determinista. En cualquier estado LR no determinista, GLR "bifurca" sub-analizadores para probar cualquier camino viable. De todos modos, LL tiene un buen contexto para el manejo de errores. Donde LR sabe que coincide con una expresión, LL sabe que es una expresión en una asignación o IF - condicional; LR sabe que podría estar en tampoco pero no está seguro, y esa incertidumbre es de donde obtiene su poder.

GLR es O(n^3) el peor caso. packrat / PEG es O(n) el peor caso. Los ANTLR son O(n^2) debido a lookahead cíclico DFA pero O(n) en la práctica. En realidad no importa. GLR es lo suficientemente rápido.

ANTLR es UNotros Tool para Lang Rel reconocimiento no anti-LR, pero eso me gusta demasiado ;)

Francamente, como muchos codificadores jóvenes en los 80, no entendía LALR y no me gustaban las cajas negras (ahora me gusta la belleza del motor GLR, pero todavía prefiero LL). Construí un compilador comercial basado en LL (k) y decidí construir una herramienta para generar lo que había construido a mano. ANTLR no es para todos y los casos extremos como C++ podrían manejarse mejor con GLR, pero mucha gente encuentra que ANTLR se adapta a su zona de confort. Desde enero de 2008, ha habido 134,000 descargas de jar binario de ANTLR, dentro de ANTLRWorks, y código fuente zips total (según Google Analytics). Ver nuestro artículo sobre LL(*) con muchos datos empíricos.

 28
Author: Terence Parr,
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
2017-05-05 09:02:51

Si tienes que codificar a mano uno, el descenso recursivo (LL) es algo que puedes hacer de manera realista; la gente no puede construir a mano analizadores L(AL)R prácticamente a mano.

Dado que los generadores de parser modernos manejarán toda la construcción del parser para usted, y que el espacio no es un gran problema, prefiero los parsers LR porque no tiene que luchar con las gramáticas tanto para hacerlas válidas para su generador de parser en particular (no "eliminar toda la recursión izquierda" tonterías).

De hecho, Prefiero analizadores GLR , que prácticamente analizarán cualquier cosa con una gramática libre de contexto. Sin preocupaciones de recursión a la izquierda. No hay cambio/reducir las preocupaciones de conflicto. Sin límites.

Si desea ver el rango de lenguajes que un motor de análisis GLR puede manejar (incluyendo el famoso lenguaje-LL/LALR, C++), puede mirar aquí.

 11
Author: Ira Baxter,
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
2010-11-04 00:07:21

Desde mi experiencia personal (usé ambos para varias situaciones), la diferencia más práctica es que, con un LL(k), puede definir la gramática de una manera más fácil (ya que es de arriba hacia abajo) sin preocuparse por muchos posibles conflictos de reducir-reducir o cambiar-reducir que a menudo ocurren con los analizadores de LR. Lo único que tiene que preocuparse es la recursión izquierda que debe ser transformada en una derecha.

Otra cosa es que el enfoque de arriba hacia abajo generalmente implica una mayor complejidad (con respecto al espacio o al tiempo), porque tiene que almacenar todo el árbol mientras analiza y puede crecer mucho hasta que se resuelvan las ambigüedades.

 2
Author: Jack,
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
2017-02-04 11:43:02

La única ventaja con la que he estado familiarizado es que puedes codificar fácilmente todos los analizadores a mano. Los analizadores LR son mucho más difíciles de codificar a mano (normalmente se usa un generador de analizadores).

 0
Author: Alex,
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
2010-11-04 21:05:21

LL Parsings la complejidad del peor caso es O(n^4), mientras que la complejidad del peor caso de LR parsing es mejor, O(n^3).

(Pero nadie escribiría nunca O(n^4) gramática.)

Https://en.wikipedia.org/wiki/Top-down_parsing

 0
Author: john ktejik,
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
2018-02-14 23:21:21

Una razón que viene a la mente es que es mucho más fácil hacer un lenguaje que necesita un retroceso arbitrario (cough C++) en un paradigma LL.

 -1
Author: zwol,
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
2010-11-03 22:44:21