Generadores de Analizadores Léxicos

Share Embed Donate


Short Description

Download Generadores de Analizadores Léxicos...

Description

Generadores de analizadores léxicos.

Existen varias herramientas para el tratamiento masivo de la información contenida en ficheros de texto, que nos permiten traducir el lenguaje contenido en el código fuente a un lenguaje fácil de comprender para el próximo analizador: el sintáctico, todo estos análisis se van elaborando paso a paso dentro de la ‘línea’. Todas ellas se apoyan en las expresiones regulares para llevar a cabo su cometido, y permiten 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 alto nivel o bien mucho más complejas en cada ocurrencia de una expresión regular. El corazón del generador del analizador léxico es su algoritmo para producir una máquina de estados finitos El algoritmo que se presenta está basado en un método para generar un autómata finito determinístico (AFD) de estados mínimos. Los generadores de analizadores léxicos son:   Lex Código generado: C.



  Flex Código generado: C++.



  Zlex Código generado: C.



  Jax Código generado: Java. No soporta entornos, está basado en expresiones regulares. No soporta Unicode.



  Jlex Código generado: Java. Similar a lex.



Hablaremos de los analizadores más comúnmente empleados: Lex y Flex LEX. 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 asociar acciones 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ódigo asociado a esa regla. Lex va a permitirnos definir nuestras propias acciones en un lenguaje mucho más común: C. La plantilla en la que Lex se 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. Se compone de tres secciones con estructuras 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 obligato ria (aunque se encuentre vacía).

FLEX. Flex es una herramienta que traduce la especificación de un analizador léxico a un programa escrito en C que lo implementa. Para especificarlo usaremos expresiones regulares a las que se puede asociar acciones escritas en C.

Cada vez que el analizador encuentra en la cadena de entrada una secuencia que encaja en una de las expresiones regulares especificadas, ejecutará la acción que le hallamos asociado. fichero.l ---> FLEX ---> lex.yy.c lex.yy.c + (ficheros .c) ---> GCC ---> ejecutable Compilación: $flex fichero.l Compila la especificación del analizador y crea el fichero yy.lex.c con el código del autómata. $ gcc lex.yy.c -ll Enlaza con librería de Flex (proporciona yywrap() y main() por defecto) $ gcc lex.yy.c (ficheros .c) El usuario deberá de proporcinar sus propias main() e yywrap(). Dentro del código se deberá llamar a la función yylex() que tratará un TOKEN por cada llamada. Funcionamiento del analizador.

El fichero lex.yy.c contine las tablas de autómata generado y la función int yylex(void) que simula el analizador especificado y sirve de interfaz con el código de usuario (yylex() deberá de ser llamada en algún punto del código del usuario) En cada llamada, yylex() irá tomando caracteres de la entrada hasta que machee una de las expresiones regulares de la especificación. Entonces, se almacenará el texto que ha macheado la expr. reg. en la variable yytext y se ejecutarán las acciones asociadas al patrón.

Las acciones podrán ser simplemente el procesamiento del texto macheado y enviarlo de nuevo a la salida. En otras ocasiones podrán suponer la alteración de varíables del código de ususario y la devolución a la rutina que llama a yylex() de algún tipo de dato por medio de RETURN (generalmente será un valor numérico que identifique la TOKEN encontrado).

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF