4

Click here to load reader

Compiladores, Analisis Lexico, Ejemplo Minilenguaje

Embed Size (px)

Citation preview

Page 1: Compiladores, Analisis Lexico, Ejemplo Minilenguaje

Ejemplo de Análisis Léxico con Dev C++

Página 1

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.

Page 2: Compiladores, Analisis Lexico, Ejemplo Minilenguaje

Ejemplo de Análisis Léxico con Dev C++

Página 2

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

Page 3: Compiladores, Analisis Lexico, Ejemplo Minilenguaje

Ejemplo de Análisis Léxico con Dev C++

Página 3

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'%':

Page 4: Compiladores, Analisis Lexico, Ejemplo Minilenguaje

Ejemplo de Análisis Léxico con Dev C++

Página 4

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;

}