Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/02/2010, 20:18
Luis_1803
 
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