estoy tratando de escribir un simple analizador YAML, leí la especificación de yaml.org, antes de empezar, me preguntaba si es mejor escribir un analizador enrollado a mano, o uso lex
(flex/bison
). Miré en el libyaml
(biblioteca de C) - no parece usar lex/yacc
. YAML (excluyendo los estilos de flujo), parece estar más orientado a la línea, entonces, ¿es más fácil escribir un analizador manual, o use flex/bison
Gracias.Análisis YAML - ¿Lex o laminado a mano?
Respuesta
Esta respuesta es básicamente una respuesta a la pregunta: "¿Debo pasar mi propio analizador o utilizar el generador de analizador?" y no tiene mucho que ver con YAML. Sin embargo, "responderá" a tu pregunta.
La pregunta que debe formularse no es "¿funciona esto con este lenguaje/gramática dada?", Sino "me siento seguro de implementar esto". La verdad del asunto es que la mayoría de los formatos que quiere analizar funcionarán con un analizador generado. La otra verdad es que es posible analizar incluso idiomas complejos con una simple mano escrita recursive descent parser.
He escrito, entre otros, un analizador de descenso recursivo para EDDL (C y elementos estructurados) y un analizador bison/flex para INI. Escogí estos ejemplos porque van en contra de la intuición y los requisitos externos dictaron la decisión.
Desde que establecí en un nivel técnico es posible, ¿por qué escogerías uno sobre el otro? Esta es una pregunta realmente difícil de responder, aquí hay algunas ideas sobre el tema:
- Escribir un buen lexer es realmente difícil. En la mayoría de los casos, tiene sentido usar flex para generar el lexer. Hay poco uso de la mano de rodar su propio lexer, a menos que tenga formatos de entrada realmente exóticos.
- El uso de bisontes o generadores similares hace que la gramática utilizada para el análisis sea explícitamente visible. La principal ventaja aquí es que el desarrollador que mantiene su analizador en cinco años verá de inmediato la gramática utilizada y podrá compararla con cualquier especificación.
- El uso de un analizador descendente recursivo hace que quede bastante claro lo que sucede en el analizador sintáctico. Esto proporciona los medios fáciles para manejar con gracia los conflictos de Harry. Puede escribir un simple si, en lugar de reorganizar toda la gramática para que sea LALR1.
- Al desarrollar el analizador puede "pasar por alto los detalles" con un analizador escrito a mano, usar bisontes es casi imposible. En Bison la gramática debe funcionar o el generador no hará nada.
- Bison es increíble al señalar fallas formales en la gramática. Lamentablemente, te dejan solo para arreglarlos. Cuando se ejecuta manualmente un analizador, solo encontrará los defectos cuando el analizador lea tonterías.
Esta no es una respuesta definitiva para una u otra, pero le indica la dirección correcta. Dado que parece que estás escribiendo el analizador sintáctico por diversión, creo que deberías haber escrito ambos tipos de analizador sintáctico.
- 1. Ply Lex problema de análisis
- 2. yacc/lex o codificación manual?
- 3. Haskell herramientas de análisis - yacc: lex :: feliz :?
- 4. materia de análisis YAML frontal en Java
- 5. archivo ELF a mano
- 6. ¿Cómo dibujar una elipse o círculo a mano alzada?
- 7. ¿Salió la salida de registro a XML, JSON o YAML?
- 8. C++ nombre mangling a mano
- 9. Eclipse "Compartir proyecto" a mano?
- 10. PHP: ¿Acceso a matriz a mano corta?
- 11. Lex/Yacc para C#?
- 12. Reconocimiento de formas escritas a mano
- 13. Lex/Flex - Escaneado para el carácter EOF
- 14. Crear un parche MSI (.msp) a mano?
- 15. jqgrid cambiar el puntero a la mano
- 16. Algoritmo para reconocimiento de escritura a mano
- 17. Cómo escribir un lexer (shell) a mano
- 18. Reconocimiento de escritura a mano chino
- 19. Django o CodeIgniter para la aplicación web llave en mano
- 20. Boost.Spirit: informe de error Lex + Qi
- 21. Ventajas de Antlr (frente a decir, lex/yacc/bison)
- 22. Lex y Yacc en PHP
- 23. cómo usar yy_scan_string en lex
- 24. Cómo analizar YAML en el navegador?
- 25. C# SqlParameters Mano corto
- 26. ¿Cómo convierto YAML a XML en Perl?
- 27. ¿Puede un objeto YAML referirse a otro?
- 28. Clojure: Conversión de archivo Clojure a YAML
- 29. ¿Serializar un objeto a JSON, XML, YAML?
- 30. Serialise a YAML usando XStream en Java
¿Ha considerado utilizar un analizador estándar YAML estándar? ¿O estás específicamente interesado en construir el tuyo propio? Además, tenga en cuenta que 'lex' y' flex' son * generadores de escáner *, no * generadores de analizador *; para hacer el análisis, querrías usar 'yacc' o' bison'. – templatetypedef
@templatetypedef Estoy interesado en construir el mío. – vyom
@templatetypedef Probablemente no aclare mi pregunta. Entiendo 'lex' es solo un tokenizer. Quería saber si la estructura de YAML se adapta mejor a 'flex/bison' o al analizador de rollo manual – vyom