Pregunta

La base de software para la que estoy desarrollando utiliza una cantidad significativa de yacc con la que no necesito tratar. Algunas veces creo que sería útil para entender algunos problemas que encuentro, pero la mayoría de las veces puedo escapar con mi completa ignorancia de yacc.

Mi pregunta, ¿hay suficientes proyectos nuevos por ahí que todavía usen yacc para garantizar el tiempo que necesitaré para aprenderlo?

Editar: Dado que la respuesta es principalmente a favor de aprender Yacc, ¿hay un lenguaje similar que recomendarías sobre Yacc?

¿Fue útil?

Solución

Sí, vale la pena aprender estas herramientas si alguna vez necesita crear o modificar código que analiza una gramática.

Durante muchos años, la herramienta de facto para generar código para analizar una gramática fue yacc, o su primo GNU, bison.

Últimamente escuché que hay un par de nuevos niños en el bloque, pero el principio es el mismo: escribes una gramática declarativa en un formato que está más o menos en forma Backus-Naur ( BNF ) y yacc / bison / lo que sea que genere algún código para usted que sería extremadamente tedioso de escribir a mano.

Además, los principios detrás de las gramáticas pueden ser muy útiles para aprender, incluso si no necesita trabajar directamente en dicho código. No he trabajado mucho con los analizadores desde que tomé un curso de Diseño de compiladores en la universidad, pero comprender las pilas de tiempo de ejecución, analizadores anticipados, evaluación de expresiones y muchas otras cosas relacionadas me ha ayudado enormemente a escribir y depurar mi código de manera efectiva.

editar: Dada su pregunta de seguimiento sobre otras herramientas, Yacc / Bison, por supuesto, son los mejores para proyectos C / C ++, ya que generan código C. Existen herramientas similares para otros idiomas. No todas las gramáticas son equivalentes, y algunos generadores de analizadores sintácticos solo pueden asimilar gramáticas de cierta complejidad. Por lo tanto, es posible que necesite encontrar una herramienta que pueda analizar su gramática. Ver http://en.wikipedia.org/wiki/Comparison_of_parser_generators

Otros consejos

No sé acerca de nuevos proyectos que lo usen, pero estoy involucrado en siete trabajos de mantenimiento diferentes que usan lex y yacc para procesar archivos de configuración.

No XML para mí, no-señor-ee :-).

Las soluciones que usan lex / yacc son un paso adelante de los archivos de configuración antiguos de las líneas key = val ya que permiten mejores estructuras jerárquicas como:

server = "mercury" {
    ip = "172.3.5.13"
    gateway = "172.3.5.1"
}
server = "venus" {
    ip = "172.3.5.21"
    gateway = "172.3.5.1"
}

Y, sí, sé que puedes hacer eso con XML, pero estas son principalmente aplicaciones heredadas escritas en C y, para ser sincero, probablemente también usaría lex / yacc para nuevos trabajos (no Java).

Eso es porque prefiero entregar el software a tiempo y presupuesto en lugar de entregar la mejor tecnología nueva: mis clientes no pagarán por mi educación, quieren resultados antes que nada y ya soy experto en lex / yacc y tener todo el código de plantilla para hacerlo rápidamente.

Una regla general: el código dura mucho tiempo, por lo que las tecnologías utilizadas en ese código también duran mucho tiempo. Reemplazar la base de código que mencionas tomaría una cantidad enorme de tiempo (tomó 15 años construirlo ...), lo que a su vez implica que seguirá existiendo en 5, 10 o más años. (¡Incluso existe la posibilidad de que alguien que lea esta respuesta termine trabajando en ello!)

Otra regla general: si una tecnología de uso general es lo suficientemente común como para que ya la haya encontrado, probablemente sea lo suficientemente común como para que se familiarice con ella, porque la volverá a ver algún día. Quién sabe: al familiarizarse con él, tal vez haya agregado una herramienta útil a su caja de herramientas ...

Yacc es una de estas tecnologías: es probable que la encuentres nuevamente, no es tan difícil y los principios que aprenderás se aplican a toda la familia de constructores de analizadores.

PEGs son lo nuevo, pero todavía hay un montón de proyectos que usan yacc o herramientas más modernas que yacc. Yo frunciría el ceño ante un nuevo proyecto que eligió usar yacc, pero para los proyectos existentes, portar una herramienta más moderna puede no tener sentido. Esto hace que tener una familiaridad aproximada con yacc sea una habilidad útil.

Si no está totalmente familiarizado con el tema de los generadores de analizadores sintéticos, le animo a que conozca uno, cualquiera. Muchos de los conceptos son portables entre ellos. Además, es una herramienta útil para tener en el cinturón: una vez que conozca uno, comprenderá cómo a menudo pueden ser superiores en comparación con los analizadores regex pesados ??escritos a mano. Si ya te sientes cómodo con el tema de los analizadores, no me preocuparía. Aprenderá yacc cuando sea necesario para hacer algo.

Trabajo en proyectos que usan Yacc. No es un código nuevo, pero si fueran nuevos, seguirían usando Yacc o un pariente cercano (Bison, Byacc, ...).

Sí, considero que vale la pena aprender si trabajas en C.

También considere aprender ANTLR u otros generadores de analizadores más modernos. Pero el conocimiento de Yacc le servirá de mucho: le ayudará a aprender otras herramientas similares, ya que gran parte de la teoría básica es similar.

No sé sobre yacc / bison específicamente, pero he usado antlr, cup, jlex y javacc. Pensé que solo tendrían una importancia académica, pero resultó que necesitábamos un lenguaje específico de dominio, y esto nos dio una solución mucho más agradable que algunas '' más simples ''. (basados ??en expresiones regulares) analizadores por ahí. Sin embargo, el mantenimiento puede ser un problema en muchos entornos, ya que la mayoría de los codificadores en estos días no tendrán experiencia con las herramientas de análisis.

No he tenido la oportunidad de compararlo con otros sistemas de análisis, pero definitivamente puedo recomendar ANTLR basado en mi propia experiencia y también con su amplia y activa base de usuarios.

Otro punto a favor de ANTLR es ANTLRWorks: El entorno de desarrollo de la GUI de ANTLR , que es una gran ayuda mientras desarrollando y depurando tus gramáticas. Todavía tengo que ver otro sistema de análisis que sea compatible con dicho IDE.

Estamos escribiendo un nuevo código yacc en mi empresa para enviar productos. Sí, estas cosas todavía se usan.

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