Clase # 6 – Ejemplo de Análisis Léxico con Dev C++
Estudiar el código fuente de un programa prototipo de análisis léxico. Aplicar el análisis análisis léxico léxico utilizando código en lenguaje C++ creado con Dev C++
Suponga que se desea construir una mini simulación de un compilador, tomando en en cuenta nada más el análisis léxico de un programa. El programa fuente será un código escrito en un lenguaje definido por el usuario
En este caso el código ha sido
escrito en lenguaje C++ y se debe trabajar con el programa Dev C++ v5.0
Generalmente un compilador toma el programa fuente, lo interpreta y crea un programa objeto (normalmente en lenguaje máquina). Por ahora nos limitaremos a comprender y analizar una de las formas, de cómo se llevaría a cabo un analizador léxico según las características de un lenguaje.
La definición de los componentes léxicos del lenguaje
es la siguiente:
, que sólo son nombres de variables y están compuestos por una única letra minúscula de rango de a – z. – z. numéricas utilizando dígitos dígitos en el rango 0 – 0 – 9. 9. : +, -, *, / y %. : asignación asignación :=, paréntesi paréntesis s ( indicadores de principio y fin de bloque {
), separador de sentencias punto y coma, }.
que están formadas por una letra mayúscula, las cuales son: R (lectura), W (escritura) y M (programa principal).
Página 1
Clase # 6 – Ejemplo de Análisis Léxico con Dev C++
Observe que en este lenguaje, que se tiene un solo tipo de dato:
. Además se considera , y que las variables están formadas por una única letra
minúscula, y las constantes son de un dígito. Se asume que para identificar la sintaxis de cada sentencia, se conoce que reglas de programa se han de s eguir, con solo conocer el token por el que comienza la sentencia.
Programa de ejemplo escrito con código fuente reconocido por el lenguaje
MiniUGB.
Conociendo la gramática del lenguaje definido, realice la descripción de lo que realiza cada una de las líneas escritas en el programa. 1. ______________________________________________________________________________ 2. ______________________________________________________________________________ 3. ______________________________________________________________________________ 4. ______________________________________________________________________________ 5. ______________________________________________________________________________ 6. ______________________________________________________________________________ 7. ______________________________________________________________________________
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 de dato entero).
Página 2
Clase # 6 – Ejemplo de Análisis Léxico con Dev C++
A continuación se muestra la definición de clase Léxico, la cual contiene las funciones necesarias para poder implementar un análisis léxico adecuado para el lenguaje DEVC. #include #include #include #include #include #define TAM_BUFFER 100 using namespace std; class Lexico { char *nombreFichero; FILE* entrada; int n1; int traza; char buffer[TAM_BUFFER]; int pBuffer; public: Lexico(char *unNombreFichero, int una_traza=0); ~Lexico(void); char siguienteToken(void); void devuelveToken(char toke); int lineaActual(void){return n1; }; int existeTraza(void){if(traza)return 1; else return 0;} }; Lexico::Lexico(char *unNombreFichero, int una_traza) { entrada=fopen(unNombreFichero, "rt"); if((entrada==NULL)) { cout<<"No se puede abrir el archivo"<0) ? buffer[--pBuffer]:getc(entrada)))!=EOF) { if(car==' ') continue; if(car=='\n'){++n1; continue;} break; } if(traza) cout<<"ANALIZADOR LEXICO: Lee el token : "<
Página 3
Clase # 6 – Ejemplo de Análisis Léxico con Dev C++
case'M': case'R': case'W': case'=': case'(': case')': case';': case'}': case'{': case'.': case'+': case'*': case'-': case'/': case'%': return(car); } if(islower(car))return(car); else if(isdigit(car)) return(car); else { cout<<"Error Lexico: Token Desconocido"<TAM_BUFFER) { cout<<"ERROR: Desbordamiento del buffer del analizador lexico"<
Programa Principal A continuación se muestra un pequeño programa para observar como es realizado el proceso de análisis léxico por la clase. (SI Ud. desea puede implementar otro tipo de proceso dentro de main). int main() { int traza; char token; Lexico obj("ejemplo_minidev.txt",1); if(obj.existeTraza()) cout<<"INICIO DE ANALISIS"<
Página 4
Clase # 6 – Ejemplo de Análisis Léxico con Dev C++
cout<
Ejercicio 2 Describa lo que hace el programa anterior: _____________________________________________________________ _____________________________________________________________ _____________________________________________________________
Página 5