2009-03-08 54 views
85

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

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

  • ¿Alguna vez Lex o Yacc está siendo mantenido por alguien?
  • ¿Son todas ellas gratis?
  • Si Lex no es gratuito, ¿por qué lo tengo instalado en mi distribución de Ubuntu?

    lex --version 
    lex 2.5.35 
    
+2

No hay versión de lex 2.5.35 - está ejecutando la versión de flex 2.5.35, solo se identifica como 'lex' si lo invoca como 'lex' –

Respuesta

55

Existen algunas diferencias entre Lex y Flex, pero debe abusar de Lex para enfrentarse a los problemas de Flex. (Tengo un programa que abusa de Lex y no funciona en Flex, por lo tanto.) Esto se realiza principalmente en el área de entrada de entrada; en Lex, puede proporcionar su propio código de entrada y modificar el flujo 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 (el original, AT & T versiones de) Lex y Yacc para instalar en Ubuntu. No necesariamente diría que es imposible, pero no estoy al tanto de eso. Flex y Bison están 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 Unix SVRx - compañías como IBM (AIX), HP (UX-UX) y Sun (Solaris) tienen versiones modificadas de Lex y Yacc a su disposición. 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 gratuitos. (AT & T) Lex y Yacc no lo son.

+3

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 negativamente sobre esta cuenta, pero si la respuesta se corrige con la suficiente rapidez, quitaré el voto a favor. –

+1

@Daniel: AFAIK, AT & T Yacc no puede obtenerse en Berkeley; lo que obtiene de Berkeley es Berkeley Yacc.Aclararé la respuesta para reflejar eso. –

+0

En flex ciertamente puede cambiar los búferes de entrada sin dolor (lo hice una vez para manejar esencialmente '# include'). Mi libro de O'Reilly sobre lex y yacc (no estuvo a mano aquí, lo siento) dijo que solo era posible en Lex a través de hacks desagradables. – vonbrand

23

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

+1

Además, byacc, la implementación de yacc en Berkeley, está ampliamente disponible (lo veo en mi lista de repositorio de Debian). –

+0

flex se llama así porque es (era?) _mucho_ más rápido que Lex. Tiene varias extensiones, y los archivos generados no se parecen en nada (es decir, los hacks feos en Lex no funcionan con flex y viceversa). – vonbrand

8

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

+1

En mi sistema (Arch Linux), los dos binarios no se comportan de la misma manera. Probablemente una característica de compatibilidad Lex. –

5

YACC está disponible bajo licencias de código abierto de Plan 9 y Open Solaris. Además, también hay 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.

Cuestiones relacionadas