Lex (software)

Ajustar Compartir Imprimir Citar
Utilidad estándar UNIX

Lex es un programa informático que genera analizadores léxicos ("scanners" o "lexers").

Lex se usa comúnmente con el generador de analizadores yacc. Lex, originalmente escrito por Mike Lesk y Eric Schmidt y descrito en 1975, es el generador de analizador léxico estándar en muchos sistemas Unix, y se especifica una herramienta equivalente como parte del estándar POSIX.

Lex lee un flujo de entrada que especifica el analizador léxico y escribe el código fuente que implementa el analizador léxico en el lenguaje de programación C.

Además de C, algunas versiones antiguas de Lex podían generar un lexer en Ratfor.

Código abierto

Aunque originalmente se distribuyó como software propietario, algunas versiones de Lex ahora son de código abierto. Las versiones de código abierto de Lex, basadas en el código propietario original, ahora se distribuyen con sistemas operativos de código abierto como OpenSolaris y Plan 9 de Bell Labs. Una popular versión de código abierto de Lex, llamada flex, o el 'analizador léxico rápido', no se deriva de la codificación propietaria.

Estructura de un archivo Lex

La estructura de un archivo Lex es intencionalmente similar a la de un archivo yacc: los archivos se dividen en tres secciones, separadas por líneas que contienen solo dos signos de porcentaje, de la siguiente manera:

Ejemplo de un archivo Lex

El siguiente es un archivo Lex de ejemplo para la versión flexible de Lex. Reconoce cadenas de números (enteros positivos) en la entrada y simplemente los imprime.

- Sí. Sección de definición ***/%{}/* C code to be copied verbatim */#include Identificado.h%}%% - Sí. Sección ***/ /* [0-9]+ coincide con una cadena de uno o más dígitos */[0-9]+ {} /* yytext es una cadena que contiene el texto emparejado. */ printf()"Ver un entero: %sn", Yytext); }.Silencion {} /* Ignora a todos los demás personajes. */ }%%- Sí. C Code section ***/int principal()vacío){} /* Llame al lexer, luego déjelo. */ Yylex(); retorno 0;}

Si esta entrada se da a flex, se convertirá en un archivo C, lex.yy.c. Esto se puede compilar en un ejecutable que coincide y produce cadenas de enteros. Por ejemplo, dada la entrada:

abc123z.

el programa imprimirá:

Vi un entero: 123
Vi un entero: 2
Vi un entero: 6

Usando Lex con otras herramientas de programación

Usando Lex con generadores de parser

Lex y los generadores de analizadores, como Yacc o Bison, suelen usarse juntos. Los generadores de analizadores utilizan una gramática formal para analizar un flujo de entrada, algo que Lex no puede hacer con expresiones regulares simples, ya que Lex se limita a autómatas de estado finito simples.

Por lo general, es preferible tener un analizador, uno generado por Yacc, por ejemplo, que acepte un flujo de tokens (un "flujo de tokens") como entrada, en lugar de tener que procesar un flujo de caracteres (un "character-stream") directamente. Lex se usa a menudo para producir un flujo de tokens de este tipo.

El análisis sin escáner se refiere al análisis del flujo de caracteres de entrada directamente, sin un lexer distinto.

Lex y hacer

make es una utilidad que se puede usar para mantener programas que involucren a Lex. Make asume que un archivo que tiene una extensión de .l es un archivo fuente Lex. La macro interna make LFLAGS se puede usar para especificar las opciones de Lex que make invocará automáticamente.