Compiladores, Analisis Lexico, Ejemplo Minilenguaje

  • 2,243 views
Uploaded on

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

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

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,243
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
98
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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
  • 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. 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