Vous êtes sur la page 1sur 5

Clase # 6 Ejemplo de Anlisis Lxico con Dev C++

UNIVERSIDAD GERARDO BARRIOS


COMPILADORES E INTRPRETES, CICLO I 2015
DOCENTE: ING. MARVIN PARADA
CLASE # 6

EJEMPLO DE ANALIZADOR LEXICO USANDO DEV C++

MiniUGB

OBJETIVOS
Estudiar el cdigo fuente de un programa prototipo de anlisis lxico.
Aplicar el anlisis lxico utilizando cdigo en lenguaje C++ creado con Dev C++
PROTOTIPO DE UN ANALIZADOR LEXICO
Suponga que se desea construir una mini simulacin de un compilador, tomando en cuenta
nada ms el anlisis lxico de un programa. El programa fuente ser un cdigo escrito en un
lenguaje definido por el usuario (podemos llamarlo MiniUGB). En este caso el cdigo ha sido
escrito en lenguaje C++ y se debe trabajar con el programa Dev C++ v5.0
Generalmente un compilador toma el programa fuente, lo interpreta y crea un programa objeto
(normalmente en lenguaje mquina). Por ahora nos limitaremos a comprender y analizar una de
las formas, de cmo se llevara a cabo un analizador lxico segn las caractersticas de un
lenguaje.
La definicin de los componentes lxicos del lenguaje MiniUGB es la siguiente:
Identificadores, que slo son nombres de variables y estn compuestos por una nica
letra minscula de rango de a z.
Constantes: numricas utilizando dgitos en el rango 0 9.
Operadores: +, -, *, / y %.
Smbolo: asignacin :=, parntesis (

), separador de sentencias punto y coma,

indicadores de principio y fin de bloque {

}.

Palabras reservadas que estn formadas por una letra mayscula, las cuales son: R
(lectura), W (escritura) y M (programa principal).

Pgina 1

Clase # 6 Ejemplo de Anlisis Lxico con Dev C++

Observe que en este lenguaje, todos los tokens son de un slo carcter. Adems se considera
que se tiene un solo tipo de dato: entero, y que las variables estn formadas por una nica letra
minscula, y las constantes son de un dgito. Se asume que para identificar la sintaxis de cada
sentencia, se conoce que reglas de programa se han de seguir, con solo conocer el token por el
que comienza la sentencia.
Programa de ejemplo escrito con cdigo fuente reconocido por el lenguaje MiniUGB.

Conociendo la gramtica del lenguaje definido, realice la descripcin de lo que realiza cada una
de las lneas escritas en el programa.
1. ______________________________________________________________________________
2. ______________________________________________________________________________
3. ______________________________________________________________________________
4. ______________________________________________________________________________
5. ______________________________________________________________________________
6. ______________________________________________________________________________
7. ______________________________________________________________________________
El anlisis lxico debe separar el fichero fuente en componentes lxicos o tokens, y enviarlos al
analizador sintctico (en este gua no se detallara el analizador sintctico).
Habitualmente se envan los componentes lxicos y sus atributos. En este caso solo se
enviaran los tokens, ya que el atributo va implcito en el token (tan slo se tiene el tipo de dato
entero).

Pgina 2

Clase # 6 Ejemplo de Anlisis Lxico con Dev C++

A continuacin se muestra la definicin de clase Lxico, la cual contiene las funciones


necesarias para poder implementar un anlisis lxico adecuado para el lenguaje DEVC.
#include<iostream>
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string>
#define TAM_BUFFER 100
using namespace std;
class Lexico
{
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;}
};
Lexico::Lexico(char *unNombreFichero, int una_traza)
{
entrada=fopen(unNombreFichero, "rt");
if((entrada==NULL))
{
cout<<"No se puede abrir el archivo"<<endl;
system("pause");
exit(-2);
}
if(una_traza) traza=1;
else traza = 0;
n1=1;
pBuffer=0;
}
Lexico::~Lexico()
{
fclose(entrada);
}
char Lexico::siguienteToken(void)
{
char car;
while((car=((pBuffer>0) ? buffer[--pBuffer]:getc(entrada)))!=EOF)
{
if(car==' ') continue;
if(car=='\n'){++n1; continue;}
break;
}
if(traza) cout<<"ANALIZADOR LEXICO: Lee el token : "<<car<<endl;
switch(car)
{

Pgina 3

Clase # 6 Ejemplo de Anlisis Lxico con Dev C++

case'M':
case'R':
case'W':
case'=':
case'(':
case')':
case';':
case'}':
case'{':
case'.':
case'+':
case'*':
case'-':
case'/':
case'%':
return(car);
}
if(islower(car))return(car);
else if(isdigit(car)) return(car);
else
{
cout<<"Error Lexico: Token Desconocido"<<endl;
system("pause");
exit(-4);
}
return(car);
}
void Lexico::devuelveToken(char token)
{
if(pBuffer>TAM_BUFFER)
{
cout<<"ERROR: Desbordamiento del buffer del analizador lexico"<<endl;
system("pause");
exit(-5);
}
else
{
buffer[pBuffer++]=token;
if(existeTraza())
cout<<"ANALIZADOR LEXICO: Recibe en buffer el token"<<token<<endl;
system("pause");
}
}

Programa Principal
A continuacin se muestra un pequeo programa para observar como es realizado el proceso
de anlisis lxico por la clase. (SI Ud. desea puede implementar otro tipo de proceso dentro de
main).
int main()
{
int traza;
char token;
Lexico obj("ejemplo_minidev.txt",1);
if(obj.existeTraza())
cout<<"INICIO DE ANALISIS"<<endl;
while((token=obj.siguienteToken() )!='}')

Pgina 4

Clase # 6 Ejemplo de Anlisis Lxico con Dev C++

cout<<token<<endl;
system("pause");
return 0;
}

Ejercicio 2
Describa lo que hace el programa anterior:
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Pgina 5