>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 */ _______________________________________________ Lista de correo Programacion. [email protected] http://listas.fi.uba.ar/mailman/listinfo/programacion
