Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Analizador lexico

Estas en el tema de Analizador lexico en el foro de C/C++ en Foros del Web. Hola soy nuevo recien me registre, quisiera su ayuda.... estoy llevando el curso de Compiladores en la Universidad. Explico un poco tengo un archivo el ...
  #1 (permalink)  
Antiguo 01/04/2014, 00:46
 
Fecha de Ingreso: marzo-2014
Mensajes: 2
Antigüedad: 10 años, 7 meses
Puntos: 0
Analizador lexico

Hola soy nuevo recien me registre, quisiera su ayuda.... estoy llevando el curso de Compiladores en la Universidad. Explico un poco tengo un archivo el cual leo desde mi programa caracter por caracter, al encontrar un espacio en blanco o retorno de carro comparo lo leido para saber si es una palabra reservada, si lo es me manda un mensaje "palabra reservada" y sino pues manda "Es un ID", el problema es al poner dos o mas espacios e blanco o dos o mas retornos de carro en el archivo ya que me manda el mensaje "es un ID" cuando realmente no es nada,.... dejo el codigo y si me pudieran ayudar muchisimas gracias......!!!!!

#include<stdio>
#include<conio>
#include<iostream>

void comparar();
void vaciar();

char pal[1];
char comp[15];
int y=0,a=0,ac=0;
FILE *codigo;

main()
{


cout<<"PRESIONE ENTER PARA LEER ARCHIVO\n";
getch();

codigo=fopen("Codigo.txt","r");
cout<<"\n";

while(!feof(codigo))
{
comp[y]=fgetc(codigo);
pal[0]=comp[y];
cout<<comp[y];

if(strncmp(pal," ",1)==0)
{
comparar();
}
if(strncmp(pal,"\n",1)==0)
{
comparar();
}
if(feof(codigo))
{
comparar();
}
if(a==1)
{
a=0;
y=0;
}
else
{
y++;
}
}
fclose(codigo);
getch();
return 0;
}

void comparar()
{
if(strncmp(comp,"int",3)==0)
{
gotoxy(8,3+ac);cout<<" Palabra Reservada\n";
a=1;
getch();
}
if(strncmp(comp,"josue",5)==0)
{
gotoxy(8,3+ac);cout<<" Palabra Reservada\n";
a=1;
getch();
}
if(strncmp(comp,"juan",4)==0)
{
gotoxy(8,3+ac);cout<<" Palabra Reservada\n";
a=1;
getch();
}
else
{
if(a==0)
{
gotoxy(8,3+ac);cout<<" ES UN ID\n";
a=1;
getch();
}
}
ac++;
vaciar();
}

void vaciar()
{
for(int z=0;z<=14;z++)
{
comp[z]=NULL;
}
}
  #2 (permalink)  
Antiguo 01/04/2014, 08:26
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Analizador lexico

Tienes que manejar el estado de tu maquina de estados. El estado podria ser, por ejemplo: fuera de una palabra o dentro de una palabra, inicialmente estas fuera, una vez que aparece un texto, estas dentro.

Cuando aparece un espacio o cambio de linea, vuelves a estar fuera y te quedas alli hasta que aparezca una letra.

Sin una variable que mantenga el estado, sera dificil. Segun veo, siempre asignas a la palabra y despues haces logica si lo que aparecio fue o no un separador.

Resumen: maneja el estado en una variable.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 01/04/2014, 10:14
 
Fecha de Ingreso: marzo-2014
Mensajes: 2
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: Analizador lexico

Podrías darme un ejemplo con código???
  #4 (permalink)  
Antiguo 03/04/2014, 07:42
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Analizador lexico

La idea indicada, en pocas lineas.
Los separadores que uso: el espacio en blanco, el tab y el cambio de linea. No uso comas o numeros, pero supongo que puedes extender facilmente para los otros separadores que quieras incorporar.

Código C++:
Ver original
  1. // Estado es una enum
  2.    Estado estado = FUERA;
  3.    string palabra = "";
  4.  
  5.    unsigned int i = 0;
  6.    char c;
  7.    while(( c = leer_caracter(s,i) ) != 0 ) {
  8.        switch( estado ) {
  9.          case FUERA:
  10.                  if( c != ' ' && c != '\t' && c != '\n' ) { // etcetera
  11.                      estado = DENTRO;
  12.                      palabra = c;
  13.                  }
  14.                  break;
  15.          case DENTRO:
  16.                  if( c == ' ' || c == '\t' || c == '\n' ) { // etcetera
  17.                      estado = FUERA;
  18.                      // se acabo la palabra, tiempo de hacer algo con ella
  19.                      cout << "Palabra = " << palabra << endl;
  20.                  }
  21.                  else
  22.                      palabra += c;
  23.                  break;
  24.          }
  25.       ++i;
  26.    }
  27.    // revisar estado al final
  28.    if( estado == DENTRO ) {
  29.        cout << "Palabra final = " << palabra << endl;
  30.    }
Puedes ver este mismo codigo ejecutandose aqui: http://goo.gl/OT36MN
__________________
Visita mi perfil en LinkedIn

Etiquetas: analizador, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:10.