Você está na página 1de 10

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN

FACULTAD DE INGENIERÍA

ESCUELA PROFESIONAL EN INFORMÁTICA Y SISTEMAS

INFORME N° 5:

ANALIZADOR LÉXICO

CURSO: COMPILADORES Y TEORÍA DE LENGUAJES

NOMBRE: LUIS ANTONIO NEYRA MELCHOR

CÓDIGO: 2013 – 39078

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

FECHA DE ENTREGA: 22 DE NOVIEMBRE DE 2016

TACNA – PERU

2016

1
INDICE

1. OBJETIVOS……………………………………………….…….3
2. FUNDAMENTO TEORICO………………………………….…3
3. PROCEDIMIENTO……………………………………………...4
4. ANÁLISIS DE RESULTADOS…………………………………8
5. CONCLUSIONES……………………………………………….10

2
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:

IF cuenta = sueldo THEN jefe := justo ;

Y les asigna su atributo, habitualmente por medio de un código numérico cuyo


significado se ha definido previamente

3
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++

4
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);
int lineaActual(void) { return n1; };
int existeTraza(void) { if(traza) return 1; else return 0; }
};

5
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;

6
}
}
}
}
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)
{
if(pBuffer>TAM_BUFFER)
{
cout<<"ERROR: Desbordamiento del buffer del analizador lexico"<<endl;

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

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

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

10

Você também pode gostar