Lex es un programa informático que genera analizadores léxicos ("escáneres" o "lexers"). [1] [2]
Autor (es) original (es) | Mike Lesk y Eric Schmidt |
---|---|
Versión inicial | 1975 |
Repositorio | |
Escrito en | C |
Sistema operativo | Unix , similar a Unix , Plan 9 |
Plataforma | Multiplataforma |
Tipo | Mando |
Lex se usa comúnmente con el generador de analizador yacc . Lex, escrito originalmente por Mike Lesk y Eric Schmidt [3] y descrito en 1975, [4] [5] 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 . [6]
Lex lee una entrada de corriente especificando el analizador léxico y salidas código fuente implementar el analizador léxico en el lenguaje de programación C . Además de C, algunas versiones antiguas de Lex también podrían generar un lexer en Ratfor . [7]
Fuente abierta
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 "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:
- Las definiciones sección se definen las macros y las importaciones archivos de cabecera escritos en C . También es posible escribir aquí cualquier código C, que se copiará literalmente en el archivo fuente generado.
- La normativa sección asocia expresiones regulares patrones con C declaraciones . Cuando el lexer ve texto en la entrada que coincide con un patrón dado, ejecutará el código C asociado.
- La sección de código C contiene declaraciones y funciones de C que se copian literalmente al archivo fuente generado. Estas declaraciones presumiblemente contienen código llamado por las reglas en la sección de reglas. En programas grandes, es más conveniente colocar este código en un archivo separado vinculado en el momento de la 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.
/ *** Sección de definición *** /% { / * Código C que se copiará literalmente * / #include % }/ * Esto le dice a flex que lea solo un archivo de entrada * / % opción noyywrap%% / *** 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 ( "Vio un entero:% s \ n " , yytext ); }. | \ n { / * Ignora todos los demás caracteres. * / }%% / *** C Sección de código *** /int main ( void ) { / * Llame al lexer, luego salga. * / yylex (); return 0 ; }
Si se da esta entrada para flex
, será convertida en un archivo de C, . Esto 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á:
Vio un número entero: 123Vio un número entero: 2Vio un número entero: 6
Usar Lex con otras herramientas de programación
Usando Lex con generadores de analizadores sintácticos
Los generadores Lex y parser, como Yacc o Bison , se usan comúnmente juntos. Los generadores de analizadores usan una gramática formal para analizar un flujo de entrada, algo que Lex no puede hacer usando expresiones regulares simples (Lex está limitado a autómatas de estado finito simples ). [ aclaración necesaria ]
Por lo general, es preferible que un analizador (generado por Yacc, digamos) reciba un flujo de tokens como entrada, en lugar de que consuma el flujo de caracteres de entrada directamente. Lex se utiliza a menudo para producir un flujo de tokens de este tipo.
El análisis sintáctico sin escáner se refiere a analizar el flujo de caracteres de entrada directamente, sin un lexer distinto.
Lex y hacer
make es una utilidad que se puede utilizar para mantener programas relacionados con Lex. Make asume que un archivo que tiene la extensión .l
es un archivo de origen Lex. La macro interna make LFLAGS
se puede utilizar para especificar las opciones de Lex que se invocarán automáticamente por make. [8]
Ver también
- Analizador léxico flex
- Yacc
- Rabia
- PLY (Python Lex-Yacc)
- Comparación de generadores de analizadores sintácticos
Referencias
- ^ Levine, John R .; Mason, Tony; Brown, Doug (1992). lex y yacc (2 ed.). O'Reilly . págs. 1 –2. ISBN 1-56592-000-7.
- ^ Levine, John (agosto de 2009). flex & bison . O'Reilly Media. pag. 304. ISBN 978-0-596-15597-1.
- ^ Lesk, ME; Schmidt, E. "Lex - Un generador de analizador léxico" . Consultado el 16 de agosto de 2010 .
- ^ Lesk, ME; Schmidt, E. (21 de julio de 1975). "Lex: un generador de analizador léxico" (PDF) . SISTEMA DE TIEMPO COMPARTIDO DE UNIX: MANUAL DEL PROGRAMADOR DE UNIX, Séptima Edición, Volumen 2B . bell-labs.com . Consultado el 20 de diciembre de 2011 .
- ^ Lesk, ME (octubre de 1975). "Lex - un generador de analizador léxico". Comp. Sci. Tech. Rep. No. 39 . Murray Hill, Nueva Jersey: Bell Laboratories.
- ^ Especificaciones básicas de Open Group Issue 7, edición de 2018 § Shell y utilidades § Utilidades § lex
- ^ John R. Levine; John Mason; Doug Brown (1992). Lex y Yacc . O'Reilly.
- ^ "hacer" . Especificaciones de la base de grupo abierto . El IEEE y The Open Group (6). 2004. IEEE Std 1003.1, edición de 2004.
enlaces externos
- Usando Flex y Bison en Macworld.com
- - Manual de referencia de comandos de usuario de Solaris 10
- - Manual del programador de Plan 9 , Volumen 1