Lex es un programa informático que genera analizadores léxicos ("escáneres" o "lexers"). [ 1 ] [ 2 ] Se usa comúnmente con el generador de analizadores sintácticos yacc y es el generador de analizadores léxicos estándar en muchos sistemas Unix y similares a Unix . Una herramienta equivalente está especificada como parte del estándar POSIX . [ 3 ]
Lex lee un flujo de entrada que especifica el analizador léxico y escribe 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 analizador léxico en Ratfor . [ 4 ]
Historia
Lex fue escrito originalmente por Mike Lesk y Eric Schmidt [ 5 ] y descrito en 1975. [ 6 ] [ 7 ] En los años siguientes, Lex se convirtió en el generador de analizadores léxicos estándar en muchos sistemas Unix y similares a Unix . En 1983, Lex fue una de varias herramientas UNIX disponibles para el sistema operativo UNOS de Charles River Data Systems bajo la licencia de Bell Laboratories . [ 8 ] 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 versión popular de código abierto de Lex, llamada flex , o el "analizador léxico rápido", no se deriva de código propietario.
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, como sigue:
- La sección de definiciones define macros e importa archivos de cabecera escritos en C. También es posible escribir aquí cualquier código C, que se copiará textualmente en el archivo fuente generado.
- La sección de reglas asocia patrones de expresiones regulares con instrucciones de C. Cuando el analizador léxico encuentra texto en la entrada que coincide con un patrón determinado, ejecuta el código C asociado.
- La sección de código C contiene instrucciones y funciones que se copian textualmente al archivo fuente generado. Se supone que estas instrucciones contienen código llamado por las reglas de la sección de reglas. En programas grandes, es más conveniente colocar este código en un archivo separado que se enlaza durante la compilación .
Ejemplo de un archivo Lex
A continuación se muestra un ejemplo de archivo Lex para la versión flexible de Lex. Reconoce cadenas de números (enteros positivos) en la entrada y simplemente las imprime.
/*** Sección de definiciones ***/% { /* Código C que se copiará textualmente */ #include <stdio.h> % }%% /*** Sección de reglas ***//* [0-9]+ coincide con una cadena de uno o más dígitos */ [ 0-9 ] + { /* yytext es una cadena que contiene el texto coincidente. */ printf ( "Se vio un número entero: %s \n " , yytext ); }. | \ n { /* Ignorar todos los demás caracteres. */ }%% /*** Sección de código C ***/int main ( void ) { /* Llama al analizador léxico y luego finaliza. */ yylex (); return 0 ; }Si se proporciona esta entrada a flex, se convertirá en un archivo C, . Este se puede compilar en un ejecutable que coincide y genera cadenas de números enteros. Por ejemplo, dada la entrada:lex.yy.c
abc123z.!&*2gj6
El programa imprimirá:
Se detectó un número entero: 123 Se vio un número entero: 2 Se vio un número entero: 6
Uso de Lex con otras herramientas de programación
Uso de Lex con generadores de analizadores sintácticos
Lex, al igual que otros analizadores léxicos, limita las reglas a aquellas que pueden describirse mediante expresiones regulares . Por ello, Lex puede implementarse mediante un autómata de estados finitos, como se muestra en la jerarquía de lenguajes de Chomsky . Para reconocer lenguajes más complejos, Lex se suele utilizar con generadores de analizadores sintácticos como Yacc o Bison . Estos generadores utilizan una gramática formal para analizar un flujo de entrada.
Por lo general, es preferible que un analizador sintáctico, como uno generado por Yacc, acepte una secuencia de tokens (una "secuencia de tokens") como entrada, en lugar de tener que procesar directamente una secuencia de caracteres (una "secuencia de caracteres"). Lex se usa con frecuencia para generar dicha secuencia de tokens.
El análisis sin escáner se refiere a analizar directamente el flujo de caracteres de entrada, sin un analizador léxico independiente.
Lex y hacer
make es una utilidad que se puede usar para mantener programas que utilizan Lex. Make asume que un archivo con una extensión .les un archivo fuente de Lex. La macro interna de make LFLAGSse puede usar para especificar opciones de Lex que make invocará automáticamente. [ 9 ]
Véase también
Referencias
- ↑ Levine, John R .; Mason, Tony; Brown, Doug (1992). lex & yacc (2.ª ed.). O'Reilly . págs. 1-2 . ISBN 1-56592-000-7.
- ↑ Levine, John (agosto de 2009). Flex & Bison . O'Reilly Media. pág. 304. ISBN 978-0-596-15597-1Archivado del original el 16 de agosto de 2011. Consultado el 8 de enero de 2010 .
- ↑ Especificaciones básicas de The Open Group, número 7, edición de 2018 § Shell y utilidades § Utilidades § lex
- ↑ John R. Levine; John Mason; Doug Brown (1992). Lex & Yacc . O'Reilly. ISBN 9781565920002.
- ↑ Lesk, ME; Schmidt, E. "Lex – Un generador de analizadores léxicos" . Recuperado el 16 de agosto de 2010 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ Lesk, ME; Schmidt, E. (21 de julio de 1975). "Lex – Un generador de analizadores léxicos" (PDF) . SISTEMA DE TIEMPO COMPARTIDO UNIX: MANUAL DEL PROGRAMADOR UNIX, Séptima edición, Volumen 2B . bell-labs.com. Archivado (PDF) del original el 16 de marzo de 2012. Recuperado el 20 de diciembre de 2011 .
- ↑ Lesk, ME (octubre de 1975). "Lex: un generador de analizadores léxicos". Informe técnico de informática n.° 39. Murray Hill, Nueva Jersey: Bell Laboratories.
- ↑ La guía del iniciado para el universo (PDF) . Charles River Data Systems, Inc. 1983. pág. 13. Archivado (PDF) del original el 25/02/2024 . Consultado el 10/02/2024 .
- ↑ "make" . Especificaciones básicas de The Open Group (6). IEEE y The Open Group. 2004. IEEE Std 1003.1, edición de 2004. Archivado del original el 31 de octubre de 2010. Consultado el 18 de septiembre de 2007 .
Enlaces externos
- Uso de Flex y Bison en Macworld.com
- – Manual de referencia de comandos de usuario de Solaris 11.4
- – Manual del programador de Plan 9 , Volumen 1
- Herramientas de compilación
- Herramientas de programación Unix
- Utilidades Unix SUS2008
- Órdenes del Plan 9
- Máquinas de estados finitos
- Análisis léxico