Seminario de introducción a Flex

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

Generador de analizadores léxicos FLEX

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

1. Funcionamiento de lex

PROCESADORES DE LENGUAJES

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

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

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

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

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...

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

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

Compiladores: Análisis Léxico. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V.

Flex a la rápida. José Ignacio Medina

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

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

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

12 La herramienta LEX

Práctica 3 Introducción al Manejo de Bison

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

Tema 2: Análisis léxico

10 Introducción a BISON/YACC

GUÍA BÁSICA DE FLEX Y BISON

Yacc/Bison. Índice. Construcción del programa objetivo Flujo de control de las funciones yylex() e yyparse()

Teoría de la Computación

Tema: Análisis Léxico

Elementos de un programa en C

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

Introducción a Flex y Bison

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

16 Análisis sintáctico I

PROCESADORES DE LENGUAJE. Hoja de ejercicios de FLEX

Tema 5 Tabla de Símbolos

Tema 2. Análisis lexicográfico

YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator

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

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

Compiladores e intérpretes Análisis Léxico I. Análisis Léxico I

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

Tema 2 Introducción a la Programación en C.

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

Introducción a los generadores de analizadores léxicos y sintácticos FLEX y BISON: Implementación de una pequeña calculadora

Análisis semántico. Análisis semántico. Índice (I)

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Diseño de Compiladores I. Estructura General de un Compilador

HERRAMIENTAS YACC Y BISON

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

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Tema: Autómatas de Estado Finitos

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

Tema 2. Concepto de Algoritmo

Procesadores de lenguaje Tema 1 Introducción a los compiladores

TEORÍA. definition TAG. PROPERTIES ID expr EXTENDS ID FIN_TAG. DELAYED : expr

Software para la Enseñanza de las Fases de Análisis Léxico y Análisis Sintáctico en Procesadores de Lenguajes

Flex, versión 2.5. Un generador de analizadores léxicos rápidos. Edición 2.5, Abril Vern Paxson

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Programación Avanzada

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

Expresiones Regulares

PROGRAMA DE LABORATORIO SECCIÓN: ÁREA A LA QUE PERTENECE: POS-REQUISITO: AUXILIAR:

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

Las Etapas de la Compilación

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

18 Análisis sintáctico III Compiladores - Profr. Edgardo Adrián Franco Martínez. Clasificación de métodos de análisis sintáctico Análisis descendente

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014

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

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

7.3. Estructura de un programa

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

Generador de analizadores sintácticos BISON

Introducción al Diseño de Compiladores. Año

Curso de Programación Avanzada en C

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

PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4

SSL Guia de Ejercicios

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

TEORÍA. N T f n h g $ S S P f C n S S P f C n S S C h P n S S C h P n S S P P f P n f P

El proceso del Análisis Léxico

ANALIZADOR LEXICO LEX

Funciones Definición de función

Conceptos básicos sobre gramáticas

Hoja técnica sobre yacc 1 y lex 2. Introducción. lex PL, 2014/2015 1

Principios de Computadoras II

Unidad 2. Introducción Lenguajes y Compiladores

Tema 5. Análisis sintáctico ascendente

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

2.1 METODOLOGÍA PARA LA SOLUCIÓN DE PROBLEMAS

Es un lenguaje estructurado, tiene una abundante cantidad de operadores y tipos de datos.

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

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

Práctica 2. TIPOS DE DATOS SIMPLES

Transcripción:

Seminario de introducción a Flex David Portolés Rodríguez dporto@unizar.es Lenguajes y Sistemas Informáticos Dpto. de Informática e Ing. de Sistemas Universidad de Zaragoza

Qué es Flex? Flex es un una herramienta que permite generar analizadores léxicos. A partir de un conjunto de expresiones regulares (patrones léxicos), Flex busca concordancias en un fichero de entrada y ejecuta acciones asociadas a estas expresiones. Expr1 => Acción1 Expr2 => Acción2 Entrada Flex Tokens + acciones 2

Tokens, lexemas y patrones léxicos (1) Token: cada uno de los elementos reconocidos por el analizador léxico Lexema: secuencia de caracteres de la entrada que corresponden a un token Patrón léxico: forma compacta de describir conjuntos de lexemas 3

Tokens, lexemas y patrones léxicos (2) Token 1:1 patrón Token 1:N lexemas Los tokens se pasan como valores simples Pero algunos requieren algo más de información: Ej: para una constante, habitualmente no sólo se necesita saber que es una constante sino también cuál es su valor 4

Expresiones regulares Definición formal de los lexemas que corresponden a un token Permitirá decidir cuándo se reconoce un token a partir de una secuencia de elementos de la entrada Se pueden bautizar para poder referenciarlas posteriormente 5

Expresiones regulares en Flex 6

Ejemplos de expresiones regulares en Flex Dígito => 0 1 2 3 4 5 6 7 8 9 Dígito => [0-9] Número entero: [0-9]+ Número entero: {Dígito}+ Número real sin signo: {Dígito}+. {Dígito}* Identificador => [a-za-z][_a-za-z]* DNI => [0-9]{8} - [A-Z] Tfno. fijo/móvil nacional => [69][0-9]{8} Teléfono => (6[0-9]{8}) (9[0-9]{8}) Palabras que empiezan por efe: [ff][a-za-z]* Líneas que NO empiezan por efe: ^[^ff].* Literal and exacto: and Palabra and : [aa][nn][dd] 7

Proceso de compilación -L/opt/flex/lib -lfl (Merlin) 8

Compilación con Makefile 9

Estructura de un fichero Flex Trespartesseparadaspor%% Sección de definiciones %% Sección de reglas %% Sección de código de usuario 10

Sección de definiciones Se incluye código C para declarar variables, funciones, tipos enumerados, include's, etc que se vayan a necesitar. Se copia exactamente en lex.yy.c Va entre %{ %} Se bautizan las E.R. Se pueden establecer condiciones iniciales del analizador léxico que se está construyendo Típicamente contiene una declaración de tipos enumerados para los posibles tokens O mejor aún, un #include a un fichero que lo contenga 11

Sección de reglas Tiene el formato: patrón1 { acción1 } patrón2 { acción2 }... Los patrones son E.R. y la acción es código C Dos tipos de líneas: Fuente C: empiezan por blanco %{ %} Patrón-acción: empiezan por otra cosa El Fuente C se copia literalmente en lex.yy.c Si hay concordancia con el patrón se ejecuta la acción asociada Si hay varios patrones coincidentes se decide cuál corresponde y se ejecuta la acción Si no hay concordancia, ejecuta ECHO (copia el lexema en la salida) 12

Consejos para la sección de reglas de Flex En la definición de patrones: Usar [] para conjuntos de caracteres Usar () para agrupar. Por ej, es típico que vayan seguidos de * Usar {} para utilizar los bautizos de la primera sección Cuidadocon: Comentarios de C Caracteres especiales:. *? % [ etc Espacios en blanco y tabuladores a principio de línea 13

Sección de código de usuario Código C creadas por necesidad del programador Flex Se copian literalmente en el lex.yy.c Aquí es donde situaremos gran parte de la lógica funcional de nuestras prácticas en lugar de hacerlo en la parte de acciones 14

Primer ejemplo en Flex Reconocedor de números enteros Ejecutar: ejemplo1 < fich_entrada.txt 15

Accediendo al lexema Reconocedor de números enteros y palabras que empiezan por a. Mostrar los lexemas reconocidos Es correcto en todos los casos? 16

Accediendo al lexema yytext contiene un puntero global al lexema reconocido yyleng contiene la longitud del lexema Hay otras más: yyin, yyout... También hay funciones: yylex(), yywrap(), yymore(), yyless(), yyterminate()... 17

Ídem que el anterior Bautizar E.R. Bautizando una E.R. 18

Ignorando mayúsculas en tokens Reconocedor de palabras reservadas Compilar con: flex i (no existe siempre) Ejecución interactiva: Ctrl-D para acabar 19

Definiendo variables C y redefiniendo main() Por defecto, Flex crea un main() que llama a yylex() Si redefinimos el main(), hay que llamar a yylex() yylex() entra en un bucle infinito hasta que no hay más tokens o se hace un return 20

Ejecutando código en las acciones: ejemplo 21

Ejecutando código en las acciones: consideraciones Si se pone toda la lógica funcional en las acciones el código queda poco elegante y complejo A veces no queda más remedio que ponerlo en las acciones 22

Lógica funcional en el main(): ejemplo Tokens.h 23

Lógica funcional en el main(): Consideraciones El código queda más elegante Esto nos permitirá enlazar el analizador léxico con el sintáctico (Yacc/Bison) de un modo más simple 24

Condiciones de arranque: Consideraciones Permite activar reglas condicionalmente Una regla cuyo patrón se prefija con una condición de arranque, sólo se activa cuando el analizador se encuentre en un determinado estado Se declaran en la (primera) sección de definiciones, usando líneas sin sangrar comenzando con %s seguida por una lista de nombres. Se activa utilizando la acción BEGIN. Hasta que se ejecute la próxima acción BEGIN: Las reglas con la condición de arranque dada estarán activas Las reglas con otras condiciones de arranque estarán inactivas Las reglas sin condiciones de arranque también estarán activas. BEGIN(0) retorna al estado original donde sólo las reglas sin condiciones de arranque están activas. BEGIN(INITIAL) es equivalente a BEGIN(0). No se requieren los paréntesis alrededor del nombre de la condición de arranque pero se considera de buen estilo. 25

Condiciones de arranque: ejemplo Es correcto en todos los casos? Qué reglas están activas en cada caso? 26

Consideraciones a tener en cuenta (1) Ser muy riguroso con la estructura: Si comienza por blanco, ya no es línea de patrón-acción Definir claramente las tres zonas delimitadas por %% Tener cuidado con los anidamientos de (),[],{} Tener presente la forma de resolución de múltiples patrones coincidentes Elige el que concuerda con el string más largo Si los patrones reconocen el mismo string, elige el que aparece primero en las declaraciones Flex 27

Consideraciones a tener en cuenta (2) Seguir principio divide y vencerás Si falla el analizador léxico, lo más simple es ir eliminando patrón-acción hasta localizar el conflictivo Seguir principio KISS (Keep it simple, stupid!) Pensar muy bien las E.R. a utilizar puede simplificar mucho la tarea Tener presente la diferencia entre mayúsculas y minúsculas de los lexemas: Complicará el código con un montón de [aa][nn][dd]... Se resuelve con flex i Consulta con tu profesor y/o compilador si estás autorizado a utilizarlo 28

Para saber más Consultar la página web de las asignaturas: CompiladoresI: http://webdiis.unizar.es/~ezpeleta/compi/compiladoresi.htm Lenguajes, Gramáticas y Autómatas: http://webdiis.unizar.es/asignaturas/lga/ En ellas aparecen enlaces a documentación de utilidad (manuales online, apuntes, etc) 29

Preguntas 30