• No se han encontrado resultados

Informe 5 de Compiladores

N/A
N/A
Protected

Academic year: 2021

Share "Informe 5 de Compiladores"

Copied!
10
0
0

Texto completo

(1)

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN

FACULTAD DE INGENIERÍA FACULTAD DE INGENIERÍA

ESCUELA PROFESIONAL EN INFORMÁTICA Y SISTEMAS ESCUELA PROFESIONAL EN INFORMÁTICA Y SISTEMAS

INFORME N° 5:

INFORME N° 5:

ANALIZADOR LÉXICO

ANALIZADOR LÉXICO

CURSO:

CURSO: COMPILADORES COMPILADORES Y Y TEORÍA TEORÍA DE DE LENGUAJESLENGUAJES  NOMBRE:

 NOMBRE: LUIS ANTONIO NEYRA MELCHORLUIS ANTONIO NEYRA MELCHOR

CÓDIGO: 2013

CÓDIGO: 2013 –  –  39078 39078 FECHA

FECHA DE DE ELABORACIÓN: ELABORACIÓN: 21 21 DE DE NOVIEMBRE NOVIEMBRE DE DE 2016.2016. FECHA

(2)

INDICE

1. OBJETIVOS

………

.

……

.3

2. FUNDAMENTO TEORICO

………

.

3

3. PROCEDIMIENTO

………

...4

4. ANÁLISIS DE RESULTADOS

………

8

5. CONCLUSIONES

……….10

(3)

1. OBJETIVOS

 Estudiar el código fuente de un programa prototipo de análisis léxico.  Aplicar el análisis léxico utilizando código en lenguaje C++ creado con

Borland C++.

2. FUNDAMENTO TEÓRICO

LÉXICO

El léxico de un lenguaje de programación u otro lenguaje usado en la informática está constituido por todas las palabras y símbolos que lo componen. En los lenguajes de programación el léxico lo constituyen todos los elementos individuales del lenguaje, denominados frecuentemente “tokens”. Así son tokens: las palabras reservadas del lenguaje, los símbolos que denotan los distintos tipos de operadores, identificadores (de variables, de funciones, de procedimientos, de tipos, etc), separadores de sentencias, y otros símbolos empleados en las distintas construcciones del lenguaje.

ANÁLISIS LÉXICO

Un programa fuente es una serie de símbolos que representan las construcciones del lenguaje tales como variables, etiquetas, palabras reservadas, constantes, operadores, entre otros. El programa fuente se trata inicialmente con el analizador léxico, el cual tiene el propósito de agrupar el texto en los diferentes tipos de patrones que conforman las unidades léxicas como identificadores (de variables, de funciones, de procedimientos, de tipos, de clases), palabras reservadas y operadores. Por razones de eficiencia, a cada token se le asocia un atributo (o más de uno) que se representa internamente por un código numérico o por un tipo enumerado. Por ejemplo a un identificador se le puede dar una representación interna de 1, a una contante de 2, a un operador aritmético un 2,…, cada palabra reservada tiene su propio código.

Así, para la siguiente sentencia de Pascal:

IF cuenta = sueldo THEN jefe:= justo ; El analizador léxico la separa en la siguiente secuencia de tokens:

(4)

TOKEN ATRIBUTO OBSERVACIONES

IF 20 Palabra reservada

cuenta 1 Identificador

= 15 Operador de comparación

sueldo 1 Identificador

THEN 20 Palabra reservada

 jefe 1 Identificador

:= 10 Asignación

 justo 1 Identificador

; 27 Separador de sentencias

El análisis léxico es un análisis a nivel de caracteres, su misión es reconocer los componentes léxicos o tokens, enviando al analizador sintáctico los tokens y sus atributos.

También se encarga de eliminar los comentarios. El analizador léxico también recibe el nombre de explorador (en inglés scanner).

3. PROCEDIMIENTO

Con el objeto de clarificar algunos de los conceptos sobre diseño de compiladores, se desea construir un mini compilador de un lenguaje muy simple (aunque de alto nivel), que se ha denominado SIMPLE. El lenguaje objeto será un lenguaje de bajo nivel denominado ENSAMBLA.

La primera parte de este ejercicio consistirá en un programa que simula el análisis léxico de un compilador, que lee desde un archivo de texto el programa fuente. Definición del compilador de SIMPLE:

SIMPLE/0 ENSAMBLA/0

C++

Figura 1 Representación simbólica de un compilador para SIMPLE A partir de este diagrama, conteste las siguientes preguntas:

1. ¿Cuál es el lenguaje fuente? El lenguaje es SIMPLE/0 2. ¿Cuál es el lenguaje objeto?

El lenguaje es EMSAMBLE/0

3. ¿Cuál es el lenguaje de implementación? El lenguaje de borland c++

(5)

Generalmente un compilador toma el programa fuente, lo interpreta y crea un  programa objeto (normalmente en lenguaje máquina). Por ahora nos limitaremos a

comprender y analizar una de las formas, de cómo se llevaría a cabo un analizador léxico según las características de un lenguaje.

FICHERO FUENTE

Digite un programa en el lenguaje SIMPLE/0, en un archivo de texto, guárdelo como prueba1.txt. Puede utilizar uno de los códigos vistos en la guía 1.

ANÁLISIS LÉXICO A TRAVÉS DEL LENGUAJE INTERMEDIO

El análisis léxico debe separar el fichero fuente en componentes léxicos o tokens, y enviarlos al analizador sintáctico (en este guía no se detallará el analizador

sintáctico). Habitualmente se envían los componentes léxicos y sus atributos. En este caso solo se enviarán los tokens, ya que el atributo va implícito en el token (tan sólo se tiene el tipo de dato entero).

A continuación, se muestra la definición de clase Léxico, la cual contiene las funciones necesarias para poder implementar un análisis léxico adecuado para el lenguaje MUSIM/0.

Digite el siguiente código:

#include <conio> #include <iostream> #include <stdio> #include <ctype> #include <stdlib>

#define TAM_BUFFER 100 // define el tamaño de TAM_BUFFER class Lexico {  private: char *nombreFichero; FILE* entrada; int n1; int traza; char buffer[TAM_BUFFER]; int pBuffer;  public:

Lexico(char *unNombreFichero, int una_traza=0); ~Lexico(void);

char siguienteToken(void); void devuelveToken(char toke);

(6)

Lexico::Lexico(char *unNombreFichero, int una_traza) {

entrada=fopen(unNombreFichero, "rt"); if((entrada==NULL))

{

cout<<"no se puede abrir el archivo"<<endl; getch(); exit(-2); } if(una_traza) { traza=1; } else { traza=0; } n1=1;  pBuffer=0; } Lexico::~Lexico() { fclose(entrada); } char Lexico::siguienteToken(void) { char car; int cen; cen=0; while(cen==0) { if(pBuffer>0) { car=buffer[--pBuffer]; } else { car=getc(entrada); } if(car!=EOF) { if(car!=' ') { if(car=='\n') { n1=n1+1; } else { cen=1;

(7)

} } } } if(traza) {

cout<<"ANALIZADOR LEXICO: Lee el token : "<<car<<endl; }

switch(car) // lee letra por letra del archivo de texto { case'M': case'R': case'W': case'=': case'(': case')': case';': case'}': case'{': case'.': case'+': case'*': case'-': case'/': case'%': return(car); } if(islower(car)!=0) {

return(car); //retorna el caracter o variable leido } else { if(isdigit(car)!=0) { return(car); } else {

cout<<"Error Lexico: Token Desconocido"<<endl; getch(); exit(-4); } return(car); } }

void Lexico::devuelveToken(char token) {

(8)

getch(); exit(-5); } else {  buffer[pBuffer++]=token; if(existeTraza()) {

cout<<"ANALIZADOR LEXICO: Recibe un buffer el token"<<token<<endl; } getch(); } } void main(void) { int traza; char token; Lexico obj("ejemplo.txt",1); if(obj.existeTraza()) {

cout<<"INICIO DEL ANALISIS"<<endl; }

while((token=obj.siguienteToken() )!='}') {

cout<<token<<endl; }

cout<<"Presione una tecla para continuar..."; getch();

}

4. ANÁLISIS DE RESULTADOS

a) ¿Qué es lo que muestra el programa?

 Nos muestra como recorre el programa con los caracteres descrito en el archivo “ejemplo.txt” recorriendo el programa sin errores.

(9)

 b) Coloque en el archivo ejemplo.txt algún carácter no reconocido por el lenguaje SIMPLE/0. Vuelva a ejecutar la aplicación generada por C++.¿Qué observó en la ejecución? ¿Cuál es la razón del resultado?

El analizador muestra que el programa compilo pero no se muestra al final que muestra un error de token desconocido

c) Elimine el carácter “;” de alguna de las instrucciones. Vuelva a ejecutar la aplicación.

¿Qué observó en la ejecución? ¿Cuál es la razón del resultado?

El analizador se ejecutó, pero algunos caracteres no se mostraron, la razón fue porque se quitó el carácter“;” y por lo tanto al final también aparece error token desconocido.

(10)

d) Explique detalladamente que es lo que realiza la función siguienteToken().

La función siguenteToken(), contiene dos variables: car (de tipo char) y cen (tipo entero), en car se guarda el carácter extraído del archivo entrada (tipo FILE*) y cen se utiliza para ver si existen caracteres tipo entero dentro del archivo.

Luego se analiza el carácter extraído, con un switch, al ejecutar el programa se analiza el programa mostrando los caracteres, el caso contrario manda un mensaje diciendo token desconocido.

5. CONCLUSIONES

 Se implementó un código fuente de borland c++, para ver como recorre el

 programa y ver el analizador léxico en el cual se reconocen muchas funciones que se pueden reconocer fácilmente

 En borland c++ ejecutamos el programa del analizador sintáctico del archito txt,

mostrándonos los caracteres que contenían el archivo y si eran reconocidos por el  programa o no.

Referencias

Documento similar

SHIRLEY C., Raines; ISBELL, Rebecca: Cómo contar cuentos a los niños : Relatos y actividades para estimular la creatividad e inculcar valores éticos , Barcelona,

Las características del trabajo con grupos que se debería llevar a cabo en los Servicios Sociales de Atención Primaria (SSAP), en términos de variabilidad o estabilidad

Pero antes hay que responder a una encuesta (puedes intentar saltarte este paso, a veces funciona). ¡Haz clic aquí!.. En el segundo punto, hay que seleccionar “Sección de titulaciones

Primeros ecos de la Revolución griega en España: Alberto Lista y el filohelenismo liberal conservador español 369 Dimitris Miguel Morfakidis Motos.. Palabras de clausura

La oportunidad, en particular, de dejar abierta una segunda fase (declarativa) junto a la preventiva depende- rá en el fondo de la configuración más administrativa o más judicial

Esta población eminentemente juvenil, presenta altas tasas de analfabetismo que se sitúan en torno al treinta y siete por ciento entre los hombres, y el sesenta y seis por

Como hemos visto, Muhamad apenas tiene lo que podríamos calificar como tiempo de ocio que, en mayor o menor medida, tanto Mustafa como Walid y Maher poseen para desarrollar su