Tema 2: Análisis léxico

Documentos relacionados
Tema 2: Análisis léxico

Tema 2: Análisis léxico

Funcionamiento del A.L.

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

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

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

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

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

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

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

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

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Procesamiento de Lenguajes (PL) Curso 2015/2016. Práctica 5: traductor a código m2r

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

8- LEX-Expresiones regulares

Tipos de Datos en C. Palabras reservadas en C

Instituto Tecnológico de Celaya

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

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

Lección 2 Introducción al lenguaje C

Tema: Análisis Léxico

Sebastián García Galán

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

El proceso del Análisis Léxico

ANÁLISIS LÉXICO CONCEPTOS BÁSICOS DEL ANÁLISIS LÉXICO

Elementos léxicos del lenguaje de programación Java

Características de JavaScript

Elementos de un programa en C

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

3.3 Conceptos Básicos del Lenguaje Java

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

Java. Introducción a la Programación Orientada a Objetos

Introducción al lenguaje C

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

Programación Estructurada

PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4

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

Procesadores de lenguaje Tema 2 Análisis léxico

Estructura de datos y Programación

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Introducción. El proceso de traducción

Construcciones del Lenguaje Java

Tema 2. Análisis léxico

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Examen de Procesadores de Lenguaje

INTRODUCCIÓN AL PROCESO DE COMPILACIÓN

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

Tema 5: Traducción dirigida por la sintaxis

Tema 2. El lenguaje de programación Java (Parte 1)

Estructuras de Datos Declaraciones Tipos de Datos

LENGUAJE. Tema 2 Elementos de un programa

Tema 5 Tabla de Símbolos

GENERACIÓN DE CÓDIGO INTERMEDIO EJEMPLOS PARA DISTINTAS ESTRUCTURAS DE DATOS

DIAGRAMAS DE TRANSICIONES

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

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

PROCESADORES DE LENGUAJES

Controla el flujo de tokens reconocidos por parte del analizador léxico. 4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion

Fundamentos de Programación Visual Basic

Analizador Léxico en ANSI C

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

Elementos léxicos del lenguaje de programación C

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

PRINCIPIOS DE PROGRAMACIÓN. Mtro. en Ingeniería de Software. Especialidad en e-commerce Ismael Jiménez Hernández

Unidad II Fundamentos de C++ M.C. Juan Carlos Olivares Rojas

Principios de Computadoras II

REFERENCIA DEL LENGUAJE

Compiladores: Introducción

Análisis léxico. Formalización y desarrollo. Procesadores de Lenguajes. Ingeniería Técnica superior de Ingeniería Informática

Introducción a la Programación

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

TEMA 3: ANÁLISIS SEMÁNTICO

Concepto de compilador Intérprete Fases de un Compilador Herramientas de construcción de Compiladores

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

Generación de Código Intermedio

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

COMPILADORES E INTERPRETES

Agenda. Introducción Analizador léxico Analysis El problema de analizar sintácticamente Analizador sintáctico descendeterecursivo

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

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

Seminario de introducción a Flex

Analizador Sintáctico RECURSIVO

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

TEMA 2: ANÁLISIS LÉXICO-SINTÁCTICO

Capítulo 2: Introducción al lenguaje.

Introducción al lenguaje C

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

Tema: Análisis Semántico

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

ANÁLISIS LÉXICO EXPRESIONES REGULARES

Conceptos básicos sobre gramáticas

Introducción a Java 10/02/2011. Tokens. Juan Manuel Fernández Peña Curso Rev Tokens. Tokens

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

16 Análisis sintáctico I

PHP: Lenguaje de programación

Examen escrito de Programación 1

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Introducción a Java. Introducción a Java. Programación I

Transcripción:

Tema 2: Análisis léxico Procesamiento de Lenguajes Dept. de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 2: Análisis léxico 1 / 21

Fundamentos del análisis léxico El analizador léxico se encarga de suministrar al analizador sintáctico una serie de unidades lógicas llamadas elementos léxicos que resultan de agrupar los caracteres del fichero de entrada Cada uno de estos elementos léxicos se denomina token El analizador léxico es una función o método que es llamado por el analizador sintáctico cada vez que necesita conocer un nuevo token para continuar el proceso de traducción Es el único módulo del compilador que maneja el fichero de entrada Procesamiento de Lenguajes Tema 2: Análisis léxico 2 / 21

Los tokens Clases de tokens: palabras reservadas (if, then,... ) símbolos especiales (operadores aritméticos, lógicos,... ) cadenas no específicas (identificador, número real,... ) EOF (fin de fichero) La cadena de caracteres concreta que se ha reconocido como un token determinado se denomina lexema El lexema no juega un papel desde el punto de vista estructural, pero sí desde el semántico A la información auxiliar que acompaña a un token se le llama atributos del token (lexema, fila, columna,... ) Los tokens se especifican mediante expresiones regulares Procesamiento de Lenguajes Tema 2: Análisis léxico 3 / 21

Ejemplo de análisis léxico EXPR. REGULAR TOKEN [a-z][a-z0-9]* id if if [0-9]+ entero > mayor >= mayorig / div Traza de una cadena: /r2d2 >= if 5=a TOKEN LEXEMA FILA COLUMNA div / 1 2 id r2d2 1 3 mayorig >= 1 9 if if 2 1 entero 5 2 4 error léxico en = id a 2 6 (si hay recuperación de errores) EOF Procesamiento de Lenguajes Tema 2: Análisis léxico 4 / 21

Conclusiones tras la traza Principio de la subcadena más larga Con algunos tokens nos tenemos que pasar leyendo la entrada (es decir, el fichero) El analizador léxico ignora los espacios en blanco, comentarios, saltos de línea,... pero sigue contando líneas y columnas Política de elección de palabra reservada sobre identificador Errores léxicos: caracteres no permitidos en el lenguaje (p.ej. $ ) o no permitidos en un contexto determinado (p.ej. 12.3 vs. o.23 ) Procesamiento de Lenguajes Tema 2: Análisis léxico 5 / 21

Diagrama de transiciones (DT) d d 8 otro 9 * REAL d 6 7 **. otro ENTERO 0 d 4 otro 5 * ENTERO + + 1 3 otro * 2 INCR Expr. regular Token + SUMA ++ INCR [0-9]+ ENTERO ([0-9]+)"."([0-9]+) REAL SUMA Procesamiento de Lenguajes Tema 2: Análisis léxico 6 / 21

Funcionamiento del DT d d 8 otro 9 * REAL d 6 7 **. otro ENTERO 0 d 4 otro 5 * ENTERO + + 1 3 otro * 2 SUMA INCR Trazas 1 12+ 2 12.35 3 ++123 4 1 5 1+2++ 6 1.+ Procesamiento de Lenguajes Tema 2: Análisis léxico 7 / 21

Conclusiones tras la traza con DT 1 Mientras se analiza la cadena de entrada, el analizador debe recordar los n caracteres leídos anteriormente (donde n es el número máximo de asteriscos que aparecen en cualquier estado del DT) 2 Cuando se llega a un estado de aceptación, se devuelve el token asociado a ese estado, y se reintegran al buffer de entrada tantos caracteres como asteriscos tenga asociados el estado 3 IMPORTANTE: en el diagrama suelen estar previstas todas las posibles transiciones de salida de un estado (excepto en los de aceptación), para ello se usa la etiqueta otro. Si no hay transición posible es un error (y no se indica en el DT). 4 En el DT se especifica lo que debe hacer el analizador léxico con cada carácter de la entrada. De los estados finales no salen transiciones 5 En algunos casos (números, id) es necesario leer un carácter más para estar seguros de haber reconocido el token completo Procesamiento de Lenguajes Tema 2: Análisis léxico 8 / 21

Algoritmo de análisis léxico estado = 1; c = leer(); do { nuevo = delta(estado,c); if (nuevo == ERROR) errorlexico(...); if (esfinal(nuevo)) { devolvercaracteres(nuevo); return tokenasociado(nuevo); } else { estado = nuevo; c = leer(); } } while (true); Procesamiento de Lenguajes Tema 2: Análisis léxico 9 / 21

Construcción automática de analizadores léxicos lex/flex: [a-z][a-z0-9]* { return ID;} ANTLR: ID : ( a.. z )( a.. z 0.. 9 )+ ;... Procesamiento de Lenguajes Tema 2: Análisis léxico 10 / 21

Lectura de ficheros carácter a carácter con Java En PL recomendamos utilizar java.io.randomaccessfile Función recomendada para leer caracteres: public char leercaracter() { char currentchar; try { currentchar = (char)fichero.readbyte(); return currentchar; } catch (EOFException e) { return EOF; // constante estática de la clase } catch (IOException e) {... // error lectura } return ; } ATENCIÓN: es posible que sea necesario trucar esta función (para tener en cuenta los caracteres leídos de más) Procesamiento de Lenguajes Tema 2: Análisis léxico 11 / 21

Caracteres leídos después del token En muchos casos, es necesario leer caracteres de más para asegurar el final del token. Ejemplo: 1234+34* IMPORTANTE: Los caracteres leídos de más se deben devolver a la entrada para que sean leídos la siguiente vez que se invoque al analizador léxico (no se pueden perder) Hay dos formas de implementar esa devolución: Retrocediendo el puntero de lectura del fichero (usando el método.seek(...)) Haciendo buffering, almacenando en un vector (que funcionaría como una cola) los caracteres, y trucando la función de lectura de caracteres para consultar el buffer antes de leer del fichero Procesamiento de Lenguajes Tema 2: Análisis léxico 12 / 21

Palabras reservadas 1 Codificación explícita en el DT (no recomendable, excepto si se usa un generador automático de analizadores léxicos: lex, ANTLR,...) 0 i 1 old 2 otro n 3 old 1 t 4 otro 2 1 5 old otro 6 * int ol 1 ld otro 2 * ident 2 O bien, tras reconocer un identificador en el DT, se consulta en una lista de palabras reservadas (o en la tabla de símbolos) para decidir el token a devolver Procesamiento de Lenguajes Tema 2: Análisis léxico 13 / 21

Función de transición en DT 1 Matriz (dispersa) gestionada por rangos 2 Implementación en código mediante instrucciones de selección 3 Hay que almacenar qué token se debe devolver para cada estado final, y en el caso del diagrama de transiciones, el número de asteriscos (que es el número de caracteres que hay que devolver a la entrada o almacenar en el buffer) Procesamiento de Lenguajes Tema 2: Análisis léxico 14 / 21

Codificación de la tabla de transiciones 1 > d d 4 otro = 2 3 5 * int delta (int estado, int c) { ENTERO switch (estado) { case 1: if (c== > ) return 2; else if (c>= 0 && c<= 9 ) return 4; else return -1; break; mayorig case 2: if (c== = ) return 3; else return -1; break; case 3: return -1; // estado final break; case 4: if (c>= 0 && c<= 9 ) return 4; else return 5; // otro break; case 5: return -1; // estado final break; default: // error interno } } Procesamiento de Lenguajes Tema 2: Análisis léxico 15 / 21

Representación de los tokens public class Token { public int fila; public int columna; public String lexema; public int tipo; // tipo es: ID, ENTERO, REAL...... } public static final int ID = 1, ENTERO = 2, REAL = 3,... FINFICHERO =...; Procesamiento de Lenguajes Tema 2: Análisis léxico 16 / 21

Ejercicio 1 Diseña un diagrama de transiciones (DT) para reconocer los siguientes componentes léxicos: numentero un número entero sin signo con dígitos entre 0 y 9, que no puede empezar por 0 numoctal un número entero en octal, que empieza por 0 y con dígitos entre 0 y 7 (p.ej. 015 es 13) numhex un número entero en hexadecimal, que empieza por 0x y con dígitos entre 0 y 9, y letras entre la A y la F (mayúsculas siempre) id identificador: secuencia de letras y dígitos que empieza por letra El 0 se debe considerar que es un número octal. A continuación, indica cómo un analizador léxico construido sobre el DT anterior separaría en tokens la secuencia de caracteres 09 120x021 0190xAF 0x9AGF 0xaF. Procesamiento de Lenguajes Tema 2: Análisis léxico 17 / 21

Ejercicio 2 Diseña un diagrama de transiciones para reconocer los siguientes componentes léxicos: if la palabra reservada if ifthen la palabra reservada ifthen iftrue la palabra reservada iftrue oftrue la palabra reservada oftrue ident cualquier secuencia de letras y dígitos que empiece por una letra y no coincida con ninguna de las palabras reservadas mulop el símbolo / assop el símbolo = mulassop el símbolo /= addassop el símbolo += identico el símbolo /==/ Indica cómo separa este analizador la secuencia de caracteres if5true/==/iftrue+=true/==false en tokens. Procesamiento de Lenguajes Tema 2: Análisis léxico 18 / 21

Ejercicio 3 Diseña un diagrama de transiciones para reconocer los siguientes componentes léxicos: numentero un número entero sin signo con uno o más dígitos entre 0 y 9 numexpo un número que tiene uno o más dígitos, una E seguida de un signo + o - opcional, y que acaba con una secuencia de uno o más dígitos. Ejemplos: 1E1, 112E+112 id identificador: secuencia de letras y dígitos que empieza por letra min la palabra reservada min mon la palabra reservada mon dosp el símbolo : igual el símbolo = asig el símbolo := equiv el símbolo :==: A continuación, indica cómo un analizador léxico construido sobre el diagrama de transiciones anterior separaría en tokens la secuencia de caracteres 09 :==mono 12E-34 123E+3a3E27. Procesamiento de Lenguajes Tema 2: Análisis léxico 19 / 21

Ejercicio 4 Diseña un diagrama de transiciones para reconocer los siguientes componentes léxicos: numentero un número entero sin signo con uno o más dígitos entre 0 y 9 numfija un número que tiene cero o más dígitos, un punto, y una secuencia de uno o más dígitos. Ejemplos:.233, 1.1, 112.112 id identificador: secuencia de letras y dígitos que empieza por letra del la palabra reservada del delete la palabra reservada delete postdec el símbolo -- flecha el símbolo --> mayor el símbolo > Procesamiento de Lenguajes Tema 2: Análisis léxico 20 / 21

Ejercicio 5 Diseña un diagrama de transiciones para reconocer los siguientes componentes léxicos: EXPRESIÓN ELEMENTO REGULAR LÉXICO <> distinto < menor > mayor + opsuma - opsuma ++ incremento -- decremento -> desref ---> dobleref := asig Procesamiento de Lenguajes Tema 2: Análisis léxico 21 / 21