> 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
