2009-03-14 15 views
14

Recientemente, comencé a aprender ANTLR. Sé que los lexers/analizadores juntos se pueden usar para construir lenguajes de programación.¿Alguna vez ha utilizado efectivamente lexer/analizador en la aplicación real?

Además de las DSL o los lenguajes de programación, ¿alguna vez ha utilizado directa o indirectamente las herramientas lexer/analizador (y el conocimiento) para resolver problemas del mundo real? ¿Es posible que el programador promedio resuelva esos problemas sin conocimiento de lexers o analizadores sintácticos?

Respuesta

13

Sí, los he usado. Sí, puedes hacer cosas sin ellos, pero cada vez que elijas la herramienta incorrecta para el trabajo, estarás haciendo un dolor innecesario para ti.

Algunos ejemplo de la no-estándar utiliza personalmente me he puesto a la tecnología:

  • datos raspado de los informes generados por los sistemas heredados
  • cabo la recolección y patrones en los datos demasiado complejos para una expresión regular
  • protocolo de análisis
  • basadas en texto juegos de aventura
  • la API metaprograming que se comió Toledo (no su nombre real)
  • análisis de código/log análisis
  • recoger aparte campos "de forma libre" en una base de datos
  • y montones más I "m olvido (soy de edad)
1

Un gran ejemplo de un analizador léxico/analizador que es en uso en muchos sistemas existe en Apache Lucene (una biblioteca de índice de búsqueda de código abierto). Tanto el analizador de consultas como el tokenizador de documentos usan estos técnicos. Aunque supongo que podrías categorizar el analizador de consultas en Lucene como un analizador dsl, todavía se está utilizando para ayudar a resolver un problema del mundo real.

Para el caso, estoy seguro de que Google está empleando algún tipo de analizador/analizador para su propia sintaxis de consulta y análisis de documentos.

4

resaltado de sintaxis. El editor de texto Scite le permite escribir su propio lexer (en C++) para proporcionar resaltado de sintaxis para cualquier idioma personalizado. Escribí mi propia lectura personalizada para Scite como un repaso sobre este tema (lo estudié hace un tiempo en mi universidad).

Las expresiones regulares se utilizan a menudo como una alternativa para la coincidencia de patrones y el procesamiento de lenguaje simple. Esto es aún más común en los últimos años gracias al soporte mejorado de RegEx en frameworks como .NET. En muchos casos, es posible que los desarrolladores ni siquiera conozcan las técnicas de lectura/análisis y, por lo tanto, caigan en usge Regex por defecto.

Sin embargo, como dice otra respuesta, Regex puede volverse ineficiente, lento y difícil de mantener para algo más que una simple gramática/lenguaje. En esa situación, los analizadores sintácticos/lexers son generalmente la mejor opción.

2

Sí, los he usado en cosas del mundo real, pero sobre todo la creación de lenguajes personalizados para los que usa lexers y analizadores, ha sido suplantada por los idiomas definidos en XML. Más prolija pero entonces no tiene que hacer todo ese trabajo ...

1

Esto es interesante -

acabo escribió un analizador léxico/analizador con la mano para permitir que simples expresiones de consulta basados ​​en cadenas a ser manejados por una implementación IBindingListView.Esa fue la primera cosa útil fuera del código para la que he podido usarlo, y no solo lo escuché.

Bonito ejemplo de peatón, pero soy bastante pedestre en mi experiencia con ellos.

2

Sí, los he usado. Soy un gran admirador de ANTLR. Doy algunos consejos y trucos sobre el uso de ANTLR here y un breve endoso de él here. Es posible escribir a mano su propio analizador usando métodos ad hoc, pero es mucho más difícil y le llevará mucho más tiempo descubrir cómo hacer cambios cuando necesite aumentar el lenguaje que su analizador debe analizar.

+0

Estoy de acuerdo - No quiero volver a escribir uno a mano. ANTLR tiene un poco de una curva de aprendizaje sobre cómo integrarlo en su idioma. – codekaizen

1

No he usado uno de los tipos grandes para hacer un análisis léxico todavía, sin embargo, he escrito mi propio lexer a mano para un proyecto en el que trabajé. Tuvimos que analizar datos que provenían de una computadora de datos del proyecto Near Space y se escribieron en la tarjeta SD en formato binario. Tuve que separar las partes, convertirlas de binarias a decimales y luego escribir todo el contenido en un archivo separado por comas.

¡Es muy divertido sentarse y pensar lógicamente y escribir una máquina de estados para la tarea en cuestión!

2

Cualquier lugar que maneje la entrada de texto termina usando algún tipo de lexer/analizador aunque algunas veces terminan siendo el caso degenerado (lex cualquier cosa excepto una coma como un tipo de token y una coma como otra. Parse A number, a nombre, un número y un final de línea. Ese tipo de cosas) En una forma de verlo, sscanf podría considerarse como los casos más degenerados de un generador lexer/analizador sintáctico.

¿En cuanto a una operación lex/yacc completa? Supongo que se usa principalmente para GPLs y para cosas que caen bajo la definición suelta de DSL

2

Siempre que exista un documento estático (por ejemplo, un archivo) o un documento dinámico (por ejemplo, una transmisión en el tiempo) , y ese documento tiene algún tipo de estructura, te encontrarás necesitando algún tipo de analizador. Para estructuras lo suficientemente simples, puede funcionar con un análisis ad hoc (hacking de cadenas, expresiones regulares, etc.). Para las estructuras que no anidan, puede pasar con una máquina de estados finitos; aquí un generador de Lexer suele ser útil. Para estructuras complejas, eres prácticamente un analizador organizado. Puede escribir analizadores sintácticos a mano si está familiarizado con el análisis de estilo de descenso recursivo. Para estructuras realmente complejas, un generador de analizadores es casi siempre una gran ganancia.

Si desea procesar un idioma de computadora, casi necesita lexers y analizadores sintácticos como punto de partida. No son suficientes; tienes que hacer algo con el resultado del analizador.

Un uso realmente espectacular de lexing y análisis que hicimos es traducir JOVIAL, un lenguaje de los años 60, en C, para el bombardero stealth B-2. Ver http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html

0

Sí! El equipo con el que trabajo ha implementado un marco de generación de documentos que, entre otras cosas, permite evaluar expresiones (principalmente aritméticas). Estamos utilizando un analizador para extraer expresiones de las entradas/definiciones de los documentos generados y crear árboles de expresiones para ellos. Luego, esos árboles se evalúan y los resultados evaluados se escriben en el documento final.

Cuestiones relacionadas