Berkeley Yacc ( byacc ) es un generador de analizadores sintácticos de Unix diseñado para ser compatible con Yacc . Fue escrito originalmente por Robert Corbett y lanzado en 1989. [3] Debido a su licencia liberal y a que era más rápido que el AT&T Yacc, rápidamente se convirtió en la versión más popular de Yacc. [4] Tiene las ventajas de estar escrito en ANSI C89 y ser software de dominio público .
Contiene características no disponibles en Yacc, como la reentrada, que se implementa de una manera que es ampliamente compatible con GNU Bison . [5] [6]
En 1985, Robert Corbett desarrolló un generador de analizador LALR original basado en un artículo de 1982 de DeRemer y Pennello. [7] Corbett lo escribió como parte de su investigación para el doctorado que recibió de la Universidad de California, Berkeley en junio de 1985. [8] [9] Originalmente se llamaba Byson y era incompatible con Yacc, pero posteriormente se renombró Bison y se convirtió en la base de GNU Bison .
Más tarde, en 1985, Corbett desarrolló su generador de analizador LALR, haciéndolo compatible con Yacc y llamándolo Zeus, pero posteriormente renombrándolo Zoo. [10] Corbett publicó el código fuente de Zoo en un grupo de noticias de Usenet, pero pasó desapercibido hasta más tarde, en septiembre de 1989, cuando Corbett publicó en el grupo de noticias comp.compilers sobre poner el código fuente en un servidor FTP . [1] Hubo una discusión sobre cambiarle el nombre y en octubre de 1989 se lo conocía como Berkeley Yacc (byacc). [11]
En 1995, Chris Dodd desarrolló BtYacc, un derivado de retroceso de Berkeley Yacc para soportar el análisis de lenguajes sensibles al contexto como C++ , [12] [13] basado en un artículo de 1993 de Merrill que describe modificaciones similares a AT&T Yacc. [14] [15] Sus capacidades de retroceso y desambiguación semántica le permiten generar analizadores para gramáticas ambiguas . Una regla analizada pero rechazada por información semántica se puede revertir, de modo que el analizador pueda probar otra regla. [16] [17] Sin embargo, también ha sido criticado por necesitar acciones de prueba gratuitas de efectos secundarios y su manejo inflexible de conflictos de reducción de desplazamiento. [18]
En 1997, Vadim Maslov se hizo cargo del mantenimiento de BtYacc para dar soporte a un analizador COBOL desarrollado por su empresa. [19] En 1999, la última versión 3.0 se había convertido a C++ , por lo que ya no se implementaba en C. [20]
En 2000, Thomas E. Dickey trasladó Berkeley Yacc a OpenVMS para facilitar la migración de tin a VMS. Después de no poder encontrar otro mantenedor, Dickey ha mantenido Berkeley Yacc desde febrero de 2002. [21] Una actualización significativa fue la conversión de K&R C a ANSI C89 . [21]
En 2014, Tom Shields integró el backtracking de BtYacc en Berkeley Yacc, subsumiendo efectivamente a BtYacc y nuevamente admitiendo C (en lugar de solo C++) en las versiones de Dickey desde abril de 2014. [22]
Los generadores de analizadores sintácticos suelen trabajar con tres lenguajes: el lenguaje en el que se implementa un generador, el lenguaje en el que se implementa un analizador sintáctico generado y, por supuesto, el metalenguaje que describe lo que debe analizar un analizador sintáctico generado. Se podría considerar un cuarto lenguaje, cualquiera que sea el lenguaje que analiza un analizador sintáctico generado, pero los generadores de analizadores sintácticos no lo manejan directamente, sino que se centran en generar un analizador sintáctico a partir de una descripción dada mientras dejan que el analizador sintáctico generado se ocupe de ello. Yacc está escrito en C y genera analizadores sintácticos en C a partir de sus propias descripciones en metalenguaje Yacc. Así es también como funciona Berkely Yacc (de ahí su compatibilidad), sin embargo, se han creado varios derivados para permitirle generar analizadores sintácticos en lenguajes distintos de C.
Ray Lischner desarrolló perl-byacc (pbyacc) a partir de byacc 1.6, de modo que también pudiera generar analizadores sintácticos en Perl . Más tarde, Richard "Rick" Ohnemus trasladó los parches de byacc 1.6 a byacc 1.8. [23] Y más tarde, en 1996, Jake Donham desarrolló p5yacc a partir de perl-yacc 1.8.2 de modo que sus analizadores sintácticos Perl generados utilizaran clases de Perl 5 .
En 1994, Mike Kleyn desarrolló tyacc a partir de perl-yacc 1.8.2 para que también pudiera generar analizadores en Tcl [24]
En 1997, Bob Jamison desarrolló BYACC/Java (más tarde llamado BYACC/J o byaccj) a partir de byacc 1.8, para que también pudiera generar analizadores en Java . [25] [26]
En 2000, Bruce Bahnsen fusionó las capacidades del analizador Java de BYACC/J en perl-yacc y agregó la capacidad de generar analizadores en Python . [27] En 2013, Thomas Dickerson realizó más mejoras y lo denominó PyByacc. [28]
En 2003, Dave Bodenstab fusionó tyacc y p5yacc para desarrollar un PERL-TCL-YACC basado en la versión 4.8 de yacc de FreeBSD (un derivado de byacc). [29]
...soporte para código reentrante, que ha evolucionado en byacc hasta el punto en que se puede comparar y ajustar con bison.