Você está na página 1de 4

Ejemplo de Anlisis Lxico con Dev C++

EJEMPLO DE ANALIZADOR LEXICO USANDO DEV C++

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 encuenta
nada ms el anlisis lxico de un programa. El programa fuente ser un cdigoescrito en un
lenguaje definido por el usuario(podemos llamarlo MiniDev). En este caso el cdigo ha sido
escrito en lenguaje C++ y se debe trabajar con el programa Dev C++ v4.9.
Generalmente un compilador toma el programa fuente, lo interpreta y crea un programaobjeto
(normalmente en lenguaje mquina). Por ahora nos limitaremos a comprender yanalizar una de
las formas, de cmo se llevara a cabo un analizador lxico segn lascaractersticas de un
lenguaje.
La definicin de los componentes lxicos del lenguaje MiniDeves 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 sentenciaspunto 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).
Observe que en este lenguaje, todos los tokens son de un slo carcter. Adems seconsidera
que se tiene un solo tipo de dato: entero, y que las variables estn formadaspor una nica letra
minscula, y las constantes son de un dgito. Se asume que paraidentificar la sintaxis de cada
sentencia, se conoce que reglas de programa se han deseguir, con solo conocer el token por el
que comienza la sentencia.
Programa de ejemplo escrito con cdigo fuente reconocido por el lenguajeMiniDev.
Pgina 1

Ejemplo de Anlisis Lxico con Dev C++

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 dedato
entero).
A

continuacin

se

muestra

la

definicin

de

clase

Lxico,

la

cual

contiene

las

funcionesnecesarias 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;
classLexico
{
char *nombreFichero;
FILE* entrada;
int n1;
inttraza;
char buffer[TAM_BUFFER];
intpBuffer;
public:
Lexico(char *unNombreFichero, intuna_traza=0);
~Lexico(void);
Pgina 2

Ejemplo de Anlisis Lxico con Dev C++

charsiguienteToken(void);
voiddevuelveToken(char toke);
intlineaActual(void){return n1; };
intexisteTraza(void){if(traza)return 1; else return 0;}
};
Lexico::Lexico(char *unNombreFichero, intuna_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);
}
charLexico::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)
{
case'M':
case'R':
case'W':
case'=':
case'(':
case')':
case';':
case'}':
case'{':
case'.':
case'+':
case'*':
case'-':
case'/':
case'%':
Pgina 3

Ejemplo de Anlisis Lxico con Dev C++

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);
}
voidLexico::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 elproceso
de anlisis lxico por la clase. (SI Ud. desea puede implementar otro tipo de proceso dentro de
main).
intmain()
{
int traza;
chartoken;
Lexicoobj("ejemplo_minidev.txt",1);
if(obj.existeTraza())
cout<<"INICIO DE ANALISIS"<<endl;
while((token=obj.siguienteToken() )!='}')
cout<<token<<endl;
system("pause");
return 0;
}

Pgina 4

Você também pode gostar