You are on page 1of 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 – 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:

luis_iquira@hotmail.com

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 !

TRABAJO 2 Analizador Léxico 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

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.

TRABAJO 2 Analizador Léxico 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

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

TRABAJO 2 Analizador Léxico 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

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.

TRABAJO 2 Analizador Léxico 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

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


//Este es un comentario de línea //También se puede anidar estas
//Abajo se aprecia un programa vacío estructuras
Abrir(op1)
Principal() {
{ 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;
/* Y finalmente Caso 5: Mostrar(“Opción 5”), Quiebre;
éste es un Defecto: Mostrar(“Ingrese de 1 a 5”);
comentario de párrafo */ }

Definición de variables Estructura Repetitiva Para

Entero x, cont12, temp_PTR; Para(x=0; x>10; x=x+1)


Decimal a_1, a_2, a_3, a_4, resp; {
Caracter op ; Para(x=0; x>10; x=x+1)
Cadena nom, ape, direc, email ; {
Booleano genero; Mostrar(“Recorre una matriz”);
Entero y,z; Doble nume; Caracter op1, }
op2; }

Inicialización, operaciones y cálculos sobre


Estructura Repetitiva Mientras
variables
a1 = 1; b=0.5; Mientras(x != 10)
nom = “Juan”; {
ape=“Perez” ; Mientras((y = = 0)|(x != 10))
z=Abs(a1); z1=5 MOD 2; z2=Sqrt(b); {
b=b+a1; Mostrar(y); z=Abs(x); z1=y Mod x;
nomC = nom && “ ” && ape; }
x = ((b * b)/a1) + ((b * b)/a1); }

Entrada y Salida de datos Estructura Repetitiva Hacer – Mientras

Leer(x); Hacer
Leer(nom); {
Mostrar(“Este es un mensaje”); Mostrar(x); z = Exp(x,2);
Mostrar(“Var 1”, x, “Nombre”, nom); }Mientras(x > 10);
Mostrar(x,” “, nom); //También podríamos haber anidado esto
Mostrar(x);

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

Si(x>=10.5) Entonces
//Abajo se aprecia un procedimiento
Mostrar(“Estas aprobado”);
Sino
Procedimiento suma()
{
{ Limpiar();
Si((x >= 7)&(x < 10.5)) Entonces
Resp = x+y; z = Sqrt(x);
{
Mostrar(“Respuesta es: ”,Resp);
Mostrar(“Estas en subsanación”);
Pausa();
}
}
Sino
{
/* Todas las instrucciones y estructuras
Mostrar(“Estas desaprobado”);
analizadas aquí pueden ser combinadas sin
}
ningún inconveniente y crear así
}
programas con todas ellas indistintamente
*/

TRABAJO 2 Analizador Léxico 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

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:
luis_iquira@hotmail.com
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 !

TRABAJO 2 Analizador Léxico 2010-0