Me gustaría hacer algunos análisis y tokenización en C++ con fines de aprendizaje. Ahora, muchas veces me encontré con bison/yacc y lex al leer sobre este tema en línea. ¿Habría algún beneficio importante de usar aquellos como, por ejemplo, un tokenizador/analizador escrito usando STL o boost :: regex o quizás solo C?C++ cuál es la ventaja de lex y bisonte para un tokenizer/analizador selfmade
Respuesta
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
¿Alguien más ya ha escrito y DEBUGGED para usted?
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.
Ciertamente no pueden analizar la "gramática arbitraria". –
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.
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
- 1. ¿cuál es la diferencia entre la lex y yacc
- 2. Lex/Yacc para C#?
- 3. ¿Cuál es la diferencia entre Flex/Lex y Yacc/Bison?
- 4. ¿Cuál es la ventaja de Jikes RVM
- 5. ¿Cuál es la ventaja de usar memset() en C
- 6. ¿Cuál es la ventaja de utilizar NginX para Node.js?
- 7. ¿Cuál es la ventaja de este peculiar formateo?
- 8. ¿Cuál es la ventaja de utilizar la codificación Base64?
- 9. ¿cuál es la ventaja de la función estática?
- 10. ¿Qué es el rendimiento ?, y ¿cuál es la ventaja de usar el rendimiento en asp.net?
- 11. ¿Cuál es la ventaja de pathmunge over grep?
- 12. ¿Cuál es exactamente la ventaja de usar Punjab
- 13. ¿Cuál es la ventaja de CodeFirst sobre Database First?
- 14. ¿Cuál es la ventaja de RDF y Triple Storage para Neo4j?
- 15. ¿Cuál es la ventaja de tener una sección .bss?
- 16. ¿Cuál es la ventaja de scrypt over bcrypt?
- 17. ¿Cuál es la ventaja de WSDualHttpBinding en WCF?
- 18. ¿Cuál es la ventaja de usar varbinary sobre varchar aquí?
- 19. ¿Cuál es la diferencia entre C++ administrado y C#?
- 20. ¿cuál es la ventaja de utilizar "importación estática"?
- 21. ¿Cuál es la ventaja de esta llamada de función indirecta?
- 22. ¿Cuál es la ventaja de que una cadena sea inmutable?
- 23. ¿Cuál es la ventaja de UnityContainer.Resolve sobre Activator.CreateInstance?
- 24. ¿Cuál es la ventaja de usar filter_has_var() sobre isset()
- 25. ¿Cuál es la ventaja de usar métodos estáticos en Python?
- 26. En Java, ¿cuál es la ventaja de utilizar BufferedWriter para anexar a un archivo?
- 27. ¿cuál es la ventaja de usar put y delete en lugar de simplemente get y post
- 28. Cuál es la ventaja de las excepciones encadenadas
- 29. ¿Cuál es la VENTAJA de JavaCC frente a ANTLR?
- 30. ¿Cuál es la ventaja de usar Python Virtualbox API?
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