¿Cuál es la diferencia entre Flex / Lex y Yacc / Bison?

122

¿Cuál es la diferencia entre Flex & Lex y Yacc & Bison? Busqué en Internet y no encontré ninguna respuesta sólida.

¿Puedo instalar Lex y Yacc puros en Ubuntu, o puedo instalar solo flex y bison? Estoy confundido.

  • ¿Lex o Yacc siguen siendo mantenidos por alguien?
  • ¿Son todos gratis?
  • Si Lex no es gratuito, ¿por qué lo tengo instalado en mi distribución de Ubuntu?

    lex --version
    lex 2.5.35
    
Interrogador tonto
fuente
3
No hay una versión lex 2.5.35: está ejecutando la versión flex 2.5.35, solo se identifica como 'lex' si la invoca como 'lex'
Chris Dodd

Respuestas:

81

Hay algunas diferencias entre Lex y Flex, pero debe abusar de Lex para encontrarse con los problemas con Flex. (Tengo un programa que abusa de Lex y, por lo tanto, no funciona bajo Flex.) Esto es principalmente en el área de búsqueda anticipada de entrada; en Lex, puede proporcionar su propio código de entrada y modificar la secuencia de caracteres; Flex no te dejará hacer eso.

Yacc y Bison son bastante compatibles, aunque Bison tiene algunos trucos adicionales que puede hacer.

Probablemente no pueda encontrar copias legítimas de (las versiones originales de AT&T de) Lex y Yacc para instalar en Ubuntu. No diría necesariamente que es imposible, pero no soy consciente de eso. Flex y Bison están fácilmente disponibles y son equivalentes para la mayoría de los propósitos. También puede encontrar varios programas alternativos y aproximadamente equivalentes del mundo BSD.

Lex y Yacc son mantenidos por los licenciatarios de Unix SVRx; compañías como IBM (AIX), HP (HP-UX) y Sun (Solaris) han modificado las versiones de Lex y Yacc a sus órdenes. MKS también proporciona MKS Lex y MKS Yacc; sin embargo, el Yacc al menos tiene algunas extensiones no estándar.

Flex y Bison son gratis. (AT&T) Lex y Yacc no lo son.

Jonathan Leffler
fuente
44
La información sobre Yacc es incorrecta. Berkeley tiene un Yacc, que está presente y disponible bajo la licencia BSD en todos los sistemas operativos BSD de código abierto. He votado a favor en esta cuenta, pero si la respuesta se corrige lo suficientemente rápido, eliminaré el voto a favor.
Daniel C. Sobral
2
@Daniel: AFAIK, AT&T Yacc no se puede obtener de Berkeley, lo que obtienes de Berkeley es Berkeley Yacc. Aclararé la respuesta para reflejar eso.
Jonathan Leffler
1
En flex, ciertamente puede cambiar los buffers de entrada sin dolor (lo hice una vez para manejar esencialmente #include). Mi libro de O'Reilly sobre lex y yacc (no disponible aquí, lo siento) decía que solo era posible en lex a través de trucos repugnantes.
vonbrand
33

Bison es la implementación / extensión GNU de Yacc, Flex es el sucesor de Lex. En cualquier caso, está bien (y recomendado) usar bison / flex.

Jan Jungnickel
fuente
1
Además, byacc, la implementación Berkeley de yacc, está ampliamente disponible (lo veo en mi lista de repositorios de Debian).
Michael Ekstrand
1
Flex se llama así porque es (¿era?) mucho más rápido que Lex. Tiene varias extensiones, y los archivos generados no son muy similares (es decir, los hacks feos en lex no funcionan con flex y viceversa).
vonbrand
11

En la mayoría de los sistemas Linux (¿todos?), "Lex" es en realidad un enlace simbólico a flex. Básicamente, es solo un nombre diferente a la versión gratuita.

ndr
fuente
1
En mi sistema (Arch Linux), los dos binarios no se comportan de la misma manera. Probablemente una característica de compatibilidad lex.
Danilo Bargen
10

YACC está disponible bajo licencias de código abierto de Plan 9 y Open Solaris. Además, también existe Berkeley YACC, que es compatible con el YACC original, pero no comparte el código fuente. Berkeley YACC se puede encontrar en cualquiera de los sistemas operativos BSD de código abierto.

Daniel C. Sobral
fuente
2

Bison en una parte del proyecto GNU. Y yacc se usa como una utilidad en Berkeley Software Distribution (BSD). Aunque es compatible con yacc, pero Lex y Yacc son cosa del pasado. Flex y bison son ampliamente utilizados hoy en día.

Avani Ranade
fuente