HackPR.NET

Webmasters => Programación General => Topic started by: lokot3 on January 09, 2007, 10:53:21 AM

Title: analizador de tokens
Post by: lokot3 on January 09, 2007, 10:53:21 AM
Hola amigos necesito un analizador lexico o algo asi, hecho en c# ke le pases varias lineas de texto y te devuelva un arreglo de tokens, o sea, todo el texto introducido pero ya separado, si es una variable, un numero, un punto y coma, un slash, un parentesis abierto, etc.........
Title: Re: analizador de tokens
Post by: ParaCarelo on January 10, 2007, 10:52:45 PM
Esto es un poco de codigo viejo, pero espero que te sirva, no es un programa completo pero es la parte del analizador lexico.


#define MAXLIN         200
#define FIN_DE_PROGRAMA      -1

#define programa   100
#define sistema      110
#define lexico      120
#define sintactico   130
#define semantico   140
#define interpretacion   150

#define pr_let         1000
#define pr_is              1010
#define pr_called      1020
#define pr_has         1030
#define pr_be         1040
#define pr_have         1050
#define pr_a         1060
#define pr_an         1070
#define pr_the         1080
#define pr_coordinates      1090
#define pr_line         1100
#define pr_point      1110
#define pr_to         1120
#define pr_from         1130
#define pr_and         1140
#define pr_then         1150
#define pr_now         1160
#define pr_before      1170
#define pr_rectangle      1180
#define pr_draw         1190
#define pr_design      1200
#define pr_make         1210
#define pr_which      1220
#define pr_circle      1230
#define pr_center      1240
#define pr_in         1250
#define pr_ratio      1260
#define pr_join         1270
#define pr_with         1280

#define pu_coma         3000
#define pu_punto      3010

#define nf_assignment           5000
#define nf_pt_defn          5010
#define nf_verb            5020
#define nf_coordefn         5030
#define nf_infinitive             5040
#define nf_coord_pair             5050
#define nf_classifier        5060
#define nf_determinier          5070
#define nf_pt_name          5080
#define nf_action      5090
#define nf_radio_defn      5100
#define nf_center_defn      5110
#define nf_inicio      5120
#define nf_sentence      5130
#define nf_sepair      5140
#define nf_figure      5150
#define nf_verb_draw      5160
#define nf_pt_assign      5170

#define variable                6000

#define da_numero      7000

#define TOKEN struct token
struct token
   {
   int lin;
   int pos;
   int id;
        int usuario;
        float num;
   struct token *sub;
   struct token *sig;
   };

#define MAXVAR      100

TOKEN *ltoken=NULL, *atoken=NULL;

-----------------

/**************************************************************************/
TOKEN *reserva_token(void)
{
TOKEN *nuevo;
nuevo=(TOKEN *)malloc(sizeof(TOKEN));
return(nuevo);
}
/**************************************************************************/
void libera_token(TOKEN *token)
{
free(token);
}
/**************************************************************************/
TOKEN *ulttoken=NULL;
char lista_variables[MAXVAR][31];
int variable_x[MAXVAR];
int variable_y[MAXVAR];
int tope=0;
/**************************************************************************/
int indice_variable(char *var)
{
int i;
for(i=0; i<tope; i++)
   {
   if(!strcmpi(lista_variables, var))
      return(i);
   }
if(tope!=MAXVAR)
   {
   strcpy(lista_variables[tope], var);
   tope++;
   return(tope-1);
   }
return(-1);
}
/**************************************************************************/
int clasifica(char *palabra)
{
if(!strcmpi(palabra, "let"))
   return(pr_let);
if(!strcmpi(palabra, "is"))
   return(pr_is);
if(!strcmpi(palabra, "called"))
   return(pr_called);
if(!strcmpi(palabra, "has"))
   return(pr_has);
if(!strcmpi(palabra, "be"))
   return(pr_be);
if(!strcmpi(palabra, "have"))
   return(pr_have);
if(!strcmpi(palabra, "a"))
   return(pr_a);
if(!strcmpi(palabra, "an"))
   return(pr_an);
if(!strcmpi(palabra, "the"))
   return(pr_the);
if(!strcmpi(palabra, "coordinates"))
   return(pr_coordinates);
if(!strcmpi(palabra, "line"))
   return(pr_line);
if(!strcmpi(palabra, "point"))
   return(pr_point);
if(!strcmpi(palabra, "to"))
   return(pr_to);
if(!strcmpi(palabra, "from"))
   return(pr_from);
if(!strcmpi(palabra, "and"))
   return(pr_and);
if(!strcmpi(palabra, "then"))
   return(pr_then);
if(!strcmpi(palabra, "now"))
   return(pr_now);
if(!strcmpi(palabra, "before"))
   return(pr_before);
if(!strcmpi(palabra, "rectangle"))
   return(pr_rectangle);
if(!strcmpi(palabra, "draw"))
   return(pr_draw);
if(!strcmpi(palabra, "design"))
   return(pr_design);
if(!strcmpi(palabra, "make"))
   return(pr_make);
if(!strcmpi(palabra, "which"))
   return(pr_which);
if(!strcmpi(palabra, "circle"))
   return(pr_circle);
if(!strcmpi(palabra, "center"))
   return(pr_center);
if(!strcmpi(palabra, "in"))
   return(pr_in);
if(!strcmpi(palabra, "radio"))
   return(pr_ratio);
if(!strcmpi(palabra, "join"))
   return(pr_join);
if(!strcmpi(palabra, "with"))
   return(pr_with);
return(variable);
}
/**************************************************************************/
TOKEN *crea_token(int lin, int pos, int id, int usuario, float num, TOKEN *sub, TOKEN *sig)
{
TOKEN *nuevo;
nuevo=reserva_token();
if(nuevo==NULL)
   {
   reporta_error(sistema, lin, pos, "No hay suficiente memoria para crear un token.");
        return(NULL);
   }
nuevo->lin=lin;
nuevo->pos=pos;
nuevo->id=id;
nuevo->usuario=usuario;
nuevo->num=num;
nuevo->sub=sub;
nuevo->sig=sig;
return(nuevo);
}
/**************************************************************************/
void agrega_token(int linea, int pos, int id, int usuario, float num)
{
TOKEN *nuevo=NULL;
nuevo=crea_token(linea, pos, id, usuario, num, NULL, NULL);
if(nuevo==NULL)
   return;
if(ltoken==NULL)
   {
   ulttoken=nuevo;
        ltoken=nuevo;
   return;
   }
ulttoken->sig=nuevo;
ulttoken=nuevo;
}
/**************************************************************************/
void analisis_lexico(char lin[], int linea_actual)
{
int ultpos=0;
int pos=0;
int aux, ind;
char *slinea;
char palabra[MAXLIN];
int vid;
slinea=lin;
inicio:
if(lnerror==1)
   return;
while(isspace(slinea[pos]))
   pos++;
if(slinea[pos]==NULL)
   return;
ultpos=pos;
if(isalpha(slinea[pos]))
   {
   pos++;
   while(isalpha(slinea[pos]) || slinea[pos]=='_')
      pos++;
   aux=slinea[pos];
   slinea[pos]=NULL;
   strcpy(palabra, slinea+ultpos);
   slinea[pos]=aux;
   vid=clasifica(palabra);
        if(vid==variable)
           aux=indice_variable(palabra);
   agrega_token(linea_actual, ultpos, vid, aux, 0);
   goto inicio;
   }
if(isdigit(slinea[pos]))
   {
   pos++;
   while(isdigit(slinea[pos]))
      pos++;
   if(slinea[pos]=='.' && isdigit(slinea[pos+1]))
      {
      pos++;
      while(isdigit(slinea[pos]))
         pos++;
      }
   aux=slinea[pos];
   slinea[pos]=NULL;
   strcpy(palabra, slinea+ultpos);
   slinea[pos]=aux;
   agrega_token(linea_actual, ultpos, da_numero, 0, atof(palabra));
   goto inicio;
   }
if(slinea[pos]==',')
   {
   agrega_token(linea_actual, ultpos, pu_coma, 0, 0);
        pos++;
        goto inicio;
        }
if(slinea[pos]=='.')
   {
   agrega_token(linea_actual, ultpos, pu_punto, 0, 0);
        pos++;
        goto inicio;
        }
reporta_error(lexico, linea_actual, pos, "Caracter inv lido.");
return;
}
/**************************************************************************/
Title: Re: analizador de tokens
Post by: ParaCarelo on January 10, 2007, 11:02:35 PM
Aqui hay otro analizador, a ver si te gusta mas:

#define fin      0
#define cod_begin   1
#define cod_end      2
#define cod_if      3
#define cod_then   4
#define cod_else   5
#define cod_id      6
#define cod_meq      7
#define cod_meiq   8
#define cod_dd      9
#define cod_maq      10
#define cod_maiq   11
#define cod_ia      12

int reconoce_token(void)
{
int ch;
estado_0:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'e': goto estado_1;
                        case 'b': goto estado_7;
                        case 'i': goto estado_12;
                        case 't': goto estado_14;
                        case '<': goto estado_18;
                        case '>': goto estado_21;
                        case '=': goto estado_23;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': goto estado_0;
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                if(ch==-1)
                                   return(fin);
                                puts("Caracter no v lido en el estado 0.");
                                return(-1);
                        }
estado_1:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'n': goto estado_2;
                        case 'l': goto estado_4;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 1.");
                                return(-1);
                        }
estado_2:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'd': goto estado_3;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 2.");
                           return(-1);
                        }
estado_3:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_end);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 3.");
                                return(-1);
                        }
estado_4:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 's': goto estado_5;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 4.");
                                return(-1);
                        }
estado_5:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'e': goto estado_6;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 5.");
                                return(-1);
                        }
estado_6:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_else);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 6.");
                                return(-1);
                        }
estado_7:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'e': goto estado_8;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 7.");
                                return(-1);
                        }
estado_8:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'g': goto estado_9;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 8.");
                                return(-1);
                        }
estado_9:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'i': goto estado_10;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 9.");
                                return(-1);
                        }
estado_10:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'n': goto estado_11;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 10.");
                                return(-1);
                        }
estado_11:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_begin);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 11.");
                                return(-1);
                        }
estado_12:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'f': goto estado_13;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 12.");
                                return(-1);
                        }
estado_13:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_if);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 13.");
                                return(-1);
                        }
estado_14:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'h': goto estado_15;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 14.");
                                return(-1);
                        }
estado_15:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'e': goto estado_16;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 15.");
                                return(-1);
                        }
estado_16:   ch=tolower(getchar());
      switch(ch)
                   {
                        case 'n': goto estado_17;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 17.");
                                return(-1);
                        }
estado_17:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_then);
                        default:
                           if(isalpha(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 17.");
                                return(-1);
                        }
estado_18:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '=': goto estado_19;
                        case '>': goto estado_20;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_meq);
                        default:
                                puts("Caracter no v lido en el estado 18.");
                                return(-1);
                        }
estado_19:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_meiq);
                        default:
                                puts("Caracter no v lido en el estado 19.");
                                return(-1);
                        }
estado_20:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_dd);
                        default:
                                puts("Caracter no v lido en el estado 20.");
                                return(-1);
                        }
estado_21:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '=': goto estado_22;
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_maq);
                        default:
                                puts("Caracter no v lido en el estado 21.");
                                return(-1);
                        }
estado_22:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_maiq);
                        default:
                                puts("Caracter no v lido en el estado 22.");
                                return(-1);
                        }
estado_23:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_ia);
                        default:
                                puts("Caracter no v lido en el estado 23.");
                                return(-1);
                        }
estado_24:   ch=tolower(getchar());
      switch(ch)
                   {
                        case '\n':
                        case '\t':
                        case 13:
                        case ' ': return(cod_id);
                        default:
                           if(isalnum(ch))
                                   goto estado_24;
                                puts("Caracter no v lido en el estado 24.");
                                return(-1);
                        }
}



void main(void)
{
int ret;
puts("Teclee cadenas para reconocer. Presione la tecla F6 para terminar.");
do
   {
        ret=reconoce_token();
        switch(ret)
           {
                case -1: puts("***** Elemento no reconocido."); break;
                case 0: puts("***** Fin del archivo de entrada."); break;
                case 1: puts("***** Inicio de un bloque de c¢digo (begin)."); break;
                case 2: puts("***** Fin de un bloque de c¢digo (end)."); break;
                case 3: puts("***** Decisi¢n condicional (if)."); break;
                case 4: puts("***** Si se cumple la condici¢n (then)."); break;
                case 5: puts("***** Si no se cumple la condici¢n (else)."); break;
                case 6: puts("***** Identificador."); break;
                case 7: puts("***** Menor que."); break;
                case 8: puts("***** Menor o igual que."); break;
                case 9: puts("***** Diferente de"); break;
                case 10: puts("***** Mayor que."); break;
                case 11: puts("***** Mayor o igual que."); break;
                case 12: puts("***** Igual a."); break;
                }
        }
        while(ret!=0);
}




Title: Re: analizador de tokens
Post by: lokot3 on January 14, 2007, 01:11:24 AM
gracias amigo, kizas eso me sirva.........

muchas gracias.


salu2

yanser