Escolar Documentos
Profissional Documentos
Cultura Documentos
FACULTAD DE INGENIERÍA
INFORME N° 5:
ANALIZADOR LÉXICO
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
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
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
3. PROCEDIMIENTO
SIMPLE/0 ENSAMBLA/0
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
#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
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?
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