1. Funcionamiento de lex

Documentos relacionados
Generador de analizadores léxicos FLEX

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

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

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

GUÍA BÁSICA DE FLEX Y BISON

Teoría de Autómatas y Lenguajes Formales LEX BISON Dr. Eric Jeltsch F. Introducción para los laboratorios y actividades relacionadas.

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

Flex a la rápida. José Ignacio Medina

FLEX: Un generador de analizadores léxicos. AT&T Lex (más común en UNIX) MKS Lex (MS-Dos) Flex Abraxas Lex Posix Lex ScanGen JLex...

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

media = ( temp0 + temp1 + temp2 + temp3 + temp temp23 ) / 24; printf( "\nla temperatura media es %f\n", media );

Generador de analizadores sintácticos BISON

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

Una Herramienta para el Análisis Léxico: Lex

MIA RICARDO GONZALEZ LOZANO APLICACIONES EN LENGUAJE C

Arrays unidimensionales. Dim.Option Base. Erase. Ejemplos en Visual Basic (CU00311A)

La última versión disponible cuando se redactó este manual era la 5 Beta (versión ), y sobre ella versa este manual.

Estructuras de Datos Declaraciones Tipos de Datos

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

ANALIZADOR LEXICO LEX

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

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

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Elementos de un programa en C

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

Fundamentos de Ordenadores. Depurar programas usando Nemiver

JLex. JLex. Instalación JLex. Generación y Ejecución del Analizador Léxico. Lex en Java

8.1. Introdución. %% [b\ t]+ $ ;

En esta lección vamos a ver más utilidades y opciones sobre la

INICIACIÓN A LA PROGRAMACIÓN EN C

Programación. Test Autoevaluación Tema 3

Fundamentos de programación

FUNCIONES PHP: DECLARACIÓN Y LLAMADAS. PARÁMETROS, RETURN. EJERCICIOS EJEMPLOS RESUELTOS. (CU00827B)

Aspectos de los LP. Diseño de compiladores. Estático vs. Dinámico. Estático vs. Dinámico. Scope. Scope 24/03/2015

Instituto Tecnológico de Celaya

Depurar programas

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

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

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

Preliminares. Tipos de variables y Expresiones

Fundamentos de Programación 2017-I

Universidad Nacional del Santa FACULTAD DE INGENIERIA E.A.P. Ingeniería de Sistemas e Informática NETBEANS 7.0 MI PRIMER PROYECTO

Unidad 2. Elementos de Word2007 (I)

PROPIEDADES DE LOS CAMPOS. Cada campo de una tabla dispone de una serie de características que proporcionan un control

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Funciones básicas del depurador

Microsoft Office Word

MANEJO DE EXPRESIONES REGULARES

SENA Distrito Capital Centro de Electricidad, Electrónica y Telecomunicaciones ADSI - Ing. Espec. Javier Vaquiro

Procesadores de lenguaje Tema 6 La tabla de símbolos

Programación estructurada (Introducción a lenguaje C)

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Visual Basic y.net: Procedimientos Sub y funciones Function. Parámetros. Organizar programas en módulos. (CU00338A)

Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase al mismo tiempo que se declara.

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

Programación En Lenguaje C

Estructuras de Control

ESCUELA DE INFORMÁTICA

El lenguaje C. 3. Una instrucción que se ejecutará si la condición es verdadera.

5. Sentencias selectivas o condicionales

La funcionalidad de carga automática de órdenes estará habilitada únicamente para usuarios con perfil Operador (perfil "A").

Práctica 4 Manejo Avanzado de Bison

Arreglos. Otra definición seria;

UNIVERSIDAD DEL ISTMO Ingeniería en computación Compiladores. Construcción de un sencillo analizador léxico.

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

PHP: Lenguaje de programación

Tema 3. Aplicaciones de Tipo Consola

Estructuras de control

3. DOCUMENTACIÓN 3.1. DOCUMENTACIÓN DE APLICACIONES. OBJETIVOS PARA MODIFICAR HACE FALTA COMPRENDER/ESTUDIAR:

MODELOS DE COMPUTACION I Preguntas Tipo Test. 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular.

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Funciones como Subprogramas en C++

Paso 1: Autómata. A 1 sin estados inútiles, que reconoce el lenguaje denotado por a a* b*

Escribir la expresión regular de un número entero que no acepte que el primer dígito sea cero salvo el número 0. Solución: 0 [1-9][0-9]*

FUNCIONES Y FÓRMULAS FUNCIONES

FUNCIONES EN EXCEL III

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

Principios de Computadoras II

El lenguaje C. 1. Estructuras. Principios de Programación Definicion de estructuras

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 4: Diseñador de Consultas (+ info)

Documentación Técnica: 1er Proyecto

Procesos e Hilos en C

Lenguajes de programación LPSI EUI UPM CADENAS DE CARACTERES

10.1. PRIMITIVAS 79. Si variable es una lista, investiga dentro de esta lista; hay dos casos posibles:

Tema: Clases y Objetos en C#. Parte II.

Ejercicio corto. Ejercicio corto. Ejercicio corto. Lección 1: Introducción a Word. Lección 2: Modificaciones de documentos

Cómo configurar formatos Wiegand personalizados

QUÉ ES UNA CLASE JAVA? ATRIBUTOS (PROPIEDADES O CAMPOS), CONSTRUCTOR Y MÉTODOS. (CU00623B)

GUÍA DE ESTILO EN JAVA

Transcripción:

El generador de analizadores léxicos lex. Teoría de Autómatas y lenguajes formales Federico Simmross Wattenberg (fedesim@infor.uva.es) Universidad de Valladolid Una vez visto cómo las expresiones regulares pueden ser muy útiles a la hora de reconocer patrones en un fichero de texto, y de utilizarlas para desencadenar ciertas acciones en respuesta, vamos a estudiar una herramienta que permite crear programas autónomos que analizan léxicamente la entrada y la procesan a nuestro antojo: el generador de analizadores léxicos lex. Lex genera código fuente en C, a partir de una serie de especificaciones escritas en lenguaje Lex. El código C generado contiene una función llamada yylex(), que localiza cadenas en la entrada (lexemas) que se ajusten a uno de los patrones léxicos especificados en el código fuente Lex, realizando entonces las acciones asociadas a dicho patrón. yylex() puede llevar a cabo cualquier tipo de acciones ante un determinado patrón y, en particular, puede comportarse como un analizador léxico. 1. Funcionamiento de lex Al contrario que sed y awk, lex no es un analizador sino un generador de analizadores. Esto permite incluir de manera cómoda un analizador a medida en cualquier programa: Programa fuente en Podemos Lex (.l) Compilador de Lex (lex, flex) lex.yy.c lex.yy.c Compilador de C gcc l gcc -lfl a.out Fichero de entrada a.out Acciones

2. El lenguaje Lex 2.1. Esquema general Un programa fuente de Lex tiene el siguiente aspecto: <sección de definiciones> <sección de reglas> <sección de rutinas> De estas tres secciones, sólo la segunda es obligatoria, y cualquiera de ellas puede estar vacía. Esto quiere decir que el mínimo programa en lex es: La sección de declaraciones incluye declaraciones de variables, constantes y definiciones regulares, que constituyen una manera cómoda de utilizar expresiones regulares largas en la sección de reglas; por ejemplo: letra [A-Za-z] La sección de reglas especifica los patrones a reconocer y las acciones asociadas a éstos, de forma similar a la que utiliza awk: patrón {acciones en C} La sección de rutinas permite definir funciones auxiliares en C, incluida la función main(). Por defecto, lex proporciona un main() que simplemente llama a la función yylex(). El comportamiento del programa generado (por defecto a.out, si no se le indica otra cosa al compilador de C) es el siguiente: Imprimir en la salida estándar los lexemas que no se adapten a ningún patrón. Realizar la acción indicada para los lexemas que se ajustan a un patrón.

Por lo tanto, si compilamos y ejecutamos el programa mínimo en lex, que consta únicamente de una sección de reglas vacía (), veremos que se limita a copiar literalmente la entrada estándar en la salida estándar. 2.2. Sección de reglas A primera vista, una regla de lex tiene el mismo aspecto que una sentencia patrón-acción de awk. Su estructura es: patrón_regular acción_en_c El patrón regular debe estar situado en la primera posición de la línea; es decir, que no puede haber espacios antes del patrón regular. Lex admite todas las expresiones regulares de egrep, con alguna extensión más (véase la página man). El patrón y la acción se separan por un blanco o un tabulador (o más). La acción puede ser una sola sentencia de C, o una sentencia compuesta, encerrada entre llaves {}. Cuando hay más de un patrón regular que puede adaptarse a la entrada, lex tomará la cadena más larga posible que pueda adaptarse a un patrón. Si aún así hay más de un patrón que se adapta a la entrada, lex ejecutará la acción de la regla que antes aparezca en el fuente lex. Lex almacena el lexema encontrado en un array de tipo char llamado yytext, y su longitud en la variable yyleng. La acción especial ECHO copia el lexema reconocido en la salida estándar. Es un sinónimo de printf("%s",yytext); La acción especial (barra vertical) indica que para este patrón debe ejecutarse la acción correspondiente al patrón inmediatamente inferior. Todo programa lex incorpora automáticamente la siguiente línea como última regla:. \n ECHO; equivalente a estas dos reglas separadas:. \n ECHO; De manera que todos los lexemas que no encajan con ningún otro patrón, se copian en la salida estándar. Se puede evitar este comportamiento especificando reglas para. y para \n.

2.3. Código C en un programa lex Muchas veces es útil poder incluir código en C dentro de un programa en lex, para apoyar el trabajo del analizador. Suele ser normal, por ejemplo, declarar una estructura de datos que contenga detalles sobre cada lexema encontrado o incluir nuestra propia función main(). Puede insertarse código C en un fuente Lex en varias partes: En la sección de declaraciones, entre una línea %{ y una línea %} (nótese que no es }%). Este código será externo y se situará antes de la función yylex() en el programa lex.yy.c. En la sección de declaraciones, cualquier línea que comience por un espacio en blanco se considerará código C y será también externo y anterior a yylex(). En la sección de reglas, y antes de que empiece la primera regla, toda línea que comience por un espacio en blanco se considerará código C que será interno a la función yylex(). Normalmente no es necesario incluir código C de esta manera. En la sección de reglas, las acciones en C de cada regla serán parte del código de yylex(). Toda la sección de rutinas es código C, externo y posterior a la función yylex(). Puede utilizarse para cualquier cosa, pero en particular, puede usarse para definir una función main() distinta a la que se genera por defecto. 3. Ejemplos Sustituir las palabras el y la, los y las por la palabra ARTICULO. el la los las printf ("ARTICULO"); ó el la los las printf ("ARTICULO");

Lo mismo, pero sin afectar a palabras como lanza : [Ll][oa]s? printf ("articulo"); [A-Za-z]+ ECHO; Pasar a mayúsculas los artículos determinados: [Ll][ao]s? { int i; for (i=0;i<yyleng;i++) printf ("%c",toupper(yytext[i])); } Contar el número de artículos determinados: %{ /* Cuenta el número de artículos determinados */ int num=0; %} [Ll][oa]s? num++ ; [A-Za-z]+ ;. \n ; main(){ yylex(); printf ("Número de artículos: %d\n", num); } 4. Ejercicios 1- Compilar el programa mínimo lex () y examinar el contenido del lex.yy.c generado. 2- Quitar los comentarios del fichero findip.c 3- Mostrar los comentarios del fichero findip.c (sólo los comentarios). 4- Quitar las palabras que consten de 3 letras o menos. 5- Construir un programa que imite al comando wc (contar los caracteres, palabras y líneas de un fichero).