> Date: Mon, 21 Apr 2008 12:55:41 -0300> From: [EMAIL PROTECTED]> To: 
> [email protected]> Subject: [Prog] Re:programa de automatas> > 
> >hola a todos!> > alguno de ustedes sabe como realizar un programa de 
> automatas finito >deterministico, con tablas de transicion, utilizando el 
> diagrama de Moore. por >favor!!> >> >de antemano gracias por su ayuda.> > 
> saludos!!> > > Hola maria, recuerdo que cuando curse la materia teoria de> 
> compiladores, habia que hacer algo en c de analixadores lexicos,> 
> sintacticos, etc> > Te adjunto un fuente de analizador lexico que ue podría 
> ser aproximado> o adaptado al diagrama de transición que construiríamos para 
> la> expresión de un analizador lexico.> > Te adjunto este pdf que esta bueno, 
> especialmente en la pag 22> 
> http://www.um.edu.ar/catedras/20353e7/document/An%e1lisis_L%e9xico.pdf> > > 
> El segundo argumento es un arhivo txt de la forma:> 5> +> 5> -> 1> /> 8> > 
> Suerte !> > /******** alexico.c ****************> > #include <stdio.h>> > 
> #include <ctype.h>> > #include <stdlib.h>> > #include <string.h>> > 
> /*Estructura donde se guardara el tipo de lexema encontrado y su valor*/> > 
> struct lexema{> > /*tipo toma: NUM, IDE o SIM segun corresponda*/> > char 
> *tipo;> > /*si es un SIM, valor es 0;*/> > char *valor;> > };> > > > /* 
> Variable global para indicar desde que posicion se debe> > * buscar el 
> proximo lexema dentro del archivo fuente*/> > long posicion=0;> > char 
> sim[]={'+','-','*','/','%','$','\0'};> > /*funcion que indica si c es un 
> simbolo o no*/> > int issimbol(int c,char *sim);> > > > /* Funcion 
> analizadorlexico devulve un elemento de la estructura> lexema si tiene exito, 
> y> > * si no devuelve NULL*/> > struct lexema *analizadorlexico(FILE 
> *fsource){> > int c;> > int state;> > int TAM_VAL;> > > > /*posicion dentro 
> del valor de un lexema*/> > int pos;> > static struct lexema lex;> > > > 
> TAM_VAL=32;> > lex.valor=(char *)calloc(TAM_VAL,sizeof(char));> > 
> lex.tipo=(char *)calloc(4,sizeof(char));> > 
> if(fseek(fsource,posicion,SEEK_SET)!=0){> > fprintf(stderr,"Error en posicion 
> inicial\n");> > exit(1); > > }> > /*lee el primer caracter del archivo fuente 
> desde el indicador de posicion,> > * e indica si toma la rama de ID o NUM*/> 
> > state=0;> > pos=-1;> > while(!feof(fsource)){> > switch(state){> > case 0:> 
> > if((c=fgetc(fsource))<0){> > return NULL;> > }> > posicion++;> > 
> if(isalnum(c)){> > if(isdigit(c)){> > pos++;> > if(pos<TAM_VAL){> > 
> lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño de lexema 
> incorrecto\n");> > return NULL;> > }> > state=4;> > }> > else 
> if(isalpha(c)){> > if(pos<=TAM_VAL){> > pos++;> > lex.valor[pos]=c;> > }> > 
> else{> > fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > 
> }> > state=1;> > }> > }> > else if(c=='\t'||c==' '||c=='\n'){> > state=0;> > 
> }> > else if(issimbol(c,sim)){> > lex.tipo[0]=c;> > strcpy(lex.valor,"0");> > 
> state=10;> > }> > else{> > fprintf(stderr,"Error Lexico\n");> > return NULL;> 
> > }> > break;> > case 1:> > /*state 3*/ > > /*state 2*/ > > /*state 10*/ > > 
> if((c=fgetc(fsource))<0){> > return NULL;> > }> > posicion++;> > 
> if(isalnum(c)){> > /*Rama state 3*/> > if(isdigit(c)){> > pos++;> > 
> if(pos<TAM_VAL){ > > lex.valor[pos]=c;> > }> > else{> > 
> fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > }> > 
> state=3;> > }> > else if(isalpha(c)){> > pos++;> > if(pos<=TAM_VAL){> > 
> lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño de lexema 
> incorrecto\n");> > return NULL;> > }> > state=2;> > }> > }> > else 
> if(c=='\t'||c==' '||c=='\n'){> > state=12;> > }> > else if(issimbol(c,sim)){> 
> > strcpy(lex.tipo,"IDE");> > state=10;> > posicion--;> > }> > else{> > 
> fprintf(stderr,"Error en dramática del lexema\n");> > return NULL;> > }> > 
> break;> > case 2:> > /*state 3*/> > /*state 2*/> > /*state 10*/> > 
> if((c=fgetc(fsource))<0){> > return NULL;> > }> > posicion++;> > 
> if(isalnum(c)){> > if(isdigit(c)){> > pos++;> > if(pos<TAM_VAL){> > 
> lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño de lexema 
> incorrecto\n");> > return NULL;> > }> > state=3;> > }> > else 
> if(isalpha(c)){> > pos++;> > if(pos<=TAM_VAL){> > lex.valor[pos]=c;> > }> > 
> else{> > fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > 
> }> > state=2;> > }> > }> > else if(c=='\t'||c==' '||c=='\n'){> > state=12;> > 
> }> > else if(issimbol(c,sim)){> > strcpy(lex.tipo,"IDE");> > state=10;> > 
> posicion--;> > }> > else{> > fprintf(stderr,"Error en dramática del 
> lexema\n");> > return NULL; > > }> > break;> > case 3:> > /*state 3*/ > > 
> /*state 2*/ > > /*state 10*/ > > if((c=fgetc(fsource))<0){> > return NULL;> > 
> }> > posicion++;> > if(isalnum(c)){> > if(isdigit(c)){> > pos++;> > 
> if(pos<TAM_VAL){> > lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño 
> de lexema incorrecto\n");> > return NULL;> > }> > state=3;> > }> > else 
> if(isalpha(c)){> > pos++;> > if(pos<=TAM_VAL){ > > lex.valor[pos]=c;> > }> > 
> else{> > fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > 
> }> > state=2;> > }> > } > > else if(c=='\t'||c==' '||c=='\n'){> > state=3;> > 
> } > > else if(issimbol(c,sim)){> > strcpy(lex.tipo,"IDE");> > state=10;> > 
> posicion--;> > }> > else{> > fprintf(stderr,"Error en dramática del 
> lexema\n");> > return NULL; > > }> > break;> > > > case 4: > > /*state 4*/> > 
> /*state 5*/> > /*state 7*/> > /*state 10*/> > if((c=fgetc(fsource))<0){> > 
> return NULL;> > }> > posicion++;> > if(isdigit(c)){> > pos++;> > 
> if(pos<TAM_VAL){ > > lex.valor[pos]=c;> > }> > else{> > 
> fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > }> > 
> state=4;> > }> > else if(c=='.'){> > pos++;> > if(pos<=TAM_VAL){> > 
> lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño de lexema 
> incorrecto\n");> > return NULL;> > }> > state=5;> > }> > else if(c=='E'){> > 
> pos++;> > if(pos<=TAM_VAL){> > lex.valor[pos]=c;> > }> > else{> > 
> fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > }> > 
> state=7;> > }> > else if(c=='\t'||c==' '||c=='\n'){> > state=11;> > } > > 
> else if(issimbol(c,sim)){> > strcpy(lex.tipo,"NUM");> > state=10;> > 
> posicion--;> > }> > else{> > fprintf(stderr,"Error posicion %ld 
> (state=8)\n",posicion);> > return NULL; > > }> > break;> > case 5:> > /*state 
> 6*/> > /*state 5*/> > if((c=fgetc(fsource))<0){> > return NULL;> > }> > 
> posicion++;> > if(isdigit(c)){> > pos++;> > if(pos<=TAM_VAL){> > 
> lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño de lexema 
> incorrecto\n");> > return NULL;> > }> > state=6;> > }> > /* else 
> if(c=='\t'||c==' '){> > state=5;> > } > > */> > else{> > 
> fprintf(stderr,"Error posicion %ld (state=5)\n",posicion);> > return NULL;> > 
> }> > case 6:> > /*state 6*/> > /*state 7*/> > /*state 10*/> > 
> if((c=fgetc(fsource))<0){> > return NULL;> > }> > posicion++;> > 
> if(isdigit(c)){> > pos++;> > if(pos<TAM_VAL){> > lex.valor[pos]=c;> > }> > 
> else{> > fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > 
> }> > state=6;> > }> > else if(c=='E'){> > pos++;> > if(pos<=TAM_VAL){> > 
> lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño de lexema 
> incorrecto\n");> > return NULL;> > }> > state=7;> > }> > else 
> if(c=='\t'||c==' '||c=='\n'){> > state=11;> > } > > else 
> if(issimbol(c,sim)){> > strcpy(lex.tipo,"NUM");> > state=10;> > posicion--;> 
> > }> > else{> > fprintf(stderr,"Error posicion %ld (state=8)\n",posicion);> > 
> return NULL; > > }> > break; > > case 7:> > /*state 8*/> > /*state 9*/> > 
> if((c=fgetc(fsource))<0){> > return NULL;> > }> > posicion++;> > 
> if(isdigit(c)){> > pos++;> > if(pos<TAM_VAL){> > lex.valor[pos]=c;> > }> > 
> else{> > fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > 
> }> > state=9;> > }> > else if(c=='+'||c=='-'){> > pos++;> > 
> if(pos<=TAM_VAL){> > lex.valor[pos]=c;> > }> > else{> > 
> fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > }> > 
> state=8;> > }> > else{> > fprintf(stderr,"Error posicion %ld 
> (state=7)\n",posicion);> > return NULL;> > }> > break; > > > > case 8:> > 
> /*state 9*/> > if((c=fgetc(fsource))<0){> > return NULL;> > }> > posicion++;> 
> > if(isdigit(c)){> > pos++;> > if(pos<TAM_VAL){> > lex.valor[pos]=c;> > }> > 
> else{> > fprintf(stderr,"Tamaño de lexema incorrecto\n");> > return NULL;> > 
> }> > state=9;> > }> > else{> > fprintf(stderr,"Error posicion %ld 
> (state=8)\n",posicion);> > return NULL; > > }> > break; > > > > case 9: > > 
> /*state 9*/> > /*state 10*/> > if((c=fgetc(fsource))<0){> > return NULL;> > 
> }> > posicion++;> > if(isdigit(c)){> > pos++;> > if(pos<TAM_VAL){> > 
> lex.valor[pos]=c;> > }> > else{> > fprintf(stderr,"Tamaño de lexema 
> incorrecto\n");> > return NULL;> > }> > state=9;> > }> > else 
> if(c=='\t'||c==' '||c=='\n'){> > state=11;> > }> > else if(issimbol(c,sim)){> 
> > strcpy(lex.tipo,"NUM");> > state=10;> > posicion--;> > }> > else{> > 
> fprintf(stderr,"Error posicion %ld (state=8)\n",posicion);> > return NULL; > 
> > }> > break; > > case 10:> > return &lex;> > case 11:> > 
> if((c=fgetc(fsource))<0){> > return NULL;> > }> > posicion++;> > 
> if(c=='\t'||c==' '){> > state=11;> > }> > else if(issimbol(c,sim)){> > 
> strcpy(lex.tipo,"NUM");> > state=10;> > posicion--;> > }> > else{> > 
> fprintf(stderr,"Error posicion %ld (state=8)\n",posicion);> > return NULL; > 
> > }> > break;> > case 12:> > if((c=fgetc(fsource))<0){> > return NULL;> > }> 
> > posicion++;> > if(c=='\t'||c==' '){> > state=12;> > }> > else 
> if(issimbol(c,sim)){> > strcpy(lex.tipo,"IDE");> > state=10;> > posicion--;> 
> > }> > else{> > fprintf(stderr,"Error posicion %ld (state=8)\n",posicion);> > 
> return NULL;> > }> > break;> > }> > } > > return NULL;> > }> > /*Funcion 
> mostrar lexema muestra el contenido de un elemento de la> estructura 
> lexema*/> > void mostrarlexema(struct lexema *lex){> > 
> fprintf(stdout,"<%s,%s>\n",lex->tipo,lex->valor);> > }> > int issimbol(int 
> c,char *sim){> > int i;> > > > i=0;> > while(sim[i]!='\0'){> > if(c==sim[i])> 
> > return 1;> > i++;> > }> > return 0;> > }> > 
> /********************************************************************************************/>
>  > int main(int argc, char *argv[]){> > > > /*Archivo del codigo fuente */> > 
> FILE *fsrc;> > char namefile[64];> > struct lexema *lex;> > > > 
> memset(namefile,0,64); > > if(argc!=2){> > fprintf(stderr,"Forma de uso: 
> #./analizadorlex <File Source>");> > exit(1);> > }> > 
> strcpy(namefile,argv[1]);> > if((fsrc=fopen(namefile,"r"))==NULL){> > 
> fprintf(stderr,"Error al abrir el archivo %s\n",namefile);> > exit(1);> > }> 
> > while((lex=analizadorlexico(fsrc))!=NULL){> > mostrarlexema(lex);> > }> > 
> return 0;> > }> > > -- > /* Leonardo Rios> * rios[dot]lj[at]gmail[dot]com> */
 
hola leonardo gracias por tu ayuda, laverdad me sirv de mucho, me ayuda a 
guiarme para llevr a cabo el mio, el uni co proble y que no mensione por 
cierto, es que se tiene que realizar en java, con el compilador JCreator 1.4.2, 
y la sintaxis no es la misma cambia mucho, si alguien sabe de esto mas que nada 
en como hacer que mi programa jale un digrafo, y que yo le tenga que meter los 
valores y a la hora de  ordenarlos se haga aleatoriamente.
 
por su ayuda y su informacion gracias
saludos para todos> > _______________________________________________> Lista de 
correo Programacion.> [email protected]> 
http://listas.fi.uba.ar/mailman/listinfo/programacion
 
_________________________________________________________________
Tenemos lo que búscas…JUEGOS.
http://club.prodigymsn.com/ 
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a