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

Problema con analizador lexico completo

Estas en el tema de Problema con analizador lexico completo en el foro de C/C++ en Foros del Web. Buenas noches chicos, actualmente tengo un problema a la hora de hacer un analizador lexico. Lo estoy haciendo en dev c++. el detalle es que ...
  #1 (permalink)  
Antiguo 08/02/2010, 21:55
 
Fecha de Ingreso: agosto-2009
Ubicación: Peru
Mensajes: 10
Antigüedad: 14 años, 8 meses
Puntos: 1
Problema con analizador lexico completo

Buenas noches chicos, actualmente tengo un problema a la hora de hacer un analizador lexico. Lo estoy haciendo en dev c++. el detalle es que el analizador lexico que he avanzado ya lee palabras reservadas, operadores arimeticos, pero el problema es que no me lee ni numeros reales ni identificadores. aqui tengo el codigo:

Código:
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>  
#include <ctype.h>
#include <stdlib.h>
#include <fstream>
#define max 100
using namespace std;
typedef char cadena[100];
typedef enum{verdadero,falso} coin;
coin relacionales (char aux)
{if(aux=='<' || aux=='>' || aux=='!' || aux==char(34) || aux==char(39))
    { return verdadero;}
    return falso;    
}
coin delimitador (char aux)
{if(aux==',' || aux==';' || aux=='[' || aux==']' || aux=='(' || aux==')' || aux==':')
    { return verdadero;}
    return falso;    
}
coin arimeticos (char aux)
{if(aux=='+' || aux=='-' || aux=='*' || aux=='/' || aux=='=' || aux=='#' )
    { return verdadero;}
    
    return falso;    
}
coin reservada (cadena cad)
{ int i;
  char *lista[]={"AND","ARRAY","BEGIN","CASE","CONST","CLRSCR","CRT","DIV","DO","DOWNTO","ELSE","END","FILE","FOR","FUNCTION","GOTO",
  "IF","IN","LABEL","MOD","NULL","NOT","OF","OR","PACKED","PROCEDURE","PROGRAM","RECORD","REPEAT","SET","THEN","TO","TYPE","UNTIL","VAR",
  "WHILE","WITH","ABS","ACTAN","BOOLEAN","CHAR","CUS","DISPOSE","EOF","EOL","EXP","FALSE","INPUT","INTEGER","INT","MAXINT","NEW","NIL",
  "ODD","ORD","OUTPUT","PACK","PAGE","PUT","READ","READLN","REAL","RESET","REWRITE","ROUND","SIN","SQR","SQRT","SOCC","TEXT","TRUE",
  "TRUNC","UNPACK","USES","WRITE","WRITELN"};
  for(i=0;i<77;i++)
  {
      if (strcmp(lista[i],cad)== 0)
      return verdadero;
  }
  return falso;
}  
/*coin analiz (string cad)
{
    int i,est,c=0,l=0,d=0,u,e=0;
    for(u=0;cad[u]!='\0';u++)
    {cad[u]='\0';}    
    for(i=0;i<cad.length();i++)
    {
        if((isalpha(cad[i]))||(isdigit(cad[i])))
        {
              if(isalpha(cad[i]))
              l++;
              if(isdigit(cad[i]))
              d++;                                    
        }
        else
        if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
        e++;
        if(cad[i]=='\0')
        break;
    }
    c=l+d+e-1;
    est=1;
    while(est!=3)
    {
        for(i=0;i<=c;i++)
        {
             switch(est)
             {
                case 1: if(isalpha(cad[i]))
                        {est=2;break;}
                        else {return falso;}
                case 2: if(cad[i]=='\0')
                        {return falso;}
                        if(isalpha(cad[i]))
                        {est=2;break;}
                        else {if(isdigit(cad[i]))
                                {est=3;
                                if(d==1)
                                 {return verdadero;}
                                 }
                default: return falso;
             }             
        }         
    }    
    }     
}
coin numero (string cad)
{
    int i,est,c=0,l=0,d=0,u,e=0;
    for(u=0;cad[u]!='\0';u++)
    {cad[u]='\0';}    
    for(i=0;i<cad.length();i++)
    {
        if((isalpha(cad[i]))||(isdigit(cad[i])))
        {
              if(isalpha(cad[i]))
              l++;
              if(isdigit(cad[i]))
              d++;                                    
        }
        else
        if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
        e++;
        if(cad[i]=='\0')
        break;
    }
    c=l+d+e-1;
    est=1;
      while(est!=3)
    {
        for(i=0;i<=c;i++)
        {
             switch(est)
             {
                case 1: if(isdigit(cad[i]))
                     {est=2;break;}
                case 2: if(cad[i]=='\0')
                     {est=3;return verdadero;}
                        else if(isdigit(cad[i]))
                             {est=2;break;}
                default: return falso;
             }       
        }
}
}*/


int main(int argc, char *argv[])
{
    int c;
    cadena linea;
    cadena cad;
    char lex[max];
    int u,i=0;
    char *aplin;
    for(u=0;linea[u]!='\0';u++)
        linea[u]='\0';
    for(u=0;lex[u]!='\0';u++)
        lex[u]='\0';
    
    ifstream arch("Codigo.txt"); 
    while(!arch.eof())
    {
    arch.getline(linea,sizeof(linea));
    cout<<"Codigo Base: "<<linea<<endl<<endl;
    }
             /*gets(linea);*/
           while((linea[i]!='\0')&&(linea[i]!=';'))
           {
           lex[i]=toupper(linea[i]);
           i++;
           }
          lex[i]='\0';
          aplin=lex;
          while(*aplin!='\x0' && *aplin!=';' && *aplin!='\0')
          {
             i=0;
             if(relacionales(*aplin)==verdadero || arimeticos(*aplin)==verdadero || *aplin =='\t' ||delimitador(*aplin)==verdadero ||*aplin==' ')
             {
                 if(relacionales(*aplin)==verdadero)
                  {
                  cout<<*aplin<<" ... Operador Relacional "<<endl;
                  }
                 if(delimitador(*aplin)==verdadero)
                  {
                  cout<<*aplin<<" .... Delimitador "<<endl;
                  }
                 if(arimeticos(*aplin)==verdadero)
                  {
                  cout<<*aplin<<" .... Operador Arimetico "<<endl;
                  }
                  *aplin++;
             }
             else
              {
                i=0;
                do
                {   cad[i]=*aplin;
                   *aplin++;
                   i++;}
                  while(relacionales(*aplin)==falso && arimeticos(*aplin)==falso && *aplin!='\x0' && delimitador(*aplin)==falso && *aplin!='\0' && *aplin!=' ');
                  cad[i]='\0';
                  if(reservada(cad)==verdadero)
                  {cout<<cad<<" ..... Palabra Reservada"<<endl;}
                  /*if(analiz(cad)==verdadero)
                  {cout<<cad<<" Identificador"<<endl;}
                  if(numero(cad)==verdadero)
                 {cout<<cad<<" Numero"<<endl;}*/
              }
          
        }
    
    system("PAUSE");
    return 0;
}
el detalle es que quiero saber como puedo lograr hacer que mi analizador lea numeros e identificadores, ademas desaria saber como puedo crear un archivo TXT con las respuestas dadas.

Estaria agradecido si me ayudan a corregir si tengo errores

Última edición por Luis_1803; 09/02/2010 a las 11:35 Razón: Informacion nueva
  #2 (permalink)  
Antiguo 10/02/2010, 20:18
 
Fecha de Ingreso: agosto-2009
Ubicación: Peru
Mensajes: 10
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Problema con analizador lexico completo

Chicos , se que no es etico, pero tengo avanzado mi codigo y desearia saber como terminarlo, es urgente
Código:
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>  
#include <ctype.h>
#include <stdlib.h>
#include <fstream>
#define max 100
using namespace std;
typedef char cadena[100];
typedef enum{verdadero,falso} coin;
coin relacionales (char aux)
{if(aux=='<' || aux=='>' || aux=='!' || aux==char(34) || aux==char(39))
    { return verdadero;}
    return falso;    
}
coin delimitador (char aux)
{if(aux==',' || aux==';' || aux=='[' || aux==']' || aux=='(' || aux==')' || aux==':')
    { return verdadero;}
    return falso;    
}
coin arimeticos (char aux)
{if(aux=='+' || aux=='-' || aux=='*' || aux=='/' || aux=='=' || aux=='#' )
    { return verdadero;}
    
    return falso;    
}
coin reservada (cadena cad)
{ int i;
  char *lista[]={"AND","ARRAY","BEGIN","CASE","CONST","CLRSCR","CRT","DIV","DO","DOWNTO","ELSE","END","FILE","FOR","FUNCTION","GOTO",
  "IF","IN","LABEL","MOD","NULL","NOT","OF","OR","PACKED","PROCEDURE","PROGRAM","RECORD","REPEAT","SET","THEN","TO","TYPE","UNTIL","VAR",
  "WHILE","WITH","ABS","ACTAN","BOOLEAN","CHAR","CUS","DISPOSE","EOF","EOL","EXP","FALSE","INPUT","INTEGER","INT","MAXINT","NEW","NIL",
  "ODD","ORD","OUTPUT","PACK","PAGE","PUT","READ","READLN","REAL","RESET","REWRITE","ROUND","SIN","SQR","SQRT","SOCC","TEXT","TRUE",
  "TRUNC","UNPACK","USES","WRITE","WRITELN"};
  for(i=0;i<77;i++)
  {
      if (strcmp(lista[i],cad)== 0)
      return verdadero;
  }
  return falso;
}  
/*coin analiz (string cad)
{
    int i,est,c=0,l=0,d=0,u,e=0;
    for(u=0;cad[u]!='\0';u++)
    {cad[u]='\0';}    
    for(i=0;i<cad.length();i++)
    {
        if((isalpha(cad[i]))||(isdigit(cad[i])))
        {
              if(isalpha(cad[i]))
              l++;
              if(isdigit(cad[i]))
              d++;                                    
        }
        else
        if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
        e++;
        if(cad[i]=='\0')
        break;
    }
    c=l+d+e-1;
    est=1;
    while(est!=3)
    {
        for(i=0;i<=c;i++)
        {
             switch(est)
             {
                case 1: if(isalpha(cad[i]))
                        {est=2;break;}
                        else {return falso;}
                case 2: if(cad[i]=='\0')
                        {return falso;}
                        if(isalpha(cad[i]))
                        {est=2;break;}
                        else {if(isdigit(cad[i]))
                                {est=3;
                                if(d>=1 and l==1)
                                 {return verdadero;}
                                 }
                default: return falso;
             }             
        }         
    }    
    }     
}*/
/*coin numero (string cad)
{
    int i,est,c=0,l=0,d=0,u,e=0;
    for(u=0;cad[u]!='\0';u++)
    {cad[u]='\0';}    
    for(i=0;i<cad.length();i++)
    {
        if((isalpha(cad[i]))||(isdigit(cad[i])))
        {
              if(isalpha(cad[i]))
              l++;
              if(isdigit(cad[i]))
              d++;                                    
        }
        else
        if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
        e++;
        if(cad[i]=='\0')
        break;
    }
    c=l+d+e-1;
    est=1;
      while(est!=3)
    {
        for(i=0;i<=c;i++)
        {
             switch(est)
             {
                case 1: if(isdigit(cad[i]))
                     {est=2;break;}
                case 2: if(cad[i]=='\0' and d>=1)
                     {est=3;return verdadero;}
                        else if(isdigit(cad[i]))
                             {est=2;break;}
                default: return falso;
             }       
        }
}
}*/
/*coin real (string cad)
{
    int i,est,c=0,l=0,d=0,u,e=0;
    for(u=0;cad[u]!='\0';u++)
    {cad[u]='\0';}    
    for(i=0;i<cad.length();i++)
    {
        if((isalpha(cad[i]))||(isdigit(cad[i])))
        {
              if(isalpha(cad[i]))
              l++;
              if(isdigit(cad[i]))
              d++;                                    
        }
        else
        if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
        e++;
        if(cad[i]=='\0')
        break;
    }
    c=l+d+e-1;
    est=1;
      while(est!=4)
    {
        for(i=0;i<=c;i++)
        {
             switch(est)
             {
                case 1: if(isdigit(cad[i]))
                     {est=2;break;}
                case 2: if(cad[i]=='\0' and d>=1)
                     {est=3;}
                        else if(isdigit(cad[i]))
                             {est=2;break;}
                        else if(cad[i]='.')
                             {est=3;break;}
                                 else
                                 {return falso;}
                case 3: if(isdigit(a[i]))
                     {est=3;break;}
                     if(a[i]=='\0' and d>=1)
                     {est=4;return verdadero;}
                     else{return falso;}}
                     
                default: return falso;
             }       
        }
}
}*/

int main(int argc, char *argv[])
{
    int c;
    cadena linea;
    cadena cad;
    char lex[max];
    int u,i=0;
    char *aplin;
    for(u=0;linea[u]!='\0';u++)
        linea[u]='\0';
    for(u=0;lex[u]!='\0';u++)
        lex[u]='\0';
    
    ifstream arch("Codigo.txt");
    ofstream resp("Respuesta.txt");  
    while(!arch.eof())
    {
    arch.getline(linea,sizeof(linea));
    cout<<"Codigo Base: "<<linea<<endl<<endl;
    resp<<"Codigo Base: "<<linea<<endl<<endl;
    
           while((linea[i]!='\0')&&(linea[i]!=';'))
           {
           lex[i]=toupper(linea[i]);
           i++;
           }
          lex[i]='\0';
          aplin=lex;
          while(*aplin!='\x0' && *aplin!=';' && *aplin!='\0')
          {
             i=0;
             if(relacionales(*aplin)==verdadero || arimeticos(*aplin)==verdadero || *aplin =='\t' ||delimitador(*aplin)==verdadero ||*aplin==' ')
             {
                 if(relacionales(*aplin)==verdadero)
                  {
                  cout<<*aplin<<" ... Operador Relacional "<<endl;
                  resp<<*aplin<<" ... Operador Relacional "<<endl;
                  }
                 if(delimitador(*aplin)==verdadero)
                  {
                  cout<<*aplin<<" .... Delimitador "<<endl;
                  resp<<*aplin<<" .... Delimitador "<<endl;
                  }
                 if(arimeticos(*aplin)==verdadero)
                  {
                  cout<<*aplin<<" .... Operador Arimetico "<<endl;
                  resp<<*aplin<<" .... Operador Arimetico "<<endl;
                  }
                  *aplin++;
             }
             else
              {
                i=0;
                do
                {   cad[i]=*aplin;
                   *aplin++;
                   i++;}
                  while(relacionales(*aplin)==falso && arimeticos(*aplin)==falso && *aplin!='\x0' && delimitador(*aplin)==falso && *aplin!='\0' && *aplin!=' ');
                  cad[i]='\0';
                  if(reservada(cad)==verdadero)
                  {cout<<cad<<" ..... Palabra Reservada"<<endl;
                  resp<<cad<<" ..... Palabra Reservada"<<endl;}
                  /*if(analiz(cad)==verdadero)
                  {cout<<cad<<" Identificador"<<endl;
                  resp<<cad<<" Identificador"<<endl;}*/
                 /* if(numero(cad)==verdadero)
                 {cout<<cad<<" Numero"<<endl;
                 resp<<cad<<" Numero"<<endl;}*/
                 /*if(real(cad)==verdadero)
                 {cout<<cad<<" Numero Real"<<endl;
                 resp<<cad<<" Numero Real"<<endl;}*/
              }
          
        }
    }
    resp.close();
    system("PAUSE");
    return 0;
}
lo ultimo que me falta es como detectar los numeros, los numeros reales y los identificadores, basta con hallar uno de ellos para hallar todo

Etiquetas: analizador, completo, lexico
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 21:02.