6
C.P. Ingeniería de Sistemas e Informática Universidad Tecnológica de los Andes Teoría de Compiladores Ing. Luis Alberto Iquira Vargas TRABAJO 2 Analizador Léxico 2010-0 TRABAJO 2 2010 0 ANALIZADOR LÉXICO MARCO TEORICO: El presente trabajo es de carácter individual y considera un afán investigativo y de implementación. OBJETIVO: Tiene como objetivo permitir al alumno manejar y aplicar los conceptos básicos, técnicas y complementos de la teoría de compiladores en su etapa léxica en la solución de problemas aprovechando las especificaciones desarrolladas teóricamente. TEMA: Desarrollar una aplicación que realice el análisis léxico sobre el LP 2010-0 a partir de las siguientes especificaciones y aplicando todo el conocimiento teórico hasta aquí obtenido. - Generar los patrones (Expresión regulares, AFNs y algoritmos) para cada componente léxico o token del LP 2010-0 según esto sea necesario. - Respetar las estructuras de almacenamiento: TABLA DE SÍMBOLOS y TABLA DE ERRORES en su composición y tratamiento. - Esta aplicación debe ser capaz de permitir el ingreso de un programa escrito en el lenguaje de programación 2010-0 planteado y realizar sobre éste la verificación léxica correspondiente. Además deberá mantener al usuario debidamente informado de lo que sucede con el programa original. PRESENTACION: Se deberá presentar lo siguiente: - Informe impreso o Carátula (Datos personales, datos del curso) o Resumen (Síntesis del contenido del trabajo) o Marco Teórico Referencial (Alcances teóricos nuevos y útiles sobre el análisis léxico distintos a los vistos en aula) o Patrones obtenidos (Expresión regular, AFN y algoritmo) o Diagrama de transiciones o Detallar Tablas y/o estructuras o BD utilizadas adicionales a las exigidas o Pantallas propias de la Aplicación (Todas) o Pseudocódigo y/o diagrama de flujo de la aplicación ( De ser pseudocódigo será este depurado ) o Conclusiones y recomendaciones o Bibliografía ( Todo material empleado debe constar en este punto ) - CD conteniendo la aplicación - Informe y aplicación en digital al email del docente. FECHA: El presente trabajo se presentará el día sábado 06 de marzo de 2010, a las 9:30 am en los ambientes del Laboratorio B (404). Para cualquier consulta y/o el envío de archivos al correo: [email protected] Recuerde siempre que todos somos mejores personas cuando nos superamos y una excelente forma de superarse es el estudio y la investigación. ¡ A superarse !

Analisis Lexico - 2010 0

Embed Size (px)

Citation preview

Page 1: Analisis Lexico - 2010 0

C.P. Ingeniería de Sistemas e Informática Universidad Tecnológica de los Andes Teoría de Compiladores Ing. Luis Alberto Iquira Vargas

TRABAJO 2 Analizador Léxico 2010-0

TRABAJO 2 – 2010 0

ANALIZADOR LÉXICO

MARCO TEORICO: El presente trabajo es de carácter individual y considera un afán investigativo y de implementación. OBJETIVO: Tiene como objetivo permitir al alumno manejar y aplicar los conceptos básicos, técnicas y complementos de la teoría de compiladores en su etapa léxica en la solución de problemas aprovechando las especificaciones desarrolladas teóricamente. TEMA: Desarrollar una aplicación que realice el análisis léxico sobre el LP 2010-0 a partir de las siguientes especificaciones y aplicando todo el conocimiento teórico hasta aquí obtenido.

- Generar los patrones (Expresión regulares, AFNs y algoritmos) para cada componente léxico o token del LP 2010-0 según esto sea necesario.

- Respetar las estructuras de almacenamiento: TABLA DE SÍMBOLOS y TABLA DE ERRORES en su composición y tratamiento.

- Esta aplicación debe ser capaz de permitir el ingreso de un programa escrito en el lenguaje de programación 2010-0 planteado y realizar sobre éste la verificación léxica correspondiente. Además deberá mantener al usuario debidamente informado de lo que sucede con el programa original.

PRESENTACION: Se deberá presentar lo siguiente:

- Informe impreso o Carátula (Datos personales, datos del curso) o Resumen (Síntesis del contenido del trabajo) o Marco Teórico Referencial (Alcances teóricos nuevos y útiles sobre el análisis léxico

distintos a los vistos en aula) o Patrones obtenidos (Expresión regular, AFN y algoritmo) o Diagrama de transiciones o Detallar Tablas y/o estructuras o BD utilizadas adicionales a las exigidas o Pantallas propias de la Aplicación (Todas) o Pseudocódigo y/o diagrama de flujo de la aplicación ( De ser pseudocódigo será este

depurado ) o Conclusiones y recomendaciones o Bibliografía ( Todo material empleado debe constar en este punto )

- CD conteniendo la aplicación - Informe y aplicación en digital al email del docente.

FECHA: El presente trabajo se presentará el día sábado 06 de marzo de 2010, a las 9:30 am en los ambientes del Laboratorio B (404).

Para cualquier consulta y/o el envío de archivos al correo:

[email protected]

Recuerde siempre que todos somos mejores personas cuando nos superamos y una excelente forma de superarse es el estudio y la investigación. ¡ A superarse !

Page 2: Analisis Lexico - 2010 0

C.P. Ingeniería de Sistemas e Informática Universidad Tecnológica de los Andes Teoría de Compiladores Ing. Luis Alberto Iquira Vargas

TRABAJO 2 Analizador Léxico 2010-0

ESTRUCTURAS y/o TABLAS - ANALIZADOR LÉXICO Nuestra aplicación tendrá dos estructuras que deben estar vacías cada vez que compilamos un programa fuente y que se van llenando de datos conforme el analizador léxico realiza sus funciones. Estas dos estructuras son la Tabla de Símbolos y la tabla de errores respectivamente, pasamos a describir cada una de ellas a continuación:

1. Estructura TABLA DE SÍMBOLOS

Tabla de Símbolos

CodS DescS TipoS PosS

Para la estructura “Tabla de Símbolos“ tenemos los siguientes campos:

CodS – Contiene el código del símbolo o token.

DescS – Contiene la descripción literal (lexema) del símbolo o token.

TipoS – Contiene el tipo de símbolo o token que corresponde.

PosS – Contiene la posición en la que se ubica el símbolo o lexema dentro de la cadena de entrada.

Un ejemplo de programa fuente con el LP Visual Basic puede ser:

Dim temp As Integer temp = (temp + 1)/2

y para éste programa de entrada la tabla de símbolos quedaría de la siguiente manera:

Tabla de Símbolos

CodS DescS TipoS PosS

1 Dim PR 1

100 Temp ID 5

2 As PR 10

10 Integer PR 13

100 Temp ID 20

22 = AS 25

41 ( SS 27

100 Temp ID 28

30 + OP 33

101 1 NE 35

42 ) SS 36

33 / OP 37

101 2 NE 38

2. Estructura ERRORES

ERRORES

CodE DescE PosE

Para la estructura “Errores“ tenemos los siguientes campos:

CodE – Contiene el código del error.

DescE – Contiene la descripción literal del error.

PosE – Contiene la posición en la que se encuentra el error.

Cada vez que se encuentra un error se debe almacenar en ésta estructura sin interrumpir el proceso de compilación.

Adicionalmente a las dos estructuras antes detalladas, existe una tercera tabla que a diferencia de las anteriores NO sufre modificación alguna, pero que si se utiliza para desarrollar el proceso de scaneo léxico sobre un programa fuente, seguidamente se detalla ésta tercera tabla.

Page 3: Analisis Lexico - 2010 0

C.P. Ingeniería de Sistemas e Informática Universidad Tecnológica de los Andes Teoría de Compiladores Ing. Luis Alberto Iquira Vargas

TRABAJO 2 Analizador Léxico 2010-0

3. Tabla Símbolos del lenguaje Esta tabla contiene todos los símbolos que contiene el LP 2010-0, símbolos con los cuales el usuario puede elaborar programas fuente.

Código Símbolo Tipo / Token Código Símbolo Tipo / Token

1 Procedimiento Palabra reservada – PR 34 [ Signo Separador – SEP

2 Funcion Palabra reservada – PR 35 ] Signo Separador – SEP

3 Principal Palabra reservada – PR 36 + Operador – OP

4 Entero Palabra reservada – PR 37 - Operador – OP

5 Decimal Palabra reservada – PR 38 * Operador – OP

6 Doble Palabra reservada – PR 39 / Operador – OP

7 Caracter Palabra reservada – PR 40 && Operador – OP

8 Cadena Palabra reservada – PR 41 ++ Operador – OP

9 Booleano Palabra reservada – PR 42 - - Operador – OP

10 Si Palabra reservada – PR 43 = Asignador – AS

11 Entonces Palabra reservada – PR 44 = = Signo Comparador – SC

12 Sino Palabra reservada – PR 45 < = Signo Comparador – SC

13 Abrir Palabra reservada – PR 46 > = Signo Comparador – SC

14 Caso Palabra reservada – PR 47 < Signo Comparador – SC

15 Quiebre Palabra reservada – PR 48 > Signo Comparador – SC

16 Defecto Palabra reservada – PR 49 != Signo Comparador – SC

17 Ira Palabra reservada – PR 50 ! Signo Relacionador – SR

18 Retornar Palabra reservada – PR 51 & (Alt + 38) Signo Relacionador – SR

19 Para Palabra reservada – PR 52 | (Alt + 124) Signo Relacionador – SR

20 Mientras Palabra reservada – PR 53 , (Alt + 44) Signo puntuación – SP

21 Hacer Palabra reservada – PR 54 ; (Alt + 59) Signo puntuación – SP

22 Mostrar Palabra reservada – PR 55 : (Alt + 58) Signo puntuación – SP

23 Leer Palabra reservada – PR 56 “ (Alt + 34) Signo puntuación – SP

24 Limpiar Palabra reservada – PR 57 „ (Alt + 39) Signo puntuación – SP

25 Pausa Palabra reservada – PR 58 . (Alt + 46) Punto flotante – PF

26 Abs Palabra reservada – PR 59 identificador Variable o Identificador – ID

27 Mod Palabra reservada – PR 60 número entero Número entero – NE

28 Exp Palabra reservada – PR 61 número decimal Número Decimal – ND

29 Sqrt Palabra reservada – PR 62 cadena Cadena – CA

30 ( Signo Separador – SS 63 caracter Carácter – CR

31 ) Signo Separador – SS 64 Símbolo desconocido – SD

32 { Signo Separador – SS 65 // Comentario línea – CL

33 } Signo Separador – SEP 66 /* */ Comentario párrafo – CP

La palabra reservada Ira sirve para el manejo de etiquetas dentro de un programa fuente. Es decir siempre debe seguirle un identificador o variable. Ejemplo: Ira x.

La palabra reservada Retornar se usa para devolver valores, así tenemos que puede devolver identificadores o variables y constantes numéricas. Ejemplo: Retornar(x), Retornar(-1).

La palabra reservada Limpiar se usa para limpiar la pantalla y va asociada siempre a (). Ejemplo: Limpiar().

La palabra reservada Pausa al igual que la anterior siempre se asocia a () y sirve para hacer una pausa en la pantalla. Ejemplo: Pausa().

La palabra reservada Abs se asocia también a () y debe contener siempre una constante numérica o un identificador. Ejemplo: Abs(x), Abs(-25).

La palabra reservada Mod se usa para determinar el residuo de una división, entonces requiere de dos operandos (identificadores o constantes numéricas). Ejemplo: 2 MOD 3, x MOD y, 3 MOD a, b MOD 2.

La palabra reservada Exp determina el resultado de elevar un valor a otro; se asocia también a () y debe contener siempre dos constantes numéricas o identificadores separadas por una coma. Ejemplo: Exp(a,b), Exp(2,3), Exp(a,2), Exp(2,b).

La palabra reservada Sqrt determina la raíz cuadrada de un número; debe estar asociada a () conteniendo una constante numérica o un identificador. Ejemplo: Sqrt(4), Sqrt(temp).

Para los operadores ++ y -- solo basta con anteponer una variable o identificador.

El operador && sirve para concatenar cadenas o caracteres. Ejemplo: “esta es ”&&”una cadena” o también „a‟&&‟e‟&&‟i‟&&‟o‟&&‟u‟.

El signo comparador != significa diferente. Ejemplo: a != b (a diferente de b).

Los relacionadores & y | son equivalentes a la conjunción y disyunción lógicas respectivamente. Ejemplos: a & b (a y b), a | b (a o b).

Page 4: Analisis Lexico - 2010 0

C.P. Ingeniería de Sistemas e Informática Universidad Tecnológica de los Andes Teoría de Compiladores Ing. Luis Alberto Iquira Vargas

TRABAJO 2 Analizador Léxico 2010-0

El relacionador ! son los que sirven para la negación. Ejemplo: !x (significa NO x).

Las cadenas de caracteres se encierran entre comillas, y las constantes de un solo carácter se encierran entre comillas simples.

Lenguaje de Programación 2010-0

Definición de variables

Inicialización de variables

Procedimiento NOMBRE()

{

Definición de variables

Inicialización de variables

NOMBRE()//puede ser de Procedimientos o Funciones

Impresión / Salida de mensajes y/o variables

Ingreso / Entrada de variables

Operaciones / Cálculos u operaciones con variables

Funciones Propias del Lenguaje

Uso de estructuras de control (decisión y repetitivas)

{

Definición de variables

Ingreso / Entrada de variables

Operaciones / Cálculos con variables

Funciones Propias del Lenguaje

Impresión / salida de mensajes y/o variables

}

Impresión / salida de mensajes y/o variables

}

Funcion NOMBRE()

{

//toda función puede contener las mismas instrucciones que un

//procedimiento

/*las dos líneas anteriores son comentarios de línea y éste es

un comentario de párrafo */

}

Principal()

{ Definición de variables

Inicialización de variables

NOMBRE() //puede ser de Procedimientos o Funciones

Impresión / Salida de mensajes y/o variables

Ingreso / Entrada de variables

Operaciones / Cálculos u operaciones con variables

Funciones Propias del Lenguaje

Uso de estructuras de control (decisión y repetitivas)

{

Definición de variables

Ingreso / Entrada de variables

Operaciones / Cálculos con variables

Funciones Propias del Lenguaje

NOMBRE()//puede ser de Procedimientos o Funciones

Impresión / salida de mensajes y/o variables

}

Impresión / salida de mensajes y/o variables

}

A continuación se muestran algunos ejemplos de cómo utilizar los símbolos pertenecientes al lenguaje de programación 2010-0 en sus diferentes instrucciones a representar.

Page 5: Analisis Lexico - 2010 0

C.P. Ingeniería de Sistemas e Informática Universidad Tecnológica de los Andes Teoría de Compiladores Ing. Luis Alberto Iquira Vargas

TRABAJO 2 Analizador Léxico 2010-0

Comentarios (línea y párrafo) y programa vacío Estructuras de Decisión Múltiple

//Este es un comentario de línea

//Abajo se aprecia un programa vacío

Principal()

{

}

/* Y finalmente

éste es un

comentario de párrafo */

//También se puede anidar estas

estructuras

Abrir(op1)

{

Caso 1: Mostrar(“Opción 1”), Quiebre;

Caso 2: Mostrar(“Opción 2”), Quiebre;

Caso 3: Mostrar(“Opción 3”), Quiebre;

Caso 4: Mostrar(“Opción 4”), Quiebre;

Caso 5: Mostrar(“Opción 5”), Quiebre;

Defecto: Mostrar(“Ingrese de 1 a 5”);

}

Definición de variables Estructura Repetitiva Para

Entero x, cont12, temp_PTR;

Decimal a_1, a_2, a_3, a_4, resp;

Caracter op ;

Cadena nom, ape, direc, email ;

Booleano genero;

Entero y,z; Doble nume; Caracter op1,

op2;

Para(x=0; x>10; x=x+1)

{

Para(x=0; x>10; x=x+1)

{

Mostrar(“Recorre una matriz”);

}

}

Inicialización, operaciones y cálculos sobre variables

Estructura Repetitiva Mientras

a1 = 1; b=0.5;

nom = “Juan”;

ape=“Perez” ;

z=Abs(a1); z1=5 MOD 2; z2=Sqrt(b);

b=b+a1;

nomC = nom && “ ” && ape;

x = ((b * b)/a1) + ((b * b)/a1);

Mientras(x != 10)

{

Mientras((y = = 0)|(x != 10))

{

Mostrar(y); z=Abs(x); z1=y Mod x;

}

}

Entrada y Salida de datos Estructura Repetitiva Hacer – Mientras

Leer(x);

Leer(nom);

Mostrar(“Este es un mensaje”);

Mostrar(“Var 1”, x, “Nombre”, nom);

Mostrar(x,” “, nom);

Mostrar(x);

Hacer

{

Mostrar(x); z = Exp(x,2);

}Mientras(x > 10);

//También podríamos haber anidado esto

Estructuras de Decisión Simple y Doble Procedimientos y/o Funciones

Si(x>=10.5) Entonces

Mostrar(“Estas aprobado”);

Sino

{

Si((x >= 7)&(x < 10.5)) Entonces

{

Mostrar(“Estas en subsanación”);

}

Sino

{

Mostrar(“Estas desaprobado”);

}

}

//Abajo se aprecia un procedimiento

Procedimiento suma()

{ Limpiar();

Resp = x+y; z = Sqrt(x);

Mostrar(“Respuesta es: ”,Resp);

Pausa();

}

/* Todas las instrucciones y estructuras

analizadas aquí pueden ser combinadas sin

ningún inconveniente y crear así

programas con todas ellas indistintamente

*/

Page 6: Analisis Lexico - 2010 0

C.P. Ingeniería de Sistemas e Informática Universidad Tecnológica de los Andes Teoría de Compiladores Ing. Luis Alberto Iquira Vargas

TRABAJO 2 Analizador Léxico 2010-0

PSEUDOCODIGO GENERAL A continuación se detalla una referencia de pseudocódigo no depurado para la construcción del analizador léxico, desarrollando algoritmos para cada patrón según el lenguaje de programación 2010-0. ALexico(STRING *cadena) { FLAG = 0 Recorrer toda la cadena y se van reconociendo símbolos IGNORAR ESPACIOS EN BLANCO, SALTOS DE LINEA Y TABULACIONES (Caracteres Especiales) RECONOCIMIENTO DE IDENTIFICADORES Y/O PALABRAS RESERVADAS – PATRON 1 Si el símbolo leído es un letra, continuar leyendo hasta encontrar un símbolo distinto

leer símbolos mientras sean alfanuméricos y se concatenan Si el símbolo es igual a una Palabra reservada

Agregar datos del token a la tabla de símbolos Sino será igual a un identificador Agregar datos del token a la tabla de símbolos

Finsi RECONOCIMIENTO DE NUMEROS ENTEROS – PATRON 2 Si el símbolo leído es un número, continuar leyendo hasta encontrar un símbolo distinto

leer símbolos mientras sean numéricos y se concatenan Agregar datos del token a la tabla de símbolos

Finsi RECONOCIMIENTO DE NUMEROS DECIMALES – PATRON 3 RECONOCIMIENTO DE CADENAS – PATRON 4 RECONOCIMIENTO DE SÍMBOLOS EN GENERAL – PATRON 5 (CUANDO SEA NECESARIO) Comparar el símbolo con los símbolos operadores, separadores, asignadores, comparadores, relacionadores, etc. Si es necesario se aplica el patrón respectivo Si es igual a uno de los símbolos Agregar datos del token a la tabla de símbolos Finsi Finsi RECONOCIMIENTO DEL SIMBOLO DESCONOCIDO Agregar datos del símbolo desconocido a la tabla de símbolos Llamar a la función de ERROR Guardar datos en la tabla de errores Cambiar FLAG a 1 VERIFICACION DE ERRORES Si FLAG = 0 Escribe “Análisis Léxico Correcto” y Mostrar contenido de la tabla de símbolos Sino Escribe “Error léxico” y Vaciar datos de la tabla de errores

Finsi }

Cabe precisar que como se indico previamente, que el algoritmo de cada patrón puede incluirse dentro de una estructura de selección múltiple o su equivalente en simples y dobles para determinar el camino correcto a seguir cuando se esté analizando un carácter del programa fuente.

Para cualquier consulta y/o el envío de archivos al correo:

[email protected]

Recuerde siempre que todos somos mejores personas cuando nos superamos y una excelente forma de superarse es el estudio y la investigación. ¡ A superarse !