Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/02/2010, 21:55
Luis_1803
 
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