ANALISIS LEXICO Universidad Nacional de Jujuy Facultad de Ingeniería COMPILADORES Elizabeth Reinoso...

23
ANALISIS LEXICO ANALISIS LEXICO Universidad Nacional de Jujuy Facultad de Ingeniería COMPILADORES COMPILADORES Elizabeth Reinoso [email protected]

Transcript of ANALISIS LEXICO Universidad Nacional de Jujuy Facultad de Ingeniería COMPILADORES Elizabeth Reinoso...

ANALISIS LEXICOANALISIS LEXICO

Universidad Nacional de Jujuy

Facultad de Ingeniería

COMPILADORESCOMPILADORES

Elizabeth Reinoso

[email protected]

Objetivos Generales

Conocer el funcionamiento de un analizador léxico

Entender las relaciones de éste con La tabla de símbolos La gestión de errores

Aprender a especificar formalmente un analizador

Conocer las distintas técnicas de implementación

Eliz2abeth Reinoso: [email protected]

Usuario

Índice General

Introducción Especificación de un Analizador Léxico Implementación de un Analizador Léxico

Elizabeth Reinoso: [email protected]

INTRODUCCION

Análisis Léxico Scanner Tabla de Símbolos Gestión de Errores

Funciones Tratar con la tabla de símbolos Generar tokens bajo demanda del analizador

sintáctico Manejar el fichero fuente Ignorar comentarios Contabilizar posición de tokens Preprocesar macros, constantes, includes …

Elizabeth Reinoso: [email protected]

e d a d

ScannerT. Símbolo

G. Errores[ID, “edad”]

Análisis Léxico Utilidad:

Se utiliza para la construcción de compiladores, como para interpretar el código HTML de una página web.

Va leyendo del fichero de entrada los caracteres secuencialmente y los va agrupando en tokens con un significado conocido por el programador.

Hace la función de preprocesador ya que se encarga de eliminar los caracteres innecesarios para el proceso de compilación Por ejemplo: elimina los espacio en blanco que hay

entre palabra y palabra

Funciones

Agrupar caracteres según categorías establecidas por la especificación del lenguaje fuente.

Rechazar texto con caracteres ilegales o agrupados según un criterio no especificado

Funcionamiento

La relación entre el A-L y el A-S es una relación de maestro-esclavo. El sintáctico demanda al léxico que lea el

siguiente lexema y el léxico lee los caracteres necesarios del fichero de entrada hasta que consiga completar un lexema, que será entregado a su maestro.

Código Fuente

Analizador léxico

Analizador Sintactico

Lee caracteres

Componente léxico

Solicita un componente lexico

Siguiente fase

Funcionamiento

Construir tokens validos a partir de la lectura carácter a carácter del fichero de entrada.

Pasar tokens validos al analizador sintáctico Gestionar el manejo de fichero de entrada. Ignorar los espacio en blanco, comentarios y demás

caracteres o tokens innecesarios para el proceso de análisis

Avisar de los errores encontrados en esta fase. Llevar la cuenta del numero de líneas par incluir lo en el

aviso de error. Hacer las funciones de preprocesador

Funcionamiento

El analizador léxico va leyendo carácter a carácter el fichero de entrada y va guardando estos caracteres en el buffer. Cuando encuentra un carácter que no le sirve para construir un token valido, se para y envía los caracteres acumulados al A-L y espera una nueva petición de lectura. Cuando recibe una nueva petición del A-S, limpia el buffer y vuelve a leer el carácter donde paro la vez anterior.

Funcionamiento

Ejemplo: Tenemos el siguiente fichero de entrada:

int x;

main() {

}.

Entrada Buffer Accion

i i Leer otro caracter

n in Leer otro caracter

t int Leer otro caracter

Espacio en blanco int Enviar token y limpiar buffer

x x Leer otro caracter

; x Enviar token y limpiar buffer

; ; Leer otro carácter….

Términos utilizados

Patron: Es una representación lógica de una serie de agrupación de caracteres con unas características comunes. Por ejemplo, en Java el identificador de una variable puede ser cualquier combinación de letras y numero que no comience con un numero. Para describir formalmente esta definición, se utilizan las expresiones regulares. Por ejemplo: letra::=(a-zA-Z), digito::=(0-9)

Identificador::=(letra)(letra|digito)

Términos utilizados

Lexema: es cada una de las combinaciones de caracteres que encajan en la definición de un patrón. Por ejemplo: variable1, x

Es decir el patrón es la definición formal y el lexema es cada una de las secuencia que pueden encajar en esa definición.

Token: es el nombre que se le va a dar cada patrón definido. Este nombre se utilizara en los procesos de análisis en representación de todos los lexemas encontrados

Ej: el token es como la palabra fruta y los lexemas son las frutas en concreto, como manzana, banana,

Especificación del analizador léxico Para comprender el funcionamiento de una

A-L, lo especificaremos como un AF, muy parecida a una AFD con las siguientes diferencia: El AFD solo dice si la secuencia de caracteres

pertenece al lenguaje o no, y el DT debe leer la secuencia hasta completar un token y luego retornar el token y dejar la entrada para leer el token siguiente.

En un DT cada secuencia no determinada es un error Los estados de aceptación de los DT deben ser

terminales

Especificación de analizador léxico

En un DT, cuando se lea una carácter que no pertenezca a ninguna secuencia especificada, se debe ir a un estado especial terminal y volver el cursor de lectura de caracteres al carácter siguiente a la secuencia correcta leida.

Construcción de un analizador léxico Utilizar un DT Mediante programas especiales que

construyen analizadores. Identificar las palabras reservadas:

1. Hacer una tabla con todas las palabras y consultarla para cada identificador y ver si esta en la tabla o no.

2. Implementar cada una de las palabras reservadas en el DT para diferenciarlas del resto de identificadores, lo que complicaría bastante la programación.

Construir el diagrama de transiciones

Construcción de un Analizador Lexico

Construir el diagrama de transiciones:

Ejemplo: vamos a crear un analizador léxico para un lenguaje que reconoce numero enteros sin signo, la suma, incremento y el producto:

a) Definir los patrones o E-R:Entero::=(“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”)+

Suma::=“+”

Producto::=“*”

Incremento::=“++”

b) Creamos el Automata

Construcción de un Analizador Léxico

o5 6

24

3

*

digito

digito

otro

++

otro

PRODUCTO

* ENTERO

INCREMENTO

* SUMA

Construcción de un Analizador Léxico

c) Crear la tabla de transicion

Consta de tantas filas como estado del automata.

En cuanto a las columnas: una para numerar el estado, tantas como distintas posibles entradas, otra para señalar el token que se reconoce; una ultima para numerar los retrocesos que hay que hacer pata reconocer los lexemas.

Construcción de un Analizador Léxico

Entradas Entradas Entradas Entradas

Estado Digito + * Otro Token Retroc.

0 5 2 1 Error -

1 - - - - PRODUCTO 0

2 3 4 3 3 - -

3 - - - - SUMA 1

4 - . . . INCREMENT 0

5 5 6 6 6 6 6

6 - - - - ENTERO 1

Construcción de un Analizador LéxicoEj: tenemos la siguiente entrada:

25+5*13+33++5**/5

El automata efectuara los siguientes pasos:Estado=0, Entrada=2, Estado=5, Entrada=5, Estado=5, Entrada=+,

Estado=6, Token=ENTERO, Lexema=25, Retroceso=1,

Estado=0, Entrada=+,Estado=2, Entrada=5, Estado=3, Token=SUMA, Lexema=+,Retroceso=1,

Estado=0, Entrada=5, Estado=5, Entrada=*, Estado=6, Token=ENTERO, Lexema=5, Retroceso=1.

Ejercicio

Diseñar un DT para reconocer los siguientes componentes lexicos: LETRAS: cualquier secuencia de una o mas letras ENTERO: cualquier secuencia de uno o mas números

(si tiene mas de un numero, no deberá comenzar por 0).

ASIGNAR: la secuencia =. SUMAR: la secuencia +. RESTAR: la secuencia -. IMPRIMIR: la palabra reservada print.

[AHO] AHO, SETHI, ULLMAN: Compiladores: Principios, técnicas y herramientas,: Addison-Wesley Iberoamericana, 1990

[GARRIDO] A. Garrido, J. Iñesta, F. Moreno y J. Pérez. 2002. Diseño de compiladores. Universidad de Alicante.

[CATALAN] Jacinto Ruiz Catalan.2010. Compiladores: Teoria e Implementacion. Alfaomega.