1. Ejemplo de Análisis Léxico con Dev C++
EJEMPLO DE ANALIZADOR LEXICO USANDO DEV C++
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 Dev C++
PROTOTIPO DE UN ANALIZADOR LEXICO
Suponga que se desea construir una mini simulación de un compilador, tomando encuenta
nada más el análisis léxico de un programa. El programa fuente será un códigoescrito en un
lenguaje definido por el usuario(podemos llamarlo MiniDev). En este caso el código 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 máquina). Por ahora nos limitaremos a comprender yanalizar una de
las formas, de cómo se llevaría a cabo un analizador léxico según lascaracterísticas de un
lenguaje.
La definición de los componentes léxicos del lenguaje MiniDeves la siguiente:
Identificadores, que sólo son nombres de variables y están compuestos por una única
letra minúscula de rango de a – z.
Constantes: numéricas utilizando dígitos en el rango 0 – 9.
Operadores: +, -, *, / y %.
Símbolo: asignación:=, paréntesis (
), separador de sentenciaspunto y coma,
indicadores de principio y fin de bloque { }.
Palabras reservadas que están formadas por una letra mayúscula, las cuales son: R
(lectura), W (escritura) y M (programa principal).
Observe que en este lenguaje, todos los tokens son de un sólo carácter. Además seconsidera
que se tiene un solo tipo de dato: entero, y que las variables están formadaspor una única letra
minúscula, y las constantes son de un dígito. 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 código fuente reconocido por el lenguajeMiniDev.
Página 1
2. Ejemplo de Análisis Léxico con Dev C++
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 detallara el analizador sintáctico).
Habitualmente se envían los componentes léxicos y sus atributos. En este caso solo se
enviaran los tokens, ya que el atributo va implícito en el token (tan sólo se tiene el tipo dedato
entero).
A
continuación
se
muestra
la
definición
de
clase
Léxico,
la
cual
contiene
las
funcionesnecesarias para poder implementar un análisis léxico 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);
Página 2
4. Ejemplo de Análisis Léxico 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 continuación se muestra un pequeño programa para observar como es realizado elproceso
de análisis léxico 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;
}
Página 4