2010-02-08 8 views
23

Prólogo: Aunque el conjunto de lenguajes reconocidos por los analizadores (gramáticas libres de contexto) es estrictamente mayor que el de los escáneres (gramática regular), la mayoría de los generadores de analizadores sintácticos necesitan un escáner.Generadores Scannerless Analizador

(No intente explicar las razones que lo explican, las conozco bastante bien).

He visto programas de análisis, que no requieren un escáner como

Hay ciertas ventajas de utilizar ningún escáner:

  • Sólo un concepto (gramáticas libres de contexto) en lugar de dos
  • Parse varios idiomas en un solo archivo (como HTML/Javascript)
  • idiomas Parse sin palabras clave reservadas (como PL/1)

A menudo, Las "soluciones temporales" se utilizan como cambiar el escáner en la solicitud del analizador.

Pregunta: ¿Conoces algún otro generador de analizadores sin escáner (cualquier idioma)? ¿Son estos prácticos en uso (o puramente académicos)? ¿Hay algún otro enfoque que Tomita/GLR?

Respuestas:

+0

Algunos más "analizador de derivación de extremo derecho a extremo derecho a extremo" se enumeran aquí http://en.wikipedia.org/wiki/Comparison_of_parser_generators#Context-free_languages ​​ – stacker

+0

@stacker: Wikipedia enumera el léxer de DParser como "generado"; Y GLR no implica que no haya ningún escáner – Meinersbur

+0

No veo por qué un escáner sería un obstáculo para varios idiomas o idiomas sin palabras clave reservadas. El escáner aún sería útil para comer espacios en blanco y (al menos con frecuencia) comentarios, y concatenar personajes en números y palabras. –

Respuesta

10

otros dos:.

  • de análisis de la expresión de Bryan Ford gramáticas (PEG) no requieren escáner. El "analizador packrat" eficiente y perezoso es opcional. No he tenido más que una buena experiencia con la versión Lua LPEG, que se compila en una máquina de bytecode eficiente. Muy práctico.

  • YAKKER parece muy intrigante aunque todavía está claramente en un estado previo a la publicación.Están usando lo que dicen ser una variación eficiente en el algoritmo de análisis de Earley.

En realidad soy un gran admirador de los analizadores sin escáner; simplifican enormemente la configuración. Y los generadores de escáner típicos, por decirlo suavemente, no son muy divertidos de usar. Desde la página del manual de Lex:

The asteroid to kill this dinosaur is still in orbit.

Por último, no tengo experiencia personal con Elkhound, pero los informes de segunda mano que escucho son impresionantes. Yo diría que no hay duda de que algunos generadores de analizadores sin escáner son muy prácticos.

3

boost::spirit::qi no necesita un analizador léxico a pesar de que se puede utilizar boost::spirit::lex como un front-end. Desde la introducción de boost::spirit::lex:

De hecho, Spirit.Qi le permite escribir analizadores sin utilizar un analizador léxico, análisis sintáctico el flujo de caracteres de entrada directa, y en su mayor parte, esto es la forma Espíritu tiene utilizado desde su invención .

boost::spirit (el original) efectivamente trabajadas, ya que queríamos exactamente, pero se ha trasladado a boost::spirit::classic.spirit::qi, spirit::lex son el nuevo diseño del espíritu, por lo que salió de la versión clásica fuera :)

9

generadores de analizadores sintácticos No necesidad de un escáner. Pero estás bastante loco si no usas uno.

Los analizadores creados por analizadores sintácticos no se preocupan por lo que los alimenta, siempre y cuando los llames tokens.

Para construir use un generador de analizador sintáctico sin un escáner, simplemente defina su gramática hasta el nivel de carácter y alimente los caracteres individuales al analizador como tokens.

La razón por la que esto es una locura es que el análisis sintáctico es una actividad más compleja que el léxico. Puede construir lexers como máquinas de estado finito, que se traducen en código de máquina más o menos como "comparar y saltar al siguiente estado". Para la velocidad, es realmente difícil de superar. Los generadores de analizadores construyen analizadores sintácticos que realizan un análisis predictivo de descenso recursivo (para la mayoría de los generadores LL como ANTLR) o realizan búsquedas de tabla mediante búsqueda hash, binaria o lineal, etc. Así que un analizador gasta mucha más energía en un token que un lexer gasta en un personaje.

Si alimenta caracteres a un analizador como tokens, gastará correspondientemente más energía en el carácter que el equivalente en lexer. Si procesa una gran cantidad de texto de entrada, esto eventualmente importará, ya sea que lo haga por tropecientos de flujos de entrada pequeños o unos pocos realmente grandes.

Los analizadores de GLR sin escáner sufren este problema de rendimiento, en relación con los analizadores GLR diseñados para usar tokens.

Mi empresa crea una herramienta, the DMS Software Reengineering Toolkit que utiliza un analizador GLR (y analiza con éxito todos los lenguajes comunes que conoce y muchos más extraños que no, porque tiene un analizador GLR). Sabíamos de analizadores sin escáner y elegimos no implementarlos debido a la diferencia de velocidad; tenemos un subsistema tipo LEX de estilo clásico (pero extremadamente poderoso) para definir tokens léxicos. En el único caso en el que el DMS pasó de punta a punta frente a una herramienta basada en XT (una herramienta sin un analizador GLR sin escáner) que procesaba la misma entrada, el DMS parecía ser 10 veces más rápido que el paquete XT. Para ser justos, el experimento realizado fue ad hoc y no se repitió, pero como coincidía con mis sospechas, no vi ninguna razón para repetirlo. YMMV. Y, por supuesto, si queremos ir sin escáner, bueno, es bastante fácil escribir una gramática con terminales de caracteres, como ya he señalado.

GLR analizadores sin escáner do tienen otra propiedad muy agradable que no le importará a la mayoría de las personas. Puede tomar dos gramáticas separadas para un analizador sin escáner, y literalmente concatenarlas, y obtener un analizador (a menudo con muchas ambigüedades). Esto importa mucho cuando construyes un lenguaje incrustado dentro de otro. Si eso no es lo que estás haciendo, esto es solo una curiosidad académica.

Y, AFAIK, Elkhound no es sin escáner. (Podría estar equivocado en esto). (EDIT: 2/10: Parece que estaba equivocado, no será la primera vez en mi vida :)

+0

Gracias por su respuesta, especialmente por informar sobre su experiencia en la industria. Tenga en cuenta que las diferencias de velocidad lineal no son una gran desventaja. De lo contrario, nadie habría escrito escáneres en lenguajes de scripting. Pero GLR puede dar como resultado un rendimiento no lineal en gramáticas que requieren una búsqueda ilimitada (O (n³)), como tokens de identificador. Si los analizadores pueden manejar tokens con complejidad lineal (y hay conceptos para hacer esto), ¿por qué molestarse en escribir un escáner? – Meinersbur

+0

Elkhound sin escáner: http://scottmcpeak.com/elkhound/sources/elkhound/examples/scannerless/ – Meinersbur

+0

@Meinersbur: No entiendo su punto. Pareces estar diciendo que los analizadores sin escáner no son lineales al tratar de manejar identificadores; eso sugeriría que aceptas que usar un analizador sin escáner no es una buena idea. Pero luego dices, "¿por qué molestarse en escribir un escáner?". ¿Qué me perdí? –