Pregunta

¿Cómo recursiva ascenso de los analizadores de trabajo?He escrito recursivo el descenso analizador de mí mismo, pero no entiendo analizadores LR todos los que bien.Lo Que Me encontrado en la Wikipedia sólo ha añadido a mi confusión.

Otra pregunta es ¿por qué recursiva ascenso de los analizadores no se usan más que su tabla de contrapartes.Parece que recursiva ascenso de los analizadores de tener un mayor rendimiento en general.

¿Fue útil?

Solución

La clásica dragón libro explica muy bien cómo LR analizadores de trabajo.También hay Técnicas De Análisis.Una Guía Práctica. donde se puede leer acerca de ellos, si recuerdo bien.El artículo en wikipedia (al menos la introducción) no es correcta.Fueron creados por Donald Knuth, y éste les explica en su el Arte de La Programación de computadoras Volumen 5.Si hablas español, no es una lista completa de libros aquí publicado por mí.No todos los libros están en español, ya sea.

Antes de entender cómo funcionan, usted debe entender algunos conceptos como la primera, de la siguiente manera y de oteo.También, yo recomiendo que usted entienda los conceptos detrás de LL (descendiente) de los analizadores antes de intentar entender el LR (ascendente) de los analizadores.

Hay una familia de analizadores LR, especialmente LR(K), SLR(K) y LALR(K), donde K es la cantidad de lookahead que necesitan para trabajar.Yacc apoya LALR(1) de los analizadores, pero usted puede hacer ajustes, no de la teoría de base, para hacer que se comporte con más poderoso tipo de gramáticas.

Sobre el rendimiento, depende de la gramática de ser analizadas.Se ejecutan en el tiempo lineal, pero, ¿cuántos espacio que necesita depende de cuántos estados se construye para el final del analizador.

Otros consejos

Yo personalmente estoy teniendo un tiempo difícil entender cómo una llamada a la función puede ser más rápido, mucho menos "significativamente más rápido" que una búsqueda en la tabla.Y sospecho que incluso "significativamente más rápido" es insignificante en comparación con todo lo demás que un analizador léxico/parser tiene que hacer (principalmente lectura y encadenamiento el archivo).Miré en la página de la Wikipedia, pero no siguen las referencias;hizo el autor en realidad el perfil de un completo analizador léxico/parser?

Más interesante para mí es la disminución de la tabla impulsada por los analizadores con respecto a las de descenso.Yo vengo de una C de fondo, donde yacc (o equivalente) fue el parser generator de elección.Cuando me mudé a Java, he encontrado una tabla impulsada por la aplicación (JavaCup), y varios recursiva descenso de las implementaciones (JavaCC, ANTLR).

Sospecho que la respuesta es similar a la respuesta de "¿por qué Java en lugar de C":la velocidad de ejecución no es tan importante como la velocidad de desarrollo.Como se señala en el artículo de la Wikipedia, tabla impulsada por los analizadores son casi imposible de entender desde el código (cuando yo la estaba usando, yo podría seguir sus acciones, pero nunca han sido capaces de reconstruir la gramática del analizador).Recursiva descenso, por comparación, es muy intuitivo (que es sin duda la razón es anterior tabla impulsada por algunos de los 20 años).

El artículo de la Wikipedia sobre recursiva ascenso el análisis de las referencias de lo que parece ser el documento original sobre el tema ("Muy Rápido LR Análisis").Rozando que el papel aclarado un par de cosas para mí.Cosas que he notado:

  1. El documento habla sobre la generación de código ensamblador.Me pregunto si usted puede hacer las mismas cosas que hacer si estás generando C o Java de código en su lugar;ver las secciones 4 y 5, el Error de "recuperación" y "la comprobación de desbordamiento de Pila".(No estoy tratando de FUD su técnica -- que podrían funcionar bien ... solo digo que es algo que usted puede desear mirar en antes de comprometerse.)

  2. Se comparan sus recursiva ascenso herramienta para su propia tabla impulsada por el analizador.A partir de la descripción en su sección de resultados, se parece a su mesa impulsada por el analizador está "totalmente interpretado";no requiere ningún personalizado código generado.Me pregunto si hay un punto intermedio donde la estructura general está todavía basada en tablas, pero que generar código personalizado para ciertas acciones para acelerar las cosas.

El papel que hace referencia la página de la Wikipedia:

Otro artículo sobre el uso de generación de código en lugar de la tabla de interpretación:

También, tenga en cuenta que recursiva-descenso de análisis no es la manera más rápida para analizar LL-gramática-idiomas:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top