12 La herramienta LEX

Documentos relacionados
Generador de analizadores léxicos FLEX

FLEX: A FAST LEXICAL ANALYZER GENERATOR

1. Funcionamiento de lex

FLEX: A FAST LEXICAL ANALYZER GENERATOR

Teoría de Autómatas y Lenguajes Formales, IS17 Ingeniería Técnica en Informática de Sistemas. Práctica 1: Introducción al Analizador Léxico FLEX

PROCESADORES DE LENGUAJES

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Unidad III Análisis Léxico. M.C. Juan Carlos Olivares Rojas

Construcción de un analizador léxico para ALFA con Flex. Construcción de un analizador léxico para ALFA con Flex. Índice (I)

Práctica No. 4 Programas en Lex

Seminario de introducción a Flex

ANÁLISIS LÉXICO EXPRESIONES REGULARES

Lex (flex,... ) Generación de analizador léxico p.1

ANÁLISIS LÉXICO Ing. Ronald Rentería Ayquipa

Funcionamiento del A.L.

Qué es Lex? Busca concordancias de un conjunto de expresiones regulares y un archivo de entrada y ejecuta acciones asociadas.

Prácticas de Lenguajes, Gramáticas y Autómatas

Lex. Lex. Ing. Adrian Ulises Mercado Martínez. Enero 30, Ing. Adrian Ulises Mercado Martínez Lex Enero 30, / 27

Construcción de un analizador léxico para ASPLE con Lex/Flex. Construcción de un analizador léxico para ASPLE con Lex/Flex

Analizador Léxico. Programación II Margarita Álvarez. Analizador Léxico - Funciones

Yacc/Bison. Introducción

Bison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

8- LEX-Expresiones regulares

Objetivos Que el estudiante logre conocer, comprender y manejar conceptos y técnicas vinculados con el Analizador Léxico, para lo cual debe:

Datos Elementales y formato de un programa en Java

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS LÉXICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

roducción a la programación con el lenguaje C usando el entorno de trabajo Dev-C. Nociones básicas de programación

Elementos de un programa en C

PRÁCTICAS DE PROCESADORES DEL LENGUAJE CURSO 2008/2009

UNIVERSIDAD NACIONAL DE JUJUY FACULTAD DE INGENIERÍA APUNTES DE CÁTEDRA EL METACOMPILADOR FLEX

Construcción de una calculadora con Lex/Flex y Yacc/Bison

Introducción a la Programación

Clase 06: Definiciones regulares

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO JFLEX LENGUAJES FORMALES Y AUTÓMATAS CURSO 2005/2006

Lenguajes y Compiladores Análisis Léxico

MANEJO DE EXPRESIONES REGULARES

Definición Es una directiva using que ayuda al compilador a localizar una clase que se usa en la aplicación.

DESARROLLO DE LA PRÁCTICA DE ANÁLISIS SINTÁCTICO

Teoría de la Computación

Compiladores e Intérpretes Análisis Léxico

Objetivo N 2. Conocer la Estructura General de un Programa en C++ Estructura de Datos Prof. Egilde Márquez

Tema: Autómatas de Estado Finitos

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

PROGRAMACIÓN EN LENGUAJE C VARIABLES Y CONSTANTES

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Programación. Test Autoevaluación Tema 3

Analizador De léxico. V A R i : I N T E G E R ; \n...

Práctica 3 Introducción al Manejo de Bison

YACC. Los símbolos terminales que la gramática empleará. El axioma o símbolo inicial de la gramática. %token. %start

Informática Ingeniería en Electrónica y Automática Industrial

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Fundamentos de Informática 4. Primeros Programas, Primeros Diseños

Programación I Teoría I.

Tema 05: Elementos de un programa en C

Fundamentos de Programación 2017-I

Seminario de introducción a Bison

Tipos de Datos en C. Palabras reservadas en C

Curso de Java Introducción a la Programación I

Curso de Programación Avanzada en C

Conceptos Básicos. Programación

UNIVERSIDAD NACIONAL DE JUJUY FACULTAD DE INGENIERÍA APUNTES DE CÁTEDRA EL METACOMPILADOR BISON INTERFAZ FLEX - BISON

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

Una función es un miniprograma dentro de un programa. Las funciones contienen varias

Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:

Procesadores de lenguaje Tema 2: Análisis léxico

Tema 2: Análisis léxico

SSL Guia de Ejercicios

Práctica 2. Desarrollo de programas. Entrada y salida estándar en C.

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

ESPECIFICACIÓN DE SÍMBOLOS

08 Análisis léxico IV

Tipos de variables. Lenguaje C. Departamento de Electrónica. Tipos de datos, variables y constantes. Fundación San Valero

Procesadores de lenguajes Ingeniería Informática Especialidad de Computación Tercer curso, segundo cuatrimestre

Introducción a c++ Introducción a la programación EIS Informática III

INTRODUCCIÓN AL LENGUAJE C

Recopilación de ejercicios sobre expresiones regulares en exámenes de Compiladores e intérpretes

PROCESADORES DE LENGUAJE. Hoja de ejercicios de FLEX

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

CAPITULO 2: LENGUAJES

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

El proceso del Análisis Léxico

DIAGRAMAS DE TRANSICIONES

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior. Trabajo Final

Procesadores de lenguaje Tema 2 Análisis léxico

Transcripción:

2 Contenido La herramienta Lex Esquema de un fuente en Lex Zona de definiciones Zona de reglas Zona de rutinas del usuario Archivo de salida (lex.yy.c) Copilar un fuente de Lex Opciones estándar Depuración de un fuente de Lex Prueba rápida de un fuente Expresiones regulares en Lex Caracteres Clases de caracteres Reconocer cualquier caracter Unión Clausuras Repetición acotada Opción Paréntesis

3 La herramienta Lex Lex 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 en esencia, expresiones regulares a las que se puede asociar acciones escritas en C. Cada vez que el analizador encuentra en la cadena de entrada un prefijo que encaja con una de las expresiones regulares especificadas, ejecutará la acción que le hallamos asociado.

4 La herramienta Lex El principal problema que se le suele achacar a Lex es el hecho de que genera programas poco eficientes, por lo que su aplicación en entornos de producción industrial se ve claramente menguada. En la actualidad, se ha desarrollado una versión que genera un código final más eficiente, pero mantiene una completa compatibilidad con la herramienta original. Se trata de Flex, un producto GNU de dominio publico del que existen versiones para UNIX y MS-DOS.

5 Esquema de un fuente en Lex Un fuente en Lex se divide en las zonas que se muestra a continuación: (zona de definiciones) %% (zona de reglas y acciones) %% (zona de rutinas de usuario) El símbolo %% actúa como separador de las tres secciones. Las dos primeras son obligatorias, aunque pueden aparecer vacías, y la tercera es opcional, de forma que en caso de omitirse no es necesario añadir el segundo separador %%.

6 Esquema de un fuente en Lex El fuente Lex mas pequeño es el siguiente: %% No incluye ninguna regla y tan solo reconoce el lenguaje formado por la palabra vacía.

7 Zona de definiciones En esta sección se debe de incluir todo el código C necesario para expresar las acciones asociadas a las expresiones regulares, se definen macros y también se definen entornos de reconocimiento. %%{ /*Un ejemplo en lex*/ int y = 0; char *f(int *); /*Una variable*/ /*Un prototipo*/ #include <stdio.h> %%} digito(0 1 2 3 4 5 6 7 8 9) letra(a b c d e f g h i j k l m n o p q r s t u v w x y z) identificador {letra}({letra} {digito})*

8 Zona de definiciones La porción de texto entre los simbolos %%{ y }%% se considera que es código C, pero Lex no lo tiene en cuenta. Lo copia íntegramente en el archivo de salida, por lo que si cometemos algún error en esta zona tan solo se detectara al compilar el archivo resultado producido por Lex. Las macros se definen usando el siguiente formato: (nombre) (expresión regular) digito se considera como un nombre de macro equivalente a la expresión regular (0 1 2 3 4 5 6 7 8 9). Para usarlas es necesario encerrar sus nombres entre llaves, como se muestra en el caso de la definición de identificador. Un error seria definirla de la siguiente manera: identificador letra(letra digito)*

9 Zona de reglas Esta sección tiene el siguiente formato: 1ª columna 2ª columna (exp_reg1) (exp_regn) (Código C) (acción1) (acciónn) Cada línea de la forma: (exp_reg1) (acción1) Recibe el nombre de regla, y es importante escribir la expresión regular en la primera columna.

10 Zona de rutinas del usuario En esta zona se puede escribir código C adicional necesario para la especificación de analizador. En la práctica, casi no se introduce ya que dificulta enormemente la depuración y la modificación del analizador léxico.

11 Archivo de salida (lex.yy.c) El archivo que Lex produce al compilar un fuente tiene la siguiente estructura: (prototipos) (código global) int yylex(void) { (código local) (simulación del autómata) } (rutinas del usuario) (tablas de transición del AFD)

12 Archivo de salida (lex.yy.c) yylex()es el nombre de la rutina que simula el analizador léxico especificado. Su prototipo estándar es el que se ha indicado y además no se puede cambiar. La zona de código global es en la que Lex coloca todo el código C que se ha escrito en la zona de definiciones del fuente y la de los código local es en la que copia el código que se escribe al comienzo de la sección de reglas sin asociarlo a ninguna expresión regular. Por lo tanto, este código se ejecuta cada vez que se llama a la rutina yylex() para analizar un lexema de la entrada.

13 Compilar un fuente de Lex El fuente de Lex deberá guardarse (generalmente con extención.l ) Una vez guardado utilizar el comando para compilarlo: User@Path: lex fuente.l Si el fuente contiene errores se mostrarán en la salida estándar de error. En el caso de no haber error, se producirá un archivo de nombre lex.yy.c con la estructura antes mencionada. Este archivo de salida se puede compilar usando cualquier compilador ANSI C, y lo normal es introducir el código objeto resultado en un archivo de biblioteca para su uso posterior.

14 Opciones estándar Las opciones más habituales de esta herramienta son: -t, para que Lex produzca su resultado en la salida estándar en vez de en el fichero lex.yy.c.es util cuando la herramienta se utiliza en conjunción con otras. -v, instruye a Lex para que muestre en la salida estandar cierta información acerca del número de estados que tiene el autómata que ha generado, el número de transiciones, etcétera. -f, realiza un proceso de compilación rápida. Generalmente no optimiza el código resultado, ni minimiza el autómata que genera al usar esta opción.

15 Depuración de un fuente de Lex Lex incluye en el código que genera alguna ayuda para la depuración. Para conseguirla es necesario definir la macro LEXDEBUG en la zona de código C global. Al hacerlo, Lex genera un código que al ejecutarse nos da información detallada sobre el estado en que se encuentra el autómata, la transición que se va ha realizar y más.

16 Prueba rápida de un fuente Una forma de probar rápidamente el resultado de compilar un fuente Lex, es utilizando la biblioteca estándar libl.a. Esta contiene, entre otras cosas, la función: int main (void) { while(yylex()) ; return 0; } De esta forma el comando:cc -ll lex.yy.c Compila el archivo lex.yy.c enlazándolo con la biblioteca libbl.a con lo que el resultado es un ejecutable que invoca al analizador léxico en repetidas ocasiones hasta que se detecte el final de la cadena de entrada. La función yyley() devuelve el valor de 0 y termina la ejecución de la rutina main().

17 Expresiones regulares en Lex En Lex todas las expresiones regulares que escribamos definen lenguajes sobre el juego completo de caracteres que use nuestro equipo (ASCCI, EBCDIC, CDC, ). Caracteres Cualquier carácter que no sea un operador se considera en Lex una expresión regular cuyo lenguaje asociado es { }. Los caracteres que tienen un significado especial y se consideran operadores son todos los siguientes: " [ ] ^ -?. * + ( ) $ / { } % < >

18 Expresiones regulares en Lex (Caracteres) Si se necesita usar alguno de estos operadores sin su significado especial y utilizarlos como cualquier otro carácter es necesario precederlos de una diagonal invertida o escribirlo entre comillas. \$ \" "[" Las comillas también se pueden usar para encerrar cadenas largas de caracteres. "[ser ^ ser]"

19 Expresiones regulares en Lex (Caracteres) Lex reconoce las siguientes secuencias de escape estándar: \a para hacer sonar el altavoz \b para hacer retroceder el cursor un carácter hacia atrás \f para provocar un avance de página en la impresora y un borrado de pantalla \n para avanzar a la siguiente línea de texto \t para avanzar hacia la siguiente posición de tabulación horizontal. \v para avanzar hacia la siguiente posición de tabulación vertical. *Algunas implementaciones de la herramienta no reconocen ciertas secuencias de escape.

20 Expresiones regulares en Lex Clases de caracteres Una clase elemental (positiva) de caracteres es la expresión regular [ab..c]. [a-b], esta expresión regular describe el lenguaje formado por todos los caracteres que se encuentran entre a y b. [a-za-z], describe el lenguaje formado por cualquier letra mayúscula o minúscula. Pero depende del juego de caracteres que utilice el equipo, ya que si en medio de a y z ó A y Z existe algún otro carácter este también será reconocido por la clase. Las clases negativas tienen la siguiente forma [^ab..c], y describen el lenguaje formado por cualquier carácter que no sea ninguno de los indicados. [^0-9], Valida cualquier carácter que no sea un digito.

21 Expresiones regulares en Lex (Clases de caracteres) Dentro de las clase pierden su característica especial de operador los siguientes caracteres, por lo que no es necesario precederlos de la diagonal invertida o escribirlos entre comillas.?. * + ( ) $ / { } % < >

22 Como reconocer cualquier carácter En muchas ocasiones es necesario reconocer cualquier carácter. Para ello su utiliza la expresión regular:. Que describe el lenguaje M { \ n }, ie. cualquier carácter del juego del equipo salvo el retorno de carro. a. reconoce las cadenas {aa,ab,ac, } a.* reconoce cualquier cadena que empiece por la letra a y no contenga retorno de carro. a.b reconoce cualquier cadena de tres caracteres que empieze por la letra a y termine con una b.. \n reconoce cualquier carácter del alfabeto M.

23 Unión El operador unión se representa utilizando una barra vertical. La única nota de interés es que el reconocedor sintáctico que genera Lex intenta validar siempre el lexema más largo que pertenezca al lenguaje de las expresiones regulares que combinemos mediante este operador. a abc Ante una cadena abcdef podría validar tanto el prefijo ab como abc, pero Lex resuelve la ambigüedad validando siempre el más largo que sea posible. En este caso abc.

24 Clausuras Lex ofrece la posibilidad de utilizar dos formas de clausura: la de Kleene, que se denota usando el símbolo *, y la positiva se denota utilizando el signo +. [0-9]+ denota literales naturales. [0-z][a-z0-9]* denota identificadores que empiezan por una letra minúscula y continúan con cero, una o más letras minúsculas y digitos. [0-9]+ "." [0-9]+ denota literales reales en notación de coma fija.

25 Repetición acotada Lex soporta la posibilidad de utilizar expresiones regulares que denotan la repetición de un cierto elemento un número exacto de veces. La nomenclatura que utiliza es la siguiente: (exp_reg{n,m}) Esta expresión denota el lenguaje de aquellas palabras que encajan en la expresión exp_reg y están concatenadas unas con otras entre n y m veces. a(b{3,3})denota el lenguaje {abbb} a(b{1,3})denota el lenguaje {ab,abb,abbb} [a-z]([a-z]{0,32})denota el lenguaje formado por las palabras minúsculas que tienen entre 1 y 33 caracteres.

26 Opción Lex también proporciona el operador de opción, que se denota utilizando el signo?. exp_reg? Esta expresión denota el lenguaje formado por la unión de la palabra vacía y el lenguaje descrito por la expresión regular sobre la que actúa. Por lo tanto, podríamos ver este operador como uno que reconoce 0 ó 1 apariciones de las cadenas que encajan en la exp_reg. P.g. dadas las macros: lit_nat ([0-9]+) exp([ee]) sig ([+]) La expresión regular {sig}?{lit_nat}("."{lit_nat})?({exp}{sig}?{lit_nat})? Reconoce números reales y enteros con signo escritos en coma fija o natción infija.

27 Paréntesis Como se sabe los paréntesis nos ayudan a cambiar la prioridad por defecto de los operadores y a agrupar expresiones para que resulten más fáciles de leer.