Computers">
Nothing Special   »   [go: up one dir, main page]

Analizador Lexico-Sintáctico

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 2

#include <iostream>

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string>
#include <fstream>
#define TAM_BUFFER 100
/* run this program using the console pauser or add your own getch, system("pause")
or input loop */
using namespace std;

class Lexico
{
char *nombreFichero; //NOmbre del fichero fuente
FILE* entrada; //Fichero de entrada
int n1; //Numero de linea
int traza; //control de traza
char buffer[TAM_BUFFER]; //Buffer auxiliar de caracteres
int pBuffer; // Posicion en el buffer
public:
Lexico(char *unNombreFichero, int una_traza=0);
~Lexico(void);
char siguienteToken(void);
void devuelveToken(char token);
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, "r+");
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; // se inicializa el contador de línea


pBuffer=0;//Se inicializa la posicion del buffer
}

Lexico::~Lexico()
{
fclose(entrada);
}

char Lexico::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': // Palabra reservada
case'R':
case'W':
case'=': //asigancion
case'(': //parentesis
case')':
case';'://separadores
case'}'://separadores
case'{':
case'.'://fin de programa
case'+':
case'*':
case'-':
case'/':
case'%':
return(car);
}
if(islower(car)) return(car);//variable
else if (isdigit(car)) return(car);//constante
else
{
cout<<"Error Lexico: Token Desconocido "<<endl;
system("pause");
exit(-4);
}
return(car);
}

void Lexico::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");
}
}

int main(int argc, char** argv)


{
int traza;
char token;
Lexico obj("prueba1.txt",1);
if(obj.existeTraza())
cout<<"INICIO DE ANALISIS"<<endl;
while((token=obj.siguienteToken())!='}')
cout<<token<<endl;
system("pause");
return 0;
}

También podría gustarte