Pregunta

Recientemente, comencé a aprender ANTLR. Sé que los lexers / parsers juntos pueden usarse para construir lenguajes de programación.

Aparte de DSL o lenguajes de programación, ¿alguna vez has utilizado directa o indirectamente herramientas lexer / parser (y conocimiento) para resolver problemas del mundo real? ¿Es posible que el programador promedio resuelva esos problemas sin el conocimiento de lexers o analizadores?

¿Fue útil?

Solución

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

Algún ejemplo de los usos no estándar en los que personalmente he puesto la tecnología:

  • raspado de datos de informes generados por sistemas heredados
  • seleccionar patrones en datos demasiado complejos para una expresión regular
  • análisis de protocolo
  • juegos de aventura basados ??en texto
  • la API de metaprogramación que se comió a Toledo (no es su nombre real)
  • análisis de código / análisis de registro
  • desguace " forma libre " campos en una base de datos
  • y scads más que estoy olvidando (soy viejo)

Otros consejos

Resaltado de sintaxis. El Scite editor de texto le permite escribir su propio lexer (en C ++) para proporcionar resaltado de sintaxis para Cualquier idioma personalizado. Escribí mi propio lexer personalizado para Scite como actualización sobre este tema (lo estudié hace un tiempo en mi universidad).

Las expresiones regulares a menudo se usan 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 marcos como .NET. En muchos casos, los desarrolladores tal vez ni siquiera conozcan las técnicas de lexing / parsing y, por lo tanto, caigan en el uso de Regex de forma predeterminada.

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

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

Sí, los he usado. Soy un gran admirador de ANTLR. Doy algunos consejos y trucos sobre el uso de ANTLR aquí y un breve aprobación de la misma aquí . Es posible escribir a mano su propio analizador utilizando métodos ad hoc, pero es mucho más difícil y tomará más tiempo descubrir cómo hacer cambios cuando necesite hacer crecer el lenguaje que su analizador debe analizar.

Cualquier lugar donde maneje la entrada de texto termina usando algún tipo de lexer / parser aunque algunas veces terminan siendo el caso degenerado (lex cualquier cosa menos una coma como un tipo de token y una coma como otro. Parse un número, un 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 / parser.

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

Cada vez que exista un documento estático (p. ej., un archivo) o un documento dinámico (p. ej., una secuencia que se produce con el tiempo) y ese documento tiene algún tipo de estructura, necesitará algún tipo de analizador. Para estructuras lo suficientemente simples, puede sobrevivir con el análisis ad hoc (pirateo de cadenas, expresiones regulares, etc.). Para estructuras que no anidan, puede pasar con una máquina de estados finitos; aquí un generador de lexer suele ser útil. Para estructuras complejas, es prácticamente un analizador organizado. Puede escribir analizadores a mano si está familiarizado con el análisis de estilo de descenso recursivo. Para estructuras realmente complejas, un generador de analizador casi siempre es una gran victoria.

Si desea procesar un lenguaje de computadora, necesita prácticamente lexers y analizadores 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 la década de 1960, en C, para el bombardero sigiloso B-2. Consulte http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html

Un gran ejemplo de un lexer / analizador que está 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 utilizan estas tecnologías. Si bien supongo que podría clasificar 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á utilizando algún tipo de lexer / parser para su propia sintaxis de consulta y análisis de documentos.

Esto es interesante

Acabo de escribir un lexer / parser a mano para permitir que una implementación IBindingListView maneje expresiones de consulta simples basadas en cadenas. Esa fue la primera cosa útil fuera del código que realmente pude usar, y no solo escuché sobre eso.

Ejemplo bastante peatonal, pero soy bastante peatón en mi experiencia con ellos.

Todavía no he usado a uno de los grandes para hacer ningún análisis léxico, sin embargo, he escrito mi propio léxico a mano para un proyecto en el que trabajé. Tuvimos que analizar los datos que regresaron de la computadora de datos de un proyecto Near Space y se escribieron en la tarjeta SD en binario. Tuve que separar los bits, convertirlos de binario a decimal 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 estado para la tarea en cuestión!

¡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 para los documentos generados y crear árboles de expresiones para ellos. Luego se evalúan esos árboles y los resultados evaluados se escriben en el documento final.

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