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.........
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;
}
/**************************************************************************/
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);
}
gracias amigo, kizas eso me sirva.........
muchas gracias.
salu2
yanser