Manual de lex
Alejandro Viloria Lanero ( aviloria@infor.uva.es ) Teoría de Autómatas y Lenguajes Formales Universidad de Valladolid
Como hemos ido viendo, el shell de los sistemas UNIX/Linux nos ofrece varias herramientas para el tratamiento masivo de la información contenida en ficheros de texto, que nos permiten hacer búsquedas, reemplazos y múltiplesprocesamientos de más alto nivel a un nivel de ‘campo’ dentro de la ‘línea’. Todas ellas se apoyaban en las expresiones regulares para llevar a cabo su cometido, y permitían encadenar su salida a modo de tubería con otras herramientas, para que de esta forma se aumentase su potencia de procesamiento. Pero a menudo todo esto no es suficiente. En ocasiones se requiere poder realizar acciones de más altonivel o bien mucho más complejas en cada ocurrencia de una expresión regular. Lex va a permitirnos definir nuestras propias acciones en un lenguaje mucho más común: C.
Introducción
Lex es una herramienta de los sistemas UNIX/Linux que nos va a permitir generar código C que luego podremos compilar y enlazar con nuestro programa. La principal característica de Lex es que nos va a permitir asociaracciones descritas en C, a la localización de las Expresiones Regulares que le hayamos definido. Para ello Lex se apoya en una plantilla que recibe como parámetro, y que deberemos diseñar con cuidado. Internamente Lex va a actuar como un autómata que localizará las expresiones regulares que le describamos, y una vez reconocida la cadena representada por dicha expresión regular, ejecutará el códigoasociado a esa regla. Externamente podemos ver a Lex como una caja negra con la siguiente estructura:
plantilla.l Lex yy.lex.c a.out (fich. Ejecutable)
Compilador + Enlazador (cc)
Otros módulos de nuestro programa
En las siguientes secciones veremos todo lo correspondiente a la descripción de la plantilla, y el proceso de compilación.
La plantilla de Lex
La plantilla en la que Lexse va a apoyar para generar el código C, y donde nosotros deberemos describir toda la funcionalidad requerida, va a ser un fichero de texto plano con una estructura bien definida, donde iremos describiendo las expresiones regulares y las acciones asociadas a ella. La estructura de la plantilla es la siguiente:
Declaraciones %% Reglas %% Procedimientos de Usuario
Se compone de tres secciones conestructuras distintas y claramente delimitadas por una línea en la que lo único que aparece es el carácter doble %. Las secciones de ‘Declaraciones’ y la de ‘Procedimientos de Usuario’ son opcionales, mientras que la de ‘Reglas’ es obligatoria (aunque se encuentre vacía), con lo que tenemos que la plantilla más pequeña que podemos definir es:
%%
Esta plantilla, introducida en Lex, generaríaun programa C donde el contenido de la entrada estándar sería copiado en la salida estándar por la aplicación de las reglas y acciones por defecto. El formato de cada una de las secciones lo discutiremos en los apartados siguientes. Lex va a actuar como un pre-procesador que va a trasformar las definiciones de esta plantilla en un fichero de código C.
La Sección de Declaraciones
En la secciónde Declaraciones podemos encontrarnos con 3 tipos de declaraciones bien diferenciados: - Un bloque donde le indicaremos al pre-procesador que lo que estamos definiendo queremos que aparezca ‘tal cual’ en el fichero C generado. Es un bloque de copia delimitado por las secuencias ‘%{‘ y ‘%}’ donde podemos indicar la inclusión de los ficheros de cabecera necesarios, o la declaración de variablesglobales, o declaraciones procedimientos descritos en la sección de Procedimientos de Usuario:
%{ /* Este bloque aparecerá tal cual en el fichero yy.lex.c */ #include #include #define VALUE 33
int nl, np, nw %}
-
Un bloque de definición de ‘alias’, donde ‘pondremos nombre’ a algunas de las expresiones regulares utilizadas. En este bloque, aparecerá AL COMIENZO DE LA LÍNEA el nombre con...
Regístrate para leer el documento completo.