2010-07-13 8 views

Respuesta

13

Recientemente me puse a escribir un lector y analizador simple.

Resultó que el lexer era más simple de codificar a mano. Pero el analizador fue un poco más difícil. Mi analizador generado por Bison funcionó casi de inmediato, y me dio muchos mensajes útiles sobre dónde había olvidado los estados. Más tarde escribí el mismo analizador a mano, pero me tomó muchas más depuraciones antes de que funcionara perfectamente.

El atractivo de generar herramientas para lexers y analizadores sintácticos es que puede escribir las especificaciones en un lenguaje limpio y fácil de leer que se aproxima a una interpretación lo más corta posible de su especificación. Un analizador manuscrito suele ser al menos dos veces más grande. Además, el analizador automático (/ lexer) viene con una gran cantidad de código de diagnóstico y lógica para ayudarlo a depurar la cosa.

Una especificación de analizador/lexer en lenguaje BNF también es mucho más fácil de cambiar, si su idioma o requisitos cambian. Si está tratando con un analizador/lector de manuscritos, es posible que necesite profundizar en su código y realizar cambios significativos.

Finalmente, debido a que a menudo se implementan como máquinas de estado finito sin retroceso (miles de millones de opciones en Bison, así que esto no siempre es un hecho), es bastante posible que su código generado automáticamente sea más eficiente que su mano producto codificado

+0

gracias por su respuesta detallada, creo que voy a probar ambos solo para comparar, ¡ya que es solo por diversión de todos modos! – moka

4

¿Alguien más ya ha escrito y DEBUGGED para usted?

1

Es más fácil y son más generales. Bison/Lex puede tonkenizar y analizar gramática arbitraria y presentarla en lo que puede ser un formato más fácil. También podrían ser más rápidos, dependiendo de qué tan bien escriba su expresión regular.

No me gustaría escribir mi propio analizador en C ya que el lenguaje no tiene una gran intuición acerca de las cadenas. Si escribe el suyo, recomendaría Perl para facilitar la expresión regular (o posiblemente Python).

Probablemente sea más rápido usar las herramientas existentes, pero puede o no ser tan divertido. Si tienes tiempo y como es solo para aprender, adelante. C++ es un buen lenguaje para empezar.

+4

Ciertamente no pueden analizar la "gramática arbitraria". –

0

Diferentes estilos para diferentes personas. Personalmente, me gustan los analizadores sintácticos de descenso recursivo. Los considero fáciles de entender y puedes hacer que produzcan mensajes de error para el usuario final superiores a los producidos por herramientas como el bisonte.

+0

También me parece que tienden a ser un poco más robustos frente a los casos de bordes difíciles en algunos idiomas donde se superponen el análisis y el léxico. – Kylotan

Cuestiones relacionadas