2011-09-19 12 views
6

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?

+1

¿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

+0

@templatetypedef Estoy interesado en construir el mío. – vyom

+1

@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

Respuesta

3

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.