Lex (software)
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:
- El definiciones sección define macros e importa archivos de cabecera escritos en C. También es posible escribir cualquier código C aquí, que será copiado literal en el archivo fuente generado.
- El reglas en la sección se asocian patrones de expresión regulares con las declaraciones C. Cuando el lexer vea texto en la entrada que coincida con un patrón dado, ejecutará el código C asociado.
- El Código C sección contiene C declaraciones y funciones que son copiadas literales al archivo fuente generado. These statements presumably contain code called by the rules in the rules section. En los programas grandes es más conveniente colocar este código en un archivo separado vinculado en el tiempo de compilación.
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.
Contenido relacionado
Sierra circular
Vino (software)
Rastra (herramienta)