Your SlideShare is downloading. ×
Ejemplo de Análisis Léxico con Dev C++

EJEMPLO DE ANALIZADOR LEXICO USANDO DEV C++

OBJETIVOS
Estudiar el código fuente d...
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,...
Ejemplo de Análisis Léxico con Dev C++

charsiguienteToken(void);
voiddevuelveToken(char toke);
intlineaActual(void){retur...
Ejemplo de Análisis Léxico con Dev C++

return(car);
}
if(islower(car))return(car);
else if(isdigit(car)) return(car);
els...
Upcoming SlideShare
Loading in...5
×

Compiladores, Analisis Lexico, Ejemplo Minilenguaje

5,252

Published on

Un ejemplo sencillo de gramática para un minilenguaje lenguaje, código fuente creado en C++ y trabajado en DevC++

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,252
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
248
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Compiladores, Analisis Lexico, Ejemplo Minilenguaje"

  1. 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. 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
  3. 3. Ejemplo de Análisis Léxico 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'%': Página 3
  4. 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

×