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



Documentos relacionados
Seminario de introducción a Flex

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

Lección 2: Análisis léxico. 1) El papel de un analizador léxico (scanner) 2) Tokens, lexemas y patrones léxicos 3) Expresiones regulares

Generador de analizadores léxicos FLEX

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

8- LEX-Expresiones regulares

Seminario de introducción a Bison

Yacc/Bison. Introducción

1. Funcionamiento de lex

PROCESADORES DE LENGUAJES

FLEX: A FAST LEXICAL ANALYZER GENERATOR

Construcción de una calculadora con Flex y Bison. Construcción de una calculadora con Flex y Bison. Índice (I)

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

Práctica 4 Análisis LALR para milenguaje y construcción de un traductor de milenguaje

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

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, IS17 Ingeniería Técnica en Informática de Sistemas. Práctica 1: Introducción al Analizador Léxico FLEX

FLEX: A FAST LEXICAL ANALYZER GENERATOR

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

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

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

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

Funcionamiento del A.L.

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

12 La herramienta LEX

ANÁLISIS LÉXICO EXPRESIONES REGULARES

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

Práctica No. 4 Programas en Lex

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

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

Modelos de Computación I. Ingeniería Informática

Introducción a las sentencias de control

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

Tema 2: Análisis léxico

ANALIZADOR LEXICO LEX

Tema 2: Análisis léxico

Sintaxis de C Ing. Jose Maria Sola Dr. Oscar Ricardo Bruno

GUÍA BÁSICA DE FLEX Y BISON

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

Teoría de la Computación

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

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

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 2.

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

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

Elementos de un programa en C

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

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

10 Introducción a BISON/YACC

4. (Junio 2005) Se está diseñando un lenguaje de programación para manejar objetos gráficos. Entre las constantes que tiene que manipular están las

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

Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, técnicas y herramientas, Tema 3, páginas:

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

Compiladores e Intérpretes Análisis Léxico

EJERCICIOS DE PROGRAMACIÓN EN C. DIBUJAR UN ROMBO O DIAMANTE. CALCULAR SUMATORIOS. (CU00542F)

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

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Documentación Técnica: 1er Proyecto

PROCESADORES DEL LENGUAJES Enero 2015

Diagrama de transiciones del autómata. Tabla de transiciones

Procesadores de lenguaje Tema 2 Análisis léxico

Estructuras de Datos Declaraciones Tipos de Datos

Nombre y apellidos: Grupo (mañana - tarde). Táchese lo que no proceda.

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

Generador de analizadores sintácticos BISON

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

Tema: Compilador Micro C

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

Tema 5 Tabla de Símbolos

Diseño de Compiladores I YACC: Yet Another Compiler-Compiler

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

Operando1 operador de relación Operando2

Introducción a la Programación

Clase adicional 2. Estructuras básicas de control. Temas

Tema 7: Polimorfismo. Índice

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

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

LENGUAJE. Tema 1 - Introducción

PRÁCTICA DE LABORATORIO 4 Programación Orientada a Objetos

Introducción a Flex y Bison

Procesadores de Lenguajes Diseño de un lenguaje y de un traductor asociado. Curso Objetivo: Documentación a entregar:

TEÓRICO ID ; = [ ], $

µ-c: Manual de referencia del lenguaje Micro-C

PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA

08 Análisis léxico IV

COMPILADORES. Tema 4. Análisis semántico

Clase 08: Autómatas finitos

41 Jornadas Argentinas de Informática Concurso de Trabajos Estudiantiles Categoría: Teoría de la Computación, Modelos Formales y Compiladores.

Programación Estructurada. Sesión 2:El lenguaje de programación C

Tema: Maquina de Turing

AMBITO DE VARIABLES EN C. GLOBALES Y LOCALES. UNDECLARED (FIRST USE IN THIS FUNCTION). EJEMPLOS (CU00548F)

Transcripción:

Como hemos visto, el paso de una expresión regular a un AF se puede hacer de manera automatizada Existen varias herramientas que relizan dicho trabajo Generadores de analizadores léxicos AT&T Lex (más común en UNIX) MKS Lex (MS-Dos) Flex Abraxas Lex Posix Lex ScanGen JLex... Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 1

Qué hace LEX? especificación FLEX especifica un analizador léxico FLEX FLEX lex.yy.c int yylex(): función que realiza el análisis léxico Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 2

FLEX sigue el esquema: donde: patrón: expresión regular acción: fuente C con las acciones a realizar cuando el patrón concuerde con un lexema Funcionamiento: FLEX recorre entrada estándar hasta que encuentra una concordancia» un lexema correspondiente al lenguaje de algunas de las e.r. representadas por los patrones entonces, ejecuta el código asociado (acción) patrón 1 { acción 1 patrón 2 { acción 2... patrón k { acción k permite acceder a la información asociada al lexema (string, longitud del mismo, nº de línea en el fuente,...) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 3

Ejemplo: implementar en LEX, un analizador léxico para menor menor < mayor mayor > menorigual <= <= mayorigual >= >= igual igual = distinto <> <> letra letra a b... z A B... Z digito 0 1... 9 identificador letra letra (letra digito)* constentera digito digito * Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 4

Comportamiento deseado: v0<>27 segundos= 1000 analizador léxico (IDENTIFICADOR,v0) (DISTINTO,) (CONSTENTERA,27) (IDENTIFICADOR,segundos) (IGUAL,) (CONSTENTERA,1000) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 5

Estructura de un programa FLEX Sección de definiciones: bloques literales» se copian tal cual al fuente lex.yy.c»entre %{ y % definiciones regulares ( bautismo ) declaraciones propias para el manejo de tablas de LEX condiciones iniciales sección sección de de definiciones definiciones %% %% sección sección de de reglas reglas %% %% sección sección de de rutinas rutinas del del usuario usuario» cambiar el funcionamiento del reconocedor Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 6

%{ %{ /* /* fichero: fichero: expresiones.l expresiones.l */ */ #include #include...... enum enum {MENOR=255,MENORIGUAL,MAYOR, MAYORIGUAL,IGUAL,DISTINTO, IDENTIFICADOR,CONSTENTERA; int int yylval; yylval; /* /* para para atributo atributo cte. cte. entera*/ entera*/ typedef typedef int int token; token; % % %% %% sección sección de de reglas reglas %% %% sección sección de de rutinas rutinas de de usuario usuario Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 7

Sección de reglas Formato: patrón {acciones dos tipos de líneas:» empiezan por blanco, %{ ó % fuente C» empiezan por otra cosa: línea patrón-código las líneas de fuente C se copian directamente en el fuente lex.yy.c al encontrar concordancia, ejecutará código asociado si no encuentra concordancia, ejecuta ECHO (copia el lexema en salida estándar) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 8

%{ %{ sección sección de de definiciones definiciones % % %% %% (\t \n " (\t \n " ")+ ")+ {/* {/* no no hace hace nada nada */; */; [0-9]([0-9])* [0-9]([0-9])* {sscanf(yytext,"%d",&yylval); return(constentera); "<" "<" {return(menor);............ "<>" "<>" {return(distinto); [a-za-z]([a-za-z] [0-9])* {return(identificador);. {ECHO; {ECHO; %% %% sección sección de de rutinas rutinas de de usuario usuario patrón acción Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 9

Sección de rutinas de usuario su contenido se copia literalmente en el fuente lex.yy.c contiene funciones C escritas por el usuario y necesarias para el analizador» manejo de tabla de símbolos» generación de salidas (cuando no es necesario generación de código) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 10

%{ sección de definiciones % %% sección de reglas %% /*-------------------------------------- Sólo para comprobación --------------------------------------- */ void escribeinfo(token eltoken) { switch(eltoken){ case IDENTIFICADOR: fprintf(stdout, "ident.\t%s",yytext); break;... /*-------------------------------------- Cuando EOF, yylex() dev. 0 ---------------------------------------*/ int main() { token eltoken; eltoken=yylex(); while(eltoken){ escribeinfo(eltoken); eltoken=yylex(); Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 11

Ejemplo de uso de LEX: expresiones.l flex expresiones.l lex.yy.c gcc -o expresiones lex.yy.c -lfl expresiones sufijo.l para fuente FLEX invocación a FLEX fuente con el analizador -lfl: biblioteca necesaria analizador Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 12

#===================================================== # Fichero: Makefile # Tema: genera un analizador léxico para # introducir Flex/Lex # Fecha: Septiembre-03 # Uso: make #===================================================== LEX=flex CC=gcc expresiones: lex.yy.o $(CC) -o expresiones lex.yy.o -lfl #-L/opt/flex/lib -lfl para Merlin lex.yy.o: lex.yy.c $(CC) -c lex.yy.c lex.yy.c: expresiones.l $(LEX) expresiones.l Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 13

Ejemplo de invocación: el fichero entrada es v0<>27 segundos= 1000 invocación: expresiones < entrada genera la siguiente salida identificador v0 distinto <> numero 27 identificador segundos igual = numero 1000 Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 14

También se pueden dar nombres a expresiones regulares %{ %{ /* /* fichero: fichero: expresiones.l expresiones.l */ */...... int int yylval; yylval; /* /* hab. hab. los los define define Yacc Yacc */ */ typedef typedef int int token; token; % % separadores separadores [\n\t [\n\t ]+ ]+...... letra letra [a-za-z] [a-za-z] digito digito [0-9] [0-9] identificador identificador {letra({letra {digito)* constentera constentera {digito({digito)* %% %% sección sección de de reglas reglas %% %% sección sección de de rutinas rutinas de de usuario usuario Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 15

%{ %{ sección sección de de definiciones definiciones % % %% %% {separadores {separadores {/* {/* no no hace hace nada nada */; */; {constentera {constentera {sscanf(yytext,"%d",&yylval); return(constentera);...... {identificador {identificador {return(identificador);. {ECHO; {ECHO; %% %% sección sección de de rutinas rutinas de de usuario usuario Nota: el nombre de la ER en la parte de patrones debe ponerse entre { y para distinguirlo del patrón literal {separadores<>separadores Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 16

Extensiones de FLEX a e.r.. cualquier cualquier carácter carácter excepto excepto \n \n r* r* 0 ó más más concat. concat. de de r r+ r+ 1 ó más más concat. concat. de de r r? r? 0 ó 1 veces veces r [c [c 1...c 1...c n ] n conj.caracteres conj.caracteres {c {c 1...c 1...c n n a-b a-b caracteres caracteres {a,succ(a),... {a,succ(a),... ^r ^r r debe debe concordar concordar al al principio principio de de la la línea línea [^c [^c 1...c 1...c n ] n cualquier cualquier car. {c car. {c 1...c 1...c n n r$ r$ r debe debe concordar concordar al al terminar terminar la la línea línea r{m,n r{m,n entre entre m y n concatenaciones concatenaciones de de r \ para para concordancia concordancia exacta exacta de de caracteres caracteres especiales: especiales: \\ \\ \. \. \? \? r1 r2 r1 r2 lo lo habitual habitual c c 1...c 1...c n n literalmente literalmente c 1...c 1...c n r1/r2 n r1/r2 reconoce reconoce r1 r1 sólo sólo si si va va seguida seguida de de r2 r2 ( e.r.?) ( e.r.?) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 17

Qué pasa cuando hay ambigüedad? FLEX aplica dos reglas: Regla 1... letra [a-za-z] digito [0-9] identificador {letra({letra {digito)* %% if {return(if); {identificador {return(ident); %% Aplica el patrón que concuerde con el string más largo Regla 2 Si dos patrones representa el mismo string, aplica el que aparece antes en las declaraciones de LEX Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 18

Un ejemplo: contar caracteres, líneas y palabras #include <stdio.h> int ncar=0, npal=0, nlin=0; % palabra [^ \t\n]+ finlin \n %% {palabra {ncar+=yyleng;npal++; {finlin {ncar++;nlin++;. {ncar++; %% int main(){ yylex(); fprintf(stdout, "car:%d pal:%d lin:%d\n", ncar, npal, nlin ); Una versión a las bravas Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 19

Un ejemplo: contar caracteres, líneas y palabras #include <stdio.h> enum {PALABRA=128,FINLINEA, OTROSEP; int ncar=0, npal=0, nlin=0; % palabra [^ \t\n]+ finlin \n %% {palabra {return PALABRA; {finlin {return FINLINEA;. {return OTROSEP; %% int main(){ int eltoken; eltoken=yylex(); un poco más estructurada y elegante while(eltoken){ switch(eltoken){ case PALABRA: npal++;ncar+=yyleng; break; case FINLINEA:nCar++;nLin++; break; case OTROSEP: ncar++; eltoken=yylex(); fprintf(stdout, "car:%d pal:%d lin:%d\n", ncar, npal, nlin ); Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 20