stringtranslate.com

Yacc

Yacc ( Yet Another Compiler-Compiler ) es un programa informático para el sistema operativo Unix desarrollado por Stephen C. Johnson . Es un generador de analizadores sintácticos LALR (izquierda a derecha, derivación más a la derecha) con lookahead , que genera un analizador sintáctico LALR (la parte de un compilador que intenta dar sentido sintáctico al código fuente ) basado en una gramática formal , escrita en una notación similar a la forma Backus–Naur (BNF). [1] Yacc se suministra como una utilidad estándar en BSD y AT&T Unix. [2] Las distribuciones Linux basadas en GNU incluyen Bison , un reemplazo de Yacc compatible con versiones posteriores . [3]

Historia

A principios de los años 1970, Stephen C. Johnson , un científico informático de Bell Labs / AT&T , desarrolló Yacc porque quería insertar un operador or exclusivo en un compilador de lenguaje B [4] (desarrollado utilizando el compilador-compilador TMG de McIlroy [5] ), pero resultó ser una tarea difícil. Como resultado, su colega de Bell Labs Al Aho le indicó el trabajo de Donald Knuth sobre análisis sintáctico LR , que sirvió como base para Yacc. [4] Yacc fue influenciado por [6] y recibió su nombre en referencia al compilador-compilador TMG. [7]

Yacc fue escrito originalmente en el lenguaje de programación B , pero pronto fue reescrito en C por Alan Snyder. [5] Apareció como parte de la versión 3 de Unix , [8] y una descripción completa de Yacc se publicó en 1975. [6]

Johnson utilizó Yacc para crear el compilador Portable C. [ 8] Bjarne Stroustrup también intentó utilizar Yacc para crear una especificación formal de C++ , pero "fue derrotado por la sintaxis de C". [9] Aunque lo consideró inadecuado para una especificación formal del lenguaje, Stroustrup procedió a utilizar Yacc para implementar Cfront , la primera implementación de C++. [10]

En una entrevista de 2008, Johnson reflexionó que "la contribución que Yacc hizo a la difusión de Unix y C es de lo que estoy más orgulloso". [11]

Descripción

La entrada a Yacc es una gramática con fragmentos de código C (llamados "acciones") adjuntos a sus reglas. Su salida es un analizador de desplazamiento-reducción en C que ejecuta los fragmentos de C asociados con cada regla tan pronto como se reconoce la regla. Las acciones típicas implican la construcción de árboles de análisis . Usando un ejemplo de Johnson, si la llamada node(label, left, right) construye un nodo de árbol de análisis binario con la etiqueta y los hijos especificados, entonces la regla

expr : expr '+' expr { $$ = nodo ( '+' , $1 , $3 ); }           

reconoce expresiones de suma y construye nodos para ellas. Los identificadores especiales $$ , $1 y $3 hacen referencia a elementos en la pila del analizador . [6]

Yacc produce únicamente un analizador sintáctico (analizador de frases) que puede utilizarse solo en el caso del análisis sintáctico sin escáner. Sin embargo, el análisis sintáctico completo normalmente requiere un analizador léxico externo para realizar primero una etapa de tokenización (análisis de palabras), a la que luego le sigue la etapa de análisis propiamente dicha. [6] Los generadores de analizadores léxicos, como Lex o Flex , están ampliamente disponibles para este propósito. El estándar IEEE POSIX P1003.2 define la funcionalidad y los requisitos tanto para Lex como para Yacc. [12]

Algunas versiones de AT&T Yacc se han convertido en código abierto . Por ejemplo, el código fuente está disponible con las distribuciones estándar de Plan 9. [ 13]

Impacto

Yacc y otros programas similares (que en su mayoría son reimplementaciones) han sido muy populares. El propio Yacc solía estar disponible como generador de analizadores por defecto en la mayoría de los sistemas Unix, aunque desde entonces ha sido reemplazado por programas más recientes, en gran medida compatibles, como Berkeley Yacc , GNU Bison , MKS Yacc y Abraxas PCYACC. Una versión actualizada del AT&T Yacc original se incluye como parte del proyecto OpenSolaris de Sun. Cada uno ofrece ligeras mejoras y características adicionales con respecto al Yacc original, pero el concepto y la sintaxis básica siguen siendo los mismos. [14]

Yacc también fue una de varias herramientas UNIX disponibles para el sistema operativo UNOS de Charles River Data Systems bajo la licencia de Bell Laboratories . [15]

Entre los lenguajes que se implementaron por primera vez con Yacc se encuentran AWK , C++ , [10] eqn y Pic . [16] Yacc también se utilizó en Unix para implementar el Portable C Compiler , así como analizadores para lenguajes de programación como FORTRAN 77 , Ratfor , APL , bc , m4 , etc. [8] [17]

Yacc también ha sido reescrito para otros lenguajes, incluidos OCaml , [18] Ratfor , ML , Ada , Pascal , Java , PHP , Python , Ruby , Go , [19] Common Lisp, [20] y Erlang . [21]

Véase también

Referencias

  1. ^ "La A a la Z de los lenguajes de programación: YACC". Computerworld. Archivado desde el original el 31 de enero de 2013. Consultado el 30 de noviembre de 2012 .
  2. ^ Levine, John (1992). Lex & yacc . Sebastopol, CA: O'Reilly & Associates. pág. xx. ISBN. 1-56592-000-7.
  3. ^ Levine, John (2009). Flex & bison . Sebastopol, California: O'Reilly Media. pág. xv. ISBN. 978-0-596-15597-1.
  4. ^ ab Morris, Richard (1 de octubre de 2009). «Stephen Curtis Johnson: Geek of the Week». Red Gate Software . Consultado el 19 de enero de 2018 .
  5. ^ ab Ritchie, Dennis M. (abril de 1993). "El desarrollo del lenguaje C". Historia de los lenguajes de programación---II . Association for Computing Machinery, Inc. (publicado el 1 de enero de 1996). doi : 10.1145/234286.1057834 . ISBN . 0-201-89502-1. pp. 675, 684: Después de que la versión TMG de B estuvo funcionando, Thompson reescribió B en sí misma (un paso de arranque)… Cuando Johnson regresó a Bell Labs en 1973, se desconcertó al descubrir que el lenguaje cuyas semillas había traído a Canadá había evolucionado en casa; incluso su propio programa yacc había sido reescrito en C, por Alan Snyder.
  6. ^ abcd Johnson, Stephen C. (1975). Yacc: Yet Another Compiler-Compiler (Informe técnico). Murray Hill, Nueva Jersey: AT&T Bell Laboratories. 32 . Consultado el 31 de enero de 2020 .
  7. ^ "Sistemas de escritura de traductores tempranos". Laboratorio de Computación Atlas.
  8. ^ abc McIlroy, MD (1987). Un lector de Unix para investigación: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
  9. ^ Stroustrup, Bjarne . "Una historia de C++: 1979-1991" (PDF) .
  10. ^ ab Stroustrup, Bjarne . "Código fuente de Cfront".
  11. ^ Hamilton, Naomi (9 de julio de 2008). "Yacc, Unix y consejos de Stephen Johnson, exalumno de Bell Labs". www.computerworld.com . Archivado desde el original el 22 de agosto de 2020. Consultado el 10 de noviembre de 2020 .
  12. ^ lex  – Referencia de shell y utilidades, la especificación única de UNIX , versión 4 de The Open Group , yacc – Referencia de shell y utilidades, la especificación única de UNIX , versión 4 de The Open Group .
  13. ^ "plan9: lanzamiento de Plan 9 por parte de UC Berkeley bajo la licencia GPLv2". GitHub . 26 de diciembre de 2017 . Consultado el 2 de enero de 2018 .
  14. ^ Manual del Bisonte: Historia
  15. ^ La guía privilegiada del universo (PDF) . Charles River Data Systems, Inc. 1983. pág. 13.
  16. ^ "Especial UNIX: profesores Kernighan y Brailsford". Computerphile . 30 de septiembre de 2015. Archivado desde el original el 11 de diciembre de 2021.
  17. ^ Kernighan, Brian W.; Pike, Rob (1984). El entorno de programación Unix . Prentice Hall. ISBN 0-13-937681-X.
  18. ^ "Manual del usuario de OCaml: Capítulo 12 Generadores de analizadores léxicos y analizadores sintácticos (ocamllex, ocamlyacc)" . Consultado el 25 de noviembre de 2013 .
  19. ^ "Yacc.go: una versión de Yacc para el lenguaje de programación Go" . Consultado el 15 de julio de 2017 .
  20. ^ "CL-Yacc: una versión Common Lisp de Yacc".
  21. ^ "yecc: Una implementación Erlang de Yacc".
  22. ^ John Levine (agosto de 2009), flex & bison , O'Reilly Media

Enlaces externos